AVRのタイマ割り込みを使う
タイマカウンタ
タイマカウンタとはクロックのタイミングを数えて割り込みや波形出力を行うことができる機能ブロックである。 ATmega168の8ビットタイマカウンタ0を例に使い方をメモする。
タイミングを数えるということをより具体的にいえば、
クロックの信号の立ち上がりのときに、
タイマカウンタに格納している8ビットのデータに1加えるということである。
8ビットでは0~255(2の8乗)まで表現できる。
クロックとタイマの挙動
標準動作
タイマカウンタは255のときに信号の立ち上がりが来ると、 データをリセットして再び0からカウントを始める。このリセットするタイミングで割り込みを発生することができるので、 256usごとに処理を行うといったことが可能である。
割り込みを使用するには、ヘッダファイルに
#include <avr/interrupt.h>タイマ割り込みの設定として、
TIMSK0 = 0b0000010; //比較A一致割り込み有効と記述する必要がある。
このようにタイマカウンタのMAX値255でリセットする動作を標準動作と呼ぶ。
この動作はタイマの設定のデフォルトである。
TCCR0A = 0b00000000; //標準動作、分周なし TCCR0B = 0b00000001;
CTC動作
データをリセットするタイミングを指定することもできる。 タイマカウンタが設定したTOP値に一致するとリセットする動作をCTC動作 (Clear Timer on Compare Match Mode)と呼ぶ。TOP値はOCR0Aの値で設定する
この動作を利用するには以下のようにTCCR0A,TCCR0Bを設定する。
TCCR0A = 0b00000010; //CTC動作、分周なし TCCR0B = 0b00000000; OCR0A = 199; //200usecで割り込み
標準動作とCTC動作
分周
クロックを分周することで長い時間も測ることができる。
図に示すように分周比の値をクロック周期を掛け算して分周後の周期を求められる。
分周の設定は、
TCCR0B=0b00000***;*の部分で設定する。分周比はアトメル社ATmega168データシート104ページを参照。
クロック信号の分周
タイマ割り込みで、5msごとに出力を反転するプログラム
//timer.c //winavr //内蔵クロック1MHz #include<avr/io.h> #include<util/delay.h> #include <avr/interrupt.h> unsigned char i=0; ISR(TIMER0_COMPA_vect) //タイマ割り込み { PINB=0xff;//ポートBを反転 } int main(void) { //タイマ0,CTC,割り込み用、比較A一致で割り込み TCCR0A = 0b00000010; TCCR0B = 0b00000011; // N=64 OCR0A = 78; // 5msごとに割り込み TIMSK0 = 0b0000010; //比較A一致割り込み有効 //方向レジスタの設定 DDRB = 0xff; //B2を出力 DDRD = 0xff; //D5を出力 PORTB = 0xff; //割り込み許可 sei(); while(1){ ; } }
Bポートから出力された波形
Moo (2012年7月29日 11:10)
AVRのPWMを検索していてこちらにお邪魔しております。
ちょい記述ミスがあるようなので書いておきます。
>TCCR0A = 0b00000000; //標準動作、分周なし
>TCCR0B = 0b00000000;
TCCR0Bは「0b00000001」で分周ナシかと思いました(全0はカウント停止)
CLKDIV8の記述も有れば有り難いです。
またお邪魔致します。
どの記事もとても簡潔で分かりやすく助かります。
佐瀬 一弥 (2012年9月10日 23:24)
修正しました。ご指摘ありがとうございます。