Button 简单的avr程序行为怪异;有时";

Button 简单的avr程序行为怪异;有时";,button,avr,led,atmega16,Button,Avr,Led,Atmega16,我是AVR新手,但我之前已经编程过图片,只是这一次我也在linux中做所有事情,所以你会猜到我在使用avrdude 我的目标是改变这个项目的双色LED的颜色取决于特定的状态 默认情况下,led为红色(当然,如果您连接正确),然后我希望它变为黄色(绿色和红色之间的快速切换),当用户按住按钮时,释放时,它将变为绿色,然后下次它将关闭 所以,概括一下 LED为红色 当我按下按钮时,它将变成黄色 当我释放时,它将是绿色的 当我再次按下按钮时,它将变成黄色 当我释放时,它将关闭 当我再次按下按钮时,它将变

我是AVR新手,但我之前已经编程过图片,只是这一次我也在linux中做所有事情,所以你会猜到我在使用avrdude

我的目标是改变这个项目的双色LED的颜色取决于特定的状态

默认情况下,led为红色(当然,如果您连接正确),然后我希望它变为黄色(绿色和红色之间的快速切换),当用户按住按钮时,释放时,它将变为绿色,然后下次它将关闭

所以,概括一下

LED为红色

当我按下按钮时,它将变成黄色

当我释放时,它将是绿色的

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

当我释放时,它将关闭

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

当我释放时,它将是红色的(依此类推)

在我的实际代码中,有时一切都很好,但有时led会卡在黄色,我不知道为什么

有什么想法吗

代码在ideone上:


谢谢

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

因为您正在一系列LED状态中循环,所以您只需将它们列在一个数组中,并沿着它(到达末尾时环绕),每当按钮状态改变时,每次都会更新LED

编辑:

这里有一个替代方案:

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]

我猜你只是看到随机发生器丢失了按钮,大约三分之一的时间发生了变化,因为去抖动稍微关闭了。考虑不同状态下花费的时间:

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

那是你的主回路。如您所见,它在大约15毫秒的时间内两次检查按钮;它不会与更新状态的最后一个值进行比较,只会与10ms之前的值进行比较。在5毫秒的“黄色”时间内释放按钮,allumerAmbre将不会重置,直到下一次释放恰好落在10毫秒时间内。此外,黄色的卷曲为1/15红色,可能不是您想要的混合

谢谢,我会试试的,(我发布的是我对同一问题的第二种方法,效果也一样:D)你认为它可能与硬件有关吗?谢谢,这很有启发性。如果我理解正确,你是说我应该在黄色状态下对按钮进行另一次检查?哦,谢谢你对我的黄色混音的评论,你实际上是对的:)我建议你停止检查转换本身(讲师1!=讲师2),而是检查按钮是否稳定在新的状态,无论是否按下(你在allumerAmbre中已经有了信息)。另外,请在上查找一篇好文章。谢谢@Yann,我想我通过你的所有建议解决了我的问题!我完全重写了检查过渡的部分,并用while()替换;而且它似乎像一个魅力!如果遇到问题,我会发回,但我认为这很好,再次感谢:)