avr单片机外部中断0,1,2初始化配置及说明

来源:本站
导读:目前正在解读《avr单片机外部中断0,1,2初始化配置及说明》的相关信息,《avr单片机外部中断0,1,2初始化配置及说明》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《avr单片机外部中断0,1,2初始化配置及说明》的详细说明。
简介:avr单片机外部中断0,1,2初始化配置及说明

#include<iom16v.h>

#include<macros.h>

/*1.状态寄存器SREG

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

I T H S V N Z C

I:全局中断使能位。

在I置位后,单独的中断使能由不同的中断寄存器控制。若I为0,则禁止中断。

MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能

Bit 7 6 5 4 3 2 1 0

SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00

外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。在检测边沿前 MCU 首先采样 INT1 引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。

SE:MCU休眠使能位

SM1~SM0:MCU休眠模式选择

SM2 SM1 SM0 休眠模式

0 0 0 空闲

0 0 1 ADC 噪声抑制模式

0 1 0 掉电模式

0 1 1 省电模式

1 0 0 保留

1 0 1 保留

1 1 0 Standby(1) 模式

1 1 1 扩展Standby(1) 模式

ISC11 ISC10 说明

0 0 INT1 为低电平时产生中断请求

0 1 INT1 引脚上任意的逻辑电平变化都将引发中断

1 0 INT1 的下降沿产生异步中断请求

1 1 INT1 的上升沿产生异步中断请求

外部中断 0 由引脚 INT0 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。在检测边沿前 MCU 首先采样 INT0 引脚上的电平。如果 选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成

ISC01 ISC00 说明

0 0 INT0 为低电平时产生中断请求

0 1 INT0 引脚上任意的逻辑电平变化都将引发中断

1 0 INT0 的下降沿产生异步中断请求

1 1 INT0 的上升沿产生异步中断请求

*/

/*MCU 控制与状态寄存器-MCUCSR-

Bit 7 6 5 4 3 2 1 0

JTD ISC2 – JTRF WDRF BORF EXTRF PORF

* Bit 6 – ISC2: 中断 2 触发方式控制

异步外中断 2 由外部引脚 INT2 激活,如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的

中断屏蔽位置位的话。若 ISC2 写 0 , INT2 的下降沿激活中断。若 ISC2 写 1 , INT2 的上

升沿激活中断。 INT2 的边沿触发方式是异步的。只要 INT2 引脚上产生宽度大于50ns

(1s=1000ms,1 ms=1000μs,1μs=1000ns )

所示数据的脉冲就会引发中断。若选择了低电平中断,低电平必须保持到当前指令完成,

然后才会产生中断。而且只要将引脚拉低,就会引发中断请求。改变 ISC2 时有可能发生

中断。因此建议首先在寄存器 GICR 里清除相应的中断使能位 INT2 ,然后再改变ISC2。

最后,不要忘记在重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1’

使其清零。

*/

/*

通用中断控制寄存器- GICR

Bit 76 5 4 3 2 1 0

INT1 INT0 INT2 – – – IVSEL IVCE

* Bit 7 – INT1: 使能外部中断请求 1

当 INT1 为 '1’ ,而且状态寄存器SREG 的 I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器– MCUCR的中断敏感电平控制1位 1/0 (ISC11与ISC10)决定中断是

由上升沿、下降沿,还是 INT1 电平触发的。只要使能,即使 INT1 引脚被配置为输出,

只要引脚电平发生了相应的变化,中断可将产生。

* Bit 6 – INT0: 使能外部中断请求 0

当 INT0 为 '1’ ,而且状态寄存器SREG 的 I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器– MCUCR的中断敏感电平控制0位 1/0 (ISC01与ISC00)决定中断是

由上升沿、下降沿,还是 INT0 电平触发的。只要使能,即使 INT0 引脚被配置为输出,

只要引脚电平发生了相应的变化,中断可将产生。

* Bit 5 – INT2: 使能外部中断请求 2

当 INT2 为 '1’ ,而且状态寄存器SREG 的 I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器– MCUCR 的中断敏感电平控制2位 1/0 (ISC2与ISC2)决定中断是由

上升沿、下降沿,还是 INT2 电平触发的。只要使能,即使 INT2 引脚被配置为输出,只

要引脚电平发生了相应的变化,中断可将产生

*/

/*

通用中断标志寄存器- GIFR

Bit 7 6 5 4 3 2 1 0

INTF1 INTF0 INTF2 – – – – –

* Bit 7 – INTF1: 外部中断标志 1

INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG 的位

I以及GICR寄存器相应的中断使能位INT1为”1” ,MCU即跳转到相应的中断向量。进入中

断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”0” 来清零。

* Bit 6 – INTF0: 外部中断标志 0

INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如果SREG 的位

I以及GICR寄存器相应的中断使能位INT0为”1” ,MCU即跳转到相应的中断向量。进入中

断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”0” 来清零。

* Bit 5 – INTF2: 外部中断标志 2

INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。如果SREG 的位

I以及GICR寄存器相应的中断使能位INT2为”1” ,MCU即跳转到相应的中断向量。进入中

断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”0” 来清零。注意,当

INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。这会导致INTF2标志设置

信号的逻辑变化

*/

//外部中断0向量端口

#pragma interrupt_handler INTER_0:iv_INT0

//外部中断1向量端口

#pragma interrupt_handler INTER_1:iv_INT1

//外部中断2向量端口

#pragma interrupt_handler INTER_2:iv_INT2

void INTER_init_0(unsigned char a)//a取值0-3

{

switch(a)

{

case 0:MCUCR&=~(1<<ISC01);MCUCR&=~(1<<ISC00);break;//INT0 为低电平时产生中断请求

case 1:MCUCR&=~(1<<ISC01);MCUCR|=1<<ISC00;break;// INT0 引脚上任意的逻辑电平变化都将引发中断

case 2:MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//INT0 的下降沿产生异步中断请求

case 3:MCUCR|=1<<ISC01;MCUCR|=1<<ISC00;break;//INT0 的上升沿产生异步中断请求

default : MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//设置错误时,下降沿产生异步中断请求

}

GICR|=(1<<INT0);//使能外部中断INT0

GIFR&=~(1<<INTF0);//清零中断标志

SREG|=0x80;//使能全局中断

}

void INTER_init_1(unsigned char a)//a取值0-3

{

switch(a)

{

case 0:MCUCR&=~(1<<ISC11);MCUCR&=~(1<<ISC10);break;//INT1 为低电平时产生中断请求

case 1:MCUCR&=~(1<<ISC11);MCUCR|=1<<ISC10;break;// INT1 引脚上任意的逻辑电平变化都将引发中断

case 2:MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//INT1 的下降沿产生异步中断请求

case 3:MCUCR|=(1<<ISC11)|(1<<ISC10);break;//INT1 的上升沿产生异步中断请求

default : MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//设置错误时,下降沿产生异步中断请求

}

GICR|=(1<<INT1);//使能外部中断INT1

GIFR&=~(1<<INTF1);//清零中断标志

SREG|=0x80;//使能全局中断

}

void INTER_init_2(unsigned char a)

{

if(a)

MCUCSR|=(1<<ISC2)//上升沿触发;

else

MCUCSR&=~(1<<ISC2)//下降沿触发;

GICR|=(1<<INT2);//使能INT2。

GIFR&=~(1<<INTF2);//清零中断标志

SREG|=0x80;//使能全局中断

}

void INTER_0(void)

{

//add your code here!

}

void INTER_1(void)

{

//add your code here!

}

void INTER_2(void)

{

//add your code here!

}

提醒:《avr单片机外部中断0,1,2初始化配置及说明》最后刷新时间 2024-03-14 01:14:09,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《avr单片机外部中断0,1,2初始化配置及说明》该内容的真实性请自行鉴别。