AVR单片机ppt教程课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、中断屏蔽与管理
AVR对中断采用两级控制方式。 为全局中断允许控制位:
中断允许的总控制位I(标志寄存器SREG中的I标志位SREG.7) 每一个中断源都设置了独立的中断允许位
这些中断允许位分散位于各中断源所属模块的控制寄存器中。
AVR响应一个可屏蔽中断源(假定为A中断)的中断的条件是:
1.响应A中断 = 全局中断允许标志 AND 中断A允许标志 AND 中断A标志 2.AVR复位后,各个中断允许位以及全局中断允许位均被清零,这保证了 程序在开始执行时(一般程序开头是对芯片内部以及外围系统的初始化配置) 不会受到中断的干扰。 3.在AVR复位后的用户初始化程序中,需要先对需要使用的中断源进行必 要的配置。待系统初始化过程结束后再置位I,使系统进入正常的工作状态, 开始响应中断请求。
4种触发方式中,还有以下的一些不同的特点: 1.低电平触发是不带中断标志类型的,即只要中断输入引脚PD2 或PD3保持低电平,那么将一直会产生中断申请。
2.MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别 (触发),需要I/O时钟信号的存在(由I/O时钟同步检测), 属于同步边沿触发的中断类型。
3.MCU对INT2的引脚上的上升沿或下降沿变化的识别(触 发),以及低电平的识别(触发)是通过异步方式检测的,不 需要I/O时钟信号的存在。因此,这类触发类型的中断经常作 为外部唤醒源,用于将处在Idle休眠模式,以及处在各种其它 休眠模式的MCU唤醒。这是由于除了在空闲(Idel)模式时, I/O时钟信号还保持继续工作,在其它各种休眠模式下,I/O时 钟信号均是处在暂停状态的。
在ICCAVRR中,只要用#pragma 伪指令和中断向量说明 中断服务程序的入口地址。
中断服务函数按以下格式定义:
#pragma interrupt_handler <函数名>:<中断向量>
C编译器会自动帮助用户产生正确的中断向量处的以及初 始化堆栈指针的代码,同时在中断服务程序中自动生成中断现 场保护和恢复(函数中用到的全部寄存器保护)及使用RETI 指令返回。
在AVR中,大多数的中断都属于带中断标志的中断。
中断标志概念 每个中断源在其I/O空间寄存器中具有自己的一个中断标志位。
AVR的硬件系统在每个时钟周期内都会检测(接受)外部(内 部)中断源的中断条件。一旦中断条件满足,AVR的硬件就会 将置位相应的中断标志位(置为“1”),表示向MCU提起中断 请求。
4.如果使用低电平触发方式的中断作为唤醒源,将MCU从掉电 模式(Power-down)中唤醒时,电平拉低后仍需要维持一段时 间才能将MCU唤醒,这是为了提高了MCU的抗噪性能。拉低的 触发电平将由看门狗的时钟信号采样两次(在通常的5V电源和 25℃时,看门狗的时钟周期为1µs)。如果电平拉低保持2次采样 周期的时间,或者一直保持到MCU启动延时(start-up time)过 程之后,MCU将被唤醒并进入中断服务。如果该电平的保持时 间能够满足看门狗时钟的两次采样,但在启动延时(start-up time)过程完成之前就消失了,那么MCU仍将被唤醒,但不会 触发中断进入中断服务程序。所以,为了保证既能将MCU唤醒, 又能触发中断,中断触发电平必须维持足够长的时间。
在系统程序的初始化部分中对外部中断进行设置时(定 义或改变触发方式),应先将GICR寄存器中该中断的中断允 许位清零,禁止MCU响应该中断后再设置ISCn位。
而在开放中断允许前,一般应通过向GIFR寄存器中的 中断标志位INTFn写入逻辑“1”,将该中断的中断标志位清 除,然后开放中断。这样可以防止在改变ISCn的过程中误触 发中断。
3个定时计数器触发的内部中断
MER2 COMP TIMER2 OVF 定时溢出2 TIMER1 CAPT 扑捉溢出1 TIMER1 COMPA 定时比较A TIMER1 COMPB 定时比较B TIMER1 OVF 定时溢出2 TIMER0 OVF 定时溢出0 TIMER0 COMP 定时比较0
同步/异步串行接收和转发器USART的内部中断
1) MCU中断方式控制寄存器—MCUCR
MCU控制寄存器MCUCR的低4位为INT0(ISC01、 ISC00)和INT1(ISC11、ISC10)中断触发类型控制位
MCU对INT0、INT1引脚上电平值的采样在边沿检测前。
1.如果选择脉冲边沿触发或电平变化中断的方式,那么在INT0、 INT1引脚上的一个脉宽大于一个时钟周期的脉冲变化将触发中 断,过短的脉冲则不能保证触发中断。
AVR的21个中断中,包含1个非屏蔽中断(RESET)3个外 部中断(INT0、INT1、INT2)和17个内部中断,
1.外部中断
INT0、INT1和INT2是3个外部中断源,它们是分别由芯片 外部引脚PD2、PD3、PB2上的电平的变化或状态触发的。通 过对控制寄存器MCUCR和控制与状态寄存器MCUCSR的配 置,外部中断可以定义为由PD2、PD3、PB2引脚上的电平的 下降沿、上升沿、逻辑电平变化,或者低电平(INT2仅支持 电平变化的边沿触发)触发。
INT0、INT1、INT2的中断触发方式取决于用户程序对 MCU控制寄存器MCUCR以及MCU控制与状态寄存器MCUCSR 的设定。其中,INT0和INT1支持4种中断触发方式,INT2支持2 种。
任意电平变化触发表示只要引脚上有逻辑电平的变化就会 产生中断申请(不管是上升沿还是下降沿都引起中断触发)
USART RXC 接收一个字节 USART TXC 发送一个字节 USART UDRE 发送数据寄存器为空
其它内部中断
SPI STC为内部SPI串行接口传送结束中断 ADC为ADC单元完成一次A/D转换的中断 EE_RDY是片内的EEPROM就绪(对EEPROM的操作完成)中断 ANA_COMP是由内置的模拟比较器输出引发的中断 TWI为内部两线串行接口的中断 SPM_RDY是对片内的Flash写操作完成中断
如:INT0中断服务程序 #pragma interrupt_handler int0_isr:2 void int0_isr(void)
{ \\中断服务程序
}
•外部中断应用实例
硬件电路
•图中使用了两个按键K1、K2,按键的 一端分别与PD2(INT0)、PD3 (INT1)连接。INT0和INT1作为外部 中断的输入,采用电平变化的下降沿触 发方式,当K1(K2)按下时,会在 PD2(PD3)引脚上产生一个高电平到 低电平的跳变,触发INT0或INT1中断。
ATmega16的中断控制
中断优先级的确定
1.在AVR单片机中,一个中断在中断向量区中的位置决定了 它 的优先级,位于低地址的中断优先级高于位于高地址的中断。 2.AVR单片机采用固定的硬件优先级方式,不支持通过软件 对中断优先级的重新设定。
中断标志
AVR有两种机制不同的中断: 带有中断标志的中断(可挂起) 不带中断标志的中断(不能挂起)。
2.如果选择低电平触发中断,那么低电平必须保持到当前指令 执行完成才触发中断。如果是低电平触发方式的话,中断请求 将一直保持到引脚上的低电平消失为止。
2)MCU控制和状态寄存器—MCUCSR
MCU控制和状态寄存器MCUCSR中的第6位(ISC2)为 INT2的中断触发类型控制位
3)通用中断允许控制寄存器 —GICR
{
delay_nms(20);
//延时大约20毫秒,去抖
if(KEY1==0)
//再次判断按键是否按下
{
while(KEY1==0); //等待按键释放 Key_Number--; //键值减1 }
}
/****** 功 能: Timer0溢出中断,数码管扫描 ******/ #pragma interrupt_handler Timer0_ovf_isr:10 void Timer0_ovf_isr(void) {
中断标志清除 中断标志位一般在MCU响应该中断时,由硬件自动清除,或 在中断服务程序中通过读/写专门数据寄存器的方式自动清除。 中断标志位除了由硬件自动清除外也可以使用软件指令清除, 注意:如用软件方法清除,清除的方法是对其写“1”。 不带(不设置)中断标志的中断: 如配置为低电平触发的外部中断即为此类型的中断 低电平中断的重要应用是唤醒处于休眠工作模式的MCU。
四、中断嵌套
由于AVR在响应一个中断的过程中通过硬件将I标志位自动清零, 这样就阻止了MCU响应其它中断。因此通常情况下,AVR是不 能自动实现中断嵌套的。如要系统中必须要实现中断嵌套的应 用,用户可在中断服务程序中使用指令将全局中断允许位开放, 通过间接的方式实现中断的嵌套处理。
外部中断触发方式和特点
中断服务程序的编写中断服务程序的编写
编写中断服务程序的两个基本原则:
1.全面、仔细考虑中断现场的保护和恢复。 2.中断服务程序应尽可能的短 不同高级语言开发环境中对编写中断服务程序的语法规则 和处理方法是不同的。用户在编写中断服务程序前,应对所使 用开发平台,中断程序的编写方法,中断的处理方法等有较好 的了解。 使用ICCAVR等高级语言编写中断服务程序时,用户通常 不必考虑中断现场保护和恢复的处理,这是由于编译器在编译 中断服务程序的源代码时,会在生成的目标代码中自动加入相 应的中断现场保护和恢复的指令,同时自动采用RETI指令作 为中断服务的返回指令。
ATmega16的中断系统
ATmega16的中断源和中断向量 AVR一般拥有数十个中断源,每个中断源都有独立的中断向量。
AVR的程序存储区的最低端,即从Flash地址的0x0000开始 用于放置中断向量,称作中断向量区。 各种型号的AVR中断向量区的大小是不同的,由下式决定:
中断向量区大小 = 中断源个数 ×每个中断向量占据字数
5.如果设置了允许响应外部中断的请求,则即便是引脚PD2、PD3、 PB2设置为输出方式工作,引脚上的电平变化也会产生外部中断 触发请求。这一特性为用户提供了使用软件产生中断的途径。
与外部中断有关的寄存器有4个,共有11 个标志位。其作用分别是3个外部中断各自的中断标志位,中断 允许控制位,和用于定义外部中断的触发类型。
• 当INT2..0引脚上的有效事件满足中断触发条件后, INTF2..0位会变成“1”。如果此时SREG寄存器中I = 1,以及 GICR寄存器中的INTn被置为“1”,MCU将响应中断请求, 跳至相应的中断向量处开始执行中断服务程序,同时硬件自动 将INTFn标志位清零。 • 用户可以使用指令将INTFn清除,清除的方式是写逻辑“1”到 INTFn,将标志清零。当INT0(INT1)设置为低电平触发方式时, 标志位INTF0(INTF1)始终为“0”,这并不意味着不产生中断请 求,而是低电平触发方式是不带中断标志类型的中断触发。
if(KEY0==0)
//再次判断按键是否按下
{
while(KEY0==0); //等待按键释放
Key_Number++; //键值加1
}
}
/****** 功 能: INT1中断函数,使键值减1 ******/
#pragma interrupt_handler Int1_isr:3
void Int1_isr(void)
通用中断控制寄存器GICR的高3位为INT0、INT1和INT2 的中断允许控制位 。GICR寄存器中相应的中断允许位被置为 “1”,当外部引脚INT0(或INT1、或INT2)上的电平变化时, MCU将会响应相应的中断请求。
4) 通用中断标志寄存器—GIFR 中断标志寄存器GIFR的高3位为INT0、INT1和INT2的中断标志位
应用中断应举例:
定时扫描数码管,INT0、INT1按键下降沿出发中断,使键值分别加减1
/****** 功 能: INT0中断函数,使键值加1 ******/
#pragma interrupt_handler Int0_isr:2
void Int0_isr(void)
{
delay_nms(20); //延时大约20毫秒,去抖