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

2020-02-06 10:11发布

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

搜索一下百度,发现碰到我这个问题的人应该不少,但都没发现他们能找到原因和解决方法。看PIC的DATASHEET也没有强调RCREG必须读才能清串口中断标志。希望阿莫坛友不要再走弯路了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
zhuxm
1楼-- · 2020-02-06 14:57
楼主没有仔细看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 或清零。
zhuxm
2楼-- · 2020-02-06 18:43
 精彩回答 2  元偷偷看……
Firman
3楼-- · 2020-02-06 23:57
zhuxm 发表于 2015-8-1 23:30
楼主没有仔细看PIC的手册,我随便找了个PIC16F193x的手册,明确写了的,收到数据后,没有读RCREG清空FIFO, ...

哦,那估计我看漏了。
Firman
4楼-- · 2020-02-07 00:24
zhuxm 发表于 2015-8-1 23:34
另外不能理解的是软件习惯,前一条串口命令没有完成,再来串口中断就不读数据,这样不是会丢失命令吗?是否 ...

若串口大频繁,忙时不理会也没办法。我用Modebus协议通过485挂在总线上,收到的命令控制交流同步电机和回答同步电机状态。电机动作本身也有延时,特别是正反转。
也有客户反馈,测试我们的控制板,不停扔命令过来,间隔小于20m有时会无命令反馈,我知道应该是前条命令没处理完的问题,但只回复他:我们是控制电机,别用485累坏了CPU。
大师对此现象有何解决办法?我也想每个485命令都能反馈。增加接收命令队列估计行不过了,命令长时近100个bytes。
bmagui
5楼-- · 2020-02-07 04:41
这个绝对是楼主没有看仔细,基本上我用过的MCU,都是要软件先清接收中断标志,才能接收下一组数据。
Firman
6楼-- · 2020-02-07 09:19
bmagui 发表于 2015-8-2 10:12
这个绝对是楼主没有看仔细,基本上我用过的MCU,都是要软件先清接收中断标志,才能接收下一组数据。 ...

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

一周热门 更多>