ISR для Timer Compare Match не работает

так что в основном я пытаюсь настроить 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;
}

person Victor Mitchell    schedule 11.07.2016    source источник
comment
Вы сбрасываете флаг прерывания в ISR?   -  person Koorosh Hajiani    schedule 12.07.2016
comment
работает ли он при опросе с отключенными прерываниями (не прерывание, а все остальное, сброс флагов и т.д.)?   -  person old_timer    schedule 12.07.2016


Ответы (1)


У вас должен быть бесконечный цикл в конце вашей функции 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 переходит в неопределенное состояние!

person netzzwerch    schedule 12.07.2016
comment
Большое спасибо, это была проблема, теперь все работает. - person Victor Mitchell; 12.07.2016
comment
Без бесконечного цикла ваш AVR переходит в неопределенное состояние! -- это неправда. Состояние в значительной степени определено: прерывания отключены и выполняется бесконечный цикл. - person Aleksander Z.; 11.08.2016