本质上,这段测试代码的目的是: *启动定时器(硬件定时器)- 打开两个 LED - 等到计时器结束 - 关闭两个 LED - 延迟0.9s - 重新开始。
for (;;) //forever
{
PORTB &= ~_BV(PINB7); //Turn OFF GREEN LED
_delay_ms(900); //RED LED stay off for 0.9s
timer_two(); // start 5 second timer
while(!(TIFR1 & _BV(OCF1A))) //WHILE 5 second timer flag is not set
{
PORTB |= _BV(PINB7); //Turn on GREEN LED
PORTA |= _BV(PINA6); //Turn on RED LED
} //leave while loop when five second timer flag is set
PORTA &= ~_BV(PINA6); //Turn off RED LED #THIS DOESN'T HAPPEN#
}
<小时/>
但是,按照原样编写的代码,两个 LED 都会亮起,但只有绿色 LED 熄灭。绿色 LED 继续按我的预期打开和关闭。
尽管它明显退出了 while 循环(因为它关闭了绿色 LED),但它之后似乎没有执行任何操作。
我在这里错过了一个基本技巧吗?
(代码是在 Windows 上通过 avr-gcc 为 AVR、atmega644p 编译的)
最佳答案
现在已经解决了。
由于计时器创建了中断,LED 似乎根据计时器闪烁。然后程序将重新启动,因为没有给出中断处理程序。这将重置计时器启动前设置的 LED。
禁用所有中断可以使代码正常运行。cli();//禁用中断
关于c - AVR C 编程 - 为什么 while 循环之后的代码没有执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29066654/