- #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一直都不亮
百思不得其解
首先调试一下,看一看汇编代码,是否while中的语句被优化了。
如果被优化了,则把j定义为volatile类型阻值其优化。
调试肯定能搞定此问题。
回复 沙发 lcofjp 的帖子
xie谢谢兄弟 请问一下怎么看汇编代码是否while中的语句被优化了
重新定义了
volatile unsigned int j;
还是P6不亮
IAR 在调试的时候有个disassembly串口,里面就是汇编代码,也是可以单步执行的。
单步执行,打断点,观察j的值。
可以执行到J=1的
但是我在主程序 if(j){p==1};
在p==1前面打断点 是无法执行到p==1
回复 4楼 lcofjp 的帖子
忘记点回复你了 谢谢您啊
没进入低功耗模式吧,进入低功耗没退出来估计也是这效果。
回复 7楼 lcofjp 的帖子
麻烦您啦 不好意思
好像没有while循环的汇编代码
中断能改变全局变量没问题,按楼主的描述貌似程序一直在进中断而不能执行主循环,可以单步运行测试一下!楼主试一下在中断中把中断标志清一下!
还有个小问题,楼主i==50后没清i吗
回复 10楼 问路者 的帖子
谢谢兄弟 是把中断标志要清一下的 手册里没写要清 估计我没看仔细
问题已经解决 谢谢啦
回复 11楼 常见泽1 的帖子
呵呵,有些手册里没写明白,上次我用的4系的一个也是这样,手册明明说是不用清,最后还得自己清!
回复 11楼 常见泽1 的帖子
楼主能不能把测试ok的程序贴出来??!
回复 12楼 问路者 的帖子
这次真的谢谢您了 不然问题也解决不了
回复 13楼 yusiaochong 的帖子
简单的 就是最后把TAIFG清零就行了
回复 9楼 常见泽1 的帖子
楼主请问
在上述程序中
if { j=1 }
其中只要j是非零的结果,都可使得
while(1)
{
if(j) P1OUT |= BIT6;
}
执行,这种理解对不对?我修改中断中j=50,然后LED2就不亮了。。。。
楼上,
if(j=1)不会是漏写了吧?if(j==1)或者 if(j)
回复 16楼 huanzxj 的帖子
不修改50之前 我程序里是幅值j=1
你调试通过没有】
不管J=50 还是51 只要非零就可以
回复 楼主 常见泽1 的帖子
常见泽1,你试着给j加上volatile,你的全局变量被编译器优化了而已,呵呵
进入中断后应该清中断标志,不然会一直进入中断而无法执行主程序。