×
嵌入式 > 技术百科 > 详情

单片机两个PIT中断不能同时运行的解决方法

发布时间:2020-06-06 发布时间:
|
基于以下的事实:

①中断子程序中,清楚中断标志位时,如果使用BSET位操作指令,PITTF清零,PIT1的中断标志位也被清零;(《单片机与嵌入式系统开发方法》P238)
②PIT中断优先级通道0大于通道1;
③1s恰好是10ms的整数倍。

所以,每到1s的时候,通道0和通道1同时发生中断,由于通道0优先级高,先进入通道0的中断子程序,而通道0的中断子程序中的清中断动作把通道1的中断标志位也清零,这样等通道0的中断程序返回时,通道1就不能发生中断了,这样通道1的中断子程序就永远不能运行。
我查看了PITTF_PTF = 1;的汇编代码为C083 BSET 0x0345,#2。

当然这只是猜想,验证如下:
1)针对③,把PIT1中断时间改为979.975ms,200*39199/8000000=0.979975s,可以运行。
2)针对②,PIT0清中断的方式是关闭PIT通道后再开启,PIT1清中断的方式是“PITTF_PTF1 = 1;”,可以运行。解释如下:通道0的中断程序运行后,马上关闭通道0,这时CPU响应通道1的中断,通道0的中断程序被中断,等到通道1的中断程序返回后,再运行通道0的中断程序。如果把PIT1清中断的方式变为关闭PIT通道后再开启效果相同。
3)针对②,将PIT0和PIT1的中断时间反转,PIT01s中断一次,PIT110ms中断一次,这样,运行1s,PIT1失效一次,可以运行。
4)把清中断的C语句改为不编译为BSET指令的语句,由于我对汇编不太懂,暂时不试验。

这样就可以证明猜想正确,同时也得出了解决方法。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
物联传感与Atmel强强联手 达成智能家居战略合作协议