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