本單元,我們提供了三種硬體外部中斷設定方式包括:傳統暫存器逐一寫入法,C4M-OS暫存器旗標群寫入巨集及快查表法,C4M-OS預設結構體及設定函式呼叫法。
愈前面的方法愈基本,但愈繁複所以難度愈高。愈後面的方式愈間接,愈依賴函庫及作業系統的正確性,但是因為內容己經綜合整理過MCU手冊並集中成表格及結構體,使用上會愈簡捷。
C4M-OS 除了提供支援中斷硬體設定的結構體,巨集及函式以外,亦提供硬體中斷分享器Hardware Interrupt Execution Service Provider. 讓同一個硬體中斷可以分享給多個登錄在它的服務名單內的軟即時工作。硬體中斷執行服務器也需要在啟用前先完成設定。
傳統上只需直接寫入中斷模式設定暫存器即可設定中斷工作模式。M128單板電腦與其它的電腦一樣,也遵循相同的方式來設定中斷工作模式,使用者可以自行參考MCU的手冊,找出中斷需要設定的暫存器及其值並執行設定。
以下我們借由程式範例來說明如何利用 C來設定中斷工作模式。
main()
{
/*宣告區塊*/
inti;
...
/*設定區塊*/
/*AVR中斷優先固定不變無法設定*/
EICRA=0x??; /*設定外部中斷3:0觸發方式,非外部中斷不需要,*/
EICRB=0x??; /*設定中斷7:4觸發方式*/
DDRD=0x??; /*設定中斷輸出入源方向*/
EIMSK=0x??; /*設定中斷致能*/
:
sei(); /*設定所有中斷均致能*/
…
/*正式程式區塊*/
…
}
• 設定中斷優先順序:AVR優先順序固定不可設定。AVR預設不允許巢狀中斷。 由AVR運算速度夠快,若在中斷中只執行有限的輸出入動作,其執行時間很短,不太會影響到中斷執行中再發生後續中斷即時性,因此即使不接受巢狀中斷,只要中斷服務常式執行工作不太長,就不會出問題。由於預設不支持巢狀中斷優先權的影響很有限。因此 AVR各個中斷的優先權是固定沒有留下任何人為設定的空間。
• 設定中斷觸發方式:AVR有兩個中斷感測方式設定暫存器,EICRA及 EICRB。分別管理外部中斷3:0,以及7:4的觸發方式。其中3:0能夠設定的觸發方式有三種,分別為準位觸發,上緣觸發,以及下緣觸發。7:4能夠設定的觸發方式,除了前述三種以外,又多了任意上下緣觸發。每一個中斷,佔用設定暫存器2個旗標,分別為ISCn1,ISCn0 (Interrupt sensing control),其中n代表中斷編號。各旗標佔用暫存器的位置。見後面暫存器圖。
下表為ISC旗標值設定值對應的觸發方式
• AVR外部中斷接腳及其輸出入方向設定:ATMEGA128的8個外部中斷接腳,會佔用PORT D PORT E 接腳,做為中斷訊號輸入腳。PORT D的PD3:0 四支腳與INT3:0四個中斷分享。PORT E的PE7:4 四支腳與INT7:4四個中斷分享。由於中斷訊號是輸入訊號,因此要設定所選用的中斷源,其DDRXn為輸入。中斷訊號才能夠進入AVR。
• 設定中斷致能:AVR的中斷遮罩暫存器名稱為EIMSK。External Interrupt Mask。八個位元每一個對應一個外部中斷。當中斷總體致能旗標,在Status Register SREG的 I bit。設成1,且主管對特定中斷的旗標也設為1時,即致能該特定中斷。
EIMSK 內部各BITS圖如下
所有中斷禁致能:中斷與電源開關一樣,除了各個中斷源的禁致能開關以外,還有一個所有中斷的總開關禁致能。對於總禁致能AVR C提供了
◦ sei():設定整體中斷致能函式。
◦ cli():設定整體中斷禁能函式。