前面我們學習了ATmega8的I/O口作為通用數字輸入/輸出口來用時對LED數碼管控制和掃描按鍵的應用;
但ATmega8多數的I/O口都是復用口,除了作為通用數字I/O使用,還有其第二功能,這里我們學習PD2、PD3兩端口的第二功能:外部中斷。
1.外部中斷的特點:
PD2端口是外部中斷源0,PD3端口是外部中斷源1。ATmega8的外部中斷就是由這兩個引腳觸發的。
*要注意的是:如果設置允許外部中斷產生,即使是INT0和INT1引腳設置為輸出方式,外部中斷還是會觸發的。
外部中斷的觸發方式有三種可選性:
(1)上升沿觸發;
(2)下降沿觸發;
(3)低電平觸發。
具體方式是由以下三個決定的:
(1)MCU的控制寄存器MCUCR
(2)MCU控制
*當允許外部中斷且設置為低電平觸發方式時,只要中斷輸入引腳保持低電平,就將一直觸發產生中斷;
*而對于上升沿或者下降沿的中斷觸發,則需要I/O時鐘信號的存在。
要使用外部中斷我們首先要了解幾個寄存器:
(1)AVR的狀態寄存器SREG
(2)MCU控制寄存器MCUCR
(3)通用中斷控制寄存器GICR
(4)通用中斷標志寄存器GIFR
詳細信息有:
(1)AVR的狀態寄存器SREG:
SREG的每一位都是一個標志位,位7(全局中斷允許位)——I位;
該位為1時全局中斷使能允許,單獨的中斷使能則有對應的中斷寄存器控制;
該位為0時則不論單獨允許位是否置1,所有中斷都被禁止,系統將不響應任何中斷。
(2)MCU控制寄存器MCUCR:
位0(ISC00)是外部中斷0的中斷方式控制位0;
位1(ISC01)是外部中斷0的中斷方式控制位1;
位2(ISC10)是外部中斷1的中斷方式控制位0;
位3(ISC11)是外部中斷1的中斷方式控制位1;
參考表與上圖類似。
(3)通用中斷控制寄存器GICR:
位6——INT0控制外部中斷0的使能;
位7——INT1控制外部中斷1的使能。
當狀態寄存器SREG的I位(全局中斷允許位)置1時,
INT0置1則外部引腳中斷0使能;
INT1置1則外部引腳中斷1使能。
(4)通用中斷標志寄存器GIFR:
位6——INT0是外部中斷0的標志位;
位7——INT1是外部中斷1的標志位;
當INT0 引腳上的有效事件觸發一個中斷請求后,INTF0位會變成1。
如果全局中斷使能且外部中斷0 使能,則MCU將跳至相應的中斷向量處開始執行中斷服務程序,同時硬件自動將INTF0 標志位清零。
*當外部中斷0被設置為低電平觸發方式時,標志INTF0 位將始終為0。
擴展:
中斷向量表:Atmega8共有18 個中斷源,Flash程序存儲器空間的最低位置(0x000—0x012)定義為復位和中斷向量空間,也就是說把中斷函數的地址保存在這里,當中斷發生后就到這里找到對應函數的地址,然后去執行對應的函數。x向量表如下:
在中斷向量表中,處于低地址的中斷向量對應的中斷優先級高,所以系統復位RESET擁有最高優先;
外部中斷0高于外部中斷1;系統復位REST不是中斷。
編程準備:
用ICCAVR的編程,在C中只要用#pragma偽指令和中斷向量說明中斷服務程序入口地址即可:
#pragma interrupt_handler 《函數名》:《中斷向量》
例如要定義使用INT0中斷服務程序:
#pragma interrupt_handler int0_fun:2
void int0_fun()
{
。。。。。。
}
2對應INT0的中斷服務程序入口地址(由向量表中紅色字體可知);
同理,3對應INT1的中斷服務程序入口地址。
也可以讓多個中斷調用同一個函數,如:
#pragma interrupt_handler int_fun:2
#praama interrupt_handler int_fun:3
表示外部中斷0和中斷1都調用int_fun函數。
2.應用實例——中斷計數器
用兩個按鍵作為兩個外部中斷的觸發源,再接一個LED數碼管用來顯示兩位數的數據,電路圖如下:
將外部中斷0設置為下降沿觸發(MCUCR的位1為1,位0為0),中斷1設置為低電平觸發(MCUCR的位3為0,位2為0);(MCUCR=0x02)
調用同一個中斷函數,在中斷中做數值加1,然后在LED數碼管中顯示。
代碼如下:
中斷計數器
3.中斷觸發鍵盤掃描
按下鍵盤的任意一個按鍵就觸發一個中斷,然后在中斷函數中來調用鍵盤處理函數。
電路圖中,比上一講的實例中多了一個74S10的與非門,作用是任意一個按鍵按下都可以觸發一個INT0中斷。
要實現的內容是:
任意一個按鍵按下觸發一個INT0中斷,INT0設置為上升沿觸發方式(MCUCR=0x03),在中斷中做一個標志,表示有按鍵按下;
然后在主函數中判斷該標志位,有按鍵按下,消除抖動干擾,再做確認哪個按鍵按下,最后在LED數碼管上顯示按鍵
編輯:hfy
評論
查看更多