WinAVRのお作法

WinAVR固有の書き方についてメモ


●インクルード


// まずはIOレジスタの定義
#include
// 割り込み書くならこれも
#include
●割り込みイネーブル/ディセーブル

// 割り込みイネーブル 書いとかないと割り込みかからない
sei();
// 割り込みディセーブル
cli();
●割り込みハンドラ
ISR(割り込みベクタ名){処理}というマクロを使って書く。
ベクタ名はavr-libc Manual参照
(WinAVR-*/doc/avr-libc/avr-libc-user-manual/group__avr__interrupts.html)

ISR(USART_RX_vect)
{
// USART受信割り込み処理
;
}
●IOレジスタのビット
はビットフィールドでもマスクでもなくビット番号が定義されてる

// (例) UCSR0BレジスタのRXCIE0ビットとRXEN0ビットを立てる
UCSR0B |= ( ( 1 << RXCIE0 ) | ( 1 << RXEN0 ) );
●2進数
GCCなので0b表記が使えるよ。僕は移植性重視で使わないけど。
C言語の標準に2進数表記法がないのは返す返すも残念なことだ。


●インラインアセンブラ
WinAVR-*/doc/avr-libc/avr-libc-user-manual/inline_asm.html 参照
引数もとれる
asm(アセンブラコード : 出力引数 : 入力引数 [: 壊すレジスタ]);
改行文字とタブ文字忘れずに

__asm__ __volatile__ (
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
::);
●ビットマスク
_BV()というマクロが用意されてる

PORTA |= _BV(0); // bit0のセット
PORTB &= ~_BV(7); // bit7のクリア