中断能否改变全局变量值

常见泽1   2012-5-27 17:06 楼主

  1. #include <msp430g2452.h>

    unsigned int i,j;
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P1DIR |= 0x01; // P1.0 output
    P1DIR |= BIT6;
    P1OUT = 0x00;
    TACTL = TASSEL_2 + MC_2+TACLR+TAIE; // SMCLK,contmode

    _EINT();
    while(1)
    {
    if(j) P1OUT |= BIT6;
    }
    }

    #pragma vector= TIMER0_A1_VECTOR
    __interrupt void Timer_A (void)
    {

    i++;
    if(i==50)
    {
    P1OUT ^= 0x01; // Toggle P1.0
    j=1;
    }
    }

 

P1.0的灯闪烁 说明进入了中断

在中断里把J赋值1

然后主函数里while 判断J=1 然后P6亮  很奇怪 P6一直都不亮

百思不得其解

 

 

回复评论 (22)

首先调试一下,看一看汇编代码,是否while中的语句被优化了。
如果被优化了,则把j定义为volatile类型阻值其优化。

调试肯定能搞定此问题。
点赞  2012-5-27 17:37

回复 沙发 lcofjp 的帖子

xie谢谢兄弟  请问一下怎么看汇编代码是否while中的语句被优化了

重新定义了
volatile unsigned int j;
还是P6不亮
点赞  2012-5-27 18:02
IAR 在调试的时候有个disassembly串口,里面就是汇编代码,也是可以单步执行的。

单步执行,打断点,观察j的值。
点赞  2012-5-27 18:44

点点滴滴.jpg

 

可以执行到J=1的

但是我在主程序 if(j){p==1};

在p==1前面打断点 是无法执行到p==1

点赞  2012-5-27 19:05

回复 4楼 lcofjp 的帖子

忘记点回复你了 谢谢您啊
点赞  2012-5-27 19:06
无语了,你看看有没有while循环的汇编代码
点赞  2012-5-27 19:11
没进入低功耗模式吧,进入低功耗没退出来估计也是这效果。
点赞  2012-5-27 19:16

回复 7楼 lcofjp 的帖子

麻烦您啦 不好意思
好像没有while循环的汇编代码
点赞  2012-5-27 19:19

中断能改变全局变量没问题,按楼主的描述貌似程序一直在进中断而不能执行主循环,可以单步运行测试一下!楼主试一下在中断中把中断标志清一下!

还有个小问题,楼主i==50后没清i吗

点赞  2012-5-27 21:39

回复 10楼 问路者 的帖子

谢谢兄弟  是把中断标志要清一下的  手册里没写要清 估计我没看仔细
问题已经解决 谢谢啦
点赞  2012-5-28 08:47

回复 11楼 常见泽1 的帖子

呵呵,有些手册里没写明白,上次我用的4系的一个也是这样,手册明明说是不用清,最后还得自己清!
点赞  2012-5-28 09:02

回复 11楼 常见泽1 的帖子

楼主能不能把测试ok的程序贴出来??!
点赞  2012-5-28 10:07

回复 12楼 问路者 的帖子

这次真的谢谢您了 不然问题也解决不了
点赞  2012-5-28 21:09

回复 13楼 yusiaochong 的帖子

简单的 就是最后把TAIFG清零就行了
点赞  2012-5-28 21:09

回复 9楼 常见泽1 的帖子

楼主请问
在上述程序中

if   {   j=1         }
其中只要j是非零的结果,都可使得
while(1)
{
if(j)   P1OUT |= BIT6;
}
执行,这种理解对不对?我修改中断中j=50,然后LED2就不亮了。。。。
点赞  2012-7-10 20:39
楼上,
if(j=1)不会是漏写了吧?if(j==1)或者 if(j)
没工作,没女人老婆,没宽带 ,  没钱
点赞  2012-7-10 21:52

回复 16楼 huanzxj 的帖子

不修改50之前  我程序里是幅值j=1
你调试通过没有】

不管J=50 还是51 只要非零就可以
点赞  2012-7-11 14:24

回复 楼主 常见泽1 的帖子

常见泽1,你试着给j加上volatile,你的全局变量被编译器优化了而已,呵呵
点赞  2012-7-11 15:21
进入中断后应该清中断标志,不然会一直进入中断而无法执行主程序。
点赞  2012-7-19 20:57
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复