当前位置:
文档之家› 第4章avrmega16单片机中断实例
第4章avrmega16单片机中断实例
• 4) 中断嵌套
在中断发生后,SREG的I位由硬件清除,并由 RETI(中断返回)指令置位,从而允许子序列的中断响应。
由于 AVR 在响应一个中断的过程中通过硬件将 I 标志 位自动清零,这样就阻止了 MCU响应其它中断。因此通 常情况下,AVR 是不能自动实现中断嵌套的。 如要系统中必须要实现中断嵌套的应用,用户可在中 断服务程序中使用指令将全局中断允许位开放,通过间接 的方式实现中断的嵌套处理。
1) MCU 控制寄存器—MCUCR
• MCU 控制寄存器 MCUCR 的低 4 位为 INT0(ISC01、 ISC00)和 INT1(ISC11、ISC10)中断触发类型控制位。
2)MCU 控制和状态寄存器—MCUCSR
• MCU 控制和状态寄存器 MCUCSR 中的第6位(ISC2) 为 INT2 的中断触发类型控制位。
void main(void) { PORTA=0xFF; DDRA=0xFF; PORTD|=0x0C; DDRD|=0x00; //DDRD.3=0;DDRD.2=0; GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0; //清除INT0、INT1中断标志位 #asm("sei") //SREG|=0x80; SREG.7=1; while (1) { PORTA=led_7[counter]; } }
4) 通用中断标志寄存器—GIFR
• 注意:用户可以使用指令将 INTFn 清除,清除的方式是 写逻辑“1”到 INTFn,将标志清零。另外, 当INT0 (INT1) 设置为低电平触发方式时, 标志位 INTF0 (INTF1) 始终为“0”,这并不意味着不产生中断请求, 而是低电平触发方式是不带中断标志类型的中断触发。在 低电平触发方式时,中断请求将一直保持到引脚上的低电 平消失为止。 • 而在开放中断允许前,一般应通过向 GIFR 寄存器中的中 断标志位 INTFn 写入逻辑“1” ,将该中断的中断标志位 清除,然后开放中断。这样可以防止在改变ISCn 的过程
• 3)中断屏蔽与管理 AVR 对中断采用两级控制方式。所谓两级控制是指 AVR有一个中断允许的总控制位 I(即 AVR 标志寄存器 SREG 中的 I 标志位“SREG.7” ),通常称为全局中断允 许控制位。同时 AVR 为每一个中断源都设置了独立的中 断允许位,这些中断允许位分散位于各中断源所属模块的 控制寄存器中。 AVR 响应一个可屏蔽中断源(假定为A 中断)的中断 的条件是:响应A 中断 = 全局中断允许标志 AND 中断A允许标志 AND 中断A标志
按键特点
如图所示:t1和t3分别为键的闭合和断开过程中的抖动
期(呈现一串负脉冲),抖动时间长短与开关的机械特性 有关,一般为5~10ms,t2为稳定的闭合期,其时间由按
键动作确定,一般为十分之几秒到几秒,t0、t4为断开期。
• 例 4.2 采用外部中断方式,用外部振荡源为 基准的时钟系统
• 例4.3 利用外部中断实现系统断电保护的实 例
• • •
• • • • • • • • • • • • • •
void Exint0() { delay_ms(10); //消抖,为什么要消抖---按钮按下时会抖动(出现多个高低电平, 不处理会出现一次按键多次中断的情况,消抖处理还可消除由外电等原因造成的不必 要的中断。 if(PIND.2==0) { if(++counter >=16) counter=0; } } void Exint0() { delay_ms(10); //消抖 if(PIND.3==0) { if(counter)--counter; else counter =15; } }
4.4.1 外部中断触发方式和特点
• MCU 对INT2的引脚上的上升沿或下降沿变化的识别 (触 发),以及低电平的识别(触发)是通过异步方式检测的, 不需要 I/O 时钟信号的存在。因此,这类触发类型的中断 经常作为外部唤醒源。 • 如果设置了允许响应外部中断的请求,那么即便是引脚 PD2、PD3、PB2设置为输出方式工作,引脚上的电平变 化也会产生外部中断触发请求。
第 4 章 中断系统与基本应用
4.1 中断的基本概念
• 单片机一般都具有良好的中断系统,它的 优点有:
– 实现实时处理 – 实现分时操作,提高了 MCU 的效率 – 进行故障处理 – 待机状态的唤醒
4.2 ATmega16 的中断系统
• 4.2.1 ATmega16 的中断源和中断向量
4.2.2 ATmega16 的中断控制
3) 通用中断控制寄存器—GICR
• 通用中断控制寄存器GICR的高3位为INT0、 INT1和INT2 的中断允许控制位, 如果SREG寄存器中的全局中断 I 位 为“1”,以及 GICR 寄存器中相应的中断允许位被置为 “1”,当外部引脚 INT0(或 INT1、或 INT2)上的电平变 化时,MCU 将会响应相应的中断请求。
4.3 中断服务程序的编写
• 编写中断服务程序的两个基本原则:
– 全面、仔细考虑中断现场的保护和恢复。(用 C编程时可不必考虑) – 中断服务程序应尽可能的短
4.3.2 CodeVision 中断程序的编写
• 在 CVAVR 中,中断服务程序必须定义成一个特殊的函数, 称为中断服务函数。 • 中断服务函数按以下格式定义: interrupt [中断向量号] void 函数名 (void)
ATmega16 的外部中断结构示意图
INT0
触发方式
INT0 INTF0 INT1 INTF1 INT2 INTF2
INT1
触发方式
C P U
INT2
触发方式
MCUCR MCUCSR
GIFR(自动, 不必设置)
GICR
SREG.I
4.4.2 与外部中断相关的寄存器和标志位
• 在 ATmega16中,除了寄存器 SREG 中的全局 中断允许标志位 I外,与外部中断有关的寄存器有 4 个,共有 11 个标志位。其作用分别是 3 个外部 中断各自的中断标志位,中断允许控制位,和用 于定义外部中断的触发类型。
• 1) 中断优先级的确定 在 AVR 单片机中,一个中断在中断向量区中的位置决 定了它的优先级,位于低地址的中断优先级高于位于高地 址的中断。 • 2) 中断标志 AVR 有两种机制不同的中断:带有中断标志的中断 (可挂起,AVR大多数的中断属于此类型)和不带中断标 志的中断(不能挂起)。 中断标志位一般在 MCU 响应该中断时,由硬件自动清 除,或在中断服务程序中通过读/写专门数据寄存器的方 式自动清除。 不带(不设置)中断标志的中断,如配置为低电平触 发的外部中断即为此类型的中断。低电平中断的重要应用 是唤醒处于休眠工作模式的 MCU。
{
…… //函数体 }
• 对全局中断允许位的操作在 CVAVR 中使用的是 C 内嵌汇 编指令的方式:用#asm("sei")开放全局中断,用 #asm("cli")关闭全局中断。
4.4 ATmega16 的外部中断
• ATmega16 有 INT0、 INT1 和 INT2 是 3 个 外部中断源,分别由芯 片外部引脚 PD2、 PD3、PB2 上的电平 的变化或状态作为中断 触发信号。
练习题(1)
• 1、INT0中断控制PA0上的LED,INT1中断控制PA1上的 LED。
练习题(2)
• 2、PA口流水灯,INT0中断控制P用实例
• 例4.1 用按键控制的一位 LED 数码管显示系统
#include <mega16.h> #include <delay.h> /******************************************* 三个外部中断声明,注意中断向量号 *******************************/ #pragma interrupt_handler Exint0:2 #pragma interrupt_handler Exint1:3 flash unsigned char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0X39 ,0x5E,0x79,0x71}; unsigned char counter=0;