Hi all ! Trying to play with ultra low power consumption (g2553). Now trying figure it out how to use timer instead delay. Now i'm using SMCLK at 1Mhz, my code is :
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; // Set P1.0 to output direction
P1OUT &= ~BIT0; // Set the red LED on
//MCLK=SMCLK=1Mhz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
//----------------------
TA0CTL = TASSEL_2+ID_3 + MC_0; // SMCLK + /3 + up mode 125 kHz
TA0CCR0 = 125 ; // 1ms
TA0CCTL0 = CCIE; // Enable counter interrupts, bit 4=1
_BIS_SR(GIE);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void) { // Timer0 A0 interrupt service routine
P1OUT ^= BIT0;
}
1. Why LED toggles not perfectly 1ms everytime ? I see on osciloscope how it varies from 498ms to 502ms)
2. How to make function ( like _delay_cycles() ) where i can use this timer for different delays ? i.e timerdelay(100) for 100ms etc.
i think it shoulb be somethink like this, but i can't do it right:
when i call timerdelay(100);
it goes to:
void timerdelay(unsigned int time_ms)
{
TA0CTL|=TACLR; //clear timer
TACTL|=MC_1; //start timer
while(time_ms!=0)
{
//decrease time_ms value every 1ms ( in the interrupt?? )
}
if (time_ms==0)
{
TACTL|=MC_0 ; //stop timer
}
}
PLEASE HELP ! :)