Atmega16 单片机串口通信与外部中断介绍
常情况和特殊请求,CPU暂时中止现行程序,转去对随机发生的更紧迫事件进行处理,处理完成后返回原来的程序继续执行。前面讲的定时器中断和串口中断是中断的两种,现在介绍外部中断。
Atmega 16有三个外部中断源,通过引脚INT0、INT1与INT2触发。中断可以由下降沿、上升沿,或者是低电平触发(INT2为边沿触发中断)。当外部中断使能并且配置为电平触发( INT0/INT1),只要引脚电平为低,中断就会产生。
跟其他中断使用一样,使用外部中断也要使能该中断。
通用中断控制寄存器-GICR
&8226; Bit 7 – INT1:使能外部中断请求1
当INT1为1’,而且状态寄存器SREG的I标志置位,相应的外部引脚中断就使能了。MCU通用控制寄存器– MCUCR的中断敏感电平控制1位1/0 (ISC11与ISC10)决定中断是由上升沿、下降沿,还是INT1电平触发的。只要使能,即使INT1引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
&8226; Bit 6 – INT0:使能外部中断请求0
&8226; Bit 5 – INT2:使能外部中断请求2
功能与使能外部中断请求1相同
MCU控制寄存器-MCUCRMCU控制寄存器包含中断触发控制位与通用MCU功能
&8226; Bit 3, 2 – ISC11, ISC10:中断1触发方式控制
外部中断1由引脚INT1激发,如果SREG寄存器的I标志位和相应的中断屏蔽位置位的话。触发方式如Table 34所示。在检测边沿前MCU首先采样INT1引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。
&8226; Bit 1, 0 – ISC01, ISC00:中断0触发方式控制
功能与中断1触发方式控制相同
MCU控制与状态寄存器-MCUCSR
&8226; Bit 6 – ISC2:中断2触发方式控制
异步外中断2由外部引脚INT2激活,如果SREG寄存器的I标志和GICR寄存器相应的中断屏蔽位置位的话。若ISC2写0,INT2的下降沿激活中断。 若ISC2写1,INT2的上升沿激活中断。INT2的边沿触发方式是异步的。只要INT2引脚上产生宽度大于Table 36所示数据的脉冲就会引发中断。若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生中断。而且只要将引脚拉低,就会引发中断请求。改变ISC2时有可能发生中断。因此建议首先在寄存器GICR里清除相应的中断使能位INT2,然后再改变ISC2。最后,不要忘记在重新使能中断之前通过对GIFR寄存器的相应中断标志位INTF2写1’使其清零。
通用中断标志寄存器-GIFR
&8226; Bit 7 – INTF1:外部中断标志1
INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG的位I以及GICR寄存器相应的中断使能位INT1为”1”,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入”1”来清零。
&8226; Bit 6 – INTF0:外部中断标志0
&8226; Bit 5 – INTF2:外部中断标志2
功能与外部中断标志1相同
外部中断初始化:
使用中断IT0、IT1、IT2(具体根据实际情况选定)—— 选择个中断触发方式
(本例IT0低电平、IT1下降沿、IT2上升沿)
//ICC-AVR application builder : 2007-5-11上午10:35:17
// Target : M16
// Crystal: 11.059Mhz
#include
#include
省略端口初始化
#pragma interrupt_handler int0_isr:2
void int0_isr(void)//中断0
{
//external interupt on INT0
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)//中断1
{
//external interupt on INT1
}
#pragma interrupt_handler int2_isr:19
void int2_isr(void)中断2
{
//external interupt on INT2
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x08;//INT0、INT1触发方式
MCUCSR = 0x40;//INT2触发方式(这句要人工输入)
GICR= 0xE0;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
简单实例参考程序
为了进一步理解串口和外部中断的使用,下面给出一简单实例。程序功能包含了串口和外部中断,注意程序main函数while循环体中为空,说明单片机上电以后什么也不干,外部中断INT0,INT1,INT2分别为低电平,下降沿,上升沿触发。INT0触发后PORTA0为高,INT1触发后PORTA1为高,INT2触发后PORTA2为高。串口接受中断为边收边发——从电
Atmega16单片机串口通信外部中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
