1、一AVR單片機(jī)中斷原理的介紹
ATmega328P微控制器具有兩個(gè)外部中斷引腳,分別是INT0和INT1。
-
外部中斷0(INT0):它對(duì)應(yīng)的引腳是PD2(數(shù)字引腳2)。INT0可以用于響應(yīng)外部信號(hào)的邊沿觸發(fā)(上升沿、下降沿或任意邊沿),并觸發(fā)相應(yīng)的中斷服務(wù)程序。INT0具有附加的可選特性,例如使能/禁用中斷、選擇觸發(fā)邊沿、使能上拉電阻等。
-
外部中斷1(INT1):它對(duì)應(yīng)的引腳是PD3(數(shù)字引腳3)。INT1的功能與INT0類似,它也可以用于響應(yīng)外部信號(hào)的邊沿觸發(fā),并觸發(fā)相應(yīng)的中斷服務(wù)程序。INT1同樣具有附加的可選特性,例如使能/禁用中斷、選擇觸發(fā)邊沿、使能上拉電阻等。
這兩個(gè)外部中斷引腳提供了一種機(jī)制,使得ATmega328P能夠在外部事件發(fā)生時(shí)及時(shí)中斷當(dāng)前的程序執(zhí)行,以處理外部事件或執(zhí)行其他特定的任務(wù)。程序員可以根據(jù)應(yīng)用需求來配置和利用這些外部中斷功能。
ATmega328單片機(jī)具有26個(gè)中斷源。每個(gè)中斷源都有個(gè)獨(dú)立的中斷向量作為中斷服務(wù)程序的入口地址,而且所有的中斷源都有自己獨(dú)立的使能位。如果全局中斷I和相應(yīng)的中斷使能位都置位,則在中斷標(biāo)志位置位時(shí)將執(zhí)行中斷服務(wù)程序。
一個(gè)中斷產(chǎn)生后,全局中斷使能位I將被清零,后續(xù)的中斷被屏蔽。用戶可以在中斷服務(wù)程序里面對(duì)工置位從而開發(fā)中斷,在中斷返回后全局中斷位I將重新置位。
ATmega328P單片機(jī)中斷向量表介紹:
ATmega328單片機(jī)具有2個(gè)外部中斷,分別是INT0(中斷號(hào)為2),INT1(中斷號(hào)為1),這2個(gè)外部中斷都是由單片機(jī)的引腳觸發(fā)。需要注意的是,如果允許外部中斷的話,即使是INT0,INT1這2個(gè)引腳都設(shè)置為輸出方式,外部中斷也會(huì)觸發(fā)。INT0,INT1外部中斷可以選擇的觸發(fā)方式有上升沿觸發(fā)、下降沿觸發(fā)以及低電平觸發(fā);使用外部中斷涉及到的寄存器有:
1.1 外部中斷控制寄存器A
EICRA(External Interrupt Control Register A):這是一個(gè)8位寄存器,用于配置外部中斷的觸發(fā)方式。它的低兩位(ISC01和ISC00)控制INT0的觸發(fā)方式,而高兩位(ISC11和ISC10)控制INT1的觸發(fā)方式。這些位可用于選擇外部中斷的觸發(fā)邊沿(上升沿、下降沿或任意邊沿)。
ISC11 | ISC10 | 說明 |
---|---|---|
0 | 0 | INT1引腳為低電平時(shí)產(chǎn)生中斷請(qǐng)求 |
0 | 1 | INT1引腳上的任意邏輯電平變化都會(huì)產(chǎn)生中斷請(qǐng)求 |
1 | 0 | INT1引腳為下降沿產(chǎn)生中斷請(qǐng)求 |
1 | 1 | INT1引腳為上升沿產(chǎn)生中斷請(qǐng)求 |
ISC01 | ISC00 | 說明 |
---|---|---|
0 | 0 | INT0引腳為低電平時(shí)產(chǎn)生中斷請(qǐng)求 |
0 | 1 | INT0引腳上的任意邏輯電平變化都會(huì)產(chǎn)生中斷請(qǐng)求 |
1 | 0 | INT0引腳為下降沿產(chǎn)生中斷請(qǐng)求 |
1 | 1 | INT0引腳為上升沿產(chǎn)生中斷請(qǐng)求 |
1.2 外部中斷屏蔽寄存器
EIMSK(External Interrupt Mask Register):這是一個(gè)8位寄存器,用于使能/禁用外部中斷。它包含兩個(gè)位用于使能/禁用INT0和INT1外部中斷。設(shè)置EIMSK寄存器的相應(yīng)位可以啟用對(duì)應(yīng)的外部中斷功能。
當(dāng) INT1 位被設(shè)置1并且狀態(tài)寄存器SREG中的I位被設(shè)置1時(shí),外部引腳中斷被啟用。 外部中斷控制寄存器 A (EICRA) 中的中斷檢測(cè)控制 1 位 1/0(ISC11 和 ISC10)定義外部中斷是在 INT1 引腳的上升沿和/或下降沿激活還是在檢測(cè)到電平時(shí)激活。 即使 INT1 配置為輸出,一旦引腳電平發(fā)生了相應(yīng)的變化,中斷就產(chǎn)生。 外部中斷請(qǐng)求1對(duì)應(yīng)的中斷從INT1中斷向量執(zhí)行。
當(dāng) INT0 位被設(shè)置1并且狀態(tài)寄存器SREG中的 I 位被設(shè)置1時(shí),外部引腳中斷被啟用。 外部中斷控制寄存器 A (EICRA) 中的中斷檢測(cè)控制 0 位 1/0(ISC01 和 ISC00)定義外部中斷是在 INT0 引腳的上升沿和/或下降沿激活還是在檢測(cè)到電平時(shí)激活。 即使INT0配置為輸出,一旦引腳電平發(fā)生了相應(yīng)的變化,中斷就產(chǎn)生。 外部中斷請(qǐng)求0對(duì)應(yīng)的中斷從INT0 中斷向量執(zhí)行。
1.3 外部中斷標(biāo)志寄存器
EIFR(External Interrupt Flag Register):這是一個(gè)8位寄存器,用于指示外部中斷事件的發(fā)生。當(dāng)外部中斷事件觸發(fā)時(shí),相應(yīng)的位(INTF0和INTF1)會(huì)被置位。在處理完中斷后,可以通過清除EIFR寄存器的相應(yīng)位來復(fù)位中斷標(biāo)志。
當(dāng)INT1引腳上的邊沿或邏輯變化觸發(fā)中斷請(qǐng)求時(shí),INTF1變?yōu)橹梦?。 如果 SREG 中的I位和IMSK中的INT1位被置位1,MCU將跳轉(zhuǎn)到相應(yīng)的中斷向量。中斷程序執(zhí)行時(shí)該標(biāo)志被清除。 或者,可以通過向其寫入邏輯1來清除該標(biāo)志。 當(dāng) INT1配置為電平中斷時(shí),該標(biāo)志總是被清除。
當(dāng)INT0引腳上的邊沿或邏輯變化觸發(fā)中斷請(qǐng)求時(shí),INTF0變?yōu)橹梦?。 如果SREG中的I位和EIMSK中的INT0位被置位1,MCU將跳轉(zhuǎn)到相應(yīng)的中斷向量。中斷程序執(zhí)行時(shí)該標(biāo)志被清除。 或者,可以通過向其寫入邏輯 1 來清除該標(biāo)志。 當(dāng) INT0配置為電平中斷時(shí),該標(biāo)志總是被清除。
二、中斷服務(wù)函數(shù)寫法
語法格式:
#pragma interrupt_handler<函數(shù)名>:<中斷向量號(hào)>
例如定義INT0中所服務(wù)程序:文章來源:http://www.zghlxwxcb.cn/news/detail-453138.html
#pragma interrupt_handler into_isr: 2
void into_isr(void)
{
//INTO中斷服務(wù)函數(shù)
}
三、外部中斷使用步驟
1、設(shè)置外部中斷觸發(fā)方式
2、使能外部中斷
3、設(shè)置中斷管腳(是否需要上拉電阻)
4、打開全局中斷
5、選擇終端號(hào),編寫中斷服務(wù)函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-453138.html
#include <avr/io.h>
#include <avr/interrupt.h>
// 外部中斷0的中斷服務(wù)函數(shù)
ISR(INT0_vect)
{
// 在此處編寫中斷處理代碼
// ...
}
int main(void)
{
// 配置引腳和外部中斷
// 設(shè)置PD2引腳為輸入
DDRD &= ~(1 << PD2);
// 使能PD2引腳的上拉電阻
PORTD |= (1 << PD2);
// 配置外部中斷0的觸發(fā)方式為下降沿觸發(fā)
EICRA |= (1 << ISC01);
EICRA &= ~(1 << ISC00);
// 使能外部中斷0
EIMSK |= (1 << INT0);
// 全局使能中斷
sei();//SREG |= (1 << 7);
while (1)
{
// 主循環(huán)代碼
// ...
}
return 0;
}
到了這里,關(guān)于AVR單片機(jī)ATemga328P中斷原理的介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!