AVRマイコン-タイマ割り込み
前回登場したタイマ割り込みについて詳細は省いて簡単に説明します。
コード
#include <avr/interrupt.h>
ISR(TIMER0_COMPA_vect)
{
// ここに書いたプログラムが実行されます
}
int main(void)
{
/* タイマ割り込み設定 */
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000101; // 1MHz/1024 = 約977Hz→約1kHz
OCR0A = 5; // 5msで割り込み
TIMSK0 = 0b00000010; // COMPA割り込み
}
クロック周波数は1MHzで5ms毎に割り込みを発生させます。
1MHzは1,000,000クロック/秒なので1クロック1/1,000,000秒=1μ秒です。その為プリスケーラというものを使って元のクロック周波数を落とします。clk/8、clk/64、clk/256、clk/1024と落とすことが出来ます。今回はclk/1024を使って、1,000,000 / 1024 = 976.56… ≒ 1kHZとなります。そうすると1クロック約1m秒です。TCNT0は8ビット・タイマ/カウンタ0という名前の通り8bitなので255までカウント出来ます。つまり256m秒まで数えられます。
レジスタ設定
各レジスタの今回の設定です。
今回はCTCモードで使いますのでWGM00を「0」WGM01を「1」WGM02を「0」にします。
プリスケーラをclk/1024にするにはCS00を「1」CS01「0」CS02「1」とします。
OCIE0Aに「1」をセットするとタイマ/カウンタ0アウトプット・コンペア・マッチAインタラプトが有効になります。TCNT0はクロックの度にインクリメント(1ずつ増える)されます。TCNT0とOCR0Aが一致したらTCNT0は0にクリアされ、タイマ/カウンタ0インタラプト・フラグ・レジスタTIFR0のタイマ/カウンタ0アウトプット・コンペアAマッチ・フラグOCF0Aがセットされ割り込みが発生します。OCR0Aを「5」としておけば約5msで割り込みが発生します。
タイマ割り込みには他にPWMモードなどあります。