所以基本上我试图设置一个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;
}

最佳答案

在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达到一个未定义的状态!

关于c - 计时器比较匹配的ISR未运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38317349/

10-13 03:33