MSP430 仿真过程中低功耗问题

[复制链接]
2199|12
 楼主| 哈利 发表于 2013-11-4 21:29 | 显示全部楼层 |阅读模式
本帖最后由 哈利 于 2013-11-4 21:39 编辑

程序代码如下:
#include <msp430.h>
void main(void)
{  unsigned int i;
   WDTCTL = WDTPW + WDTHOLD;
   if(CALBC1_1MHZ==0XFF || CALDCO_1MHZ==0XFF)
   {
          while(1);   
   }
   do
   {
     IFG1 &= ~OFIFG;
     for(i=0xff;i>0;i--);
   }
   while((IFG1&OFIFG));
   P1DIR |= BIT0;
   P1OUT =0;
   ADC10CTL0 |= ADC10ON + ADC10IE + SREF_1 + ADC10SHT_3 + REF2_5V + REFON;
   ADC10CTL1 |= INCH_10 + ADC10SSEL_2 + SHS_1 + CONSEQ_2;
   __enable_interrupt();                  
   TA0CCR0 = 30;                        
   TA0CCTL0 |= CCIE;                          
   TA0CTL = TASSEL_2 | MC_1;               
   LPM0;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void timer0_isr(void)
{
   TA0CTL = 0;
   TA0CCR0 =32767;
   TA0CCR1 = 2500;
   TA0CCTL0 &=~CCIE;
   TA0CCTL1 = OUTMOD_3;
   TA0CTL = TASSEL_2 + MC_1;
   ADC10CTL0 |= ENC;
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_isr(void)
{
  P1OUT ^= BIT0;
}
是这样一回事:当我让程序全速进行时,发现CPU进入低功耗不响应ADC10的中断,但是只要这时候,我按一下BREAK按钮,也就是那个红色的小手,接着通过查看寄存器得知ADC10中断标志已经置位。不可思议的是:紧接着,我按一下单步执行,发现响应了中断。再全速运行,仍然是同样的问题。每次都是这样。。。这是为什么?仿真过程有问题??
如果我把主程序最后一句“LPM0;”换成“while(1)”,仿真过程不会出现问题。求解?
dirtwillfly 发表于 2013-11-5 10:14 | 显示全部楼层
一句注释都没有。
dirtwillfly 发表于 2013-11-5 11:08 | 显示全部楼层
楼主能否讲讲程序的思路,难道使用ADC10就是为了让引脚电平翻转?
 楼主| 哈利 发表于 2013-11-5 12:39 | 显示全部楼层
dirtwillfly 发表于 2013-11-5 10:14
一句注释都没有。

抱歉,编这个程序本来就是打算看一下ADC10的SHI信号是边沿触发还是电平触发。ADC10的触发源来自TA1,TA1的输出高电平时间足够ADC采样几百次,但是运行起来发现,LED是闪烁的,说明SHI是边沿触发。因为就是一个小实验,所以没有注释。问题上午刚刚解决:当CPU进入LPM0时,MAIN CLOCK 是关闭的,而我的ADC10时钟选的是它,所以进入低功耗之后,肯定不会有中断响应的。至于BREAK一下,再执行为什么能够响应,还不知道。将ADC10的时钟源改为子系统时钟就可以。谢啦!
 楼主| 哈利 发表于 2013-11-5 12:40 | 显示全部楼层
dirtwillfly 发表于 2013-11-5 11:08
楼主能否讲讲程序的思路,难道使用ADC10就是为了让引脚电平翻转?

;P就是一个小实验,思路我回复给楼上了。
 楼主| 哈利 发表于 2013-11-5 12:42 | 显示全部楼层
哈利 发表于 2013-11-5 12:40
就是一个小实验,思路我回复给楼上了。

奥,原来是一个人啊:lol:lol,不好意思。
dirtwillfly 发表于 2013-11-5 12:43 | 显示全部楼层
哈利 发表于 2013-11-5 12:39
抱歉,编这个程序本来就是打算看一下ADC10的SHI信号是边沿触发还是电平触发。ADC10的触发源来自TA1,TA1 ...

解决了就好。:handshake
看到一堆代码就头疼:funk:

评分

参与人数 1威望 +2 收起 理由
哈利 + 2 赞一个!

查看全部评分

 楼主| 哈利 发表于 2013-11-5 12:47 | 显示全部楼层
dirtwillfly 发表于 2013-11-5 12:43
解决了就好。
看到一堆代码就头疼

恩恩,还么有完全解决,不过我下次一定会注释:lol:victory:,谢谢啦!我还会继续解决这个问题:lol
shenmu2012 发表于 2013-11-7 23:08 | 显示全部楼层
if(CALBC1_1MHZ==0XFF || CALDCO_1MHZ==0XFF)
    {
           while(1);   
    }
这个会不会进入死循环的呢?
dirtwillfly 发表于 2013-11-8 08:05 | 显示全部楼层
shenmu2012 发表于 2013-11-7 23:08
if(CALBC1_1MHZ==0XFF || CALDCO_1MHZ==0XFF)
    {
           while(1);   

这段程序的意思是:如果发现segmentA对应的位置有校正参数,则继续运行,若其里面的值没有(即使0xFF,或者有符号数-1)程序就进入死循环不执行下面的程序了
dong00520 发表于 2013-11-8 10:15 | 显示全部楼层
不错  学习下,多谢分享
liufeiyang8023 发表于 2013-11-10 21:35 | 显示全部楼层
1988020566 发表于 2013-11-12 16:48 | 显示全部楼层
中断唤醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

75

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部