前一篇和大家介紹到透過CPU不斷詢問Timer是否已經計算到目標值來達成LED的閃爍
雖然這是一個可行的方法, 但可以想像, CPU必須不斷詢問Timer的狀態, 等到Timer計算到目標值後才能繼續做其他的事情, 對於CPU來說是非常浪費資源的方法, 所以這篇要和大家介紹如何利用"中斷(interrupt)"來達成LED的閃爍
範例程式如下:
首先, 要在MSP430裡面開啟 interrupt 的功能, 我們必須要把SR (status register) 裡面的 GIE (general interrupt enable) 這個bit做設定才行.
_BIS_SR(GIE);
接著, 如果我們想設定TimerA的interrupt, 讓他時間到的時候產生interrupt, 這時我們還得設定其他部分.
如果是TimerA本身的interrupt, 我們必須把TACTL裡面的TAIE設為1 (TAIE: timerA interrupt enable). 讓TimerA能夠產生interrupt給CPU.
然而這次的範例程式, 我們是利用到TimerA裡面的Capture/Compare功能, 設定一個目標值, 當TimerA計算到目標值時產生interrupt. 所以我們必須把TACCL0的CCIE設為1. (CCIE: Capture/Compare interrupt enable)
TACCL0=CCIE;
再來, 我們需要設定, 當Interrupt發生時, 希望CPU做出什麼反應.
#pragma vector = TIMER0_A0_VECTOR;
這段程式碼便是讓編譯器知道, 這行程式碼後面的部分是作為TIMER0_A0_VECTOR發生interrupt時的處理. 這邊要特別注意的是因為MSP430有許多不同型號, 所以對應到的名稱也會有所不同, 因為這邊我使用的是MSP430G2553, 所以可以從檔案msp430g2553.h裡面找出對應到此interrupt的名稱為TIMER0_A0_VECTOR.
最後, 則是設定interrupt發生後, CPU所做的處理, 我們令了一個TimerA的函式, 並在函式裡面讓LED燈反向, 如此便可以達成LED固定閃爍的目標了.
__interrupt void Timer_A (void) {
P1OUT ^= LED1;
}
請先 登入 以發表留言。