三個外部中斷INT0,INT1,INT2;對應由芯片外部引腳PD二、PD三、PB2上的電平的變化或狀態做爲中斷觸發信號。
INT0、INT一、INT2的中斷觸發方式取決於用戶程序對MCU控制寄存器(MCUCR)以及MCU控制與狀態寄存器(MCUCSR)的設定。其中,INT0和INT1支持4種中斷觸發方式,INT2支持2種。
|
INT0 |
INT1 |
INT2 |
說明 |
上升沿觸發 |
Yes |
Yes |
Yes(異步) |
|
降低沿觸發 |
Yes |
Yes |
Yes(異步) |
|
任意電平變化觸發 |
Yes |
Yes |
—— |
|
低電平觸發 |
Yes |
Yes |
—— |
無中斷標誌 |
任意電平變化觸發表示只要引腳上有邏輯電平的變化就會產生中斷申請(無論是上升沿仍是降低沿都引發中斷觸發)。
▋低電平觸發是不帶中斷標誌類型的,即只要中斷輸入引腳PD2或PD3保持低電平,那麼將一直會產生中斷申請。
▋MCU對INT0和INT1的引腳上的上升沿或降低沿變化的識別(觸發),須要I/O時鐘信號的存在(由I/O時鐘同步檢測),屬於同步邊沿觸發的中斷類型。
▋MCU對INT2的引腳上的上升沿或降低沿變化的識別(觸發),以及低電平的識別(觸發)是經過異步方式檢測的,不須要I/O時鐘信號的存在。所以,這類觸發類型的中斷常常做爲外部喚醒源,
用於將處在 Idle 休眠模式,以及處在各類其它休眠模
式的 MCU 喚醒。這是因爲除了在空閒(Idel)模式時,I/O 時鐘信號還保持繼續工
做,在其它各類休眠模式下,I/O 時鐘信號均是處在暫停狀態的。
▋若是設置了容許響應外部中斷的請求,那麼即使是引腳PD二、PD三、PB2設置爲輸出方式工做,引腳上的電平變化也會產出外部中斷觸發請求。這一特性爲用戶提供了使用軟件中斷的途徑。
與外部中斷相關的寄存器和標誌位
除了寄存器SREG中的全局中斷容許標誌位I外,與外部中斷有關的寄存器有4個,共有11個標誌位。其做用分別是3個外部中斷各自的中斷標誌位,中斷容許控制位,和用於定義外部中斷的觸發類型。
1)、MCU控制寄存器——MCUCR (ATmega328P EICRA - External Interrupt Control Register A外部中斷控制寄存器A(0x69))
MCU控制寄存器MCUCR的低4位爲INT0(ISCO1,ISC00)和INT1(ISC十一、ISC10)中斷觸發類型控制位,中斷觸發方式:
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$35($0055) |
SM2 |
SE |
SM1 |
SM0 |
ISC11 |
ISC10 |
ISC01 |
ISC00 |
讀/寫 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
初始化值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
INT0、INT1的中斷觸發方式
ISCn1 |
ISCn0 |
中斷觸發方式 |
0 |
0 |
INTn的低電平產生一箇中斷請求 |
0 |
1 |
INTn的降低沿和上升沿都產生一箇中斷請求 |
1 |
0 |
INTn的降低沿產生一箇中斷請求 |
1 |
1 |
INTn的上升沿產生一箇中斷請求 |
MCU對INT0、INT1引腳上電平值的採樣在邊沿檢測前。若是選擇脈衝邊沿觸發或電平變化中斷的方式,那麼在INT0、INT1引腳上的一個脈寬大於一個時鐘週期的脈衝變化將觸發中斷,太短的脈衝則不能保證觸發中斷。若是選擇低電平觸發中斷,中斷請求將一直保持到引腳上的低電平消失爲止。
2)、MCU控制和狀態寄存器——MCUCSR
MCU控制和狀態寄存器MCUCSR中的第6位(ISC2)爲INT2的中斷觸發類型控制位
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$34($0054) |
JTD |
ISC2 |
—— |
JTRF |
WDRF |
BORF |
EXTPF |
PORF |
讀/寫 |
R/W |
R/W |
R |
R/W |
R/W |
R/W |
R/W |
R/W |
初始化值 |
0 |
0 |
0 |
復位標誌 |
復位標誌 |
復位標誌 |
復位標誌 |
復位標誌 |
ISC2 |
中斷觸發方式 |
0 |
INT2的降低沿產生一個異步中斷請求 |
1 |
INT2的上升沿產生一個異步中斷請求 |
3)、通用中斷控制寄存器——GICR
通用中斷控制寄存器GICR的高3位爲INT0、INT1和INT2的中斷容許控制位,若是SREG寄存器中的全局中斷I位爲「1」,以及GICR寄存器中相應的中斷容許位別置爲「1」,當外部引腳INT0(或INT一、或INT2)上的電平變化時,MCU將會響應相應的中斷請求。
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$3B($005B) |
INT1 |
INT0 |
INT2 |
—— |
—— |
—— |
IVSEL |
IVCE |
讀/寫 |
R/W |
R/W |
R/W |
R |
R |
R |
R/W |
R/W |
初始化值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
//針對ATmega328P,叫作外部中斷屏蔽寄存器
ATmega328P EIMSK - External Interrupt Mask Register 外部中斷屏蔽寄存器(0x3D)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0x1D(0x3D) |
- |
- |
- |
- |
- |
- |
INT1 |
INT0 |
讀/寫 |
R |
R |
R |
R |
R |
R |
R |
R |
初始值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
4)、通用中斷標誌寄存器——GIFR
通用中斷標誌寄存器GIFR的高3位爲INT0、INT1和INT2的中斷標誌位。
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$3A($005A) |
INTF1 |
INTF0 |
INTF2 |
—— |
—— |
—— |
—— |
—— |
讀/寫 |
R/W |
R/W |
R/W |
R |
R |
R |
R |
R |
初始化值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
//針對ATmega328P,叫作外部中斷標誌寄存器
ATmega328P EIFR - External Interrupt Flag Register 外部中斷標誌寄存器(0x3C)
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0x1C(0x3C) |
- |
- |
- |
- |
- |
- |
INTF1 |
INTF0 |
讀/寫 |
R |
R |
R |
R |
R |
R |
R/W |
R/W |
初始化值 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
當 INT2..0 引腳上的有效事件知足中斷觸發條件後,INTF2..0 位會變成「1」。若是此時
SREG 寄存器中 I = 1,以及
GICR 寄存器中的 INTn 被置爲「1」,
MCU 將響應中斷請求,跳至相應的中斷向量處開始執行中斷服務程序,同時硬件自動將 INTFn 標誌位清零。
注意:用戶可使用指令將 INTFn 清除,清除的方式是寫邏輯「1」到 INTFn,將標誌清零。另外,當INT0(INT1) 設置爲低電平觸發方式時,標誌位 INTF0(INTF1) 始終爲「0」,
這並不意味着不產生中斷請求,而是低電平觸發方式是不帶中斷標誌類型的中斷觸發。在低
電平觸發方式時,中斷請求將一直保持到引腳上的低電平消失爲止。
在系統程序的初始化部分中對外部中斷進行設置時(定義或改變觸發方式),應先將GICR寄存器中該中斷容許位清零,禁止MCU響應該中斷後再設置ISCn位(中斷觸發方式)。 在開放中斷容許前,通常應經過向GIFR寄存器中的中斷標誌位INTFn寫入邏輯「1」,將該中斷的中斷標誌位清零,而後開放中斷。這樣能夠防止在改變ISCn的過程當中誤觸發中斷。 |
GICR|=0xC0; //容許INT0、INT1中斷 1100 0000 MCUCR=0x0A; //INT0、INT1降低沿觸發 0000 1010 GIFR=0xC0; //清除INT0、INT1中斷標誌位 1100 0000 //全局中斷容許; |
/* 注: */
在
ATmega328P中,
EICRA
- External Interrupt Control Register A、EIMSK -
External Interrupt Mask Register 外部中斷屏蔽寄存器、EIFR -
External Interrupt flag Register 外部中斷標誌寄存器。三個寄存器中,要觸發外部中斷,SREG.7全局中斷容許標誌位I爲1,外部中斷屏蔽寄存器(外部中斷容許標誌位)中的對應外部中斷位爲1(中斷容許),EIFR外部中斷標誌位爲1(中斷標誌位),便可觸發中斷。即:外部中斷知足觸發條件
EIFR(對應位) = 1,
,而且SREG.7 = 1 和 EIMSK(對應位) = 1