AVR
ATmega328Pで割り込みを使う - AVR †
概要 †
昔AVRを使い始めた頃、ATmega328Pでピン変化割り込みを使おうとして割り込みベクタの名前で苦労したので、一応問題発生から解決までのプロセスをメモしておく。
調べてもあまり出て来なかったし。
問題 †
- 調べて出てきたATTinyやmega8用のソースコードをコピペしても動かなかった
- データシートを参照しても、割り込みベクタ名は書かれていなかった
- 以上2つの理由で詰んだ
解決 †
まず、データシートから探そうとしていたのが間違いだった。基本的にレジスタ名などはデータシート上の名前に準拠しているのだが、最終的に名前を規定しているのはavr-libcの中である。よって、avr-libcのリファレンスを参照する必要があった。
avr-libcのリファレンスを読むと、<avr/interrupt.h>のページに割り込みベクタのリストがある。「Vector name」と「Old vector name」に、それぞれ新しいベクタ名と古いベクタ名が書かれている。
これに応じて、ソースコードを変更する。
例えば、このページのソースコードのピン変化割り込み部分は、次のように書ける。
橋本商会 » ATmega168でピン変化割り込み
元のソース:
-
-
|
|
!
-
|
|
!
!
|
SIGNAL(SIG_PIN_CHANGE0){
if(bit_is_set(PINB, PB1)){ LED_SET(); usart_sendStr("PB1_HIGH\r\n");
}
else{
LED_CLR(); usart_sendStr("PB1_LOW\r\n");
}
}
|
書き換え後:
-
-
|
|
!
-
|
|
!
!
|
ISR(PCINT0_vect){
if(bit_is_set(PINB, PB1)){ LED_SET(); usart_sendStr("PB1_HIGH\r\n");
}
else{
LED_CLR(); usart_sendStr("PB1_LOW\r\n");
}
}
|
これで動作するようになる。
最後に †
AVRには日本語情報があるようでない。また、存在する日本語情報も古すぎて使いものにならないものが多くある。基本的には自分でデータシートなりavr-libcのリファレンスを読むようにしたほうが、難解ではあるかもしれないが、最終的に得られる知識も多く、問題の解決にかかる時間も短く済む。