TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430G2433定时器Timer0_A1中断问题

各位,我也是最近做项目才碰到的问题,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是没问题的,可以正常闪烁

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

Ling Zhu2:

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,因为它单独/有一个中断源,在中断内无需分支判断,响应速度最快。

Frankie Yang:

回复 Ling Zhu2:

我的上面的代码设置定时器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 TAIFGIn capture mode any CCIFG flag is set when a timer value is captured in theassociated TACCRx register. In compare mode, any CCIFG flag is set if TARcounts to the associated TACCRx value.

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

Ling Zhu2:

回复 Frankie Yang:

Frankie Yang

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

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

我这样理解对吗?

Frankie Yang:

回复 Ling Zhu2:

以下是我按照这个理解改出来的代码,可以看到两个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;             }       }}

Frankie Yang:

回复 Ling Zhu2:

以下是我根据这个理解修改后的代码,可以看到两个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;            }      }}

Frankie Yang:

回复 Ling Zhu2:

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

Frankie Yang:

回复 Frankie Yang:

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

Ling Zhu2:

回复 Frankie Yang:

Frankie Yang

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430G2433定时器Timer0_A1中断问题
分享到: 更多 (0)