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

Posted

技术标签:

【中文标题】使用定时器中断闪烁 LED(atmega 128)【英文标题】:blinking an led using timer interrupt (atmega 128) 【发布时间】:2017-12-08 07:20:54 【问题描述】:

我正在尝试在不使用延迟功能的情况下使 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)
    

【问题讨论】:

“程序似乎不起作用”是什么意思?你能详细说明一下吗?请read about how to ask good questions。最后idownvotedbecau.se/itsnotworking 很抱歉。这是我第一次在这个网站上提问!问题是程序正在编译没有任何错误,但指示灯不闪烁。我相信它固定在 PORTA=0x01;并且 ISR 功能不起作用。我的编码有问题吗? @NicholasLee 您的调试有问题。使用您的 JTAG 或其他调试接口在中断处理程序上放置断点。如果您没有调试接口,请获取一个。你会需要它。 【参考方案1】:

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

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

if (count <= 625) 

【讨论】:

非常感谢。我按照你的建议修复了它,它立即起作用了。 太棒了!请花一点时间选择我的答案作为您问题的正确答案。

以上是关于使用定时器中断闪烁 LED(atmega 128)的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP8266利用定时器中断控制LED闪烁示例程序

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32通用定时器实现LED灯闪烁

求高手赐教: 想做一个用CPU定时器0的中断,产生一个每隔一秒LED灯闪烁一次的程序

STM32使用TIM闪烁LED——输出比较方式