各位,我也是最近做项目才碰到的问题,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设定一个值,到了就产生中断