気まぐれ

日々の出来事やプログラミングのことを書いていくブログです。不定期更新かもです。

タイマ0の割り込み

今回はタイマ0を使って1msecのインターバルタイマを作ろうと思いました。

ちなみにコンパイラはC18です。

CPUのクロック周波数は40MHzです。

 

タイマ0なので当然割り込み処理を書くことに...。

今回は優先順位なしでかきました。

 

int timer = 0;

void main(){

    ..........//各種設定(省略)

    while(1){

        //cntの値をダイナミック点灯で表示

        if(timer == 999)++cnt;

    }

}

#pragma interrupt isr0
#pragma code isrcode = 0x08
void isr_direct(void){
    _asm goto isr0 _endasm
}
#pragma code
void isr0(void){
    INTCONbits.TMR0IF = 0;
    WriteTimer0(0xffd9); //1ms
   
    ++timecnt.timer;
    //Here I write the reset condition of "timer 0"
    if(timer == 1000){
        timer = 0;
    }
}

 

が、まったくうごかない

原因がまったくわからないのでとりあえず放置。

5分後くらいにやっと動いた。

しかしcntの値は12までしか増えず、それ以降はまたとまったまま。

 

試行錯誤をしてみる。

すると

if(timer == 999)++cnt;

の部分が怪しいことに気づいた。

なんかうまく比較されていなぁ。

比較している途中に割り込みが発生してるのかも。。。

と思いとりあえず、timerの値が999になったら割り込みの中でフラグを立ててそのフラグを元にcntの値を増やすとうまく動いたーー。

 

とまぁ、今回はこんな感じでした。

 

ちなみにWriteTimer0の値は

カウンタ数=インターバル時間/(CPUクロック・4)

65536-(カウンタ数/プリスケーラの値)

で求めることができます(端数は誤差なので四捨五入して大丈夫なはず)

 

うーん、ハードウェアはどこで何やってるかわからんときがあるから油断できないなぁ。