6260|17

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】又是中断问题! [复制链接]

又是中断问题!
之前有 xuanyu 和 lsdfae11 告知小弟中断嵌套,需要重新用_EINT()重新开启总中断。之后可以了。但是,最近我又写一个程序,同样用到中断嵌套。结果就大不一样了。下面是我的程序结构。
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
Inisys(); //初始化,包括各种端口中断、各种定时器中断、捕获比较中断等初始化等
while(1)
{
LPM3;
}
}

#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
if((P1IFG&BIT1)==BIT1)
{
启动捕获中断;
E_INT(); //开启总中断
……;
其他语句;
处理捕获中断处理返回的数据;
P1IFG &= ~BIT1;
}
}

#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1()
{
int i;
switch(__even_in_range(TAIV,10))
{

case 2:
if((CCTL1&CCI)==0)
{
中断处理程序;
break;
}
}

如果在端口1的中断程序中不加"_EINT();"语句,则捕获中断不会产生。但加了之后――我把“
_EINT();"语句加在开启捕获中断语句之后,没有问题吧――捕获中断的程序运行完之后,直接跳到主程序等待端口中断了。郁闷呀,为什么不是返回端口中断位置?
请求帮助!

最新回复

恭贺  详情 回复 发表于 2006-4-4 13:44
 
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
本人遇到同样的问题,端口可以中断,却怎么也进不了定时器中断,请高手们多多指点,在此多谢了!!!
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用:

又是中断问题!
如果在端口1的中断程序中不加"_EINT();"语句,则捕获中断不会产生。但加了之后――我把“
_EINT();"语句加在开启捕获中断语句之后,没有问题吧――捕获中断的程序运行完之后,直接跳到主程序等待端口中断了。郁闷呀,为什么不是返回端口中断位置?
请求帮助!
这是正常的!
在你的P1口中断程序中,执行完“_EINT();”语句后会继续执行后续语句,直到完成P1口中断处理后返回到主程序。在此期间,由“_EINT();”开启的其他中断(捕获中断)由于并未产生中断,而是在程序流程返回主程序后产生了中断。所以在“捕获中断的程序运行完之后,直接跳到主程序等待端口中断了”
若想在P1口中断中等候捕获中断,你只能在开启捕获中断语句之后使用循环等待,直到捕获中断发生后,就返回到循环等待处了,然后再继续执行P1口中断的后续程序。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果我不加“_EINT();”语句,P1中断里的语句就会全部执行完毕(因为我后面有LED显示程序,程序执行没有执行是可以看到的),只是我开启的捕获中断就不会触发。
如果我加了“_EINT();”语句,捕获中断就可以被触发,但是P1中断里的语句并未执行完就退出了,因为后面的LED没有被点亮,证明并未执行完P1中断的全部语句。

如果,要在P1口里等待中断产生,那要等待多久了呢?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
在430中,我没有实际使用过中断嵌套技术。不过,通过LZ的问题,联想到:
1、在LPM3状态下,来P1口中断,硬件会自动退出LPM3状态,转入中断服务状态,退出中断服务处理程序之后,会再次进入LPM3状态吧?
2、如果有中断嵌套的话,在P1中断处理的时候,中断处理逻辑转入捕获中断服务,这时LPM3的处理会是什么样的情形?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
捕获中断返回后还是活动状态,因为P1中断并没有反回。我之所以这样做,就是希望可以实现低功耗!只可惜,为什么会出现这种部题。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
1、你的一级和二级中断频率分别是多少(或者,两者的相对频度)?
2、在二级中断退出前,加“_DINT();”语句试试。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用:

如果我不加“_EINT();”语句,P1中断里的语句就会全部执行完毕(因为我后面有LED显示程序,程序执行没有执行是可以看到的),只是我开启的捕获中断就不会触发。
如果我加了“_EINT();”语句,捕获中断就可以被触发,但是P1中断里的语句并未执行完就退出了,因为后面的LED没有被点亮,证明并未执行完P1中断的全部语句。

如果,要在P1口里等待中断产生,那要等待多久了呢?
如果是这样的话,只能说明你的程序存在致命逻辑错误!捕获中断在执行过程中或完成后,意外修改了SP或PC指针才会出现这种情况,你可以用单步跟踪一下,观察SP的变化情况,从而找到问题所在。

另外,我仍然怀疑在P1中断里的语句全部执行完毕以前是否真的发生了捕获中断!如果是,说明你的待捕获脉冲频率极高,甚至在P1中断里的语句全部执行完毕以前会发生多次捕获中断。以至于在处理不当时,使得中断嵌套层数超过系统的最高嵌套层数造成目前的情况。

至于“要在P1口里等待中断产生,那要等待多久了呢”的问题,其实很简单:
1、在P1口中断中开启捕获中断前复位一个全局的标志变量。
2、在捕获中断程序完成后置位这个全局的标志变量。
3、在P1口中断中开启捕获中断后使用“while”语句循环检查该标志变量,一旦置位则执行后续语句。
上述方法是建立在捕获中断程序完成后能正确返回的前提下才有意义。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
呵呵,修改!
上贴(7楼)中的“2、在二级中断退出前,加“_DINT();”的本意是要修改位于栈中的SP的GIE位,以便保证二级中断退出后,在一级中断里,达到禁止中断的目的。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
说得没错,我的待捕获脉冲频率比较高,但是二级中断里的程序执行时间要比脉冲周期小得多。 不会发生再次嵌套问题。应该是二级中断返回后继续执行一级中断的语句,然后再发次发生二级中断。如此并不是发生多次中断嵌套了。顶多只有两级而已。
mmtcyq说的“_DINT();”语句是起什么作用的,关闭总中断吗?我试了,没有用。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 
后贴超前贴,呵呵,请楼主回首!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
你的理解与我的表达是一致的,只不过我的表达有错误,请谅解。
目的就是为了防止在退出二级中断,回到一级中断的时候,又一个一级中断发生。否则,不就是中断重入了吗?
在二级中断里,应该没有这种危险存在,除非你在它里面又用了EINT!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用:

你的理解与我的表达是一致的,只不过我的表达有错误,请谅解。
目的就是为了防止在退出二级中断,回到一级中断的时候,又一个一级中断发生。否则,不就是中断重入了吗?
是的,我的原意也是如此,无论一级还是二级中断都是源于外部,在时间上的随机性是很大的。在一级中断中开了总中断后,一级中断重入是一方面,在程序中还有一个TA1中断,也可能嵌套进入的。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 
我之前也试过用汇编指令“ _BIC_SR_IRQ(GIE);清除GIE中断允许,但是也没有用啊。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
二级中断里面没有用到_EINT();但是它仍然可以中断很多次。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
捕获中断按单步运行查看肯定是不行的,看到的情况他总是在中断完了,又发生中断。始终在循环当中。所以,只能保证二级中断里执行完所有的语句的时间要短于下一个脉冲到来的时间很多。
按单步查看SP值,也不正确,程序总是二级中断处理完,又产生二级中断这样来回反复,SP值也只是来回的是PC值、R13、R12、R15、R14入栈,再出栈。根本看不到什么意外。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
问题解决了:
原因:我在前面开启了TimerA0中断,但是我没用到,我就把中断函数删除了,结果就出现了这个现象。
哎,出现这种错误,实在不该。
谢谢各位的热情解答。 thank!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
恭贺
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表