ATmega16中断系统

Download Report

Transcript ATmega16中断系统

第四章 AVR中断系统
4.1
中断概念
4.2
中断源与中断向量
4.3
中断标志及清除
第四章 AVR中断系统
4.4
AVR外部中断
4.5
中断寄存器
4.6
应用编程
四、中断系统
1、中断概念
(1)中断概念
中断是指计算机(MCU)自动响应一个
“中断请求”信号,暂时停止(中断)了当前
程序的执行,转而执行为外部设备服务的程序
(中断服务程序),并在执行完服务程序后自
动返回原程序执行的过程。
●实现实时处理。
●实现分时操作,提高了MCU的效率。
●进行故障处理。做紧急故障处理。
●待机状态的唤醒。通常,恢复到正常工作方式往
往也是利用中断信号来唤醒。
四、中断系统
1、中断概念
(2)中断处理过程
四、中断系统
(2)中断处理过程
在整个中断处理过程中,由于MCU执行完中断处理程
序后仍然要返回主程序,因此,在执行中断处理程序之
前,要将主程序中断处的地址,即断点处(实际为程序
计数器PC的当前值――即将执行的主程序的下一条指令
地址,图7-1中的k+1点)保存起来,称为保护断点。
又由于MCU在执行中断处理程序时,可能会使用和改
变主程序使用过的寄存器、标志位,甚至内存单元,因
此,在执行中断服务程序前,还要把有关的数据保护起
来,称为中断现场保护。在MCU执行完中断处理程序后,
则要恢复原来的数据,并返回主程序的断点处继续执行,
称为恢复现场和恢复断点。
四、中断系统
(3)中断分类
内部中断:
在计算机内部产生的中断;
外部中断:
由外部引脚触发的中断;
可屏蔽中断:
可由软件编程打开和关闭的中断;
非可屏蔽中断:
无法由软件编程关闭或打开的中断,任何
时候都有效。
此外,还有硬件中断和软件中断。在AVR
里面,基本都属于硬件中断。
四、中断系统
2、中断源及中断向量
(1)中断源
中断源:触发中断的事件。
ATmega16共21个中断源,包含1个非屏蔽中断
(RESET,不能软件关断)3个外部中断(INT0、INT1、INT2)
和17个内部中断,它们的具体意义和使用方法将在相应的章
节中详述。
系统复位RESET中断是一个特殊的中断源,是AVR中唯
一的不可屏蔽的中断。当ATmega16由于各种原因被复位后,
程序将跳到复位向量(缺省为0x0000)处,在该地址处通常
放置一条跳转指令,跳转到主程序继续执行。
四、中断系统
2、中断源及中断向量
(1)中断源
四、中断系统
2、中断源及中断向量
(1)中断源
INT0、INT1和INT2是3个外部中断源,它们是分别
由芯片外部引脚PD2、PD3、PB2上的电平的变化或状态
触发的。通过对控制寄存器MCUCR和控制与状态寄存器
MCUCSR的配置,外部中断可以定义为由PD2、PD3、
PB2引脚上的电平的下降沿、上升沿、逻辑电平变化,或
者低电平(INT2仅支持电平变化的边沿触发)触发,这
为外部硬件电路和设备向AVR申请中断服务提供了很大
方便。
四、中断系统
2、中断源及中断向量
(1)中断源
TIMER2 COMP、TIMER2 OVF、TIMER1 CAPT、
TIMER1 COMPA、TIMER1 COMPB、TIMER1 OVF、TIMER0
OVF、TIMER0 COMP这8个中断是来自于ATmega16内部的3
个定时计数器触发的内部中断。定时计数器处在不同的
工作模式下时,这些中断的发生条件和具体意义是不同
的,它们的应用将在有关定时计数器介绍的章节中进行
详述。
四、中断系统
2、中断源及中断向量
(1)中断源
USART RXC、USART TXC、USART UDRE是来自于ATmega16
内部的通用同步/异步串行接收和转发器USART的3个内部中断。
当USART串口完整接收一个字节、成功发送一个字节以及发送
数据寄存器为空时,这3个中断会分别被触发
其它6个中断源为: SPI STC为内部SPI串行接口传送结
束中断,ADC为ADC单元完成一次A/D转换的中断,EE_RDY是
片内的EEPROM就绪(对EEPROM的操作完成)中断,
ANA_COMP是由内置的模拟比较器输出引发的中断,TWI为内
部两线串行接口的中断,SPM_RDY是对片内的Flash写操作
完成中断。
四、中断系统
2、中断源及中断向量
(2)中断向量
中断向量:中断源的中断程序的入口地址。
每个中断源都有独立的中断向量。缺省情况下,AVR
的程序存储区的最低端,即从Flash地址的0x0000开始用
于放置中断向量,称作中断向量表——中断向量集合。
各种型号的AVR中断向量表大小是不同的,由下式决
定:
中断向量区大小 = 中断源个数 * 每个中断向量占据字数
四、中断系统
2、中断源及中断向量
(3)中断优先级及嵌套
AVR不支持软件重定义优先级——不支持硬件嵌套。在
中断复位程序中会自动关全局中断使能,其他中断无法响应。
可在中断程序中打开全局中断,以实现中断的软件嵌套。
缺省情况,AVR中断源的优先级别由中断矢量表的终端
号来确定,越低中断优先级越高,如reset为最高优先级,
SPM_RYD优先级最低。
四、中断系统
3、中断标志及清除
AVR的硬件系统在每个时钟周期内都会检测(接受)外部
(内部)中断源的中断条件。一旦中断条件满足,AVR的硬件
就会将置位相应的中断标志位(置为“1”)——向MCU提起中
断请求。
中断标志位一般在MCU响应该中断时,由硬件自动清除,或在
中断服务程序中通过读/写专门数据寄存器的方式自动清除。
也可以使用指令清除——清除的方法是对其写“1”。
当中断被禁止,或MCU不能马上响应中断,则该中断标志将会
一直保持,直到中断允许并得到响应之止。如果暂时不能被
响应,该中断标志会一直保留(除非被用户软件清除掉)。
四、中断系统
3、中断标志及清除
还有个别的中断不带(不设置)中断标志,如配置为低
电平触发的外部中断即为此类型的中断。这类中断只要中断
条件满足(外部输入低电平),便会一直向MCU发出中断申
请,它不产生中断标志。如果由于等待时间过长而得不到响
应,可能会因中断条件结束(低电平取消)而失去一次服务
机会。
如果低电平维持时间过长,会程序反复中断死机。因此,
在中断后,应该有破坏中断条件产生的操作,使外部器INT
引脚上低电平消失。
低电平中断的重要应用是唤醒处于休眠工作模式的MCU。
因为当MCU休眠时,其系统时钟往往处于停止工作状态,使
用低电平中断可以将MCU唤醒。而这一功能边沿中断是不能
代替的,因为边沿信号的检测需要系统时钟。
四、中断系统
4、外部中断
INT0、INT1和INT2
3个外部中断源,分别由芯片外部引
脚PD2、PD3、PB2上的电平的变化或状态作为中断触发信号。
其中,INT0和INT1支持4种中断触发方式,INT2支持2种。
四、中断系统
4、外部中断
特 点:
●低电平触发是不带中断标志类型的,只要PD2或PD3保持低
电平,一直会产生中断申请。
● MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别
(触发),需要I/O时钟信号的存在(由I/O时钟同步检测
),属于同步边沿触发的中断类型。
● MCU对INT2的引脚上的上升沿或下降沿变化的识别(触发
),以及低电平的识别(触发)是通过异步方式检测的,
不需要I/O时钟信号。因此,这类触发类型的中断经常作为
外部唤醒源。
四、中断系统
4、外部中断
●如果使用低电平触发方式的中断作为唤醒源,将MCU从
掉电模式(Power-down)中唤醒时,电平拉低后仍需要
维持一段时间才能将MCU唤醒,以提高CPU的抗噪性能。
为了保证既能将MCU唤醒,又能触发中断,中断触发电
平必须维持足够长的时间。
● 如果设置了允许响应外部中断的请求,即便是PD2、
PD3、PB2设置为输出方式,引脚的电平变化也将产生外
部中断触发请求。这一特性为用户提供了使用软件产生
中断的途径。
四、中断系统
5、中断寄存器
在ATmega16中,除了寄存器SREG中的全局中断允许标
志位I外,与外部中断有关的寄存器有4个,共有11个标
志位。其作用分别是:
●3个外部中断中断标志位,
● 3个中断允许控制位
● 用于定义外部中断的触发类型。
(1)中断控制寄存器——MCUCR
四、中断系统
5、中断寄存器
(1)中断控制寄存器——MCUCR
MCU控制寄存器MCUCR的低4位为INT0(ISC01、ISC00)
和INT1(ISC11、ISC10)中断触发类型控制位,中断触发
方式见表:
四、中断系统
5、中断寄存器
(2)控制和状态寄存器——MCUCSR
仅MCUCSR的第6位控制INT2的中断方式。
四、中断系统
5、中断寄存器
(3)通用中断控制寄存器——GICR
GICR的高3位为INT0、INT1和INT2的中断允许控制位,
只有SREG寄存器中的全局中断I位为“1”,以及GICR寄存
器中相应的中断允许位被置为“1”,当外部引脚INTx上的
电平变化时,MCU将会响应相应的中断请求。
四、中断系统
5、中断寄存器
(4)通用中断标志寄存器——GIFR
●当INTx引脚上的有效事件满足中断触发条件后,INTFx位会变成“1”。
如果此时SREG寄存器中I = 1,以及GICR寄存器中的INTn被置为“1”,
MCU将响应中断请求同时硬件自动将INTFn标志位清零。
● 用户可以使用指令将INTFn清除,清除的方式是写逻辑“1”到INTFn,
将标志清零。
● 当INT0(INT1)设置为低电平触发方式时,标志位INTF0(INTF1)始
终为“0”,这并不意味着不产生中断请求,而是低电平触发方式是不带
中断标志类型的中断触发。在低电平触发方式时,中断请求将一直保持
到引脚上的低电平消失为止。
四、中断系统
6、中断应用编程
使用ICCAVR、CVAVR、BASCOM-AVR等高级语言编写中断
服务程序时,用户通常不必考虑中断现场保护和恢复的处
理,这是由于编译器在编译中断服务程序的源代码时,会
在生成的目标代码中自动加入相应的中断现场保护和恢复
的指令,同时自动采用RETI指令作为中断服务的返回指令。
不同编译器,使C语言具有中断属性的方法不同,在
ICC-AVR是使用编译开关#pragma实现:
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0 i++; //在中断里进行操作
}
四、中断系统
6、中断应用编程
#pragma interrupt_handler int0_isr:2
中断源
void int0_isr(void)
中断号
{
//external interupt on INT0 i++; //在中断里进行操作
}
编
译
开
关
函数名
关键字
中断源中断服务
程序主体
自定义
函数名
四、中断系统
6、中断应用编程
编程步骤:
(1)确定中断源(内部中断,外部中断)
(2)如是INT中断还得设定外部中断触发方式
MCUCR——INT0,INT1;
MCUCSR——INT2;
(3)开放可屏蔽中断源(打开中断开关)
SREG.7——中断总开关;
GICR ——中断源开关
(4)编写中断事件函数
#pragma interrupt_handler int0_isr:2
(5)处理中断函数的参数传递
全局变量
INT0
四、中断系统
6、中断应用编程
编写程序:
#include <iom16v.h>
void delay(unsigned char t);
void CPU_init(void);
char flag=0; //define globe avrable
void main(void)
{ char position = 0;
CPU_init();
while (1)
{
if(flag==0)
{PORTB = ~(1<<position);
delay(100);
if (++position >= 8) position = 0;
}
}
}
void delay(unsigned char t)
{unsigned char a,b;
for(a=0;a<100;a++)
for(b=0;b<t;b++);
}
void CPU_init(void)
{DDRD&=0xf9;
SFIOR&=0xfd;
PORTD|=0x04;
SREG|=0x80;
//globle INT 'ON'
MCUCR|=0x02; //intrrupt modue
GICR|=0x40;
//INT source 'ON'
DDRB=0xFF;
PORTB=0xff;
}
#pragma interrupt_handler int0_sev:2
void int0_sev(void)
{flag=~flag; }