はじめに
ATtiny13のTimer0割り込みが機能しねえええええええ!
出だしからすいません。
Timer0割り込みに3時間ほど躓いていた事の記事です。
ATtiny0にはTimer0という8bitタイマカウンタ機能があります。
このTimer0は標準タイマカウンタ、タイマカウンタのTOP値を可変できるCTC、PWMモード2種あります。今回はCTCモードでの比較割り込みを使用する時にドツボにハマった記録です。
おそらく需要はそこまでないかもしれませんが独り言と思って聞いてください。
間違い例
まずは間違いのコードです。3時間くらいにらめっこしていたコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include<avr/io.h> #include<avr/wdt.h> #include <avr/interrupt.h> ISR(TIMER0_COMPA_vect){ //タイマ割り込み PORTB ^= 0b00000001; } void setup() { DDRB = 0b00000001;//PORTB出力設定 PORTB = 0b00000000;//PORTB_LOW TCCR0A = 0b00000010;//CTC TCCR0B = 0b00000101;//1024分周 OCR0A = 117;//0.0998sec TIMSK0 |= 0b00000010;//比較A割り込み sei(); } void loop() { wdt_reset(); } |
私の中ではおよそ100ms間隔でPB0のLEDが点滅することを予定していましたが、うんともすんとも言いません。
ここで間違っているのは以下の2点でした。
- タイマカウンタ比較Aの割り込みベクタ
- タイマカウンタ比較Aの割り込み許可レジスタ設定
ほんと初歩的なミスです。しっかりデータシートを見ればよかったものをATmega88PAを取り扱った本を参考にしていたことがミスでした。
その本では、割り込みベクタを【TIMER0_COMPA_vect】比較A割り込み許可ビットをTIMSK0の1bit目と記載されていましたが、ATtiny13の場合は割り込みベクタが【TIM0_COMPA_vect】で比較A割り込み許可ビットがTIMSK0の2bit目でした。
というか、同じTimer0なのに許可ビットが違うのとか割り込みベクタの名称が違うとか、、、そんなもんなんですかね?何か理由があるのかな。
正解例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include<avr/io.h> #include<avr/wdt.h> #include <avr/interrupt.h> ISR(TIM0_COMPA_vect){ //タイマ割り込み PORTB ^= 0b00000001; } void setup() { DDRB = 0b00000001;//PORTB出力設定 PORTB = 0b00000000;//PORTB_LOW TCCR0A = 0b00000010;//CTC TCCR0B = 0b00000101;//1024分周 OCR0A = 117;//0.0998sec TIMSK0 |= 0b00000100;//比較A割り込み sei(); } void loop() { wdt_reset(); } |
これで動きます。参考にATtiny13の割り込みベクタ表と割り込み許可レジスタを載せときますね。(有志の皆様ありがたく使用させていただきます)
- 割り込みベクタ表(ATtiny13)
- 割り込み許可レジスタ(ATtiny13)
おわりに
今回はATtiny13のTimer0比較A割り込みを使用するときに私がハマった記録でした。
いやー、データシートはちゃんと見ましょうねという事ですね。
では、ばいばい!
コメント