avr6中断及课程设计要求

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATmega16的中断系统
ATmega16的中断源和中断向量
AVR一般拥有21个中断源,每个中断源都有独立的中断向量。 AVR的程序存储区的最低端,即从Flash地址的0x0000开始 用于放置中断向量,称作中断向量区。 各种型号的AVR中断向量区的大小是不同的,由下式决定: 中断向量区大小 = 中断源个数 ×每个中断向量占据字数 AVR的21个中断中,包含1个非屏蔽中断(RESET)3个外 部中断(INT0、INT1、INT2)和17个内部中断,
4.如果使用低电平触发方式的中断作为唤醒源,将MCU从掉电 模式(Power-down)中唤醒时,电平拉低后仍需要维持一段时 间才能将MCU唤醒,这是为了提高了MCU的抗噪性能。
5.如果设置了允许响应外部中断的请求,则即便是引脚PD2、PD3、 PB2设置为输出方式工作,引脚上的电平变化也会产生外部中断 触发请求。这一特性为用户提供了使用软件产生中断的途径。
三、中断屏蔽与管理
AVR对中断采用两级控制方式。
为全局中断允许控制位:
中断允许的总控制位I(标志寄存器SREG中的I标志位SREG.7) 每一个中断源都设置了独立的中断允许位 这些中断允许位分散位于各中断源所属模块的控制寄存器中。
AVR响应一个可屏蔽中断源(假定为A中断)的中断的条件是:
1.响应A中断 = 全局中断允许标志 AND 中断A允许标志 AND 中断A标志 2.AVR复位后,各个中断允许位以及全局中断允许位均被清零, 这保证了程序在开始执行时(一般程序开头是对芯片内部以及外 围系统的初始化配置)不会受到中断的干扰。 3.在AVR复位后的用户初始化程序中,需要先对需要使用的中 断源进行必要的配置。待系统初始化过程结束后再置位I,使系 统进入正常的工作状态,开始响应中断请求。
中断服务程序的编写中断服务程序的编写
编写中断服务程序的两个基本原则:
1.全面、仔细考虑中断现场的保护和恢复。 2.中断服务程序应尽可能的短 不同高级语言开发环境中对编写中断服务程序的语法规则 和处理方法是不同的。用户在编写中断服务程序前,应对所使 用开发平台,中断程序的编写方法,中断的处理方法等有较好 的了解。 使用ICCAVR等高级语言编写中断服务程序时,用户通常 不必考虑中断现场保护和恢复的处理,这是由于编译器在编译 中断服务程序的源代码时,会在生成的目标代码中自动加入相 应的中断现场保护和恢复的指令,同时自动采用RETI指令作 为中断服务的返回指令。
与外部中断相关的寄存器和标志位
在ATmega16中,与外部中断有关的寄存器有4个,共有11 个标志位。其作用分别是3个外部中断各自的中断标志位,中断 允许控制位,和用于定义外部中断的触发类型。 1) MCU中断方式控制寄存器—MCUCR MCU控制寄存器MCUCR的低4位为INT0(ISC01、 ISC00)和INT1(ISC11、ISC10)中断触发类型控制位
• 用户可以使用指令将INTFn清除,清除的方式是写逻辑“1”到 INTFn,将标志清零。当INT0(INT1)设置为低电平触发方式时, 标志位INTF0(INTF1)始终为“0”,这并不意味着不产生中断请 求,而是低电平触发方式是不带中断标志类型的中断触发。
在系统程序的初始化部分中对外部中断进行设置时(定 义或改变触发方式),应先将GICR寄存器中该中断的中断允 许位清零,禁止MCU响应该中断后再设置ISCn位。 而在开放中断允许前,一般应通过向GIFR寄存器中的 中断标志位INTFn写入逻辑“1”,将该中断的中断标志位清 除,然后开放中断。这样可以防止在改变ISCn的过程中误触 发中断。
主函数 Void main() { Port_init(); //端口初始化 INT1_init(); //外中断1初始化 While(1) { LED_disp(); } } 外中断1函数 #pragma interrupt_handler Extint1:3 // 外中断1 Extint1() { DDRD=(1<<PD7); //PD7配置为输出 For(count=0;count<5;count++) //鸣叫5次 {beep_0;delay_ms(300); beep_1;delay_ms(300);} }
4种触发方式中,还有以下的一些不同的特点:
1.低电平触发是不带中断标志类型的,即只要中断输入引脚PD2 或PD3保持低电平,那么将一直会产生中断申请。 2.MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别 (触发),需要I/O时钟信号的存在(由I/O时钟同步检测), 属于同步边沿触发的中断类型。
MCU对INT0、INT1引脚上电平值的采样在边沿检测前。
1.如果选择脉冲边沿触发或电平变化中断的方式,那么在INT0、 INT1引脚上的一个脉宽大于一个时钟周期的脉冲变化将触发中 断,过短的脉冲则不能保证触发中断。
2.如果选择低电平触发中断,那么低电平必须保持到当前指令 执行完成才触发中断。如果是低电平触发方式的话,中断请求 将一直保持到引脚上的低电平消失为止。
同步/异步串行接收和转发器USART的内部中断
USART RXC 接收一个字节 USART TXC 发送一个字节 USART UDRE 发送数据寄存器为空
其它内部中断
SPI STC为内部SPI串行接口传送结束中断 ADC为ADC单元完成一次A/D转换的中断 EE_RDY是片内的EEPROM就绪(对EEPROM的操作完成)中断 ANA_COMP是由内置的模拟比较器输出引发的中断 TWI为内部两线串行接口的中断 SPM_RDY是对片内的Flash写操作完成中断
四、中断嵌套
由于AVR在响应一个中断的过程中通过硬件将I标志位自动清 零,这样就阻止了MCU响应其它中断。因此通常情况下,AVR 是不能自动实现中断嵌套的。如要系统中必须要实现中断嵌套 的应用,用户可在中断服务程序中使用指令将全局中断允许位 开放,通过间接的方式实现中断的嵌套处理。
外部中断触发方式和特点
ATmega16的中断控制
中断优先级的确定
1.在AVR单片机中,一个中断在中断向量区中的位置决定了 它 的优先级,位于低地址的中断优先级高于位于高地址的中断。 2.AVR单片机采用固定的硬件优先级方式,不支持通过软件 对中断优先级的重新设定。
中断标志
AVR有两种机制不同的中断: 带有中断标志的中断(可挂起) 不带中断标志的中断(不能挂起)。 在AVR中,大多数的中断都属于带中断标志的中断。
1.外部中断
INT0、INT1和INT2是3个外部中断源,它们是分别由芯片 外部引脚PD2、PD3、PB2上的电平的变化或状态触发的。通 过对控制寄存器MCUCR和控制与状态寄存器MCUCSR的配 置,外部中断可以定义为由PD2、PD3、PB2引脚上的电平的 下降沿、上升沿、逻辑电平变化,或者低电平(INT2仅支持 电平变化的边沿触发)触发。
课程设计:多功能温度计 设计要求:采用12864液晶显示器,DS18B20,DS1302以及 单片机(可用AT89S52或者ATMEGA16)来实现。 功能: 1.有上电指示灯 2.能正确手动复位 3.能实时显示当前的日历时间 4.能正确显示当前温度 5.可以手动设置上下限报警温度,当温度不在设置范围内时, 蜂鸣器报警。 (两个同学一组,作品包括实物以及课程设计报告)
在ICCAVRR中,只要用#pragma 伪指令和中断向量说明 中断服务程序的入口地址。 中断服务函数按以下格式定义:
#pragma interrupt_handler <函数名>:<中断向量>
C编译器会自动帮助用户产生正确的中断向量处的以及初 始化堆栈指针的代码,同时在中断服务程序中自动生成中断现 场保护和恢复(函数中用到的全部寄存器保护)及使用RETI 指令返回。
3个定时计数器触发的内部中断
TIMER2 COMP T2比较匹配中断 TIMER2 OVF T2定时溢出 TIMER1 CAPT T1捕捉溢出 TIMER1 COMPA T1比较匹配A TIMER1 COMPB T1比较匹配B TIMER1 OVF T1溢出 TIMER0 OVF T0溢出 TIMER0 COMP T0比较匹配中断
INT0、INT1、INT2的中断触发方式取决于用户程序对 MCU控制寄存器MCUCR以及MCU控制与状态寄存器MCUCSR 的设定。其中,INT0和INT1支持4种中断触发方式,INT2支持2 种。
任意电平变化触发表示只要引脚上有逻辑电平的变化就会 产生中断申请(不管是上升沿还是下降沿都引起中断触发)
流水灯显示函数 voidLED_disp() {uchar i; For(i=0;i<8;i++) {PORTA=~(1<<i); delay_ms(200); } } 中断初始化 Void INT_init() { SREG=0X80; //使能全局中断 MCUCR=(1<<ISC11)|(0<<ISC10); //INT1下降沿触发 GICR=(1<<INT1); //使能外中断1请求 }
2)MCU控制和状态寄存器—MCUCSR MCU控制和状态寄存器MCUCSR中的第6位(ISC2)为 INT2的中断触发类型控制位
3)通用中断允许控制寄存器 —GICR 通用中断控制寄存器GICR的高3位为INT0、INT1和INT2 的中断允许控制位 。GICR寄存器中相应的中断允许位被置为 “1”,当外部引脚INT0(或INT1、或INT2)上的电平变化时, MCU将会响应相应的中断请求。
4) 通用中断标志寄存器—GIFR
中断标志寄存器GIFR的高3位为INT0、INT1和INT2的中断标志位
• 当INT2..0引脚上的有效事件满足中断触发条件后, INTF2..0位会变成“1”。如果此时SREG寄存器中I = 1,以及 GICR寄存器中的INTn被置为“1”,MCU将响应中断请求, 跳至相应的中断向量处开始执行中断服务程序,同时硬件自动 将INTFn标志位清零。
系统复位RESET中断是一个特殊的中断源,是AVR 中唯一的不可屏蔽的中断。当ATmega16由于各种原 因被复位后,程序将跳到复位向量(缺省为0x0000) 处,在该地址处通常放置一条跳转指令,跳转到主程 序继续执行。
AVR大部分中断都是可屏蔽的,可通过设置相应的中 断使能端来屏蔽。 AVR不支持软件中断。
中断标志概念 每个中断源在其I/O空间寄存器中具有自己的一个中断标志位。 AVR的硬件系统在每个时钟周期内都会检测(接受)外部(内 部)中断源的中断条件。一旦中断条件满足,AVR的硬件就会 将置位相应的中断标志位(置为“1”),表示向MCU提起中断 请求。
因为当MCU休眠时,其系统时钟往往处于停止工作状态,使 用低电平中断可以将MCU唤醒。而这一功能边沿中断是不能 代替的,因为边沿信号的检测需要系统时钟。
如:INT0中断服务程序 #pragma interrupt_handler int0_isr :2 void int0_isr(void) { \\中断服务程序 }
应用中断应举例:
#include<iom16.h> 实例1------外中断1演示 #include<macros.h> #define beep_0 (PORTD=PORTD&0X7F) //PD7上蜂鸣器发声 # define beep_1 (PORTD=PORTD&0X80) //PD7上蜂鸣器不发声 /*****************延时函数*****************************/ Void delay_ms(uint xms) Void port_init() DDRA=0XFF; //PA口为输出 PORTA=0XFF; //PA口的初始值为“1” DDRD&=(0<<PD3); //PD3为输入 PORTD|=(1<<PD3); //PD3带上拉电阻 DDRD=(1<<PD7); //PD7配置为输出
相关文档
最新文档