人気ブログランキング | 話題のタグを見る

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 の PORTB 定義 (33) (11/29)

AVRやarduino のC/C++ソースをいつも見てて気持ち悪い気分がしていた。

PORTB = 0x0A; /* C/C++ */
または
PORTB = 0b00001010; /* C++14から0bプレフィックス可能 */
と書いている。

PORTBが単なる数値ならこんな事は出来ない。
#define P_PORTB (unsinged char *)base_addr
とかなっていないと。
でもマイクロソフトの悪習だったが、LPSTRなどと変数の型がわかるように定義するものだ。
でなければ、
EECR
EEPE
の2つのマクロがぱっと見、ポインタなのか値なのか全然わからない。慣れればいいってものじゃ。

これは<avr/io.h>に何か仕掛けがあると思って、ずっと探していた。
だが<avr/sfr_defs.h>の方だったorz

ソースはSpecial Function Register=I/Oレジスタの事で、色々定義が絡み合っている。
こちらのサイト様で確信を持った次第だ。
AVR avr/io.h インクルードファイルは一体何をしているのか??: マイコン漬け

こちらにあるように、ページ末尾にはマクロ定義を使わないで直接アドレス指定してポートアクセスしている次のページへのリンクもある。

つまり、ATtiny13なら、
__SFR_OFFSET = 0x20
なので、
#define PORTB (*(volatile uint8_t *)(0x18 + 0x20))
なのだ。

ふぅ、納得いった。
いっそこのように定義してincludeしないくらいじゃないと。

by k1segawa | 2016-11-29 21:19 | arduino, AVR | Comments(0)

by k1segawa