6376|15

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

IO口中断的奇怪问题 [复制链接]

本人用F412做仪表,设置一个按键P16来关机,关机后进入LPM4,同时设定IO口中断,结果发现进入休眠以后P1IE莫名其妙地被清零,硬件仿真的时候读出来的P1IE为0,从而导致不能再次开机,修改内存把它改为0x40(BIT6)后才能进入中断唤醒,再次进入休眠后又成老样子了,郁闷!
换了一台机器还是不行,原以为是个别芯片的问题,现在换了一个,还是老毛病
部分程序如下,各路英雄有空的请帮我看看,谢谢!

#define KEY1 BIT6
void main(void)
{
...
for(;;)
{
if((P1IN & KEY1)==0)
{
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
P1IES= KEY1; //fall edge ××aila××e
P1IE = KEY1; //ena××e IO interrupt
LPM4;
}
}
...
}

interrupt [PORT1_VECTOR] void P1_ISP( void )
{
main_delay();
if((P1IN & KEY1) == 0)
{
P1IE = 0; //disa××e IO interrupt
LPM4_EXIT;
}
P1IFG = 0;
}

最新回复

我也一直用1.26b,后面的版本就懒得用了,改了工作台的界面,感觉烦了很多,要用新的芯片的时候再考虑用新版本吧,到时候找各位要破解版软件,哈哈  详情 回复 发表于 2005-9-9 10:03
 
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我估计是出在中断服务程序中。按键没去抖引起的。P1IN & KEY1的判断最好加些去抖处理。不行的话你我给你做个test。
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断服务程序里面的那个main_delay()就是用于去抖的。
不是去抖不去抖的问题,是根本就进不了中断了,用cspy查看内存,发现P1IE已经变成0了,而程序还停留在LPM4位置
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
下午有空,写个demo测试一下给你。加我msn,我的qq号码忘掉了,再xiaoliang 那。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
你在第一次进入P1_ISP中断时把P1IE清零了。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
erlking
if((P1IN & KEY1)==0)是否有问题?
P1IES= KEY1; 应该是下降沿中断,p1.6平时应该是高电位,进不了WDTCTL=WDTPW+WDTHOLD; //Stop WDT
P1IES= KEY1; //fall edge ××aila××e
P1IE = KEY1; //ena××e IO interrupt
LPM4;
改成if((P1IN & KEY1)==1),那么当没有按键的时候,进入lpm4
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用:

你在第一次进入P1_ISP中断时把P1IE清零了。
我忘了把主循环的语句写上来了,现在补充上去了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用:

erlking
if((P1IN & KEY1)==0)是否有问题?
P1IES= KEY1; 应该是下降沿中断,p1.6平时应该是高电位,进不了WDTCTL=WDTPW+WDTHOLD; //Stop WDT
P1IES= KEY1; //fall edge ××aila××e
P1IE = KEY1; //ena××e IO interrupt
LPM4;
改成if((P1IN & KEY1)==1),那么当没有按键的时候,进入lpm4
我的按键是对地的,有一个上拉电阻,平时为高电平,按键按下时为低电平,当然时下降沿触发了,为了防止抖动,进入中断后延迟一段时间再次查询P16口状态,如果还保持低电平则认为按键有效。前面进入LPM4时的按键查询也是一样的道理。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用:

本人用F412做仪表,设置一个按键P16来关机,关机后进入LPM4,同时设定IO口中断,结果发现进入休眠以后P1IE莫名其妙地被清零,硬件仿真的时候读出来的P1IE为0,从而导致不能再次开机,修改内存把它改为0x40(BIT6)后才能进入中断唤醒,再次进入休眠后又成老样子了,郁闷!
换了一台机器还是不行,原以为是个别芯片的问题,现在换了一个,还是老毛病
部分程序如下,各路英雄有空的请帮我看看,谢谢!

#define KEY1 BIT6
void main(void)
{
...
for(;;)
{
if((P1IN & KEY1)==0)
{
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
P1IES= KEY1; //fall edge ××aila××e
P1IE = KEY1; //ena××e IO interrupt
LPM4;
}
}
...
}

interrupt [PORT1_VECTOR] void P1_ISP( void )
{
main_delay();
if((P1IN & KEY1) == 0)
{
P1IE = 0; //disa××e IO interrupt
LPM4_EXIT;
}
P1IFG = 0;
}
我自己琢磨了一下,原因估计在这里,各位看看是否合理:
当主程序检测到按键按下,程序运行完P1IES = KEY1;时,由于按键抖动,P1IFG已经置位了,这时再运行完P1IE = KEY1;后就立刻进入IO口中断,在中断服务程序里把P1IE清0了,然后退出中断服务程序,接下来再运行LPM4这条指令,就会造成无法唤醒的状态了,解决办法是插入一条语句:
P1IES= KEY1;//fall edge ××aila××e
P1IFG = 0;
P1IE = KEY1;//ena××e IO interrupt

实验证明问题已经解决
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
应该是。进入P1中断时,总中断是关闭的,应该不会再次响应中断,更何况您是软件查询P1IN的位,所以,没有必要清楚P1IE,只要中断返回之前清除P1IFG就可以了。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
"
P1IES= KEY1;//fall edge ××aila××e
P1IFG = 0; 是要这样用的
P1IE = KEY1;//ena××e IO interrupt
"
哈哈,前面有讨论这个问题!就你不常来!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
把P1IE = 0; //disa××e IO interrupt去掉就可以了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
呵呵
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用:

把P1IE = 0; //disa××e IO interrupt去掉就可以了
不能去掉那一句的,唤醒后这个按键就改成查询方式了,只有休眠时才用中断来唤醒
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用:

兄弟在那混那!听说去了好地方了?
问题已经找道了!呵呵!很有意思的结果!
3。21版本不支持F123这个芯片,不知道为什么!看安装目录中有f123.xc和f123.ddf文件啊!应该支持的啊!
换到1.26就好了!下载速度飕飕的!l
目前在上海混,还可以,挺满意的。有空来上海玩哦。
321玩123,我玩过啊。郁闷。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
我也一直用1.26b,后面的版本就懒得用了,改了工作台的界面,感觉烦了很多,要用新的芯片的时候再考虑用新版本吧,到时候找各位要破解版软件,哈哈
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表