/* * Blikanie LEDkou na pine P1.0 s volitelnou frekvenciou blikania a striedou. Vyuzivame casovac TimerA0 a prerusenie. * Jedno spolocne prerusenie pre flagy TA0CTL.IFG (nastaveny ked timer TA0R prechadza z max. hodnoty do nuly) * a TA0CCTL1.CCIFG (nastaveny ked TA0R = TA0CCR1 ) */ #include // Definicie Makier #define LED1_ON (P1OUT |= BIT0) #define LED1_OFF (P1OUT &= ~BIT0) #define LED1_TOGGLE (P1OUT ^= BIT0) int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer //LED1 init P1DIR |= BIT0; // pin P1.0 nastavi ako vystup //TimerA0 init TA0CTL &= ~(MC_3); // zastavi TimerA0 TA0CTL |= TASSEL__SMCLK | ID__1 | TACLR; // zdroj hodin pre TimerA0 bude SMCLK; preddelicka /1; a zmaze TA0R register TA0CCR0 = 40000; // nastavi periodu TA0CCR1 = TA0CCR0/4; // nastavi striedu TA0CTL |= TAIE; // povoli prerusenie od pretecenia casovacia; nastavuje sa flag TAIFG ked casovac prechadza z maximalnej hodnoty do nuly TA0CCTL1 |= CCIE; // povoli prerusenie ked TA0R = TA0CCR1; nastavuje sa flag TA0CCTL1.CCIFG TA0CTL |= MC__UP; // spusti TimerA0 _bis_SR_register(GIE); // globalne povoli vsetky maskovatelne prerusenia // Nekonecna slucka while(1) ; return 0; } // Prerusenie od casovacia TimerA0 pre skupinu flagov // TA0CCTL1.CCIFG az TA0CCTL4.CCIFG a TA0CTL.TAIFG. // V tomto priklade vyuzivame flagy TA0CCTL1.CCIFG a TA0CTL.TAIFG #pragma vector = TIMER0_A1_VECTOR __interrupt void CasovacA0_ISR(void) { // Cez switch zistujeme, ktory flag vyvolal prerusenie switch(_even_in_range(TA0IV, 0x0E)) { case 0x00 : break; // ziadny flag case 0x02 : LED1_OFF; // flag TA0CCTL1.CCIFG break; case 0x04 : break; // flag TA0CCTL2.CCIFG case 0x06 : break; // flag TA0CCTL3.CCIFG case 0x08 : break; // flag TA0CCTL4.CCIFG case 0x0A : break; // flag TA0CCTL5.CCIFG case 0x0C : break; // flag TA0CCTL6.CCIFG case 0x0E : LED1_ON; // flag TA0CTL.TAIFG break; default: _never_executed(); } }