首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIC 18F46K22,MikroC:“多任务”简单耗时的任务

PIC 18F46K22,MikroC:“多任务”简单耗时的任务
EN

Stack Overflow用户
提问于 2013-06-04 10:21:48
回答 2查看 1.1K关注 0票数 1

我正在接收一条包含原始传感器数据数组的UART消息。我正在程序的主循环中读取消息。有两件事,我需要事先知情同意做不同的价值观。在LCD上显示它(这有点费时),并且,至少对于其中一个值,将连接到PORTD的LED条相应地更改为该值(相当简单)。

在主循环中,这是我目前的工作方式:

  • 从UART外部设备请求传感器数据
  • 从外部设备接收字节数组
  • 进行计算,将原始传感器数据转换为实际值/单位
  • 使用以下代码在LCD栏上显示RPM值: 如果(RPM < 99) { PORTD = 0;} if (RPM > 100) { PORTD = 0x01;} if (RPM > 2400) { PORTD = 0x03;} if (RPM > 3700) { PORTD = 0x07;} if (RPM > 4900) { PORTD = 0x0F;} if (RPM > 6200) { PORTD = 0x1F;} if (RPM > 7400) { PORTD = 0x3F;} if (RPM > 8700) { PORTD = 0x7F;} if (RPM > 10000) { PORTD = 0xFF;}
  • 最后,在LCD上显示多个值。因此,删除旧值,绘制标签,设置新值,再次绘制标签。

最后一项任务减缓了整个循环的速度,这使得LED-bar功能变得“滞后”。我得到的建议是在重绘标签之前检查值是否已经更改,以避免不必要的绘图。但是所有的值都是快速变化的值,比如RPM之类的。

欢迎任何建议!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-04 16:27:15

进入显示器的数据不需要比查看器所能感觉到的更快地改变。如果您的更改大于阈值(40到100 Hz),则只使用上一期间发生的最后一次更改。

代码语言:javascript
复制
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)

票数 2
EN

Stack Overflow用户

发布于 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。

从这个意义上说,我提出的所有解决方案都是“理想的”,它们可以使用所有可用的周期“自动”地从您的硬件中提取出最多的(在显示更新频率方面)。您只需要为您的情况选择合适的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16915363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档