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.

MSP430G2333: Timer1_A0 and Timer1_A1 on different frequency

Part Number: MSP430G2333

Hi 

I have trouble to getting Timer1_A0 & A1 to work on different frequency, The Timer1_A1 seem to follow whatever I set on Timer1_A0. 

From what I can understand, Timer1_A0, A1 & A2 should be able to work indecently right? 

In the following code, I expect LED1 toggle 1Hz, while the LED2 toggle 4Hz, but I see them both toggle at 1Hz. What have I done wrong??

Thanks guys!

int main(void) {
	//InitialSystem();

	wdt_stop();

	/* 12.5pF to ACLK */
	BCSCTL3 |= XCAP_3;

	/* divide ACLK by 8 */
	BCSCTL1 |= DIVA_3;


	/* initial all IOs to a known state */
	P1DIR = 0xFF;
	P1OUT = 0x00;

	P2DIR = 0xFF;
	P2OUT = 0x00;

	P3DIR = 0xFF;
	P3OUT = 0x00;

        /* ACLK, up mode, clear timer */
	TA1CTL = TASSEL_1 + MC_1 + TACLR;

        /* enable interrupt */
	TA1CCTL0 |= CCIE;
	TA1CCR0 = ONE_SECOND;

        /* enable interrupt */
	TA1CCTL1 |= CCIE;
	TA1CCR1 = (ONE_MS * 250);

	LED1_OUTPUT();
	LED2_OUTPUT();

	flash_led1(3);

	_BIS_SR(GIE+LPM3_bits);
	while(1);
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void){
	/* CCIFG is automatically reset when the TACCR1 & TACCR2 interrupt request is serviced */

	switch(TA1IV){
	case 0x02:	/* timer1_A1 */
		LED2_OUT ^= LED2_BIT;
		break;
	case 0x04: /* timer1_A2 */

		break;
	case 0x0A: /* timer1 overflow */

		break;
	}
}

/* timer1 A0 interrupt handler */
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void){
	/* CCIFG is automatically reset when the TACCRO interrupt request is serviced */
	timer_counter++;
	LED1_OUT ^= LED1_BIT;
}

  • Hi Zhuhua!

    Zhuhua Wu said:
    From what I can understand, Timer1_A0, A1 & A2 should be able to work indecently right? 

    It depends on the mode of operation. CCR0 is the base of a timer module for several things. If you want to use CCR0, CCR1 and CCR2 independently for specific time intervals, I would recommend to use the continuous mode in a way like this:

    void main( void )
    {
      ...
    
      TA1CCTL0 |= CCIE;
      TA1CCR0 = ONE_SECOND;
    
      TA1CCTL1 |= CCIE;
      TA1CCR1 = (ONE_MS * 250);
    
      /* ACLK, continuous mode, clear timer */
      TA1CTL = (TASSEL_1 | MC_2 | TACLR);
    
      ...
    
      _BIS_SR( GIE | LPM3_bits );
    
      while( 1 );
    }
    
    #pragma vector = TIMER1_A1_VECTOR
    __interrupt void TIMER1_A1_ISR( void )
    {
      /* Reading TA1IV automatically clears the highest pending interrupt flag */
      switch( TA1IV )
      {
        case 0x02: /* timer1_A1 */
          TA1CCR1 += (ONE_MS * 250); // <- Better use a constant instead of the multiplication inside the ISR
          LED2_OUT ^= LED2_BIT;
          break;
    
        case 0x04: /* timer1_A2 */
          break;
    
        case 0x0A: /* timer1 overflow */
          break;
      }
    }
    
    /* timer1 A0 interrupt handler */
    #pragma vector = TIMER1_A0_VECTOR
    __interrupt void TIMER1_A0_ISR (void )
    {
      /* CCIFG is automatically reset when the TACCRO interrupt request is serviced */
      TA1CCR0 += ONE_SECOND; // Add time
      LED1_OUT ^= LED1_BIT;
    }

    Dennis

  • Thanks Dennis, it just work. 

**Attention** This is a public forum