主程序一旦进入中断服务程序,那么AVR芯片将自动的关闭全局中断,在这个期间不再执行其它的中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。(注意,在这个期间某些中断请求可能会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马上得到响应,如INT0的下降沿触发就会留下中断请求标致,而低电平触发就不会流下中断请求标致)。如果你想在执行中断服务程序时响应另外一个更重要的中断,那么就要在中断服务程序中加入一条打开全局中断的语句。
使用ICCAVR Application Builder进行如下图所示的设置。 可以设置是否使用中断,上升延,下降延,低电平,任意的逻辑电平变化。
将生成的程序进行修改,DDRA = 0x01;PORTD = 0x0C; ,添加MAIN函数,如下
-
//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 on ly DDRC = 0x00; PORTD = 0x0C; //使INT0,INT1对应口上拉电阻有效 DDRD = 0x00; //必须设置INT0,INT1对应口为输入}#pragma interrupt_handler int0_isr:2void int0_isr(void){ //external interupt on INT0 i++; //在中断里进行操作}#pragma interrupt_handler int1_isr:3void int1_isr(void){ //external interupt on INT1 PORTA = 0x01; //在中断里进行操作}//call this routine to initialize all peripheralsvoid init_devices(void){ //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x08; //INT1 的下降沿产生异步中断请求,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) //死循环等待中断 ;}
相关解释
- #pragma interrupt_handler int0_isr:2
- 中断的约定表示方法:int0_isr有一个与之对应的应用程序void int0_isr(void),2为中断向量,值越小,优先级越高,INT0的优先级仅次于复位。
- MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用MCU 功能
- 通用中断控制寄存器- GICR 使能或禁用外部中断请求
使用过程中:为了降低干扰,中断引脚请加上一个4.7K的上拉电阻,还可以根据实际需要,加上电容滤波,防抖动。
上一篇:Debian中AVR交叉编译工具包的安装
下一篇:AVR定时/计数器应用设计
推荐阅读最新更新时间:2024-03-16 15:02