第4章avrmega16单片机中断实例
AVR mega16 简单的外中断C程序和相关寄存器解析

ISC11~ISC10:外部中断 1 的中断检测方式 ISC11 0 0 1 1 ISC01~ISC00:外部中断 0 的中断检测方式 ISC01 0 0 1 1 ISC00 0 1 0 1 表三 MCU 控制与状态寄存器-MCUCSR bit7 JTD bit6 ISC2 bit5 bit4 JTRF bit3 WDRF bit2 BORF bit1 EXTRF bit0 PORF INT0中断 低电平中断 INT1 引脚上任意的逻辑 电平变化都将引发中断 下降沿中断 上 ISC10 0 1 0 1 INT1中断 低电平中断 INT1 引脚上任意的逻辑电 平变化都将引发中断 下降沿中断 上升沿中断
個人說明:本文為本人學習的筆記,有不足之處請多多包涵,還請各路大俠多多指教。
INT1:使能外部中断请求1 INT0:使能外部中断请求0 INT2:使能外部中断请求 2 表五 通用中断标志寄存器 GIFR bit7 INTF1 bit6 INTF0 bit5 INTF2 bit4 bit3 bit2 bit1 IVSEL bit0 IVCE
INTF1:外部中断标志 INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG 的位I以及GICR寄存器相应的中断使能位INT1为”1”,MCU即跳转到相应的中断向量。 进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入”1” 来清零。
SE:MCU休眠使能位 SM1~SM0:MCU 休眠模式选择 SM2 0 0 0 0 1 1 1 1 SM1 0 0 1 1 0 0 1 1 SM0 0 1 0 1 0 1 0 1 休眠模式 空闲 ADC 噪声抑制模式 掉电模式 省电模式 保留 保留 Standby(1) 模式 扩展Standby(1) 模式
atmege16外部中断程序

atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned char#define beep_0 (PORTD&=~(1<<PD7)) #define beep_1 (PORTD|=(1<<PD7))//蜂鸣器响uint count;/******************************************* 三个外部中断声明,注意中断向量号*******************************/#pragma interrupt_handler Exint0:2#pragma interrupt_handler Exint1:3#pragma interrupt_handler Exint2:19/*************************************系统延时函数************************************/void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1140;j++);}}/**************************************端口初始化每个外部中断端口是固定的****************************************/void port_init(){DDRA=0XFF;PORTA=0XFF;DDRB&=(0<<PB2);//INT2PORTB|=(1<<PB2);DDRD&=(0<<PD2);//INT0PORTD|=(1<<PD2);DDRD&=(0<<PD3);//INT1PORTD|=(1<<PD3);}/***********************************外部中断初始化*******************************/void INT_init(){SREG=0X80;//打开全局中断GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);//I NT0,INT1下降沿触发MCUCSR=(0<<ISC2);//INT2下降沿触发中断}/***************************************** 流水灯函数****************************************/ void LED_1(){uchar i;for(i=0;i<8;i++){PORTA=~BIT(i);delay(200);}}/*********************************** LED_2函数**********************************/void LED_2(){PORTA=0X0F;delay(500);PORTA=0XF0;delay(500);}/********************************LED_3函数************************************/ void LED_3(){PORTA=0X81;delay(500);PORTA=0X7E;delay(500);}/************************************ 外中断0函数**********************************/ void Exint0(){LED_2();}/********************************** 外中断1函数***********************************/ void Exint1(){LED_3();}/************************外中断2函数***********************/void Exint2(){DDRD=(1<<PD7);for(count=0;count<4;count++) {beep_0;delay(200);beep_1;delay(200);}}/********************************* 主函数*********************************/ void main(){port_init();//端口初始化INT_init();//中断初始化while(1)// 当非0值时执行下面函数{LED_1();//流水灯函数}}。
ATMEGA16 中断GCC模式

AVR单片机中断实现ATmega16 INT ISR(INT0_vect)内容来源:本站发布时间:[2010-11-28]查看次数:42332.21 实例功能前面例子中分别介绍了按键控制发光二极管的亮灭,但是我们注意到,在程序中需要一直检测按键的状态,这样明显的浪费了单片机的资源,降低了单片机的工作效率,。
那么有没有一种方法可以让单片机不用一直检测按键的状态,而只在有按键动作时才去响应呢?当然有!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。
在本例中,通过利用外部中断实现单片机对按键事件的响应和处理。
本例中三个功能模块描述如下:● 单片机系统:对按键事件产生的中断时间作出响应,并在数码管上显示按键按下的次数。
● 外围电路:通过将按键连接到单片机的外部中断检测端口,实现中断产生电路,数码管显示电路用于指示按键的按下状态。
● 软件程序:编写AVR单片机的外部中断服务程序,从而实现对中断事件的响应。
2.2.2 器件和原理1单片机的中断系统关于中断的概念可以在一般的教材中找到,本例中只做简要叙述,不再详细说明。
中断属于一种对事件的实时处理过程。
中断源可能随时停止单片机当前正在处理的工作,转而去处理中断事件,待中断时间处理完毕之后,再返回原来工作的断点处,继续原来的工作。
对于单片机的中断系统,需要了解这几个概念:中断源、中断信号、中断向量、中断优先级、中断嵌套、中断控制(屏蔽)、中断响应条件、中断响应过程(中断服务程序)。
●中断源中断源是指能够向单片机发出中断请求信号的部件和设备。
对于单片机来讲,往往存在多个中断源。
中断源一般可分为内部中断源和外部中断源。
单片机内部集成的许多功能模块,如定时器、串行通讯口、模/数转换器等,它们在正常工作时往往无需CPU参与,而当处于某种状态或达到某个规定值需要程序控制时,会通过发出中断请求信号通知CPU。
这一类的中断源位于单片机内部,称作内部中断源。
Atmega16中断

应用课题:设计一段程序,用于统计INT0的 中断次数
主程序
void main(void) { 设置引脚PD2方向为输入 DDRD.2=0; 设置PC口方向为输出 DDRC=0xff; INT0中断使能 GICR=0x40; 设置INT0为下降沿触发 MCUCR=0b00000010; 清INT0的中断标志位 GIFR=0x40; 开放全局中断使能 SREG=0x80; while(1) { PD2引脚输出方波, PORTC.2=! PORTC.2; 作为外部中断信号 delay_ms(500); }
中断法和查询法的特点及差别:
中断法特点: ▲ 需要开放中断的“总开关”和“分开关”; ▲ 中断响应速度快; ▲ 需要定义中断服务程序才能进行相关处理。 ▲ 不需要软件清中断标志位 查询法特点: ▲ 不需要开放中断的“总开关”和“分开关”; ▲ 标志位检测不及时,因而响应速度慢; ▲ 不需要定义中断服务程序也能进行相关处理。 ▲ 需要软件清中断标志位(写“1”清零)
interrupt [中断向量号或中断向量号的宏定义] void handler(中断函数名) (void) 其中,中断函数名为用户定义的中断服务子程序的名称,
而中断向量号则用于表明中断的类型。
例如: interrupt [2] void int_0 (void) { …… } interrupt [EXT_INT0] void int_0 (void) { …… }
通用中断标志寄存器——GIFR
∫5.3 外部中断应用
CVAVR编译器的中断操作:
CVAVR 的C编译器支持在C源程序中直接开发中断程序。当 用户使用该功能时,必须在中断服务子程序定义之前用 “interrupt”语句通知编译器,该子程序是一个中断操作。
ATmega16定时器中断

ATmega16定时器/计数器中断及编程Atmega16内部有三个定时器/计数器T/C0,T /C1.T/C2,其中T/C0,T/C2为8为定时器,T/C1为16定时器,这里从高级语言编程的使用出发,简要介绍T/C0的使用。
定时器中断的过程是:当中断发生时,程序控制立即从主程序转移到中断服务程序,执行完中断服务程序后再返回到主程序的中断处继续执行后续的程序。
利用中断可以节省CPU资源。
先了解几个寄存器。
MCUCR---MCU控制寄存器;MCUCSR-----MCU控制与状态寄存器;GICR-----通用控制寄存器;GIFR-----通用中断标志寄存器;TIFR---定时器中断标志寄存器,TIMSK----定时器中断屏蔽寄存器。
这几寄存器保留默认设置即可,需要编程时了解并设置的寄存器为TCCR0----T/C0控制寄存器,TCNT0----T/C0的计数初始值,OCR0----输出比较寄存器,OC0/PB3----输出比较引脚。
TCCR0为8位寄存器,从高位到低位的名称依次是:FOC0,WGM00,COM01,COM00,WGM01,CS02,CS01,CS00.TCCR0各个控制位的作用:(1) CS02,CS01,CS00控制时钟选择和预分频,如100表示预分频为256(2) WGM01,WGM00控制波形产生模式,分为普通模式(用于普通计时),CTC模式(用于频率发生),快速PWM模式(用于PWM调速,功率调节),相位修正PWM模式。
如10表示CTC模式。
(3) COM01,COM00控制比较匹配输出模式。
在不同的波形产生模式下其逻辑值功能表不同,如在普通模式或CTC模式下01表示比较匹配发生OC0取反。
(4)FOC0,中断标志位,设为零即可。
至于上述控制位的逻辑值功能表可查阅Atmega16的中文数据手册,在官方网上会有英文版。
完成TCCR0的设定,接下来是设置TCNT0,OCR0寄存器了。
ATmega16中断

▪ 每一个外部中断源都有相应的中断标志位; ▪ 某一个外部中断源申请中断,相应中断标志位置1。
中断源
INT0 INT1 INT2
中断标志位
INTF0 INTF1 INTF2
中断标志位由 CPU自动置“1” 当CPU响应中断 后,则中断标志 位自动 清“0”; 也可以通过对其 写“1”来清“0”
数字 y
xunce_7219(char i,int y,char n) —— 显示函数
数字编号,显示 器的1~2位显示i
显示的数字,显示n器为小数点的 的3~8位显示y 位置
实 验 结 果 仿 真
(PB4)/SS (PB7)SCK
(PB5)MOSI
MAX 7219
8位LED显1示0234567891器
中断源的中断请求将被响应。 位4~0:与外部中断的设置无关。
在ICCAVR C开发系统中,可通过编程向导对位
7~5进行设置。
MCU控制寄存器 —— MCUCR
7654 3 210
SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
位3~0:外部中断1、 0中断请求信号有效方式控制位。
清 志“ 位总 价显0#中”a示I断sN芯m开T(片F“放0可s初标,e由自始i等”编动化) 程生向 成导
等待初始化完成
delay_ms(20);//
输出方波,作为外
while (1)
部延中时断,请改求变信此号值即改变
{
方波的频率,也即改变
PORTC.2=!PORTC.2;// 中断请求的频率
delay_ms(500);//
4.ATmega16中断系统

编 译 开 关
关键字
Байду номын сангаас
自定义 函数名
函数名
中断源中断服务 程序主体
四、中断系统 6、中断应用编程
编程步骤: (1)确定中断源(内部中断,外部中断) (2)如是INT中断还得设定外部中断触发方式 MCUCR——INT0,INT1; MCUCSR——INT2; (3)开放可屏蔽中断源(打开中断开关) SREG.7——中断总开关; GICR ——中断源开关 (4)编写中断事件函数
四、中断系统 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时钟信号。因此,这类触发类型的中断经常作为 外部唤醒源。������
四、中断系统 5、中断寄存器
在ATmega16中,除了寄存器SREG中的全局中断允许标 志位I外,与外部中断有关的寄存器有4个,共有11个标 志位。其作用分别是: ●3个外部中断中断标志位, ● 3个中断允许控制位 ● 用于定义外部中断的触发类型。
(1)中断控制寄存器——MCUCR
四、中断系统 5、中断寄存器
AT mega系列单片机原理及应用第4章 ATmega 单片机的中断系统及定时器

告终止了。
4.1.2 外部中断
• 外部中断通过引脚INT0,INT1(ATmega16L多一 个INT2外部中断)触发。即使引脚INT0,1配置 为输出,只要电平发生了合适的变化,中断也会 触发。这个特点可以用来产生软件中断。通过设 置MCU控制寄存器MCUCR,中断可以由下降沿、 上升沿,或者是低电平触发。
•
GICR = 0x40;//开启中断0使能
•
//}}WIZARD_MAP(External IRQ)
•}
• SIGNAL(SIG_INTERRUPT0)//外部中断0程序
•{
•
uint k;//设置变量k来记录中断的次数
•
// TODO: Add your code here
• k++;
•}
4.2 定时器/计数器的使用方法
• 中断源基本上分为两种类型的中断:一类是时间 触发型中断,另一类是条件中断,对于时间触发 类中断(如时钟、计数、比较等),一旦事件产 生后会将相应的中断标志位置位,申请中断处理, 当MCU响应中断,跳转到实际中断向量,开启相 应的中断处理程序时,硬件自动清除对应的中断 标志,这些中断标志位也可通过软件写“1”来清 除。
-
-
-
-
-
GIFR
R/W R/W
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 4) 中断嵌套
在中断发生后,SREG的I位由硬件清除,并由 RETI(中断返回)指令置位,从而允许子序列的中断响应。
由于 AVR 在响应一个中断的过程中通过硬件将 I 标志 位自动清零,这样就阻止了 MCU响应其它中断。因此通 常情况下,AVR 是不能自动实现中断嵌套的。 如要系统中必须要实现中断嵌套的应用,用户可在中 断服务程序中使用指令将全局中断允许位开放,通过间接 的方式实现中断的嵌套处理。
1) MCU 控制寄存器—MCUCR
• MCU 控制寄存器 MCUCR 的低 4 位为 INT0(ISC01、 ISC00)和 INT1(ISC11、ISC10)中断触发类型控制位。
2)MCU 控制和状态寄存器—MCUCSR
• MCU 控制和状态寄存器 MCUCSR 中的第6位(ISC2) 为 INT2 的中断触发类型控制位。
void main(void) { PORTA=0xFF; DDRA=0xFF; PORTD|=0x0C; DDRD|=0x00; //DDRD.3=0;DDRD.2=0; GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0; //清除INT0、INT1中断标志位 #asm("sei") //SREG|=0x80; SREG.7=1; while (1) { PORTA=led_7[counter]; } }
4) 通用中断标志寄存器—GIFR
• 注意:用户可以使用指令将 INTFn 清除,清除的方式是 写逻辑“1”到 INTFn,将标志清零。另外, 当INT0 (INT1) 设置为低电平触发方式时, 标志位 INTF0 (INTF1) 始终为“0”,这并不意味着不产生中断请求, 而是低电平触发方式是不带中断标志类型的中断触发。在 低电平触发方式时,中断请求将一直保持到引脚上的低电 平消失为止。 • 而在开放中断允许前,一般应通过向 GIFR 寄存器中的中 断标志位 INTFn 写入逻辑“1” ,将该中断的中断标志位 清除,然后开放中断。这样可以防止在改变ISCn 的过程
• 3)中断屏蔽与管理 AVR 对中断采用两级控制方式。所谓两级控制是指 AVR有一个中断允许的总控制位 I(即 AVR 标志寄存器 SREG 中的 I 标志位“SREG.7” ),通常称为全局中断允 许控制位。同时 AVR 为每一个中断源都设置了独立的中 断允许位,这些中断允许位分散位于各中断源所属模块的 控制寄存器中。 AVR 响应一个可屏蔽中断源(假定为A 中断)的中断 的条件是:响应A 中断 = 全局中断允许标志 AND 中断A允许标志 AND 中断A标志
按键特点
如图所示:t1和t3分别为键的闭合和断开过程中的抖动
期(呈现一串负脉冲),抖动时间长短与开关的机械特性 有关,一般为5~10ms,t2为稳定的闭合期,其时间由按
键动作确定,一般为十分之几秒到几秒,t0、t4为断开期。
• 例 4.2 采用外部中断方式,用外部振荡源为 基准的时钟系统
• 例4.3 利用外部中断实现系统断电保护的实 例
• • •
• • • • • • • • • • • • • •
void Exint0() { delay_ms(10); //消抖,为什么要消抖---按钮按下时会抖动(出现多个高低电平, 不处理会出现一次按键多次中断的情况,消抖处理还可消除由外电等原因造成的不必 要的中断。 if(PIND.2==0) { if(++counter >=16) counter=0; } } void Exint0() { delay_ms(10); //消抖 if(PIND.3==0) { if(counter)--counter; else counter =15; } }
4.4.1 外部中断触发方式和特点
• MCU 对INT2的引脚上的上升沿或下降沿变化的识别 (触 发),以及低电平的识别(触发)是通过异步方式检测的, 不需要 I/O 时钟信号的存在。因此,这类触发类型的中断 经常作为外部唤醒源。 • 如果设置了允许响应外部中断的请求,那么即便是引脚 PD2、PD3、PB2设置为输出方式工作,引脚上的电平变 化也会产生外部中断触发请求。
第 4 章 中断系统与基本应用
4.1 中断的基本概念
• 单片机一般都具有良好的中断系统,它的 优点有:
– 实现实时处理 – 实现分时操作,提高了 MCU 的效率 – 进行故障处理 – 待机状态的唤醒
4.2 ATmega16 的中断系统
• 4.2.1 ATmega16 的中断源和中断向量
4.2.2 ATmega16 的中断控制
3) 通用中断控制寄存器—GICR
• 通用中断控制寄存器GICR的高3位为INT0、 INT1和INT2 的中断允许控制位, 如果SREG寄存器中的全局中断 I 位 为“1”,以及 GICR 寄存器中相应的中断允许位被置为 “1”,当外部引脚 INT0(或 INT1、或 INT2)上的电平变 化时,MCU 将会响应相应的中断请求。
4.3 中断服务程序的编写
• 编写中断服务程序的两个基本原则:
– 全面、仔细考虑中断现场的保护和恢复。(用 C编程时可不必考虑) – 中断服务程序应尽可能的短
4.3.2 CodeVision 中断程序的编写
• 在 CVAVR 中,中断服务程序必须定义成一个特殊的函数, 称为中断服务函数。 • 中断服务函数按以下格式定义: interrupt [中断向量号] void 函数名 (void)
ATmega16 的外部中断结构示意图
INT0
触发方式
INT0 INTF0 INT1 INTF1 INT2 INTF2
INT1
触发方式
C P U
INT2
触发方式
MCUCR MCUCSR
GIFR(自动, 不必设置)
GICR
SREG.I
4.4.2 与外部中断相关的寄存器和标志位
• 在 ATmega16中,除了寄存器 SREG 中的全局 中断允许标志位 I外,与外部中断有关的寄存器有 4 个,共有 11 个标志位。其作用分别是 3 个外部 中断各自的中断标志位,中断允许控制位,和用 于定义外部中断的触发类型。
• 1) 中断优先级的确定 在 AVR 单片机中,一个中断在中断向量区中的位置决 定了它的优先级,位于低地址的中断优先级高于位于高地 址的中断。 • 2) 中断标志 AVR 有两种机制不同的中断:带有中断标志的中断 (可挂起,AVR大多数的中断属于此类型)和不带中断标 志的中断(不能挂起)。 中断标志位一般在 MCU 响应该中断时,由硬件自动清 除,或在中断服务程序中通过读/写专门数据寄存器的方 式自动清除。 不带(不设置)中断标志的中断,如配置为低电平触 发的外部中断即为此类型的中断。低电平中断的重要应用 是唤醒处于休眠工作模式的 MCU。
{
…… //函数体 }
• 对全局中断允许位的操作在 CVAVR 中使用的是 C 内嵌汇 编指令的方式:用#asm("sei")开放全局中断,用 #asm("cli")关闭全局中断。
4.4 ATmega16 的外部中断
• ATmega16 有 INT0、 INT1 和 INT2 是 3 个 外部中断源,分别由芯 片外部引脚 PD2、 PD3、PB2 上的电平 的变化或状态作为中断 触发信号。
练习题(1)
• 1、INT0中断控制PA0上的LED,INT1中断控制PA1上的 LED。
练习题(2)
• 2、PA口流水灯,INT0中断控制P用实例
• 例4.1 用按键控制的一位 LED 数码管显示系统
#include <mega16.h> #include <delay.h> /******************************************* 三个外部中断声明,注意中断向量号 *******************************/ #pragma interrupt_handler Exint0:2 #pragma interrupt_handler Exint1:3 flash unsigned char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0X39 ,0x5E,0x79,0x71}; unsigned char counter=0;