9547818 发表于 2021-1-8 20:08:50

18B20,数码管,串口中断总是打断数码管显示,怎么解决?

51单片机,18B20测温,tm167数码管显示,串口传送温度,但是数码管总是间断的显现闪了一下,18B20测温我屏蔽串口中断了,怎么解决数码管的闪烁?

zxq6 发表于 2021-1-8 20:25:57

一般我都是中断里面做显示的。

t3486784401 发表于 2021-1-8 21:30:05

别说用 TM1637 了,就是直接用 IO 扫描带点阵,都可以做到和 18B20 并用,无闪烁。
重新规划一下各种任务的时间先后,而不是一味靠中断帮你解决前后台,就可以很稳定。

读 18B20 -> 更新 TM1637 -> 阻塞式串口发包,这么个流程都不需要用到中断

9547818 发表于 2021-1-8 22:12:55

t3486784401 发表于 2021-1-8 21:30
别说用 TM1637 了,就是直接用 IO 扫描带点阵,都可以做到和 18B20 并用,无闪烁。
重新规划一下各种任务的 ...

串口是不定时接受上位机的查询,返回温度值,有突发性

huangxiaolpbany 发表于 2021-1-8 22:51:25

9547818 发表于 2021-1-8 22:12
串口是不定时接受上位机的查询,返回温度值,有突发性

做个标记,看看怎么解决掉的。

JY-MCU 发表于 2021-1-8 22:54:45

都用了驱动芯片了,还会闪?都不需要程序扫描就能驱动的了,看看程序是不是哪里关了显示或者清了显示吧,即使定时扫描都能做到跟18b20不冲突的何况还用了专用芯片

hecat 发表于 2021-1-8 23:20:33

软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在访问18B20的时候就不用屏蔽串口中断,等18B20处理完了,再处理串口请求。

主循环:读18B20 -> 显示 -> 处理串口请求

hecat 发表于 2021-1-8 23:24:01

9547818 发表于 2021-1-8 22:12
串口是不定时接受上位机的查询,返回温度值,有突发性

也许你的这个应用,下位机做成定时主动上传数据,而不是交互式更简单。

JY-MCU 发表于 2021-1-9 01:15:24

hecat 发表于 2021-1-8 23:20
软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在 ...

专用的芯片驱动了,数码管即使不送数据也是不会闪的,这里闪的原因是程序的问题,肯定不是显示部分的问题,因为18B20转换时间比较长,以前使用都是读取数据,然后启动转换,中间干其他事情过几百毫秒回来再读数据再启动转换,如此循环,这里不会有多少的时间开销的

hecat 发表于 2021-1-9 14:52:20

JY-MCU 发表于 2021-1-9 01:15
专用的芯片驱动了,数码管即使不送数据也是不会闪的,这里闪的原因是程序的问题,肯定不是显示部分的问题 ...

如果单纯分析数码管闪的问题,的确是程序的问题。

闪一般情况是,重新初始化了驱动芯片,或者送了空白显示数据,引起短暂黑屏,后来又有了正确数据,显示又正常了。

9547818 发表于 2021-1-9 15:48:08

hecat 发表于 2021-1-9 14:52
如果单纯分析数码管闪的问题,的确是程序的问题。

闪一般情况是,重新初始化了驱动芯片,或者送了空白显 ...

恩 我感觉是串口中断打断了显示程序。在上位机不发询问的时候,显示很正常。

zhuyi25762 发表于 2021-1-9 16:19:25

我猜
1:显示放在中断里
2: delay() 太多,时间太长

elecfun 发表于 2021-1-9 16:50:58

第一步先把程序中的delay去掉,当然可能不有简单的删除,需要修改程序逻辑{:lol:}

laujc 发表于 2021-1-9 16:59:21

9547818 发表于 2021-1-9 15:48
恩 我感觉是串口中断打断了显示程序。在上位机不发询问的时候,显示很正常。 ...

你多久送一次显示?
使用了专用显示驱动芯片时,不用太频繁送显示的

电子喵星人 发表于 2021-1-9 19:47:03

串口中断后,不要马上返回温度,而是先用变量标记已经收到查询请求,这样占用的时间会非常短。
然后,在循环程序里执行完显示后,再判断有没有这个标记,有的话再从串口返回温度。这样就是顺序执行了,不会过长时间中断。

electricit 发表于 2021-1-10 06:01:07

51去掉发送时WHILE等待

9547818 发表于 2021-1-19 17:49:04

经过实验,显示闪烁,包括通讯过程中的温度跳变,都是18B20采集温度受到串口中断影响,采集温度值错误所致,琢磨了几天,把18B20局部屏蔽中断,全部屏蔽中断都试了,效果很差,全部屏蔽,温度不发生跳变,显示也稳定,但就是通讯有问题,上位机发1000个,下位机才回复400个,差的太大,串口中断无法预知的,怎么才能完美解决?想了很久都没有答案。求助

jinbangzhou 发表于 2021-1-19 19:08:18

9547818 发表于 2021-1-19 17:49
经过实验,显示闪烁,包括通讯过程中的温度跳变,都是18B20采集温度受到串口中断影响,采集温度值错误所致 ...

先把串口收发中断做好,成功率达到100%;产生串口忙标志,如果忙(可以计算忙时间最好)就不处理18B20;等空闲处理18B20;显示的问题,定时0.1 -- 0.2S随便送送都不应该闪烁

MCUStudent 发表于 2021-1-19 21:41:27

确实如9楼所说的专用的芯片驱动了,数码管即使不送数据也是不会闪的。建议把程序分成几个模块先单独测试在一个个加上去。

lhj200304 发表于 2021-1-19 23:50:57

读一下18b20的手册吧。详细的读一读,你会有收获的

子不语 发表于 2021-1-27 10:12:15

更新数码管再慢一些,我觉得500ms就够了,测温时不屏蔽中断,只传递接收中断标志--然后空闲时再回复;降低18B20精度,测温的延时通过switch切换实现不要用delay();

9547818 发表于 2021-2-14 20:39:40

hecat 发表于 2021-1-8 23:20
软件模拟1-Wire总线访问18B20比较耗时,这应该是程序主要时间开销。
串口开中断,收发分别加环形缓冲区。在 ...

如何增加“环形缓冲区”?

hecat 发表于 2021-2-15 10:38:53

本帖最后由 hecat 于 2021-2-15 10:39 编辑

环形缓冲区,建一个数组作为串口的发送缓存。
串口正在发送时,后继要发送的数据先存缓冲区,发送函数可以立即返回,而不用等到串口发送完,省去等待时间。
串口发送完当前字符后,产生中断,接着发送缓冲区的数据,直到发完。

mcu5i51 发表于 2021-2-15 17:37:08

我也猜下:你的1820操作时阻塞中断了,并且时间不短,可能一个读写周期

dz20062008 发表于 2021-3-23 17:36:19

屏蔽串口了还闪烁?那就是模拟总线占用时间太多。除了复位操作占用时间长,其它读写操作占用很短的,还是程序逻辑有问题。

kite2006 发表于 2021-3-24 10:58:56

显示刷新不用很快的,18b20用中断,显示放在循环里不用精确定时扫描就行

mcu5i51 发表于 2021-3-24 10:59:57

dz20062008 发表于 2021-3-23 17:36
屏蔽串口了还闪烁?那就是模拟总线占用时间太多。除了复位操作占用时间长,其它读写操作占用很短的,还是程 ...

复位也不用占时间的,1820的时间占用可以忽略

Romate 发表于 2021-3-24 13:30:49

把18b20移植成状态机接入到中断里面 毫无压力

Romate 发表于 2021-3-24 13:33:38

如果这个都搞不定还需要努力努力了,这个可是基础。把18b20切成小块小块去做。
页: [1]
查看完整版本: 18B20,数码管,串口中断总是打断数码管显示,怎么解决?