This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2433定时器Timer0_A1中断问题

Other Parts Discussed in Thread: MSP430G2433

各位,我也是最近做项目才碰到的问题,Timer0_A1比较模式中断问题,比如下面代码不能进入中断,但是改为Timer0_A0可以进入中断

硬件是自己设计的,没问题,因为硬件上有LED,所以我写了个下面的实验代码来测试Timer0_A1

#include<msp430g2433.h>
#define  LED_R  BIT0      //RED LED(P2.0)
void main()
{
     WDTCTL = WDTPW + WDTHOLD;
     BCSCTL1 = CALBC1_1MHZ;           // Set DCO
     DCOCTL = CALDCO_1MHZ;
     P2DIR |= LED_R; //LED
     P2OUT &= ~LED_R;
     TACTL |= TASSEL_2 + MC_1 + ID_0;
     TA0CCTL1 |= CCIE;
     TA0CCR1 =10000;
     while(1);
}

static unsigned int Timer0_A1_Counter =0;

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1()
{

     if(TAIV ==2)

     {
          Timer0_A1_Counter ++;
          if(Timer0_A1_Counter ==50)
          {
               Timer0_A1_Counter =0;
               P2OUT ^=LED_R;
          }

     }
}

正常工作应该是LED灯1Hz闪烁,但是却不工作。以上代码定时器初始化的时候,如果(TA0CCTL1 |= CCIE; TA0CCR1 =10000;)这处改为(TA0CCTL0 |= CCIE;TA0CCR0 =10000;)并且中断向量(TIMER0_A1_VECTOR)改为(TIMER0_A0_VECTOR),也就是Timer0_A0是没问题的,可以正常闪烁

试了一天了都不行,也查了很多资料,网上也偶有反映这个问题的,谢谢!!

  • Timer_A定时器的中断

    Timer_A3定时器的下列4种事件均能产生中断

    1.主计数值计满(或计至TACCR0)后复位,TAIFG标志被置1。中断发生在计数值从TACCR0跳至0的时刻。

    2,捕获通道0发生捕获事件,或主计数值TAR计至TACCR0(计数值从TACCR0-1跳至TACCR0的时刻),TACCTL0寄存器内的CCIFG标志被置1.

    3,捕获通道1发生捕获事件,或主计数值TAR计至TACCRl(计数值从TACCR1-1跳至TACCR1的时刻),TACCTL1寄存器内的CCIFG标志被置!

    4,捕获通道2发生捕获事件,或主计数值TAR计至TACCR2(计数值从TACCR2-l跳至TACCR2的时刻),TACCTL2寄存器内的CCIFG标志被置!

    这四种事件占用了2个中断源,其中,事件2(计至TACCR0或捕获通道0发生捕获事件)独,个中断源TIMERA0_VECTOR,其余3种事件公用另一个中断源TIMERA1_VECTOR.对了需要紧急处理的捕获事件建议使用通道0,因为它单独/有一个中断源,在中断内无需分支判断,响应速度最快。

  • 我的上面的代码设置定时器TIEMRA计数模式为UP Mode,所以从芯片手册上看,我理解的应该设定一个TACCR0值,并且比TACCR1大。

    这样,TAR计数的时候,从0记到TACCR0过程中,如果计到TACCR1,则TIMER0_A1_VECTOR产生中断,当计数到TACCR0的时候,TIMER0_A0_VETOR产生中断,并且TAR再次从0开始计数。

    我这样理解对吗?

    Two interrupt vectors are associated with the 16-bit Timer_A module:
        TACCR0 interrupt vector for TACCR0 CCIFG
        TAIV interrupt vector for all other CCIFG flags and TAIFG
    In capture mode any CCIFG flag is set when a timer value is captured in the
    associated TACCRx register. In compare mode, any CCIFG flag is set if TAR
    counts to the associated TACCRx value.

    上面这段英文是我从芯片USER GUIDE上面复制的,注意加粗的字体,我觉得从这个来说,我理解的没问题,并且上面的那段测试代码有什么问题吗?

  • Frankie Yang 说:

    我的上面的代码设置定时器TIEMRA计数模式为UP Mode,所以从芯片手册上看,我理解的应该设定一个TACCR0值,并且比TACCR1大。

    这样,TAR计数的时候,从0记到TACCR0过程中,如果计到TACCR1,则TIMER0_A1_VECTOR产生中断,当计数到TACCR0的时候,TIMER0_A0_VETOR产生中断,并且TAR再次从0开始计数。

    我这样理解对吗?

    理解正确,要么设定一个TACCR0值,并且比TACCR1大

    要么改成 Continue mode

  • 以下是我按照这个理解改出来的代码,可以看到两个LED灯交替闪烁,实验OK。

    原来不管TA0CCR1设置是多少,其中断周期都是由TA0CCR0来定的,所以非常感谢!!!

    #include<msp430g2433.h>
    #define LED_R BIT0       //RED LED(P2.0)
    #define LED_B BIT6       //BLUE LED (P2.6)
    void main()
    {
          WDTCTL = WDTPW + WDTHOLD;
          BCSCTL1 = CALBC1_1MHZ;       // Set DCO
          DCOCTL = CALDCO_1MHZ;
          P2SEL &= ~BIT6;       //引脚复用
          P2DIR |= (LED_R + LED_B);
          P2OUT &= ~(LED_R + LED_B);
          TACTL |= TASSEL_2 + MC_1 + ID_0;
          TA0CCTL0 |= CCIE;
          TA0CCTL1 |= CCIE;
          TA0CCR0 =50000;
          TA0CCR1 =25000;
          while(1);
    }
    static unsigned int Timer0_A0_Counter =0;
    static unsigned int Timer0_A1_Counter =0;
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0()
    {
          Timer0_A0_Counter++;
          if(Timer0_A0_Counter ==25)
          {
                Timer0_A0_Counter =0;
                P2OUT ^=LED_B;
          }
    }
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer0_A1()
    {
          if(TAIV ==2)
          {
                Timer0_A1_Counter ++;
                if(Timer0_A1_Counter ==50)
                {
                      Timer0_A1_Counter =0;
                      P2OUT ^=LED_R;
                }
          }
    }

  • 以下是我根据这个理解修改后的代码,可以看到两个LED灯交替闪烁,实验OK。

    原来不管TA0CCR1设定的值多大,其中断向量TIMER0_A1_VECTOR的中断周期都由TA0CCR0而定,如果下面的(Timer0_A0_Counter ==25)改为50,两个中断将很难看出差别。

    所以非常感谢!!

    #include<msp430g2433.h>
    #define LED_R BIT0      //RED LED(P2.0)
    #define LED_B BIT6      //BLUE LED (P2.6)
    void main()
    {
          WDTCTL = WDTPW + WDTHOLD;
          BCSCTL1 = CALBC1_1MHZ;      // Set DCO
          DCOCTL = CALDCO_1MHZ; 
          P2SEL &= ~BIT6;     //引脚复用
          P2DIR |= (LED_R + LED_B);
          P2OUT &= ~(LED_R + LED_B);
          TACTL |= TASSEL_2 + MC_1 + ID_0;
          TA0CCTL0 |= CCIE;
          TA0CCTL1 |= CCIE;
          TA0CCR0 =50000;
          TA0CCR1 =25000;
          while(1);
    }
    static unsigned int Timer0_A0_Counter =0;
    static unsigned int Timer0_A1_Counter =0;
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0()
    {
          Timer0_A0_Counter++;
          if(Timer0_A0_Counter ==25)
          {
                Timer0_A0_Counter =0;
                P2OUT ^=LED_B;
          }
    }
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer0_A1()
    {
          if(TAIV ==2)
          {
                Timer0_A1_Counter ++;
                if(Timer0_A1_Counter ==50)
                {
                      Timer0_A1_Counter =0;
                      P2OUT ^=LED_R;
                }
          }
    }

  •  是的 

     关键是理解 三种计数模式的区别和两个中断源的区别

  • 另外,我还有一点比较困惑,比较模式和和定时器模式,感觉这两个是一样的呀,都是给TA0CCR0设定一个值,到了就产生中断

  •  这个问题水平太低了,我的意思是TAIFG什么时候中断,仔细看了下手册,懂了,谢谢!!!

  • Frankie Yang 说:

    另外,我还有一点比较困惑,比较模式和和定时器模式,感觉这两个是一样的呀,都是给TA0CCR0设定一个值,到了就产生中断

    比较模式 主要是用来输出PWM的