使用定时器中断闪烁 LED(atmega 128)

blinking an led using timer interrupt (atmega 128)

我试图在不使用延迟功能的情况下使 LED 闪烁。 我遇到了使用定时器中断的情况,我试了一下,它编译得很好。但输出固定在 PORTA = 0x01;所以,我相信 ISR 功能不起作用。代码中有什么我遗漏的吗?谢谢

#include <asf.h>
#include <avr/interrupt.h>

volatile unsigned int count=0;
volatile unsigned int tTime=0;

void port_init(void) {
    PORTA = 0xff;
}

ISR(TIMER0_OVF_vect)
{
    TCNT0 = 206;
    count++;
    if (count < 625) {
        PORTA=0x01;
    }
    else if ((count > 625) && (count < 1250)) {
        PORTA=0x00;
    }
    else {
        count=0;
    }
}

int main (void)
{ 
    board_init();
    port_init();

    TCCR0 = 0x06; //setting dispensing ratio
    TCNT0 = 206; //initial value of register
    TIMSK = 0x01; //enabling interrupt
    SREG=0x80;

    DDRA=0xff;
    while(1){
    }
}

您的 ISR() 函数存在逻辑错误。一旦 count 命中 625,前两个 if/else-if 子句将是 false(因为 625 既不小于也不大于 625),因此最后的 else 子句将执行并将 count 重置为零。这样做的结果是设置 PORTA=0x00 的 else-if 子句永远不会执行。

要修复,请将第一个 if< 更改为 <=,如下所示:

if (count <= 625) {