雑感
2024年4月15日月曜日
dht11 and lcd1602-i2c code / keypad
2024年4月4日木曜日
7 segment pedia
おはようございます。遅くまでやっていますね。
> AVマイコンプログラミング入門 258pで2sc1815を使う場合 スイッチする端子から
> 10kΩ経由で(15kΩの抵抗を分岐してGNDにつなぎつつ)
> この理由がわかりません 電流がながれんときに確実にGNDにおちるように?
> (
Webより抜粋です。
『抵抗R3,4について
以下の理由で抵抗R3,4を入れた方が良いらしいです、
・コレクタしゃ断電流(ICBO=0.6uA)
・ベースの入力に、
・また、抵抗R1,2が断線した時や、R1,
それと2SC1815のベース・
よろしくお願いします。
----------------------static点灯----------------------------
まずはUnoで試運転 led 抵抗は1kΩとした
// https://burariweb.info/electronic-work/arduino-learning/arduino-7segment-led.html
// Arduino入門編㉔ 7セグメントLEDを制御する①
// https://burariweb.info
// 7セグメントLED配列
// A(D2)
// -------
// F(D7)| |B(D3)
// | G(D8) |
// -----
// | |
// E(D6)| |C(D4)
// ------- .DP
// D(D5)
const int ASeg = 2;
const int BSeg = 3;
const int CSeg = 4;
const int DSeg = 5;
const int ESeg = 6;
const int FSeg = 7;
const int GSeg = 8;
void setup() {
pinMode(ASeg, OUTPUT);
pinMode(BSeg, OUTPUT);
pinMode(CSeg, OUTPUT);
pinMode(DSeg, OUTPUT);
pinMode(ESeg, OUTPUT);
pinMode(FSeg, OUTPUT);
pinMode(GSeg, OUTPUT);
}
void loop() {
zero();
delay(500);
one();
delay(500);
two();
delay(500);
three();
delay(500);
four();
delay(500);
five();
delay(500);
six();
delay(500);
seven();
delay(500);
eight();
delay(500);
nine();
delay(500);
}
// LED表示関数の定義
// 0を表示
void zero() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, HIGH);
}
// 1を表示
void one() {
digitalWrite(ASeg, HIGH);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, HIGH);
}
// 2を表示
void two() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, HIGH);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, LOW);
}
// 3を表示
void three() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, LOW);
}
// 4を表示
void four() {
digitalWrite(ASeg, HIGH);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
// 5を表示
void five() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, HIGH);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
// 6を表示
void six() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, HIGH);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
// 7を表示
void seven() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, HIGH);
}
// 8を表示
void eight() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
// 9を表示
void nine() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
----------------次は2桁のダイナミック点灯だがリスキーコード--------------------------------
// https://elchika.com/article/14f0dc75-293e-4939-9f55-9f998698b73b/
//a : 13
//b : 12
//c : 11
//d : 10
//e : 9
//f : 8
//g : 7
//A1 :19
// LEDをオン・オフする際の出力
#define DIGIT_ON LOW // anode common
#define DIGIT_OFF HIGH
#define SEGMENT_ON HIGH // anode common
#define SEGMENT_OFF LOW
const int up_button = 19;//カウントアップボタン
//const int down_button = 18; //カウントダウンボタン
//const int reset_button = 17; //リセットボタン
//チャタリング防止用変数
int old_val1 = 1;
int old_val2 = 1;
int old_val3 = 1;
int up = 0;
int down = 0;
int reset = 0;
int i = 0;
const int digitPins[] = {5,4}; // ディジット(アノード)に接続するアルディーノピン
// 例えば5ピンをオンにして数字の8を表示させると70mA流れるのでリスキー!
//吉野さんによれば一瞬なのでうまくいっているだけだとのこと!
Arduinoのピン
const int segmentPins[] = {13,12,11,10,9,8,7,}; // 7セグメント接続のArduinoピン
const int numberOfDigitPins = sizeof(digitPins) / sizeof(digitPins[0]);
// 2:ディジットの数(桁)
const int numberOfSegmentPins = sizeof(segmentPins) / sizeof(segmentPins[0]);
//7: セグメントの数(7セグ)
// 数字と表示させるセグメントの関係
const int digits[] = {
0b00111111, // 0 dp g f e d c b a
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
};
// 数字を表示する
void displayNumber(int n) {
// digits[n]の各ビットを調べて対応するセグメントを点灯・消灯する
for (int i = 0; i < numberOfSegmentPins; i++) {
digitalWrite(segmentPins[i], digits[n] & (1 << i) ? SEGMENT_OFF : SEGMENT_ON);
}
}
// セグメントをすべてオフにする
void clearSegments() {
for (int j = 0; j < numberOfSegmentPins; j++) {
digitalWrite(segmentPins[j], SEGMENT_OFF);
}
}
// 2桁の数字を表示する
void displayNumbers(int n) {
for (int i = 0; i < numberOfDigitPins; i++) { // 右の桁からディジットを選択する
digitalWrite(digitPins[i], DIGIT_ON); // ディジットをoffにする
displayNumber(n % 10); // 10で割った余りを求めて、1の位を求め、表示する
delay(12); // 12ms停止
clearSegments(); // セグメントをすべてオフにする
digitalWrite(digitPins[i], DIGIT_OFF); // ディジットをonにする
n /= 10; // 10で割り、次に表示する数字を、1の位に移す
}
}
// setup() は,最初に一度だけ実行される
void setup() {
//const int numberOfDigitPins = sizeof(digitPins) / sizeof(digitPins[0]); // ディジットの数
// const int numberOfSegmentPins = sizeof(segmentPins) / sizeof(segmentPins[0]); // セグメントの数
//Serial.begin( 9600 );
//Serial.println(numberOfDigitPins);//2
// Serial.println(numberOfSegmentPins);//7
pinMode(up_button, INPUT_PULLUP );
// pinMode(down_button, INPUT_PULLUP );
// pinMode(reset_button, INPUT_PULLUP );
for (int i = 0; i < numberOfDigitPins; i++) {
pinMode(digitPins[i], OUTPUT); // digitPinsを出力モードに設定する
digitalWrite(digitPins[i], DIGIT_OFF);
}
for (int i = 0; i < numberOfSegmentPins; i++) {
pinMode(segmentPins[i], OUTPUT); // segmentPinsを出力モードに設定する
}
}
//loop() は繰り返し実行される
void loop() {
up = digitalRead(up_button);
// down = digitalRead(down_button);
// reset = digitalRead(reset_button);
//以下チャタリング防止のプラグラム
if((up == 0) && (old_val1 == 1)){
if(i == 99){
i = 0;
} else{
i++;
}
}else if((i != 0) && (down == 0) &&(old_val2 == 1)){
i--;
}else if((reset == 0) &&(old_val3 == 1)){
i = 0;
}
displayNumbers(i);
old_val1 = up;
old_val2 = down;
old_val3 = reset;
}
2024年3月27日水曜日
AVR ISP シールド
AVR ISP Shieldを使ってみた #Arduino - Qiita やら
Arduino (Shield) (ht-deko.com) にある説明では十分要領を得んのでメモ
押し下げ棒があるほうにpin1,pin28がくるようにセット avrispのsocketは以下のように挿す
〇 〇 miso vtg
〇 〇 sck mosi
〇 〇 rst gnd
ISP記載が下にある6穴のやつを用いる
注:あくまでatmega88v/328p用と心得よう
2024年3月26日火曜日
fastPWM and ADC/INT0,PCINT (attiny13a)
// https://www.adnbr.co.uk/articles/adc-and-pwm-basics
// code: https://gist.github.com/adnbr/9289235
#define F_CPU 9600000
#define LED PB1
#include <avr/io.h>
void pwm_setup(){
TCCR0B |= (1<<CS01); // prescale 8
TCCR0A |= (1<<WGM01) | (1<<WGM00);// fast PWM
// Clear OC0B output on compare match, upwards counting.
TCCR0A |= (1<<COM0B1);
}
void pwm_write(int val)
{
OCR0B = val;
}
void adc_setup(void)
{
// set the ADC input to PB2/ADC1
ADMUX |= (1<<MUX0); // mux1/0=01 select adc1
ADMUX |= (1<<ADLAR);
// set the prescaler 128 , adps2 add by me
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);
}
int adc_read(void)
{
ADCSRA |= (1<<ADSC); // start conversion
while(ADCSRA&(1<<ADSC));
return ADCH;
}
int main (void)
{
int adc_in;
// LED is an output.
DDRB |= (1 << LED);
adc_setup();
pwm_setup();
while (1) {
// Get the ADC value
adc_in = adc_read();
// Now write it to the PWM counter
pwm_write(adc_in);
}
}
ーーーーーーーーーINT0ーーーーーーーーーーーーー
// https://kurobekoblog.com/attiny_gaibuwarikomi
#include <avr/interrupt.h>
volatile byte state = 0;
int16_t cnt;
ISR(INT0_vect){
state = 1;
}
void sw_up(){
switch(state){
case 0:
break;
case 1:
cnt = 1000;
state = 2;
break;
case 2:
cnt --; // avoid chattering
if(cnt == 0){
PORTB ^= 0b00000001; // toggle led on off
state = 0;
}
}
}
void setup(){
DDRB |= 0b0000001 ; // pb0 output
PORTB |= 0b0000010 ; // pb1 input pullup
MCUCR &= ~0b00000011; // if low level, int0 occur
GIMSK |= (1<<INT0) ; // int0 enable
sei();
}
void loop(){
sw_up();
}
注:pb3をinput pullupでスイッチにつなぎ、スイッチはグランドともつなぐ
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define F_CPU 960000UL
#define LED PB0
//#define SWITCH PINB3 どっちでもうごくが。。。。
#define SWITCH PB3
ISR(PCINT0_vect){ // 0番台の割り込みがpcint0~5ピンに割当られているようだ
if(PINB & _BV(SWITCH)){
PORTB ^= _BV(LED);
}
}
int main(void)
{
DDRB |= _BV(LED); // SET PORT B0 AS OUTPUT(ALL OTHERS ARE INPUT)
PORTB = 0b0001000 ; // pb3(switch) input pullup
PCMSK |= _BV(SWITCH); // SET PCINT MASK TO LISTEN TO PORT B3
GIMSK |= _BV(PCIE);
sei();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
for (;;){
sleep_mode();
}
}
ーーーーーーPCINTもう一つーーーーーーーーー
2024年3月20日水曜日
ACM1602/SD1602 ASM 表示のみ
-----------------acm1602-------------------------------------------------------------------------------https://mctouringadv.net/20200823/arduino11/ にピン番号詳しい
nanoではコントラスうまくいかん
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
; ファイル名 : LCD.asm
.include "m88def.inc"
.def R_TEMP0 = R2
.def STACK = R16
.def R_FLAG1 = R17 ; 割込状態他
.def R_TMR0 = R18 ; タイマ0カウント領域(10mS単位)
.def R_TMR2 = R19 ; タイマ2カウント領域(0.1mS単位)
.def R_TEMP1 = R20
.def R_TEMP2 = R21
.def R_TEMP3 = R22
.def R_TEMP4 = R23
.def R_TEMP5 = R24
;---- R_FLAG1 ----(割込状態他)
.EQU B_IOVF0 = 0 ; タイマ0オーバーフロー
.EQU B_IOVF1 = 1 ; タイマ1オーバーフロー
.EQU B_IOVF2 = 2 ; タイマ2オーバーフロー
.EQU B_INT0 = 3 ; 手動スイッチ押下割込み
;---- PORT ----
.EQU P_LCD = PORTD ; LCD
;.EQU P_SW0 = PINC ; SW0
;---- 入出力ビット -------------
.EQU B_LCD_RS = 4
.EQU B_LCD_E = 5
.EQU B_SDC_CS = 2
; 割り込みベクタ定義
.CSEG ; コードセグメント
RJMP MAIN ; リセット
.ORG $0009
RJMP IOVF2 ; タイマ2
.ORG $0010
RJMP IOVF0 ; タイマ0
;*******************************************************************************
; 割込みルーチン
;*******************************************************************************
;*******************************************************************************
;***************************************
; タイマ2(0.1mS単位)
;***************************************
IOVF2:
IN STACK,SREG ; PUSH SREG
DEC R_TMR2
BRNE IOVF2_1
SBR R_FLAG1,(1<<B_IOVF2)
RJMP IOVF2_9
IOVF2_1:
LDI R_TEMP1, 0x9C ; 割込時間0.1mSを再セット
STS TCNT2, R_TEMP1
IOVF2_9:
OUT SREG,STACK ; POP SREG
RETI
;***************************************
; タイマ0 (10mS単位)
;***************************************
IOVF0:
IN STACK,SREG ; PUSH SREG
DEC R_TMR0
BRNE IOVF0_1
SBR R_FLAG1,(1<<B_IOVF0)
RJMP IOVF0_9
IOVF0_1:
LDI R_TEMP1, 0xD9 ; 割込時間10mSを再セット
OUT TCNT0, R_TEMP1
IOVF0_9:
OUT SREG,STACK ; POP SREG
RETI
;*******************************************************************************
; サブルーチン
;*******************************************************************************
;*****************************
; タイマ2 (0.1mSタイマ) SUBROUTINE
;*****************************
STMR2:
;---- タイマ2 割込み許可 ----
LDS R_TEMP1,TIMSK2 ; タイマ割込許可
SBR R_TEMP1,(1<<TOIE2)
STS TIMSK2,R_TEMP1
;---- タイマ2 開始----
CBR R_FLAG1,(1<<B_IOVF2) ; タイマ2オーバーフローフラグクリア
LDI R_TEMP1, 0x9C ; 割込時間0.1mS
STS TCNT2, R_TEMP1
LDI R_TEMP1, 0x01 ; プリスケーラ 1
STS TCCR2B, R_TEMP1
STMR2_1:
SBRS R_FLAG1,B_IOVF2 ; タイマ0カウント完了判定
RJMP STMR2_1 ; カウント中
;---- タイマ 停止 ----
LDI R_TEMP1, 0x00
STS TCCR2B, R_TEMP1
;---- タイマ2 割込み禁止 ----
LDS R_TEMP1,TIMSK2
CBR R_TEMP1,(1<<TOIE2)
STS TIMSK2,R_TEMP1
RET
;*****************************
; タイマ0 (10mSタイマ) SUBROUTINE
;*****************************
STMR0:
;---- タイマ0 割込み許可 ----
LDS R_TEMP1,TIMSK0 ; タイマ割込許可
SBR R_TEMP1,(1<<TOIE0)
STS TIMSK0,R_TEMP1
;---- タイマ0 開始----
CBR R_FLAG1,(1<<B_IOVF0) ; タイマ0オーバーフローフラグクリア
LDI R_TEMP1, 0xD9 ; 割込時間10mS
OUT TCNT0, R_TEMP1
LDI R_TEMP1, 0x04 ; プリスケーラ 256
OUT TCCR0B, R_TEMP1
STMR0_1:
SBRS R_FLAG1,B_IOVF0 ; タイマ0カウント完了判定
RJMP STMR0_1 ; カウント中
;---- タイマ 停止 ----
LDI R_TEMP1, 0x00
OUT TCCR0B, R_TEMP1
;---- タイマ0 割込み禁止 ----
LDS R_TEMP1,TIMSK0
CBR R_TEMP1,(1<<TOIE0)
STS TIMSK0,R_TEMP1
RET
;*****************************
; USART 送信
;*****************************
;UARTS:
; LDS R_TEMP0,UCSR0A
; SBRS R_TEMP0,UDRE0
; RJMP UARTS
; STS UDR0,R_TEMP3
; RET
;*****************************
; LCD WAIT処理
;*****************************
LCDW:
CBI PORTC,B_LCD_E
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
SBI PORTC,B_LCD_E
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
RET
;*****************************
; LCD 表示処理
;*****************************
;*************************************************
; 引数で渡されたキャラクタを表示する
; 引数 R_TEMP3 キャラクタフォント
;*************************************************
LCDP:
OUT P_LCD,R_TEMP3
RCALL LCDW
SWAP R_TEMP3
OUT P_LCD,R_TEMP3
RCALL LCDW
RET
;*****************************
; LCD 初期化処理
;*****************************
LCDI:;■■■■ ファンクションセット ■■■■
;********* 初期セットモードへの移行 ******************************
NOP
CBI PORTC,B_LCD_RS
NOP
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- タイマー(10mS)セット ----
LDI R_TMR2,0x64 ; 10mSでフラグセット
RCALL STMR2
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;********* 各種設定 ******************************
;---- 4bit-mode セット ----
LDI R_TEMP1,0b00100000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- 2-line,5x8dot-font セット ----
LDI R_TEMP3,0b00101000
RCALL LCDP
;---- display off セット ----
LDI R_TEMP3,0b00001000
RCALL LCDP
;---- display クリア ----
LDI R_TEMP3,0b00000001
RCALL LCDP
;---- entry-mode セット ----
LDI R_TEMP3,0b00000110
RCALL LCDP
;---- display on セット ----
LDI R_TEMP3,0b00001100
RCALL LCDP
SBI PORTC,B_LCD_RS
RET
;*************************************************
; LCD 起動表示
;*************************************************
LCDS:
;---- リターンホーム ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b00000010
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- display クリア ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b00000001
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- 1行目表示 ----
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'W'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'C'
RCALL LCDP
LDI R_TEMP3,'O'
RCALL LCDP
LDI R_TEMP3,'M'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'T'
RCALL LCDP
LDI R_TEMP3,'O'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'T'
RCALL LCDP
LDI R_TEMP3,'H'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
;---- 2行目先頭へ ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b11000000
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- 2行目表示 ----
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'C'
RCALL LCDP
LDI R_TEMP3,'D'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'S'
RCALL LCDP
LDI R_TEMP3,'A'
RCALL LCDP
LDI R_TEMP3,'M'
RCALL LCDP
LDI R_TEMP3,'P'
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
RET
;*************************************************
; LCD 動作表示
;*************************************************
;LCDM:
;---- リターンホーム ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b00000010
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- display クリア ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b00000001
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- 1行目表示 ----
; LDI R_TEMP3,'R'
; RCALL LCDP
; LDI R_TEMP3,'='
; RCALL LCDP
;---- 2行目先頭へ ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b11000000
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- 2行目表示 ----
; LDI R_TEMP3,'S'
; RCALL LCDP
; LDI R_TEMP3,'='
; RCALL LCDP
; RET
;*****************************
; メインルーチン(MAIN)
;*****************************
MAIN:
CLI ; 全割込み禁止
;---- PORT 設定 ----
;LDI R_TEMP1,0b11111111
;LDI R_TEMP2,0b00000000
;OUT DDRB,R_TEMP1
;OUT PORTB,R_TEMP2
LDI R_TEMP1,0b11110000
LDI R_TEMP2,0b00101111
OUT DDRC,R_TEMP1
OUT PORTC,R_TEMP2
LDI R_TEMP1,0b11111111
LDI R_TEMP2,0b00000000
OUT DDRD,R_TEMP1
OUT PORTD,R_TEMP2
;---- USART 設定 ----
;LDI R_TEMP1,25
;STS UBRR0L,R_TEMP1
;LDI R_TEMP1,0
;STS UBRR0H,R_TEMP1 ; ボーレート2400
;LDS R_TEMP1,UCSR0C
;SBR R_TEMP1,((1<<UCSZ01)+(1<<UCSZ00)) ; ノンパリティ/1ストップビット/8ビット長
;STS UCSR0C,R_TEMP1
;LDS R_TEMP1,UCSR0B
;SBR R_TEMP1,((1<<RXEN0)+(1<<TXEN0)) ; 送受信イネーブル
;STS UCSR0B,R_TEMP1
;---- フラグ・ワークレジスタ 初期化 ----
LDI R_FLAG1, 0x00
SEI ; 全割込み許可
;---- LCD(液晶パネル) 初期化 ----------------------
RCALL LCDI
;---- LCD(液晶パネル) 起動表示 ----------------------
RCALL LCDS
;---- タイマ(2秒) ----
;LDI R_TMR0,0xC8
;RCALL STMR0
;---- LCD(液晶パネル) 動作表示 ----------------------
;RCALL LCDM
;---- LCD 文字初期表示位置設定 ----------------------
;LDI R_TEMP4,0x82
MAIN01:
;---- 1文字受信 ----
;LDS R_TEMP1,UCSR0A
;SBRS R_TEMP1,RXC0
;RJMP MAIN01 ; 受信バッファが空
;LDS R_TEMP5,UDR0
;---- LCD 文字表示位置 最終桁+1判定 ----------------------
CPI R_TEMP4,0x90
BREQ MAIN10 ; 最終桁+1である
MAIN02:
;---- LCD 受信文字表示位置設定 ----------------------
;CBI PORTC,B_LCD_RS
;MOV R_TEMP3,R_TEMP4
;RCALL LCDP
;SBI PORTC,B_LCD_RS
;---- LCD(液晶パネル) 受信文字表示 ----------------------
;MOV R_TEMP3,R_TEMP5
;RCALL LCDP
;---- LCD 送信文字表示位置設定 ----------------------
;CBI PORTC,B_LCD_RS
;MOV R_TEMP3,R_TEMP4
;LDI R_TEMP1,0x40
;ADD R_TEMP3,R_TEMP1
;RCALL LCDP
;SBI PORTC,B_LCD_RS
;---- 受信文字 判定 ----------------------
;CPI R_TEMP5,'T'
;BRNE MAIN20 ; 受信文字が'T'でない
;IN R_TEMP3,P_SW0 ; 受信文字が'T'である
;ANDI R_TEMP3,0x0F ; 不要ビットマスキング
;LDI R_TEMP1,0x0F
;EOR R_TEMP3,R_TEMP1 ; リアルコード→コンプリメンタリコード変換
;LDI R_TEMP1,0x30
;ADD R_TEMP3,R_TEMP1
MAIN03:
;---- 1文字送信 ----
;RCALL UARTS ; パソコン転送
;---- LCD(液晶パネル) 送信文字表示 ----------------------
;RCALL LCDP
;INC R_TEMP4
;RJMP MAIN01
MAIN10:
;---- LCD(液晶パネル) 動作表示 ----------------------
;RCALL LCDM
;---- LCD 文字初期表示位置設定 ----------------------
LDI R_TEMP4,0x82
RJMP MAIN02
MAIN20:
;LDI R_TEMP3,'X'
RJMP MAIN03
2024年3月17日日曜日
PIC pickit3shield
PIC10F322 + PICKIT3 + Windows11 + MPLAB + MCCの環境構築が大変だった件 #PIC10F200 - Qiita
こんばんは。MCCはそれぞれ別のバージョンがインストールでき
-----------------------------------------------------------------------------------
【PIC】PICの使い方を解説する-PICKIT3とMPLABを使うよ!- - TRY-AND-ERROR-AND-TRY (aisumegane.com) 中華pickit3のつなぎかた pic16f1827,pic121822,12lf1840のセットのしかたが詳しい ちなみにpickit4と違い、5vの外部電源を外付け必要(uspisp同様)
PICを使ってLチカ|キム日記 (kimudiary.com) も参考になった
PIC16F18313 MPLAB+MCC+MPLAB-SNAPでの書籍あり これはmplab6以降,mccも5? pickit4/mplab-snap用
2024年3月16日土曜日
usart on atmega88/328
2進化10進のコードが難解なのでTをいれたら0,それ以外をいれたらXが返るようにした
;; USART.ASM RX/TX :: TERATERM 2400BAUD SUCCESS!
.include "m88def.inc"
.def STACK = R16
.def R_TEMP1 = R17
.def R_TEMP2 = R18
.def R_TEMP3 = R19
.EQU P_SW0 = PINC ;SW0
.CSEG
RJMP MAIN
;;---------------------------
;; USART SEND ROUTINE
;;-----------------------
UARTS:
LDS R_TEMP1,UCSR0A
SBRS R_TEMP1,UDRE0
RJMP UARTS
STS UDR0,R_TEMP3 ; R_TEMP3 VAL SETUP IN MAIN ROUTINE
RET
; --------------- MAIN ROUTINE ---------------------
MAIN:
CLI
LDI R_TEMP1,0b11110000
LDI R_TEMP2,0b00001111
OUT DDRC,R_TEMP1
OUT PORTC,R_TEMP2
; -- USART INIT
LDI R_TEMP1,25
STS UBRR0L,R_TEMP1
LDI R_TEMP1,0
STS UBRR0H,R_TEMP1 ; BAUD RATE 2400
LDS R_TEMP1,UCSR0C
SBR R_TEMP1,((1<<UCSZ01)+(1<<UCSZ00))
STS UCSR0C,R_TEMP1 ; NO-PARI/1STOP/8BIT-LEN
LDS R_TEMP1,UCSR0B
SBR R_TEMP1,((1<<RXEN0)+(1<<TXEN0))
STS UCSR0B,R_TEMP1 ; TX/RX ENABLE
SEI
MAIN01:
LDS R_TEMP1,UCSR0A ; 1 CHAR RECV
SBRS R_TEMP1,RXC0
RJMP MAIN01
LDS R_TEMP3,UDR0 ; RECV BUFFER IS EMPTY
CPI R_TEMP3,'T'
BRNE MAIN10 ; IF NOT T,GOTO MAIN10
;IN R_TEMP3,P_SW0 ;IF T, UNUSED BITS MASKING
;ANDI R_TEMP3,0x0F
;LDI R_TEMP1,0x0F
;EOR R_TEMP3,R_TEMP1 ; REAL CODE -> COMPLEMENTARY CODE CONV
LDI R_TEMP3,0x00
LDI R_TEMP1,0x30
ADD R_TEMP3,R_TEMP1
MAIN02:
RCALL UARTS ; CONVERTED CHAR SEND TO PC
RJMP MAIN01
MAIN10:
LDI R_TEMP3,'X'
RJMP MAIN02
ーーーーーーーーーーーATMEGA88 SEND TO PC ----------------------------
以下のコードはinoにしてarduinoIDEは通らんかったのでcにしてmicrochip studioで成功
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL いらんかも。。。
// +-----------------------------------------------------------------------+ //
// | ATmega328p Baudrate calc is as below を88に変更
// +--https://qiita.com/k_match/items/c99d25adf6b1a984061f
//---------------------------------------------------------------------+ //
#define BAUD_RATE_2400_BPS 25 // 2400bps
// +-----------------------------------------------------------------------+ //
int main()
{
int i = 0;
unsigned int ubrr = BAUD_RATE_2400_BPS;
unsigned char data[] = "Hello from ATmega88 ";
/* Set Baudrate */
UBRR0H = (ubrr>>8);
// Shift the 16bit value ubrr 8 times to the right and
// transfer the upper 8 bits to UBBR0H register.
UBRR0L = (ubrr);
// Copy the 16 bit value ubrr to the 8 bit UBBR0L register,
// Upper 8 bits are truncated while lower 8 bits are copied
UCSR0C = 0x06; /* Set frame format: 8data, 1stop bit */
UCSR0B = (1<<TXEN0); /* Enable transmitter */
while(1) /* Loop the messsage continously */
{
i = 0;
while(data[i] != 0) /* print the String "Hello from ATmega328p" */
{
while (!( UCSR0A & (1<<UDRE0))); /* Wait for empty transmit buffer */
/* When UDRE0 = 0,data transmisson ongoing. */
/* So NOT{[UCSR0A & (1<<UDRE0)] = 0} = 1 ,While(1) loop stays there */
/* When UDRE0 = 1,data transmisson completed. */
/* So NOT{[UCSR0A & (1<<UDRE0)] = 1} = 0 ,While(0) loop fails */
UDR0 = data[i]; /* Put data into buffer, sends the data */
i++; /* increment counter */
}
/* Sending '\n' '\r' Character pair helps to format the output properly on console putty Screen */
/*************************************************************/
/* Send "\n" Character */
while (!( UCSR0A & (1<<UDRE0))); /* Wait for empty transmit buffer */
UDR0 = '\n'; /* Put data into buffer, sends the data */
/* Send "\r" Character */
while (!( UCSR0A & (1<<UDRE0))); /* Wait for empty transmit buffer */
UDR0 = '\r'; /* Put data into buffer, sends the data */
/*---------------------------------------------------------------------------*/
_delay_ms(100);
}
}