2016-07-11 1 views
0

기본적으로 나는 ISR (인터럽트 서브 루틴)을 설정하여 조명을 켜고 있지만 ISR이 실행되지 않는 것 같습니다. 내가 뭔가 잘못하고 있지만 아무것도 찾을 수 없다면 많이 볼 마이크로 컨트롤러 데이터 시트를 통해 봤어요.ISR for 타이머 비교 일치가 실행되지 않습니다.

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이 정의되지 않은 상태에 도달했습니다! _ - 사실이 아닙니다. 상태는 거의 정의되어 있습니다 : 인터럽트가 비활성화되고 무한 루프가 실행됩니다. –

관련 문제