2016-07-11 14 views
0

基本的には、単にライトをオンにするためにISR(割り込みサブルーチン)を設定しようとしていますが、ISRは実行されていないようです。私は何か間違っているかどうかを確認するためにマイクロコントローラのデータシートを見てきましたが、何も見つかりませんでした。タイマ比較一致のISRが実行されていない

Heres my code。

#include <asf.h> 

int main (void) { 
    DDRD = 0b10000000; 

    cli();        // turn off global interrupts 
    //Timer 
    TCCR2A |=_BV(WGM21);    //CTC mode 
    TCCR2B |=_BV(CS22)|_BV(CS21);  //clk pre-scale 1/256 
    OCR2A = 0x7d;      //125clk cycles = 2ms 
    TIMSK2 |=_BV(OCIE2A);    //enable interrupt on compare matchA 
    TIFR2 |= _BV(OCF2A);    //clear flag 
    TCNT2 = 0x00;      // reset counter 
    sei();        // enable global interrupts 
} 

ISR(TIMER2_COMPA_vect) { 
    PORTD = 0b10000000; 
} 
+1

ISRの割り込みフラグをクリアしていますか? –

+0

割り込みをオフにしてポーリングすると(割り込みではなく、他のすべて、フラグのクリアなど)、ポーリングすると機能しますか? –

答えて

4

はあなたのmain()関数の最後で無限ループを持つ必要があります:あなたのAVRは未定義の状態に達する

#include <asf.h> 

int main (void) { 
    DDRD = 0b10000000; 

    cli();        // turn off global interrupts 
    //Timer 
    TCCR2A |=_BV(WGM21);    //CTC mode 
    TCCR2B |=_BV(CS22)|_BV(CS21);  //clk pre-scale 1/256 
    OCR2A = 0x7d;      //125clk cycles = 2ms 
    TIMSK2 |=_BV(OCIE2A);    //enable interrupt on compare matchA 
    TIFR2 |= _BV(OCF2A);    //clear flag 
    TCNT2 = 0x00;      // reset counter 
    sei();        // enable global interrupts 
    while(1); 
} 

ISR(TIMER2_COMPA_vect) { 
    PORTD = 0b10000000; 
} 

無限ループがなければ!

+0

ありがとう、それは問題だった、それは今働く。 –

+0

_無限ループなしに、あなたのAVRは未定義状態になります!_ - そうではありません。状態はかなり定義されています:割り込みは無効になり、無限ループが実行されます。 –

関連する問題