使用定时器中断闪烁 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
从 <
更改为 <=
,如下所示:
if (count <= 625)
【讨论】:
非常感谢。我按照你的建议修复了它,它立即起作用了。 太棒了!请花一点时间选择我的答案作为您问题的正确答案。以上是关于使用定时器中断闪烁 LED(atmega 128)的主要内容,如果未能解决你的问题,请参考以下文章
Arduino ESP8266利用定时器中断控制LED闪烁示例程序
STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁
STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁