AVR單片機中斷
關(guān)于AVR中斷:
系統(tǒng)在正常運行主程序時,如果突然有一個重要的任務(wù)要馬上處理,那么系統(tǒng)就要保存現(xiàn)在的工作,然后再去處理這個任務(wù),執(zhí)行這個重要任務(wù)完畢以后再返回原來的主程序繼續(xù)運行,這就是中斷。
主程序一旦進入中斷服務(wù)程序,那么AVR芯片將自動的關(guān)閉全局中斷,在這個期間不再執(zhí)行其它的中斷請求,直到中斷程序結(jié)束以后芯片才自動的重新開放全局中斷。(注意,在這個期間某些中斷請求可能會被丟棄,某些請求會留下中斷請求標(biāo)致,一旦當(dāng)前的中斷執(zhí)行完畢,這個有中斷標(biāo)致的請求就有可能馬上得到響應(yīng),如INT0的下降沿觸發(fā)就會留下中斷請求標(biāo)致,而低電平觸發(fā)就不會流下中斷請求標(biāo)致)。如果你想在執(zhí)行中斷服務(wù)程序時響應(yīng)另外一個更重要的中斷,那么就要在中斷服務(wù)程序中加入一條打開全局中斷的語句。
使用ICC快速建立中斷服務(wù)程序 程序文件
使用ICCAVR Application Builder進行如下圖所示的設(shè)置。 可以設(shè)置是否使用中斷,上升延,下降延,低電平,任意的邏輯電平變化。
將生成的程序進行修改,DDRA = 0x01;PORTD = 0x0C; ,添加MAIN函數(shù),如下
//ICC-AVR application builder : 2006-12-8 17:04:44
// Target : M16
// Crystal: 7.3728Mhz
#include
#include
unsigned int i=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x0C; //使INT0,INT1對應(yīng)口上拉電阻有效
DDRD = 0x00; //必須設(shè)置INT0,INT1對應(yīng)口為輸入
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
i++; //在中斷里進行操作
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
PORTA = 0x01; //在中斷里進行操作
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x08; //INT1 的下降沿產(chǎn)生異步中斷請求,INT0上升延
GICR = 0xC0; //INT0和INT1使能
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1) //死循環(huán)等待中斷
;
}
相關(guān)解釋
#pragma interrupt_handler int0_isr:2
中斷的約定表示方法:int0_isr有一個與之對應(yīng)的應(yīng)用程序void int0_isr(void),2為中斷向量,值越小,優(yōu)先級越高,INT0的優(yōu)先級僅次于復(fù)位。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中斷觸發(fā)控制位與通用MCU 功能
通用中斷控制寄存器- GICR 使能或禁用外部中斷請求
使用過程中:為了降低干擾,中斷引腳請加上一個4.7K的上拉電阻,還可以根據(jù)實際需要,加上電容濾波,防抖動。
【更多資源】
編輯:admin 最后修改時間:2019-07-31