文档详情

第09讲-中断-外部中断.ppt

发布:2018-10-10约2.12千字共9页下载文档
文本预览下载声明
集美大学机械工程学院-郑东强 中断和外部中断 《AVR单片机原理及测控工程应用》 中断的概念 在程序运行期间,发生非预期事件 通常是为了避免查询方式的程序设计 AVR ATmega16中断数:20个 中断服务程序 中断发生时,主程序(当前程序)暂停,跳转到中断服务程序,称为“响应中断” 执行完毕后返回主程序继续运行 AVR中断的特点 每条指令结束后都检查是否有中断请求信号; 各种中断同时发生时,按中断向量号排序; 响应中断时,PC入栈,但不保存状态寄存器; 任意中断执行时,会关闭全局中断(也即禁用其他所有中断),该中断完成返回(RETI)时恢复全局中断使能; 可通过软件改变中断优先顺序; 一个中断完成返回后至少执行一条主程序再继续响应其他中断; Mage16的外部中断 M16具有3个外部中断 INT0、INT1: 支持4种触发模式, INT2 支持2种触发模式 中断相关库函数头文件 avr/interrupt.h 中断服务程序 ISR(INT0_vect) {//中断服务代码} 中断触发控制位 MCUCR和MCUCSR(白色背景) -0,下降沿触发;1,上升沿触发 中断使能和中断标志位(Flag)寄存器 GICR和GIFR 外部中断使用步骤 第1步:包含头文件 #include avr/interrupt.h 第2步:端口初始化、设置中断触发方式 任意逻辑电平变化: MCUCR |= (1 ISC10); 上升沿触发:MCUCR |= (1 ISC10)|(1 ISC11); 下降沿触发:MCUCR |= (1 ISC11); 低电平:默认 第3步:使能响应相应外部中断 GICR |= (1 INT0); 第4步:使能全局中断 sei(); 第5步:编写中断服务程序 ISR(INTx_vect){//中断代码} 简单外部中断-按键程序Interrupt_Simple * #include avr/io.h #define F_CPU 1000000 //CPU频率1M(HZ) #include util/delay.h #include avr/interrupt.h ISR(INT0_vect) { asm(sei);//允许被其他中断 _delay_ms(10);//延时防止抖动 if((PIND(12))==0) { PORTA=0x01; } while(!(PIND(12)))//等待键弹起, { _delay_ms(10); } } ISR(INT1_vect) { _delay_ms(10);//延时防止抖动 if((PIND(13))==0) { PORTA=0x02; } while(!(PIND(13)))//等待键弹起, { _delay_ms(10); } } int main(void) { DDRA=0xff; PORTA=0x0;//初始状态灯关闭,如果电容存在,会导致上电中断即产生 DDRD=0x0;//中断口作为输入 PORTD=0xff;//使能上拉电阻 MCUCR=(1ISC11)|(0ISC10)|(1ISC01)|(0ISC00); // GICR=(1INT1)|(1INT0); sei(); while(1) { } } 集美大学机械工程学院-郑东强 * #include avr/io.h #define F_CPU 1000000 //CPU频率1M(HZ) #include util/delay.h #include avr/interrupt.h ISR(INT0_vect) { asm(sei);//允许被其他中断 _delay_ms(10);//延时防止抖动 if((PIND(12))==0) { PORTA=0x01; } while(!(PIND(12)))//等待键弹起, { _delay_ms(10); } } ISR(INT1_vect) { _delay_ms(10);//延时防止抖动 if((PIND(13))==0) { PORTA=0x02; } while(!(PIND(13)))//等待键弹起, { _delay_ms(10); } } int main(void) { DDRA=0xff; PORTA=0x0;//初始状态灯关闭,如果电容存在,会导致上电中断即产生 DDRD=0x0;//中断口作为输入 PORTD=0xff;//使能上拉电阻 MCUCR=(1ISC11)|(0ISC10)|(1ISC01)|(0ISC00); // GICR=(1INT1
显示全部
相似文档