Other Parts Discussed in Thread: CC430F6137
I have the following code:
__disable_interrupt(); //stop timer TA0CTL &= ~(MC0 | MC1); //set timer count register to 0 TA0R = 0; // set aclk source, clear timer TA0CTL |= TASSEL0 + TACLR;// + TAIE; //divide by 8 TA0CTL |= ID1 | ID0; //set capture/compare register to ... TA0CCR0 = 0x4000; // Enable cc0 interrupt TA0CCTL0 |= CCIE; //set capture/compare register to ... TA0CCR1 = 0x8000; // Enable cc0 interrupt TA0CCTL1 |= CCIE; //set capture/compare register to ... TA0CCR2 = 0xB000; // Enable cc0 interrupt TA0CCTL2 |= CCIE; //start timer TA0CTL |= MC1; __enable_interrupt();
And the following interrupt handlers that don't work as I expected:
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) {
count++;
if (TA0CTL & TAIFG == TAIFG) {
count++;
}
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void) {
count++;
if (TA0CTL & TAIFG == TAIFG) {
TA0CTL &= ~TAIFG;
}
if (TA0CCTL0 & CCIFG == CCIFG) {
TA0CCTL0 &= ~CCIFG;
}
if (TA0CCTL1 & CCIFG == CCIFG) {
TA0CCTL1 &= ~CCIFG;
}
if (TA0CCTL2 & CCIFG == CCIFG) {
TA0CCTL2 &= ~CCIFG;
}
}
The interrupt flag for TA0CCTL0 is never set to 1, only TA0CCTL1 / TA0CCTL2 interrupt flags are set when the value set in TA0CCR1 / TA0CCR2 is reached by the counter. When TA0R reaches 0x4000 the TIMER0_A0_ISR is executed and no interrupt flag is set. Is this how it's supposed to work or am I doing something wrong. I also don't understand when should I use TIMER0_A0_VECTOR and when TIMER0_A1_VECTOR.
To be clear I want the following code to work as it should:
if (TA0CCTL0 & CCIFG == CCIFG) {
TA0CCTL0 &= ~CCIFG;
}
if (TA0CCTL1 & CCIFG == CCIFG) {
TA0CCTL1 &= ~CCIFG;
}
if (TA0CCTL2 & CCIFG == CCIFG) {
TA0CCTL2 &= ~CCIFG;
}
At the moment I can only work with TA0CCTL1 and TA0CCTL2, for TA0CCTL0 the TIMER0_A0_ISR is executed instead without ANY interrupt flag being set.