§2.6 中断系统
中断系统是单片机的重要组成部分,实时控制、数据传送、故障自动处理等往往都采用中断系统。中断系统的应用使单片机的功能更强、效率更高、使用更加灵活方便。本章主要介绍中断的概念以及Atmega8单片机的中断系统。 一、中断的概念:
㈠ 什么是中断
所谓中断指的是由于某中原因,使当前正在进行的工作暂时停止,改为去执行另一项工作,待这项工作处理完后,回到原来的地方继续以前的工作。
其实,在我们日常生活中也经常发生中断现象。例如:小王正在家中看书,突然响起急促的电话铃。小王放下手中的所看的书,去听电话。电话是他同学打来的,因两人很久没有联系,自然少不了一番寒暄。之后,小王挂断电话,又继续看书。
㈡、中断的基本术语 1.主程序
主程序就是单片机中断前所执行的程序。上例中小王看书的过程可以理解为主程序。
2.中断源
中断源即引起中断的原因或事件。上例中小王的同学是引起小王中断看书的根本原因,因此,小王的同学是产生这次中断的中断源。
3.中断请求信号
中断请求信号指的是中断源通过什么方式请求中断。上例中小王的同学是通过电话铃声请求中断的,因此,电话铃声是产生这次中断的中断请求信号。
4.中断服务程序
中断服务程序即发生中断后所执行的程序。上例中小王暂停看书后所做的事是接他同学的电话,因此,小王接听电话是中断服务程序。
5.断点
断点就是主程序被断开的位置。在上例中,假设小王刚好看到第98页时,电话铃声响了,小王暂停看书去接听电话,那么第98页就是断点。
6.中断的优先级 在同一时刻,使单片机暂停当前正在执行程序的中断源有可能不止一个,而每个中断源都有自己的“份量”,有的请求比较迫切,单片机必须尽快响应,而有的则可以等会后才响应,这就是中断的优先级。 二、Atmega8单片机的中断系统
不同型号的单片机,其硬件结构和软件指令有所不同,中断系统也有所不同。下面我们就来看看Atmega8单片机的的中断系统。
㈠ 中断源
Atmega8单片机提供了18个中断源和一个复位向量。每个中断源在程序空间都有一个独立的中断向量号(地址),如表2—9所示。
表2—9 Atmega8中断源和中断向量 中断向量号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 中断源 RESET INT0 INT1 TIMER2 COMP TIMER2OVF TIMER1CAPT TIMER1 COMPA TIMER1 COMPB TIMER1OVF TIMER0OVF SPI,STC USART,RCX USART,UDRE USART,TXC ADC EE_RDY ANA_COMP TWI SPM_RDY 中断定义 上电、外部、BOD、看门狗复位 外部中断0 外部中断1 定时/计数器2比较匹配 定时/计数器2溢出中断 定时/计数器1捕获事件 定时/计数器1比较匹配A 定时/计数器1比较匹配B 定时/计数器1溢出中断 定时/计数器0溢出中断 SPI串行传输完成 USART,Rx完成 USART,寄存器空 USART,Tx完成 ADC转换完成 E2PROM准备好 模拟比较器 两线串行接口(I2C) 写程序存储器准备好 在这19个中断向量中,中断向量号越小的,其中断优先级别越高。
㈡ 与外部中断有关寄存器
在Atmega8单片机18个中断源中,每个中断源都有独立的中断使能位,在这里我们先介绍与外部中断有关使能位,其它(如定时/计数器溢出中断)在相应章节中介绍。Atmega8与外部中断有关的寄存器有MCUCR、GICR、GIFR。这三个寄存器是如何为外部中断系统服务呢?具体地说,Atmega8两个外部中断源的中断方式锁存在MCUCR中。这两个外部中断源的中断请求,能否得到响应,还受通用中断控制寄存器GICR中各位的控制和状态寄存器I位控制(I位置1,允许全局中断,在C语言中定义为SEI())。响应中断后的中断标志寄存在通用中断标志寄存器GIFR中。
1.MCU控制积存器——MCUCR
MCUCR寄存器中包含外部中断方式控制位和一般的MCU功能控制位,每一位定义如下。
位7SER/W复位值R/W06SM2R/W05SM1R/W043210MCUCRSM0ISC11ISC10ISC01ISC00R/W0R/W0R/W0R/W0R/W0
⑴ 位3、2:外部中断1的中断方式控制位
如果状态寄存器中的I位和中断控制寄存器GICR中相应的中断屏蔽位被置“1”,外部中断1会由引脚INT1(PD3)上电平的变化而触发。外部中断1的中断方式定义如表2—10。
表2—10 INT1中断方式
位3 0 0 1 1 位2 0 1 0 1 中 断 方 式 INT1的低电平产生一个中断请求 INT1的下降沿和上升沿都产生一个中断请求 INT1的下降沿产生一个中断请求 INT1的上升沿产生一个中断请求 我们用C语言编写了这样一条语句:MCUCR=0x08;其意思是外部中断1采用INT1引脚上脉冲下降沿触发。
⑵ 位1、0:外部中断0的中断方式控制位
如果状态寄存器中的I位和中断控制寄存器GICR中相应的中断屏蔽位被置“1”,外部中断0会由引脚INT0(PD2)上电平的变化而触发。外部中断0的中断方式定义如表2—11。
表2—11 INT0中断方式 位1 位0 中 断 方 式 0 0 INT0的低电平产生一个中断请求 0 1 INT0的下降沿和上升沿都产生一个中断请求 1 0 INT0的下降沿产生一个中断请求 1 1 INT0的上升沿产生一个中断请求 我们用C语言编写了这样一条语句:MCUCR=0x02;其意思是外部中断0采用INT0引脚上脉冲下降沿触发。
2.通用中断控制寄存器—GICR
我们用GICR寄存器的控制位定义相应外部中断使能,每一控制位的定义如下。
位7INT1R/W复位值R/W06INT0R/W05-R04-R03-R02-R010GICRIVSELIVCER/W0R/W0
⑴ 位7:外部中断1使能 当位7置“1”,同时状态寄存器SREG的I位被置“1”时(即打开全局中断),外部中断1被使能(开放)。即使INT1引脚(即PD3)被定义为输出方式,其上的有效电平变化仍会触发中断。
⑵ 位6:外部中断0使能 当位6置“1”,同时状态寄存器SREG的I位被置“1”时(即打开全局中断),外部中断0被使能(开放)。即使INT0引脚(即PD2)被定义为输出方式,其上的有效电平变化仍会触发中断。
3.通用中断标志寄存器—GIFR
位765-R04-R03-R02-R01-R00-R0GIFRINTF1INTF0R/W复位值R/W0R/W0
⑴ 当INT1引脚(即PD3)上的有效电平触发一个中断请求后,GIFR寄存
器的位7会变成“1”。如果SREG寄存器中的I位和GICR的位7被置“1”,MCU将跳至相应的中断处开始执行中断服务程序,同时硬件自动将GIFR的位7清零。如果将逻辑“1”写到GIFR的位7,该位将被清零。
⑵ 当INT0引脚(即PD2)上的有效电平触发一个中断请求后,GIFR寄存器的位6会变成“1”。如果SREG寄存器中的I位和GICR的位6被置“1”,MCU将跳至相应的中断处开始执行中断服务程序,同时硬件自动将GIFR的位6清零。如果将逻辑“1”写到GIFR的位6,该位将被清零。 三、单片机中断处理过程
㈠ 中断响应的条件 单片机在运行时,将对所有中断源按优先级顺序检测,单片机响应中断的条件是:
1.中断源有中断请求;
2.MCU开放全局中断,即状态寄存器SREG的I位置“1”(用C语言编程时定义为“SEI();”);
3.通用中断控制寄存器GICR的相应位置“1”。 满足以上条件,MCU一般会响应中断。 ㈡ 中断处理过程
中断处理过程可以分为中断响应、中断处理和中断返回3个阶段。 1.中断响应
中断响应包括保护断点和将程序转向中断服务程序的向量入口。当有中断源申请中断时,先将这些中断的标志位置“1”,以便MCU采样每一个中断标志。MCU根据具体情况决定是否响应中断。如果MCU没有更急、更重要的任务,则在执行完当前指令后响应中断申请。
2.中断处理
中断处理就是执行中断服务程序。 3.中断返回
中断返回就是完成中断服务程序后,程序返回到断点的位置,继续执行原来的程序。
四、C语言编制中断源程序
对中断实现控制,实质上就是对上面所讲的几个与中断有关的寄存器进行管理和控制。只要将这些寄存器的相应位按照我们的要求进行状态预置,MCU就会按照我们的意图对中断源进行管理和控制。
C语言编制中断程序的要点如下:
1.程序中必须有“#include
3.相应中断控制寄存器(如GICR)相应位置“1”。
4.对于外部中断源,还必须用MCUCR寄存器定义中断方式,是低电平触发中断,还是下降沿,或上升沿触发中断。
5.声明中断源入口的中断向量,书写格式为:
#pragma interrupt_handler 中断服务程序名_isr:中断向量 6.编制中断服务程序,书写格式如下:
#pragma interrupt_handler 中断服务程序名_isr:中断向量 void 中断服务程序名_isr:中断向量 {
中断服务程序内容 }
如果多个中断源使用同一个中断服务程序,可以用不同的中断向量声明多次,如INT0和INT1使用同一个中断服务程序: #pragma interrupt_handler int0_isr:2 #pragma interrupt_handler int0_isr:3 void int0_isr(void) {
中断服务程序内容 }
§2.7 定时/计数器
在自动控制中,常常需要实时时钟来实现定时或延时,也常常要对外部事件进行计数。下面分析定时/计数器的工作原理和Atmega8单片机的定时/计数器。 一、定时/计数器的工作原理
1.定时/计数器的工作原理图:图2—12