louant 发表于 2014-1-18 09:47:31

MSP430 无法跳出中断

用的是msp430f149,用定时器模拟脉冲,使端口高低电平切换,中断只做自加,主程序死循环中做处理,现在问题就是程序一直在中断中,不跳出来进入主程序中。代买如下
#include <msp430x14x.h>

#define Beep_onP4OUT&=~(BIT2+BIT1+BIT3);
#define Beep_OFF P4OUT|=(BIT2+BIT1+BIT3);

unsigned char beep_flag=1;
unsigned int beep_timer;
uint beep_timer_temp = 500;

void Clock_init()
{
   unsigned char iq0;
   BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2on, max RSEL
   BCSCTL1&=~XT2OFF; //打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG; // 清除振荡器失效标志
      for (iq0 = 255; iq0 > 0; iq0--); // 延时,等待XT2起振
   }
    while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
   
   BCSCTL2 |= SELS+SELM_2;                        // SMCLK = XT2
}

void timerA_init()
{
   CCTL0 = CCIE;                               // CCR0 interrupt enabled
   CCR0 = 5;                              // 晶振8M   
   TACTL = TASSEL_2 + MC_1+TACLR;            // SMCLK, upmode
}

void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;                  // Stop WDT

    Clock_init();
   
   P4DIR |= (BIT2+BIT1+BIT3);                           // P1.0 output
   timerA_init();

_EINT();
while(1)
    {
      if(beep_timer == beep_timer_temp)
                {
            beep_timer=0;
            switch(beep_flag)
         {
            case 1:
                      beep_flag=2;
                      //Beep_on;
                      P4OUT |= BIT2;
                      P4OUT |= BIT1;
                     P4OUT |= BIT3;
                      break;
               case 2:
                      //Beep_OFF;
                      beep_flag=1;
                      P4OUT &= ~BIT2;
                      P4OUT &= ~BIT1;
                      P4OUT &= ~BIT3;
                      if(beep_timer_temp > 10)
                        beep_timer_temp--;
                      break;
            default:break;
            }
       }

    };
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
   beep_timer++;
}


求高手指点,为什么我的程序一直在中断中不跳出来进入while(1)里面

louant 发表于 2014-1-18 09:49:27

如果把while里面的处理程序放到中断中,完全没问题,可实现效果
但我中断只想做自加操作,程序处理要放到别的地方

xyz543 发表于 2014-1-18 10:07:02

强制 Reset 它,肯定是可以跳出的!... {:lol:}

lcofjp 发表于 2014-1-18 10:14:20

在中断里面是不是需要清除一下标志位?

Jordan?? 发表于 2014-1-18 10:16:58

关注一下。。。
之前做红外遥控,解码的时候也是始终不能跳出中断,加了RETI也无法解决
最后不了了之。。。。。{:mad:}{:mad:}

Jordan?? 发表于 2014-1-18 10:22:46

lcofjp 发表于 2014-1-18 10:14
在中断里面是不是需要清除一下标志位?

IO中断才需要软件清除吧?

louant 发表于 2014-1-18 10:30:45

Jordan?? 发表于 2014-1-18 10:22
IO中断才需要软件清除吧?

是IO中断才需要清除标志位,我这里是定时器中断,就是找不到原因为什么不能跳出中断

lcofjp 发表于 2014-1-18 10:37:16

本帖最后由 lcofjp 于 2014-1-18 10:49 编辑

Jordan?? 发表于 2014-1-18 10:22
IO中断才需要软件清除吧?

你这言论头次听说。

楼主,不好意思,我说错了。

lcofjp 发表于 2014-1-18 10:57:16

原因我再猜测一下:楼主这个中断产生周期太快,5个时钟周期就要产生一个中断,所以是相应不过来的。入出中断的时间肯定是大于5个周期的。

alextime 发表于 2014-2-15 21:23:28

中断太快了

34071417 发表于 2014-3-6 19:34:00

lcofjp说的不错,5个周期,也就是不到1us就中断,太快了
页: [1]
查看完整版本: MSP430 无法跳出中断