タイマ/カウンタの割り込み


注意!このページを読んだことによる如何なる損害に対しても筆者は責任を取りません。
参考にされる場合は全て自己責任で行ってください。


マイコンを使うに当たって重要な要素のひとつにタイマ/カウンタが挙げられる。レジスタの設定等も重要だが、与えられたクロックから自分の欲しい周波数を作り出すのはなかなか面倒くさいものがある。そこで、ここには良く使うクロック周波数から10の累乗の周波数を作り出す解を蓄積していこうと思う。
使用できる分周は普段使用するAVRマイコンでサポートされている 1/8/32/64/128/256/1024 に限定する。
また、タイマ/カウンタ1をCTC動作させて使用する際の例を合わせて書く。


クロック周波数 / 分周 / 比較一致クリア(CTC)TOP値 = 取得周波数


◆ ◆◆◆ ◆


8MHz / 256 / 31250 = 1Hz

8MHz / 256 / 3125 = 10Hz

8MHz / 64 / 1250 = 100Hz

8MHz / 64 / 125 = 1kHz

8MHz / 8 / 100 = 10kHz

8MHz / 8 / 10 = 100kHz

8MHz / 8 / 1 = 1MHz


12MHz / 256 / 46875 = 1Hz

12MHz / 64 / 18750 = 10Hz

12MHz / 64 / 1875 = 100Hz

12MHz / 8 / 1500 = 1kHz

12MHz / 8 / 150 = 10kHz

12MHz / 8 / 15 = 100kHz

12MHz / 1 / 12 = 1MHz


20MHz / 64 / 31250 = 10Hz

20MHz / 64 / 3125 = 100Hz

20MHz / 8 / 2500 = 1kHz

20MHz / 8 / 250 = 10kHz

20MHz / 8 / 25 = 100kHz

20MHz / 1 / 20 = 1MHz







以下はPD0に接続したLEDを1秒間隔で点滅させるプログラム。
デバイスには手持ちのmega48を使用。mega88でも同様に使用できると思う。


/***************************************************
device:        mega48
clk:         8MHz
    
written by yosio @ chocolatespeaker
2009/09/26
***************************************************/
    
#include <avr/io.h>
#include <avr/interrupt.h>
    
//****************************
//割り込み 1Hz  8MHz動作時
//8M/256/31250=1Hz
//****************************
ISR(TIMER1_COMPA_vect){
    PORTD= ~PORTD & 0x01;
}
    
//****************************
//メイン関数定義
//****************************
int main(void){
    
/*16ビットタイマ カウンタ1 レジスタ設定*/
    TCCR1A = 0;
    TCCR1B = (1<<WGM12)|(1<<CS12);    //クロックの分周指定(256分周),CTC動作指定
    TCCR1C = 0;
    TIMSK1 = (1<<OCIE1A);    //A比較一致割り込み許可
    OCR1A  = 31250;        //カウントクロック数(比較一致)
 
/*入出力ポート設定*/
    PORTD = 0x00;    //ポートD初期値設定
    DDRD  = 0xFF;    //ポートDを全て出力に設定
    
    sei();        //全割り込み許可
    
    for(;;);    //無限ループ
    
    return 0;
}



タイマ/カウンタ0,1の主要レジスタ
レジスタ名 7 6 5 4 3 2 1 0
8ビット タイマ/カウンタ0
TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
TCCR0B FOC0A FOC0B - - WGM02 CS02 CS01 CS00
TIMSK0 - - - - - OCIE0B OCIE0A TOIE0
OCR0A 比較Aレジスタ(CTC動作のTOP値を指定する)
16ビット タイマ/カウンタ1
TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11 WGM10
TCCR1B ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
TCCR1C FOC1A FOC1B - - - - - -
TIMSK1 - - ICIE1 - - OCIE1B OCIE1A TOIE1
OCR1A 比較Aレジスタ(CTC動作のTOP値を指定する)


カウンタ0,1の分周表(x=0or1)
CSx2CSx1CSx0意味
 0 0 0停止
 0 0 1分周なし
 0 1 08分周
 0 1 164分周
 1 0 0256分周
 1 0 11024分周
 1 1 0T0ピンの上昇端
 1 1 1T0ピンの下降端
 
カウンタ2の分周表
CS22CS21CS20意味
 0 0 0停止
 0 0 1分周なし
 0 1 08分周
 0 1 132分周
 1 0 064分周
 1 0 1128分周
 1 1 0256分周
 1 1 11024分周



2009/10/07  内容追加
2009/09/26  内容追加
2009/09/18  文書作成

HOME /AVR_TOP inserted by FC2 system