普段TinyやMegaのAVRを使っていて、今日初めてXMEGAなAVR(ATXMEGA32A4U)を
使って入出力周りのレジスタの表記がガラッと変わっていて驚いたので使い方をメモ。
XMEGAはMegaみたいにDDRD = 0xFFって書いてもダメなのね。
役割 | Tiny & Megaでの表記例 | XMEGAでの表記例 |
---|---|---|
ポート入出力方向の設定 | DDRB = 0xFF | PORTB.DIRSET = 0xFF |
PORTB.DIR = 0xFF | ||
PORTB_DIR = 0xFF | ||
ポートへの数値の設定 | PORTA = 0x0B | PORTA.OUTSET = 0x0B |
PORTA.OUT = 0x0B | ||
PORTA_OUT = 0x0B | ||
ポートの特定bitの反転 | PORTA = 0x0F ^ PORTA | PORTA.OUTTGL = 0x0F |
こう見てみると例えばPORTA.OUT = 0xFF と PORTA.OUTSET = 0xFF は意味同じやんけって思うけど、
実際は微妙に違うらしく、
PORTx.OUTSETの方は「レジスタの1が立ってる場所を1に設定」って意味で
1を立てる事はできるけど、0を立てる事は出来ない。
PORTx.OUTの方は単純に「出力ポートレジスタに値を代入」って意味で
こっちは普通に0を立てることもできる。
だから
PORTA.OUT = 1; while(1) { PORTA.OUT = PORTA.OUT << 1; }
このwhileループと
PORTA.OUT = 1; while(1) { PORTA.OUTSET = PORTA.OUTSET << 1; }
このwhileループでは動作が全く違う。(分かりにくい例でごめんね J('ー` )し)
もうちょっと例を出すと、
sbi(PORTA,1); と PORTA.OUTSET = 1; が同じで
PORTA = 1; とは違うよねってそんな感じ。
ぶっちゃけTinyやMegaで値の代入に慣れきってるとOUTSETのありがたみが分からない・・・