18B20,数码管,串口中断总是打断数码管显示,怎么解决?
51单片机,18B20测温,tm167数码管显示,串口传送温度,但是数码管总是间断的显现闪了一下,18B20测温我屏蔽串口中断了,怎么解决数码管的闪烁? 一般我都是中断里面做显示的。 别说用 TM1637 了,就是直接用 IO 扫描带点阵,都可以做到和 18B20 并用,无闪烁。重新规划一下各种任务的时间先后,而不是一味靠中断帮你解决前后台,就可以很稳定。
读 18B20 -> 更新 TM1637 -> 阻塞式串口发包,这么个流程都不需要用到中断 t3486784401 发表于 2021-1-8 21:30
别说用 TM1637 了,就是直接用 IO 扫描带点阵,都可以做到和 18B20 并用,无闪烁。
重新规划一下各种任务的 ...
串口是不定时接受上位机的查询,返回温度值,有突发性 9547818 发表于 2021-1-8 22:12
串口是不定时接受上位机的查询,返回温度值,有突发性
做个标记,看看怎么解决掉的。 都用了驱动芯片了,还会闪?都不需要程序扫描就能驱动的了,看看程序是不是哪里关了显示或者清了显示吧,即使定时扫描都能做到跟18b20不冲突的何况还用了专用芯片 软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在访问18B20的时候就不用屏蔽串口中断,等18B20处理完了,再处理串口请求。
主循环:读18B20 -> 显示 -> 处理串口请求
9547818 发表于 2021-1-8 22:12
串口是不定时接受上位机的查询,返回温度值,有突发性
也许你的这个应用,下位机做成定时主动上传数据,而不是交互式更简单。 hecat 发表于 2021-1-8 23:20
软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在 ...
专用的芯片驱动了,数码管即使不送数据也是不会闪的,这里闪的原因是程序的问题,肯定不是显示部分的问题,因为18B20转换时间比较长,以前使用都是读取数据,然后启动转换,中间干其他事情过几百毫秒回来再读数据再启动转换,如此循环,这里不会有多少的时间开销的 JY-MCU 发表于 2021-1-9 01:15
专用的芯片驱动了,数码管即使不送数据也是不会闪的,这里闪的原因是程序的问题,肯定不是显示部分的问题 ...
如果单纯分析数码管闪的问题,的确是程序的问题。
闪一般情况是,重新初始化了驱动芯片,或者送了空白显示数据,引起短暂黑屏,后来又有了正确数据,显示又正常了。 hecat 发表于 2021-1-9 14:52
如果单纯分析数码管闪的问题,的确是程序的问题。
闪一般情况是,重新初始化了驱动芯片,或者送了空白显 ...
恩 我感觉是串口中断打断了显示程序。在上位机不发询问的时候,显示很正常。 我猜
1:显示放在中断里
2: delay() 太多,时间太长 第一步先把程序中的delay去掉,当然可能不有简单的删除,需要修改程序逻辑{:lol:} 9547818 发表于 2021-1-9 15:48
恩 我感觉是串口中断打断了显示程序。在上位机不发询问的时候,显示很正常。 ...
你多久送一次显示?
使用了专用显示驱动芯片时,不用太频繁送显示的 串口中断后,不要马上返回温度,而是先用变量标记已经收到查询请求,这样占用的时间会非常短。
然后,在循环程序里执行完显示后,再判断有没有这个标记,有的话再从串口返回温度。这样就是顺序执行了,不会过长时间中断。 51去掉发送时WHILE等待 经过实验,显示闪烁,包括通讯过程中的温度跳变,都是18B20采集温度受到串口中断影响,采集温度值错误所致,琢磨了几天,把18B20局部屏蔽中断,全部屏蔽中断都试了,效果很差,全部屏蔽,温度不发生跳变,显示也稳定,但就是通讯有问题,上位机发1000个,下位机才回复400个,差的太大,串口中断无法预知的,怎么才能完美解决?想了很久都没有答案。求助 9547818 发表于 2021-1-19 17:49
经过实验,显示闪烁,包括通讯过程中的温度跳变,都是18B20采集温度受到串口中断影响,采集温度值错误所致 ...
先把串口收发中断做好,成功率达到100%;产生串口忙标志,如果忙(可以计算忙时间最好)就不处理18B20;等空闲处理18B20;显示的问题,定时0.1 -- 0.2S随便送送都不应该闪烁
确实如9楼所说的专用的芯片驱动了,数码管即使不送数据也是不会闪的。建议把程序分成几个模块先单独测试在一个个加上去。 读一下18b20的手册吧。详细的读一读,你会有收获的 更新数码管再慢一些,我觉得500ms就够了,测温时不屏蔽中断,只传递接收中断标志--然后空闲时再回复;降低18B20精度,测温的延时通过switch切换实现不要用delay(); hecat 发表于 2021-1-8 23:20
软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在 ...
如何增加“环形缓冲区”? 本帖最后由 hecat 于 2021-2-15 10:39 编辑
环形缓冲区,建一个数组作为串口的发送缓存。
串口正在发送时,后继要发送的数据先存缓冲区,发送函数可以立即返回,而不用等到串口发送完,省去等待时间。
串口发送完当前字符后,产生中断,接着发送缓冲区的数据,直到发完。 我也猜下:你的1820操作时阻塞中断了,并且时间不短,可能一个读写周期 屏蔽串口了还闪烁?那就是模拟总线占用时间太多。除了复位操作占用时间长,其它读写操作占用很短的,还是程序逻辑有问题。 显示刷新不用很快的,18b20用中断,显示放在循环里不用精确定时扫描就行 dz20062008 发表于 2021-3-23 17:36
屏蔽串口了还闪烁?那就是模拟总线占用时间太多。除了复位操作占用时间长,其它读写操作占用很短的,还是程 ...
复位也不用占时间的,1820的时间占用可以忽略 把18b20移植成状态机接入到中断里面 毫无压力 如果这个都搞不定还需要努力努力了,这个可是基础。把18b20切成小块小块去做。
页:
[1]