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

2020-02-06 10:11发布

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

搜索一下百度,发现碰到我这个问题的人应该不少,但都没发现他们能找到原因和解决方法。看PIC的DATASHEET也没有强调RCREG必须读才能清串口中断标志。希望阿莫坛友不要再走弯路了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
Firman
2020-02-07 00:24
zhuxm 发表于 2015-8-1 23:34
另外不能理解的是软件习惯,前一条串口命令没有完成,再来串口中断就不读数据,这样不是会丢失命令吗?是否 ...

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

一周热门 更多>