PICC中断应用之大问题(菜鸟特别关注)

[复制链接]
6678|17
 楼主| 52mcu 发表于 2008-4-1 00:54 | 显示全部楼层 |阅读模式
PICC中断应用之大问题(菜鸟特别关注)<br /><br />在PICC的中断函数里调用一个函数后,整个程序都不运行了,而这个函数在主循环里用查询方式是能正常运行的。<br />这究竟是咋回事???该如何处理???<br /><br /><br />/*PICC中断函数*/<br />void&nbsp;interrupt<br />timer0_isr(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(reload&nbsp;==&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seconds++;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ScanKey2();//此处调用按键扫描函数后&nbsp;将整个程序烧入片子&nbsp;程序就不运行了!!!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;reload--;<br />&nbsp;&nbsp;&nbsp;&nbsp;T0IF&nbsp;=&nbsp;0;<br />&nbsp;<br />}<br /><br />/*中断中调用的函数*/<br />void&nbsp;ScanKey2(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;unsigned&nbsp;int&nbsp;KeyCounter=0;<br />&nbsp;&nbsp;static&nbsp;bit&nbsp;FirstPress;&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;KeyValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY_IN();<br />&nbsp;&nbsp;KeyValue=GET_KEY();<br />&nbsp;&nbsp;if(KeyValue==0x3)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;KeyCounter=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirstPress=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY_READY();<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(FirstPress)<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(++KeyCounter&gtKEY_TIME)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;KeyCounter-=KEY_SPEED;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyProcess(KeyValue);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;KEY_READY();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;}&nbsp;//if(FirstPress)<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=200;i&gt0;i--);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyValue=GET_KEY();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(KeyValue==0x3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCounter=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirstPress=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KEY_READY();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FirstPress=1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCounter=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyProcess(KeyValue);&nbsp;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;KEY_READY();<br /><br />}<br /><br />
yewuyi 发表于 2008-4-1 08:37 | 显示全部楼层

void interrupt ISR(void){}

  
 楼主| 52mcu 发表于 2008-4-1 09:37 | 显示全部楼层

楼上的兄台,能否指教明白点,我实在不知道是啥意思?

楼上的兄台,能否指教明白点,我实在不知道是啥意思?
yewuyi 发表于 2008-4-1 11:18 | 显示全部楼层

中断函数写错了

  
 楼主| 52mcu 发表于 2008-4-1 12:26 | 显示全部楼层

中断函数象我那样写是没问题的 ,这测试过了。

关键问题是在中断中调用函数
x512775199 发表于 2008-4-1 13:48 | 显示全部楼层

额。。

我觉得只有很有耐心的人会看完这个东东。。。LZ可不可以把程序注释清楚点。。。
king6301 发表于 2008-4-1 15:27 | 显示全部楼层

程序重入

中断函数中所有出现的子函数均要保证在MAIN()中不出现,否则就出现了程序的重入问题,而PICC并不支持
yewuyi 发表于 2008-4-1 16:48 | 显示全部楼层

呵呵,还真没仔细看

ScanKey2()函数调用肯定有问题的嘛,呵呵,你真神了,竟然想这么干?
 楼主| 52mcu 发表于 2008-4-1 18:40 | 显示全部楼层

程序重入

main和interrupt中没有同时调用ScanKey2函数  在main中调用时interrrupt中就注视掉了&nbsp;同样在interrupt中调用时main中的就注释掉了
 楼主| 52mcu 发表于 2008-4-1 19:54 | 显示全部楼层

难道PICC的中断函数中真的不能调用任何函数吗

难道PICC的中断函数中真的不能调用任何函数吗 刚测试了在中断中调用如下一个简单函数都不行 编译没问题,烧进去就不运行。中断里不能调用函数,这不急死人啊。<br /><br /><br />void&nbsp;fun(void)<br />{<br />&nbsp;&nbsp;char&nbsp;a=7,b;<br />&nbsp;&nbsp;char&nbsp;c;<br />&nbsp;c=a+b;<br /><br />}<br />
neaphy 发表于 2008-4-1 20:10 | 显示全部楼层

定义成宏吧

晕在中断中放这么长的函数真恐怖<br />把函数定义成宏就行啦
hotpower 发表于 2008-4-1 20:14 | 显示全部楼层

这就是键盘中断的难处,定时中断查询才是最佳选择~~~

  
 楼主| 52mcu 发表于 2008-4-1 22:00 | 显示全部楼层

这个函数就是 定时中断扫描函数啊

  
yewuyi 发表于 2008-4-2 10:44 | 显示全部楼层

中断中可以调用函数,你的函数没有运行估计是别的问题

  
ayb_ice 发表于 2008-4-2 12:20 | 显示全部楼层

准确的应该说是程序运行不正确

而不是没有运行。。。
dzdiy 发表于 2008-4-2 22:01 | 显示全部楼层

看看:

&nbsp;避免在中断内使用函数调用。虽然PICC&nbsp;允许在中断里调用其它函数,但为了解决<br />递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其<br />它函数内的代码直接写在中断服务程序中。<br />&nbsp;避免在中断内进行数**算。数**算将很有可能用到库函数和许多中间变量,就<br />算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变<br />量就需要大量的开销,严重影响中断服务的效率。
zhaoyu2005 发表于 2008-4-4 11:52 | 显示全部楼层

估计数堆栈溢出了

不知LZ使用的什么型号的,PIC有些型号的堆栈很少(就两级,调用三次函数就溢出,LZ的至少得3级),弄不好就溢出
萝卜秧子 发表于 2008-4-4 23:07 | 显示全部楼层

程序会执行的

PIC的中断是要查询中断标志位的。<br /><br />你所谓的中断函数中没加判别,全都执行。除非只有T0一个中断请求,否则会出错的。<br /><br />void&nbsp;interrupt&nbsp;ISR(void)<br />{<br />&nbsp;&nbsp;&nbsp;if(T0IE&nbsp;&&nbsp;T0IF)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0IF&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />这样试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

292

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部