1. 程式人生 > >msp430學習筆記之定時器A

msp430學習筆記之定時器A

1 相關知識

1 定時器a圖解     1  定時器A圖解 2  定時器A的四種計數模式  

1. 停止模式。

2. 增計數模式。(產生兩個中斷標誌)

當計數到跟TACCR0一樣的時候,就返回0,重新計數。當計數到TACCR0的同時產生一箇中斷標誌CCIFG,而當計數器溢位返回零的同時又同時產生一箇中斷標誌TAIFG。如圖:

2 增計數模式的時序圖

3.連續計數模式(產生一箇中斷標誌)

計數器將直接計數到計數器所能計數的最大值0FFFFH之後重新返回零,再次計數。返回零的同時產生一個TAIFG中斷標誌。如圖

3 連續技術模式的時序圖

如果相應中斷位允許,每當一個定時間隔到都會產生中斷請求,在連續計數模式下,須將下一事件發生的時間在當前中斷程式中加到CCRx中,如圖4,下次發生中斷的時間等於在CCR0a發生中斷時刻,CCR0 = CCR0a + Δt

4 連續計數模式下中斷與CCRx關係

4 增減計數模式(產生兩個中斷標誌)

當計數器計數到跟TACCR0一樣的之後,然後從TACCR0開始又減少,直到為零,然後又開始增。當計數跟TACCR0一樣的時候產生一箇中斷標誌CCIFG,當減到為零的時候又產生一箇中斷標誌TAIFG。如圖:


圖 5 增減計數模式時序圖

相關暫存器這裡就不一一介紹了,可以翻閱資料手冊

2 程式碼實現

//本平臺 msp430f149
#include <msp430f149.h>

volatile unsigned char count = 0,flag = 0;

void P2_config(){
	P2DIR = 0x80;
	P2OUT = 0xff;

}

void select_xt2(void){
	
	unsigned char i;
	
	/*------選擇系統主時鐘為8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                 	
	do{    
    IFG1 &= ~OFIFG;                 		//清除晶振失敗標誌
        for (i = 0xFF; i > 0; i--);     	//等待8MHz晶體起振
    }while ((IFG1 & OFIFG));             	
	
    BCSCTL2 |= SELM_2 + SELS  ;           	//MCLK和SMCLK選擇高頻晶振	

}


void main(){
	WDTCTL = WDTPW + WDTHOLD;				       // 關狗
	select_xt2();								   //8MHz晶振	
	P2_config();
	
	CCTL0 = CCIE;                                  // CCR0 中斷使能
 	CCR0 = 10000;
  	TACTL = TASSEL_2 + MC_2 + ID_3;                // SMCLK = 1MHz, 連續計數模式
	 _EINT();									   // 開啟全域性中斷
	
	while(1){
		if(count == 50){
			count = 0;
			P2OUT  ^= BIT7 ;
	        
		}
		
	}

}

// Timer A0 中斷服務函式
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  count ++;
  CCR0 += 10000;                            // 下次中斷時間裝入CCR0中
}

3 實驗結果

       led燈間隔0.5s變化一次,說明使用定時器比較模式成功