打印

按键程序为什么不能重复执行?可能涉及了硬件细节

[复制链接]
1251|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_cir_|  楼主 | 2014-11-14 21:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
_cir_|  楼主 | 2014-11-14 21:21 | 只看该作者
本帖最后由 _cir_ 于 2014-11-14 21:26 编辑

网上有网友说可能是AD采样影响了正常的按键扫描,我现在担心的是它是不是因为程序堆栈不够了,导致函数调用出现了问题!  单片机用的是msp430f149。

使用特权

评论回复
板凳
_cir_|  楼主 | 2014-11-14 21:25 | 只看该作者
单片机是msp430f149

使用特权

评论回复
地板
dirtwillfly| | 2014-11-14 22:21 | 只看该作者
不一定阿,可能的原因有很多,也有可能被优化掉了

使用特权

评论回复
5
dirtwillfly| | 2014-11-14 22:22 | 只看该作者
说不准的

使用特权

评论回复
6
_cir_|  楼主 | 2014-11-15 19:57 | 只看该作者
dirtwillfly 发表于 2014-11-14 22:22
说不准的

问题是单片机复位之后它能正常运行一次,第二次就出问题了。

使用特权

评论回复
7
李冬发| | 2014-11-15 21:42 | 只看该作者
你的KeyValue从哪来的?

使用特权

评论回复
8
Unshining| | 2014-11-16 13:46 | 只看该作者
KeyValue是什么?在哪里改变的?这很重要。
你处理过程中禁止了按键中断,但是处理完后你重新开启了按键中断吗?
你的INT_KEY是在发生中断时调用,还是在主程序中根据标志位调用?

使用特权

评论回复
9
_cir_|  楼主 | 2014-11-16 14:59 | 只看该作者
本帖最后由 _cir_ 于 2014-11-16 15:05 编辑
Unshining 发表于 2014-11-16 13:46
KeyValue是什么?在哪里改变的?这很重要。
你处理过程中禁止了按键中断,但是处理完后你重新开启了按键中 ...

在主程序中根据标志位调用的,一旦有按键中断立马根据确定KeyValue退出低功耗模三执行按键程序。

#pragma vector=PORT2_VECTOR
__interrupt void PORT_2(void)
{

    INT_Flag = 2;
    KeyValue = P2IFG;//读取中断标志,确定按键值,KeyValue是总程序定义的全局变量
     P2IFG &= 0x0f;    //清楚中断标志                          
    LPM3_EXIT;
}

主程序部分程序
while(1){
        _BIS_SR(LPM3_bits+GIE);      
        switch(INT_Flag){

            case 2:     INT_KEY();                     
                       break;

}

使用特权

评论回复
10
_cir_|  楼主 | 2014-11-16 14:59 | 只看该作者
本帖最后由 _cir_ 于 2014-11-16 15:04 编辑
李冬发 发表于 2014-11-15 21:42
你的KeyValue从哪来的?

总程序里面定义的全局变量。

使用特权

评论回复
11
Unshining| | 2014-11-17 00:07 | 只看该作者
_cir_ 发表于 2014-11-16 14:59
在主程序中根据标志位调用的,一旦有按键中断立马根据确定KeyValue退出低功耗模三执行按键程序。

#pragma ...

1、在INT_KEY()中,关了P2高四位中断后,你是不是忘了再把它打开?
2、建议KeyValue = P2IFG & 0xf0;
3、如果还不行,请进行调试,例如直接将KeyValue的值显示在LCD上并观察现象。

使用特权

评论回复
12
_cir_|  楼主 | 2014-11-19 12:33 | 只看该作者
本帖最后由 _cir_ 于 2014-11-19 12:35 编辑
Unshining 发表于 2014-11-17 00:07
1、在INT_KEY()中,关了P2高四位中断后,你是不是忘了再把它打开?
2、建议KeyValue = P2IFG & 0xf0;
3、 ...

厉害,我就是这样解决的!不知道为什么P2IFG中P2.2误触发置高了。我的P2.2口用来烧程序了,BSL方式的。但是我的程序在执行时这个引脚相当于悬空的,希望大神还能指导指导。谢谢!!!

使用特权

评论回复
13
Unshining| | 2014-11-19 20:28 | 只看该作者
_cir_ 发表于 2014-11-19 12:33
厉害,我就是这样解决的!不知道为什么P2IFG中P2.2误触发置高了。我的P2.2口用来烧程序了,BSL方式的。但 ...

任何悬空的引脚,当设置为输入模式(MSP430默认就是输入模式)时,其输入的电位是不固定的。引脚设为输入模式时,相当于一个电容(可以理解为MOS管的栅电容),所以一点点风吹草动(比如说来点电磁波),引入一点点电荷,都会引起该引脚电位的变化。
因此,对于没有连接的引脚,必须避免它对程序造成影响(比如说中断要禁止)。另外,为了功耗考虑,建议将未连接的引脚设为输出方式。

使用特权

评论回复
14
_cir_|  楼主 | 2014-11-28 21:27 | 只看该作者
Unshining 发表于 2014-11-19 20:28
任何悬空的引脚,当设置为输入模式(MSP430默认就是输入模式)时,其输入的电位是不固定的。引脚设为输入 ...

多谢指导···

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

17

帖子

0

粉丝