(1)利用定時(shí)器A的模式2(連續(xù))實(shí)現(xiàn)的定時(shí)資料 利用定時(shí)器A的模式2(連續(xù))實(shí)現(xiàn)的定時(shí)資料 在程序中對(duì)TACTL的控制,當(dāng)TACTL為如下的賦值時(shí) TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt 可以改變TASSEL_X來實(shí)現(xiàn)不同的定時(shí), 當(dāng)為TASSEL_1時(shí)選ACLK為定時(shí)時(shí)鐘,可以實(shí)現(xiàn)最短2S的定時(shí),其次為2S的倍數(shù)的定時(shí)。 當(dāng)為TASSEL_2時(shí)選 SMCLK為定時(shí)時(shí)鐘,定時(shí)取決于SMCLK的時(shí)鐘源, 1、SMCLK選 DCO = 800KHZ為時(shí)鐘源,最短定時(shí)時(shí)間 為 0.08S 的定時(shí),其次為其倍數(shù)。 2、SMCLK選 XT2也即外部高頻晶振,此時(shí)定時(shí)取決于晶振頻率,及其對(duì)分頻的設(shè)置上。主要是設(shè)置BCSCTL1及 BCSCTS2. BCSCTL1 &= ~XT2OFF; BCSCTL2 |= SELS + DIVS_3; 通過對(duì)上面兩句的不同設(shè)置,可實(shí)現(xiàn)不同的延時(shí)。 /****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK // // Description: Toggle P3.4 using software and Timer_A overflow ISR. // In this example an ISR triggers when TA overflows. Inside the TA // overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz. // Proper use of the TAIV interrupt vector generator is demonstrated. // ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz // // MSP430F149 // --------------- // /|| XIN|- // | | | // --|RST XOUT|- // | | // | P3.4|-->LED // // Dasheng // LiTian Electronic Inc. // Feb 2008 // Built with IAR Embedded Workbench Version: 3.42A 功 能: 由定時(shí)器A,采用800KHz的DCO,來實(shí)現(xiàn)近一秒的定時(shí)中斷; 計(jì)算方法: T = 1/800,000 = 1.25uS so 根據(jù)連續(xù)計(jì)數(shù)模式,當(dāng)計(jì)到0XFFFF時(shí),發(fā)生溢出中斷 因此溢出一次的時(shí)間是: 65536*1.25 = 0.0819S,所以計(jì)時(shí)1秒需12次溢出。 ******************************************************************************/ #include typedef unsigned char uchar; typedef unsigned int uint; uchar flag=0; void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &= ~XT2OFF; BCSCTL2 |= SELS + DIVS_3;   ![]() TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) { switch( TAIV ) { case 2: break; // CCR1 not used case 4: break; // CCR2 not used case 10: P4OUT ^= BIT5; // overflow break; } } /* // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P4OUT ^= BIT5; // Toggle P3.4 } */ (2)利用定時(shí)器A的模式1(上升)實(shí)現(xiàn)的定時(shí)資料 此時(shí)要用到TACCTL0 及 TACCR0 ,根據(jù)設(shè)定的不同的TACCR0及不同的TASSEL_X即可實(shí)現(xiàn)不同的定時(shí)。 但此時(shí)的中斷程序要改變。 對(duì)定時(shí)器A的中斷的說明: 1、TIMERA1_VECTOR 的中斷地址為 0XFFEA, 此中斷入口地址包含3個(gè)中斷源,屬于多源中斷,通過TAIV的值,可以知道是哪個(gè)源的中斷,當(dāng)TAIV 為0X02H時(shí) 中斷源為 TACCR1 CCR1IFG 當(dāng)TAIV 為0X04H時(shí),中斷源為 TACCR2 CCR2IFG 當(dāng)TAIV 為0X0AH時(shí),中斷源為 TA OVERFLOW TAIFG 2、TIMERA0_VECTOR 的中斷地址為 0XFFEC 為單源中斷,中斷源為TACCR0 CCR0IFG 對(duì)定時(shí)時(shí)間的說明: 當(dāng)TASSEL_1時(shí),選ACLK = 32.768KHZ,此時(shí)根據(jù)選取不同的TACCR0來實(shí)現(xiàn)不同的延時(shí), 當(dāng)TASSEL_2時(shí),選SMCLK = DCO 時(shí),~~~~~~~~~~~~~~~~~~~~~ 選SMCLK = XT2時(shí),~~~~~~~~~~~~~~~~ 關(guān)鍵語句: TACTL = TASSEL_X + MC_1; TACCR0 = ~~~~~~~; TACCTL0 = CCIE; (3)、利用定時(shí)器A的比較模式,及輸出模式4和連續(xù)計(jì)數(shù)模式可實(shí)現(xiàn)同時(shí)實(shí)現(xiàn)4個(gè)獨(dú)立的定時(shí)間隔,或4種不同的頻率輸出。 在實(shí)驗(yàn)的過程中,同時(shí)驅(qū)動(dòng)數(shù)碼管的4個(gè)段。 在比較模式下主要區(qū)分TACCR0 TACCR1 TACCR2 及TAIFG,的中斷向量及入口地址,及輸出模式(共8種) 其程序如下: #include typedef unsigned char uchar; typedef unsigned int uint; uchar flag=0; uchar table[] = {0x18,0x7e,0x51,0x52,0x36,0x92,0x90,0x5E,0x10,0x12}; //對(duì)應(yīng)0---9的共陽極碼 void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT //BCSCTL1 |= XT2OFF; //BCSCTL2 |= SELS + DIVS_3; TACCTL0 = OUTMOD_4 +CCIE ; //Enable interrupt TACCTL1 = OUTMOD_4 +CCIE ; TACCTL2 = OUTMOD_4 +CCIE ; TACCR1 = 0X8000; TACCR2 = 0X2000; TACCR0 = 0XF000; P3DIR |= BIT6 + BIT7; // P3.4 output P3OUT |= BIT6 + BIT7; P4DIR = 0XFF; P4OUT = 0XFF; TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } /**/ // Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) { switch( TAIV ) { case 2: P4OUT ^= BIT5; TACCR1 += 0X8000;break; // CCR1 not used case 4: P4OUT ^= BIT3;TACCR2 += 0X2000;break; // CCR2 not used case 10: flag++; if(flag==12){P4OUT ^= BIT2; flag = 0; } // overflow break;//flag++; } } /**/ // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer0_A (void) { P4OUT ^= BIT4; // Toggle P3.4 TACCR0 += 0XF000; } |