微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Atmega16 单片机串口通信与外部中断介绍

Atmega16 单片机串口通信与外部中断介绍

时间:11-10 来源:互联网 点击:

常情况和特殊请求,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为高。串口接受中断为边收边发——从电

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top