简单的avr程序表现奇怪“有时”

时间:2012-01-28 01:32:18

标签: button avr led atmega16

我是AVR的新手,但我以前编程过PIC,只是这次我在linux上做了所有事情,所以你猜我正在使用avrdude ......

我的目标是根据特定状态更改双色LED的颜色。

默认情况下,LED是RED(如果你当然正确连接),那么我希望它转到黄色(这是绿色和红色之间的快速更改)按住按钮然后按下释放,它将变为绿色,然后下次它将关闭。

所以,回顾一下,

LED 红色

当我按住按钮时,它将黄色

当我发布时,它将是绿色

当我再次按下按钮时,它将黄色

当我发布时,它将关闭

当我再次按下按钮时,它将黄色

当我发布时,它将是红色(依此类推......)

在我的实际代码中,有时候一切都运行良好,但有时候led会陷入黄色并且我不知道为什么

有什么想法吗?

代码在ideone上:http://ideone.com/LI9gH

谢谢

2 个答案:

答案 0 :(得分:1)

我不知道问题出在哪里,但如果有帮助,我可以提出另一种方法。 : - )

因为你在一系列LED状态中循环,你只能将它们列在一个数组中并沿着它走(当你到达终点时环绕),每当按钮状态改变时,每次更新LED。 / p>

编辑:

这是另一种选择:

colours = [red, yellow, green, yellow, off, yellow]
current button = released
state = 0
repeat
    check button
    if button != current button
        current button = button
        state += 1
        if state >= len(colours)
            state = 0
    // showing the colour sets the LED and includes a delay
    show colours[state]

答案 1 :(得分:1)

我猜你只是看到随机发生器错过按钮的变化大约1/3的时间,因为去抖动稍微偏离了。考虑在不同状态下花费的时间:

check button
wait 10ms
check button again
if button values differ, update state
if yellow
  shine red for 1ms
  shine green for 4ms then leave green on
otherwise
  set current color

那是你的主循环。如您所见,它在大约15ms的时间内在两个时刻检查按钮;并且它不会与更新状态的最后一个值进行比较,只能使用10ms之前的值。在“黄色”的5ms周期内释放按钮,allumerAmbre将不会重置,直到下一个版本恰好落在10ms周期内。此外,黄色缠绕1/15红色,可能不是你想要的混合。