2016-07-11 33 views
0

所以基本上我試圖建立一個ISR(中斷子程序)只是打開燈,但ISR似乎並沒有運行。我仔細查看了微控制器數據表,看看我是否做錯了什麼,但找不到任何東西。ISR的定時器比較匹配不運行

繼承人我的代碼。

#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()函數的末尾有一個死循環:

#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; 
} 

沒有無限循環您的AVR達到一個不確定的狀態!

+0

非常感謝你,那就是問題,它現在起作用。 –

+0

_沒有無限循環你的AVR達到一個未定義的狀態! - - 這是不正確的。狀態非常明確:中斷被禁用並且執行無限循環。 –