我正在接收一条包含原始传感器数据数组的UART消息。我正在程序的主循环中读取消息。有两件事,我需要事先知情同意做不同的价值观。在LCD上显示它(这有点费时),并且,至少对于其中一个值,将连接到PORTD的LED条相应地更改为该值(相当简单)。
在主循环中,这是我目前的工作方式:
最后一项任务减缓了整个循环的速度,这使得LED-bar功能变得“滞后”。我得到的建议是在重绘标签之前检查值是否已经更改,以避免不必要的绘图。但是所有的值都是快速变化的值,比如RPM之类的。
欢迎任何建议!!
发布于 2013-06-04 16:27:15
进入显示器的数据不需要比查看器所能感觉到的更快地改变。如果您的更改大于阈值(40到100 Hz),则只使用上一期间发生的最后一次更改。
int UpdateValue;
int UpdateNeeded = 0;
void TimerServiceRountine() { // called at N (60) Hz.
if (UpdateNeeded) {
UpdateNeeded = 0;
UpdateLCD(UpdateValue);
}
// ...
}
// Call this with each RPM
void UpdateDisplay(int Value) {
UpdateValue = Value;
UpdateNeeded = 1;
}进一步细化:只有当x与以前不同时才调用UpdateLCD(x)。
发布于 2013-08-13 16:15:13
解决方案思想#1
我的猜测是,LCD部分的缓慢是因为您需要等待LCD处理发送给它的命令(某些字母数字LCD常见)。
否则,主循环可能会每秒执行数千次循环。
如果是这种情况,那么您应该为主循环中的LCD输出实现一个状态机。这台状态机会在主循环的每次运行中,一个接一个地向LCD发出必要的命令,以更新显示器,前提是LCD准备接受新的命令。
这样,您的主循环就可以不用等待LCD,而LCD也可以得到足够快的更新(取决于不执行LCD任务的主循环的周转时间是否足够低:最佳地少于LCD的典型“繁忙”时间)。
解决方案思想#2
这是更复杂和适用的,如果液晶显示过程是相当繁重的,因为某种原因(像素的工作在图形LCD?)。
即使在这种情况下,解决方案#1的类似方法也可能运行良好。如果您可以将LCD任务拆分为具有大致相似处理时间要求的较小块,则可以加快主循环(一次只处理其中一个块)。
如果您更希望为主要任务提供更准确的时间安排,那么需要将主要任务置于中断中(假设您从传感器请求数据,则需要一个计时器IT来对这些请求进行计时)。然后主回路将只与LCD一起工作。
公共元素
在所有情况下,您都会执行更多的采样,而单个分散的LCD显示数据构造过程。这需要一些数据管理:在开始构建显示之前,您必须“示例”(主要是复制,在最后一个解决方案中禁用中断)数据进入LCD。
从这个意义上说,我提出的所有解决方案都是“理想的”,它们可以使用所有可用的周期“自动”地从您的硬件中提取出最多的(在显示更新频率方面)。您只需要为您的情况选择合适的方法。
https://stackoverflow.com/questions/16915363
复制相似问题