搜索
bottom↓
回复: 18

终于解决了PIC16串口中断重入问题

[复制链接]

出0入0汤圆

发表于 2015-8-1 22:56:22 | 显示全部楼层 |阅读模式
很少用PIC的单片机,这个问题给我的教训很深刻,但我认为PIC本身也有做得不好的地方。
问题现象:MCU复位,应该属于看门狗复位,但程序启动时读STATUS显示为上电复位。若没打开看门狗,现象应该为MCU死机。
查找原因:过程相当艰苦,共花2天X20小时的时间,最后发现,串口中断发生后,一定要读RCREG,否则串口中断标志会一直产生,清了还会产生,造成反反复复进入中断。
造成原因:与写软件习惯有关。我的流程是,收到前一条串口命令,若还没处理完成,再来串口命令时,不处理(不读RCREG),只清串口中断标志。这也造成这现象偶然才会出现。
解决方法:有串口中断,不管三七二十一,退出串口中断前读一下RCREG,再清串口中断标志。

搜索一下百度,发现碰到我这个问题的人应该不少,但都没发现他们能找到原因和解决方法。看PIC的DATASHEET也没有强调RCREG必须读才能清串口中断标志。希望阿莫坛友不要再走弯路了。

出0入0汤圆

发表于 2015-8-1 23:30:31 | 显示全部楼层
楼主没有仔细看PIC的手册,我随便找了个PIC16F193x的手册,明确写了的,收到数据后,没有读RCREG清空FIFO,RCIF就一直为1。

接收到所有数据位和停止位之后,立即将RSR 中的字
符传送到EUSART 接收FIFO,且PIR1 寄存器的RCIF
中断标志位置1。通过读RCREG 寄存器,将FIFO 顶
部的字符送出FIFO。

25.1.2.3 接收中断
只要EUSART 接收器使能且接收FIFO 中存在未读字
符, PIR1 寄存器的RCIF 中断标志位就会置1。RCIF
中断标志位是只读位,不能用软件置1 或清零。

出0入0汤圆

发表于 2015-8-1 23:34:51 | 显示全部楼层
另外不能理解的是软件习惯,前一条串口命令没有完成,再来串口中断就不读数据,这样不是会丢失命令吗?是否妥当,如果要这样不如干脆关了串口接收中断,等处理完后再开。

出0入0汤圆

 楼主| 发表于 2015-8-2 09:08:15 | 显示全部楼层
zhuxm 发表于 2015-8-1 23:30
楼主没有仔细看PIC的手册,我随便找了个PIC16F193x的手册,明确写了的,收到数据后,没有读RCREG清空FIFO, ...

哦,那估计我看漏了。

出0入0汤圆

 楼主| 发表于 2015-8-2 09:25:57 | 显示全部楼层
zhuxm 发表于 2015-8-1 23:34
另外不能理解的是软件习惯,前一条串口命令没有完成,再来串口中断就不读数据,这样不是会丢失命令吗?是否 ...

若串口大频繁,忙时不理会也没办法。我用Modebus协议通过485挂在总线上,收到的命令控制交流同步电机和回答同步电机状态。电机动作本身也有延时,特别是正反转。
也有客户反馈,测试我们的控制板,不停扔命令过来,间隔小于20m有时会无命令反馈,我知道应该是前条命令没处理完的问题,但只回复他:我们是控制电机,别用485累坏了CPU。
大师对此现象有何解决办法?我也想每个485命令都能反馈。增加接收命令队列估计行不过了,命令长时近100个bytes。

出350入8汤圆

发表于 2015-8-2 10:12:33 | 显示全部楼层
这个绝对是楼主没有看仔细,基本上我用过的MCU,都是要软件先清接收中断标志,才能接收下一组数据。

出0入0汤圆

 楼主| 发表于 2015-8-2 21:21:57 | 显示全部楼层
bmagui 发表于 2015-8-2 10:12
这个绝对是楼主没有看仔细,基本上我用过的MCU,都是要软件先清接收中断标志,才能接收下一组数据。 ...

呵呵,你没看懂我的意思。
问题是中断标志清不了,要读BUFFER才行。
若你用PIC,估计你会碰到我一样的问题。

出0入0汤圆

发表于 2015-8-2 22:08:07 | 显示全部楼层
如果不想被串口中断打断,暂时禁止串口中断即可,反正你在没处理完上次的命令,串口的数据对你也没用

出0入0汤圆

 楼主| 发表于 2015-8-2 23:15:12 | 显示全部楼层
tdh03z 发表于 2015-8-2 22:08
如果不想被串口中断打断,暂时禁止串口中断即可,反正你在没处理完上次的命令,串口的数据对你也没用 ...

是可以,
我的意思是要读BUFFER才能清串口接收为断标志的,还是是第一次碰到。
而且这问题要网上查好像很多人碰到,但也没找到他们的答案,
或者有些人碰到问题上网问别人,但解决后他并没有在他的贴子后留解决方法。

出350入8汤圆

发表于 2015-8-3 09:20:07 | 显示全部楼层
Firman 发表于 2015-8-2 21:21
呵呵,你没看懂我的意思。
问题是中断标志清不了,要读BUFFER才行。
若你用PIC,估计你会碰到我一样的问 ...

嗯,明白你的意思。
但是我想说的是不管那种单片机,都会要清接收中断标志,可能清标志的方式有一点不一样。

出0入0汤圆

发表于 2015-8-6 10:08:07 | 显示全部楼层
小弟目前用PIC的收485指令,還沒遇過MCU復位的問題。

大概分享一下UART接收積了兩個BYTE沒讀取,會造成OERR設為1,進而造成UART無法再接收資料。所以要檢查OERR是否為1?如果是,先關閉接收後再打開接收功能就可以了。

出0入4汤圆

发表于 2015-8-6 11:18:39 | 显示全部楼层
用 pic多年还真没遇到过你的问题 - -

手册上明确说了中断标志不能软件清,要读了自动清的。

要不丢数据那就开缓存,要是想丢数据那就在处理数据过程中关中断,处理完了再开。

基本上没发现什么不妥。

ps:用stm32的时候貌似 处理数据的时候关中断,完了再开  这样会造成串口死了还是咋的,当时没解决,直接一直打开着了。

出0入53汤圆

发表于 2015-8-31 11:22:01 | 显示全部楼层
LZ请问PIC8位MCU用什么编译器  还有仿真下载器用什么,最近打算用PIC的单片机

出0入0汤圆

 楼主| 发表于 2015-8-31 13:24:20 | 显示全部楼层
zhcj66 发表于 2015-8-31 11:22
LZ请问PIC8位MCU用什么编译器  还有仿真下载器用什么,最近打算用PIC的单片机 ...

PIC8没听说过,
有用过PIC16和PIC18系列的.
我用PICKIT3仿真,PICC编译.

出0入0汤圆

 楼主| 发表于 2015-8-31 13:34:20 | 显示全部楼层
zhcj66 发表于 2015-8-31 11:22
LZ请问PIC8位MCU用什么编译器  还有仿真下载器用什么,最近打算用PIC的单片机 ...

PIC8没听说过,
有用过PIC16和PIC18系列的.
我用PICKIT3仿真,PICC编译.

出0入53汤圆

发表于 2015-8-31 13:48:57 | 显示全部楼层
Firman 发表于 2015-8-31 13:34
PIC8没听说过,
有用过PIC16和PIC18系列的.
我用PICKIT3仿真,PICC编译.

说错了是PIC16F      PICC编译是编译器?

出0入0汤圆

发表于 2015-8-31 14:05:19 | 显示全部楼层
Firman 发表于 2015-8-2 09:25
若串口大频繁,忙时不理会也没办法。我用Modebus协议通过485挂在总线上,收到的命令控制交流同步电机和回 ...

这还是你软件上处理的不好, 若是太忙, 给对方一条忙状态, 相信也是很简单的事, 这样对方可以酌情处理,   你置之不理, 他就怀疑你出了问题也是很正常的事

出0入0汤圆

 楼主| 发表于 2015-8-31 14:12:01 | 显示全部楼层
tomhe666 发表于 2015-8-31 14:05
这还是你软件上处理的不好, 若是太忙, 给对方一条忙状态, 相信也是很简单的事, 这样对方可以酌情处理,    ...

挂在总线上的,不能确定总线上都接什么.
客户做了很多通信指令,偏偏没有忙指令.

出0入0汤圆

发表于 2015-8-31 17:35:07 | 显示全部楼层
要结合通讯速率要求来处理忙的问题,通讯数据段落间距导致前后数据冲突及丢失情况,至于在不在中断期间处理要看处理周期是否超出程序周期任务的最小时间要求....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 06:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表