XMEGAの入出力レジスタ周り

普段TinyやMegaのAVRを使っていて、今日初めてXMEGAなAVR(ATXMEGA32A4U)を
使って入出力周りのレジスタの表記がガラッと変わっていて驚いたので使い方をメモ。
XMEGAはMegaみたいにDDRD = 0xFFって書いてもダメなのね。

役割Tiny & Megaでの表記例XMEGAでの表記例
ポート入出力方向の設定DDRB = 0xFFPORTB.DIRSET = 0xFF
PORTB.DIR = 0xFF
PORTB_DIR = 0xFF
ポートへの数値の設定PORTA = 0x0BPORTA.OUTSET = 0x0B
PORTA.OUT = 0x0B
PORTA_OUT = 0x0B
ポートの特定bitの反転PORTA = 0x0F ^ PORTAPORTA.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のありがたみが分からない・・・