我设计了一个系统,当电位计的电阻低于设定值时,LED闪烁led1 = 1; wait(0.2); led1 = 0 wait(0.2)
,这就是发生的情况。我需要两个等待序列,否则用户不会看到任何变化。我还连接了一个LCD,当用户按下按钮时LCD会改变以显示不同的东西。问题是LCD的这种变化明显减慢到wait(0.2)
语句(0.2秒延迟)。这种方式给系统带来了一种迟钝的感觉。任何想法我能做什么?
ISR 我最初想过将闪烁的LED放入一个中断程序,但很快意识到,如果用户没有改变电位计的值并且它总是设置为0,那么系统将保持在ISR中。
轮询 我的第二个想法是尝试投票,每次进入此功能时都会使LED闪烁。结果并不好,现在经常会减慢系统的速度。当它没有减慢系统速度时,它会变得太快。
答案 0 :(得分:2)
我建议硬件计时器和ISR是可行的方法。通过以您的方式延迟程序执行,您将体验'滞后'用于任何其他处理,而不仅仅是LCD。
这里的关键是你需要考虑你在ISR中的逻辑,以便它不会留在那里......使用条件if
条款或类似条款来对你的电位器读数是。
答案 1 :(得分:0)
您需要完成系统工程。
听起来你现在没有使用ISR,这可以正常工作。您需要走完执行路径并了解最糟糕的情况。
其中一些可能是工具链+处理器的问题。如果你说的轮询导致滞后(相对于强制等待循环),那么这可能是你正在做的任何处理器的时间,并且将在ISR中存在。也许我误会了。如果你的处理器+时钟+编译器+ programming_language + coding_style等产生的东西无法在执行任务所需的时间内完成所有任务,那么添加更多东西(ISR更多轮询等)并不会让它变得更快。找到实际问题并攻击它们,不要只是引发更多问题。
使用硬件计时器,你可能有一个。当您走过主循环时,检查是否为低电位,如果定时器超时或者从上次到当前时间的增量是否大于X,则更改LED状态并继续循环,不要停在那里等待。使用状态机,如果它更容易编程(对于某些人来说,状态机更难)。
如果你有任何其他的等待循环像这样烧掉cpu,也可以使用定时器,不要再等,回来检查。
如果ISR处理程序没有检查所有条件(但非isr解决方案确实如此)添加条件,如果pot值为0是特殊情况,则需要代码来检查特殊情况。或者如果用户设置了这种情况,则不启用中断(或禁用它)。基本的编程问题,“解决它的小问题”。
答案 2 :(得分:-2)
我不确定你的意思。由于存在wait(0.2)
语句,LCD刷新速度非常慢。 LED声明不需要放在ISR中。 LCD刷新后,继续处理主循环中的LED(while(1)
)。