User Tools

Site Tools


Sidebar

製作物
燃焼系
自動車ターボ流用ジェットエンジン
空き缶パルスジェットエンジン

弱電系
半導体式γ線検出器
半導体式α線検出器
AVRプログラム集

強電系
オーディオフライバックトランス
テスラコイル1号機(PWM式)
テスラコイル2号機(DRSSTC)
テスラコイル3号機(DRSSTC)
TIG溶接機
バッテリー溶接機1号機
バッテリー溶接機2号機
HeNeレーザー
ZVSドライバ

化学系
塩化銅エッチング

その他
雑多な物、便利な技など
FETの死亡診断
表面実装部品の取り外し
ICのシリコンダイの取り出し
バッテリー溶接
放射性鉱物探し
工具の消磁
特性不明なコア材の特性調べ
携帯の温度センサーの騙し方



過去のBlog記事一覧

他サイトへのリンク

管理人の連絡先など
管理人のYoutube
管理人のTwitter

blogspace:xmegaの入出力レジスタ周り

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のありがたみが分からない・・・

blogspace/xmegaの入出力レジスタ周り.txt · Last modified: 2014/03/03 21:59 by hirosi