第4章avrmega16单片机中断实例

合集下载

AVR mega16 简单的外中断C程序和相关寄存器解析

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外部中断程序

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模式

ATMEGA16 中断GCC模式

AVR单片机中断实现ATmega16 INT ISR(INT0_vect)内容来源:本站发布时间:[2010-11-28]查看次数:42332.21 实例功能前面例子中分别介绍了按键控制发光二极管的亮灭,但是我们注意到,在程序中需要一直检测按键的状态,这样明显的浪费了单片机的资源,降低了单片机的工作效率,。

那么有没有一种方法可以让单片机不用一直检测按键的状态,而只在有按键动作时才去响应呢?当然有!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。

在本例中,通过利用外部中断实现单片机对按键事件的响应和处理。

本例中三个功能模块描述如下:● 单片机系统:对按键事件产生的中断时间作出响应,并在数码管上显示按键按下的次数。

● 外围电路:通过将按键连接到单片机的外部中断检测端口,实现中断产生电路,数码管显示电路用于指示按键的按下状态。

● 软件程序:编写AVR单片机的外部中断服务程序,从而实现对中断事件的响应。

2.2.2 器件和原理1单片机的中断系统关于中断的概念可以在一般的教材中找到,本例中只做简要叙述,不再详细说明。

中断属于一种对事件的实时处理过程。

中断源可能随时停止单片机当前正在处理的工作,转而去处理中断事件,待中断时间处理完毕之后,再返回原来工作的断点处,继续原来的工作。

对于单片机的中断系统,需要了解这几个概念:中断源、中断信号、中断向量、中断优先级、中断嵌套、中断控制(屏蔽)、中断响应条件、中断响应过程(中断服务程序)。

●中断源中断源是指能够向单片机发出中断请求信号的部件和设备。

对于单片机来讲,往往存在多个中断源。

中断源一般可分为内部中断源和外部中断源。

单片机内部集成的许多功能模块,如定时器、串行通讯口、模/数转换器等,它们在正常工作时往往无需CPU参与,而当处于某种状态或达到某个规定值需要程序控制时,会通过发出中断请求信号通知CPU。

这一类的中断源位于单片机内部,称作内部中断源。

Atmega16中断

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定时器/计数器中断及编程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中断

ATmega16中断
76 5 4 3 2 1 0 INTF1 INTF0 INTF2 — — — — —
▪ 每一个外部中断源都有相应的中断标志位; ▪ 某一个外部中断源申请中断,相应中断标志位置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中断系统

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 单片机的中断系统及定时器

AT mega系列单片机原理及应用第4章 ATmega 单片机的中断系统及定时器
• 在CPU内部有一个中断允许触发器。只有当其为 “1”时,CPU才能响应中断;若其为“0”,即使 INTR线上有中断请求,CPU也不响应。而这个触 发器的状态可由软件指令来改变。当CPU复位时, 中断允许触发器为“0”,所以必须要用软件指令 来开中断。当中断响应后,CPU就自动关中断, 所以在中断服务程序中也必须要用软件指令来开 中断。CPU在现行指令结束后即响应中断。
告终止了。
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

AVR单片机中断

AVR单片机中断

AVR 单片机中断
关于AVR 中断:
系统在正常运行主程序时,如果突然有一个重要的任务要马上处理,那幺系统就要保存现在的工作,然后再去处理这个任务,执行这个重要任务完毕以后再返回原来的主程序继续运行,这就是中断。

主程序一旦进入中断服务程序,那幺AVR 芯片将自动的关闭全局中断,
在这个期间不再执行其它的中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。

(注意,在这个期间某些中断请求可能会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马上得到响应,如INT0 的下降沿触发就会留下中断请求标致,而
低电平触发就不会流下中断请求标致)。

如果你想在执行中断服务程序时响应另外一个更重要的中断,那幺就要在中断服务程序中加入一条打开全局中断的语句。

使用ICC 快速建立中断服务程序程序文件
使用ICCAVR Application Builder 进行如下图所示的设置。

可以设置是否使用中断,上升延,下降延,低电平,任意的逻辑电平变化。

第4讲AVR单片机中断

第4讲AVR单片机中断
16
Bit 0 – IVCE: 中断向量修改使能 改变IVSEL 时IVCE 必须置位.在IVCE 或IVSEL 写操作之后4 个时钟周期, IVCE 被硬件清零.如前面所述,置位IVCE 将禁止中 断
17
12
13
14
15
通用中断控制寄存器- GICR
Bit 1 – IVSEL: 中断向量选择 当IVSEL 为"0" 时,中断向量位于Flash 存储器的起始地址;当 IVSEL 为"1" 时,中断向量转移到Boot 区的起始地址.实际的 Boot 区起始地址由熔丝位BOOTSZ 确定.为了防止无意识地改 变中断向量表,修改IVSEL 时需要遵照如下过程: 1. 置位中断向量修改使能位IVCE 2. 在紧接的4 个时钟周期里将需要的数据写入IVSEL,同时对 IVCE 写"0"
11
AVR 退出中断后总是回到主程序并至少执 行一条指令才可以去执行其他被挂起的中 断.要注意的是,进入中断服务程序时状态寄 存器不会自动保存,中断返回时也不会自动 恢复.这些工作必须由用户通过软件来完成. 使用CLI 指令来禁止中断时,中断禁止立即 生效.没有中断可以在执行CLI 指令后发生, 即使它是在执行CLI 指令的同时发生的.下 面的例子说明了如何在写EEPROM 时使用 这个指令来防止中断发生以避免对 EEPROM 内容的可能破坏.
3
#include <mega16.h> flash char
led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x 7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; char counter; // INT0 中断服务程序 interrupt [EXT_INT0] void ext_int0_isr<void> { if <++counter>=16> counter = 0; } // INT1 中断服务程序 interrupt [EXT_INT1] void ext_int1_isr<void>

AVR mega16单片机编程

AVR mega16单片机编程

AVR mega16单片机C/C++初步使用如果仅仅只是从使用单片机的角度出发,单片机其实根本没有想象中的那么难,单片机内部的寄存器,运算器,结构框图,CPU时序等知识并非应用所必须,而大多数人可能就因为缺少这些很专业的知识而很少涉及单片机。

当然,这也并非说仅仅会了C/C++的编程技巧就能运用单片机了,就我的使用经验来说,需要了解的是:单片机的最小系统,4个通用的I/O端口,单片机控制的基本了解。

在已经把单片机与外围设备连接好后,接下来就是编程的问题了。

我们可以将4个通用端口用程序设定为输入端口和输出端口,简单的说,单片机控制就是程序(保存在单片机的程序存储区)根据输入端口的逻辑值给出输出端口的逻辑值,输出端口的逻辑值通过驱动电路控制相应的元件执行所要求的动作。

很明显,输出端口的逻辑值决定了执行机构的动作,而输出端口的逻辑值最终由程序控制。

在ICC AVR环境中,可以采用C/C++编程,编译好后可以用AVR Studio打开后缀为cof 的文件进行仿真。

仿真无误用JETAG下载线将编译生成的后缀为hex文件(机器代码)下载到单片机中,接通单片机电源程序便可运行。

在设置I/O端口过程的基本语法如下(以端口PA为例,其他三个端口类似):DDRA=0x00;//设置PA0~PA7为输入端口PORTA=0x00;//设置PA端口的值,在PA为输入端口的前提下,PA的值对程序的运行无影响,设定是否使用端口的内部上拉电阻unsigned char state;state=PINA;//读取输入端口PA引脚的逻辑值,即外部的输入值DDRB=0xff;//设置PB0~PB7为输出端口PORTB=0x0f;//当PB为输出端口时,PORTB的值即为实际的逻辑输出值,设置PB0~PB3为1(引脚电压为5V),PB4~PB7为0(引脚电压为0V)当只是涉及到某些位时,可以用位运算符&,|,~来操作相应的位。

对于端口的特殊用法(如PWM波形)需查阅相关资料。

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

【知识目标】
1. 了解LED发光二极管的驱动控制方法 2. 了解ATmega16单片机数字I/O口的结构 3. 了解ATmega16单片机数字I/O口的相关寄
存器功能
2021/8/3
【项目知识点与技能点】
1. 掌握单片机控制LED发光二极管驱动电 路的连接方法
2. 掌握ATmega16单片机数字I/O口的相关 寄存器功能的设置
位 PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0
复位值 0
0
0
0
0
0
0
0
2021/8/3
二、I/O接口的寄存器
• 端口输入寄存器:PINX(PINA)-----只读
位 PINA.7 PINA.6 PINA.5 PINA.4 PINA.3 PINA.2 PINA.1 PINA.0 复位值 N/A N/A N/A N/A N/A N/A N/A N/A
①DDRA为A口数据方向寄存器,用来定义A口的通讯方 向(输入/输出);
②PORTA为A口数据寄存器,用来输出数据(输入时, PORTX为高,打开上拉电阻);当PORTx=1时,I/O引脚高 电平,可提供输出20mA电流;当PORTx=0时,I/O引脚低电 平,可吸纳20mA电流。因此,AVR的I/O在输出方式下提供 了比较大驱动能力,可以直接驱动LED等小功率外围器件。
AVR单片机(C语言)项目开发实践 教程项目4 ATmega16单片机IO接口应

项目四 ATmega6单片机I/O口应用
• 任务一 项目知识点学习 • 任务二 LED闪烁灯控制 • 任务三 LED开关灯控制 • 任务四 汽车转向灯控制 • 任务五 霓虹灯控制 • 任务六 继电器控制照明设备

AVRmega16中断经典源程序

AVRmega16中断经典源程序

AVRmega16中断经典源程序AVRmega16中断经典源程序,内含完整各中断的使用,真正做到一通百通,avrmega16中断轻松上手#include<iom16v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned intvoid delay(void){uint a,b;for(a=0;a<10;a++)for (b=0;b<500;b++);}void init (){DDRB|=BIT(0);//端口初始化PORTB=BIT(0);//端口初始化DDRA|=0xff; //端口初始化PORTA=0xff; //端口初始化,要想用到那个端口,就必须先初始化MCUCR|=0x02;//0000 0000 INT0低电平产生外部中断请求//0000 0001 INT0任意逻辑电平都将引发产生外部中断请求//0000 0010 INT0下降沿产生外部中断请求//0000 0011 INT0上升沿产生外部中断请求GICR|=BIT(6);//对第六位置1;BIT7-INT1 // BIT6-INT0// BIT5-INT2DDRD&=~BIT(2);//PD2置0PORTD|=BIT(2);//PD2置1 带上拉电阻的输入//DDRxn PORTxn I0 上拉电阻说明// 0 0 输入无高阻态// 0 1 输入有带上拉的输入// 1 0 输出无输出低电平// 1 1 输出无输出高电平SREG|=BIT(7); //开全局中断}/*主函数写闪烁灯*/void main(void){init();while(1){PORTB|=BIT(0);delay();PORTB &=~BIT(0);delay();}}#pragma interrupt_handler int0_isr:2 void int0_isr(void){PORTA=0;delay(); PORTA=0xff;}。

avr外部中断详细讲解

avr外部中断详细讲解
ISC11 0 0 1 1 ISC10 0 1 0 1 说明 INT1 低电平触发中断 INT1 任意逻辑电平变化都触发中断 INT1 的下降沿产生异步中断请求 INT1 的上升沿产生异步中断请求
另外 ISC01,ISC00 和外部中断 0 设置触发方式有关:
ISC01 0 0 1 1 ISC00 0 1 0 1 说明 INT0 低电平触发中断 INT0 任意逻辑电平变化都触发中断 INT0 的下降沿产生异步中断请求 INT0 的上升沿产生异步中断请求
{ DDRB=0XFF; PORTB=0XFF; DDRD=0XF7; PORTD=0XFF;
//将 PB 口设置为输出 //PB 口输出 11111111,熄灭全部灯 //PD3 设置为输入,其余设置输出 //PD3 使能上拉电阻,其余都输出 1
MCUCR=0X08; //INT1 设置为下降沿触发 GICR=0X80; //使能 INT1 中断 SREG=0X80; //使能总中断 while(1) { PORTB=0X00; delay(100); PORTB=0XFF; delay(100); } }
MCUCR 是 MCU 控制寄存器,在中文版数据手册中 P65:
在这里我们只要关心它的 Bit 0-3,这四位跟外部中断才有关系。 对于上面的表格 Read/Write 代表可读可写,Initial Value 表示初始值,上面表示 默认值都为零。 其中 ISC11,ISC10 和外部中断 1 设置触发方式有关:
第 4 章 轻松掌握外部中断
4.1 什么是外部中断
“中断”这个词来自英文单词“interrupt” ,在单片机中中断的设置,大大提 高了单片机的工作能力。 对于中断的学习是单片机学习中的重点难点,只要掌握了中断,操纵单片机 让它做你想要实现复杂过程就容易多了。 从生活例子来看, 假如说在寝室里只有你一个人, 这个时候你在写一份作业, 写到一半,有人敲门,这时候,你放下笔,走过去开门,是隔壁寝室的同学来还 书,你收下书后,关上门,拿起笔继续写作业。这其中对于你写作业这个事情来 说就是发生了一次中断,而你能够处理这次“开门事件” ,就说明了你有“中断 能力” 。 反过来说,假如你没有中断能力,事情会这样发生:门外有人敲门的时候, 你的作业还没有写完, 你还是继续在写你的作业, 你甚至不知道外面有人在敲门, 于是便漏过了这件事情。 对应于单片机,假如有一段很长的程序要执行,当按键按下的时候,单片机 在执行前面的程序, 按键松开的时候还没有执行到按键扫描程序,一会儿到了执 行按键扫描程序的时候,扫描的结果是按键会是没有按下,这就发生了错误。 假如开启了外部中断,像上面人一样,执行写作业的动作的时候,外面一有 人在敲门,人便立刻知道了,然后放下手中的事情去开门。单片机开启中断后, 一旦有按键按下,单片机便立刻感知,马上去执行按键按下对应的程序。这样便 不会漏过按键对应的命令,保证了程序正常执行。

单片机ATMEGA16应用案例

单片机ATMEGA16应用案例

图 1 电路图
现代制造技术与装备2016年12月-正文-20170105.indd 155
2017/1/6 9:55:20来自 1562.2 控制逻辑
现代制造技术与装备
2016 第 12 期 总第 241 期
void PRINT_INT0(void) //pd2 print 打印信号用于 触发 CCD 拍照处理 { CCD_result=PIND;CCD_result&=BIT(6); //PD6 取拍 照检测结果,合格为零不合格 1 if(CCD_result==0) label_queue|=BIT(7); // 不 合 格给 label_queue 队列第一位置 1,即做剔除标志 label_queue=(label_queue>>1); // 队列右移一位 label_test=label_queue; //label_test 重 新赋值 label_test&=BIT(4); // 出标位是否有 剔除标志 if(label_test!=0) *((unsigned char*)&convey_queue+3)|=0x3e;// 如 果标签队列第四位为 1,它有剔除标志,给输送队列变量第 三字节赋值 0x3e(二进制 00111110),使输送队列里同时 产生 5 个位的剔除(原因后面会有说明)。 ccdtrig_num=100;// 给触发拍照延时及时长,这是 一个时间常数,在定时器 0 time0 定时中断里继续处理, 会产生拍照触发信号,它的延时是用于消抖(标签刚送完 停顿时会有一个抖动),延时后再发拍照信号。 } 3.2 定时器中断程序 time0 用于产生拍照触发脉冲,它先经过一段延时,之后再 发一个脉冲。 void time0(void) { TCNT0=6; //250us if(ccdtrig_num>0) //CCD 拍照触发 { ccdtrig_num--; // 触发延时消抖 if(ccdtrig_num<30) // 给触发脉冲 PORTC|=BIT(0); //PC0 输出到 CCD_TRIG else PORTC&=~BIT(0); } } 3.3 外部中断程序 INT2 输送带队列:用一个无符号长整型变量,程序中定义

AVR Mega16中断与定时器

AVR Mega16中断与定时器

中断与定时器AVR Mega16 一共有21个中断源 3个外部中断 INT0、INT1、INT2 8个定时器中断3个串口中断 RXC 、TXC 、UDRESPI 、AD 、EEPROM 、模拟比较、TWI 、SPM 各一个 RESET 中断 SPI 串行传输结束SPI, STC$01411保存程序存储器内容就绪SPM_RDY$02821定时器/ 计数器0 溢出TIMER0 OVF $012 10定时器/ 计数器0 比较匹配TIMER0 COMP $026 20定时器/ 计数器1 溢出TIMER1 OVF $010 9外部中断请求2INT2 $024 19定时器/ 计数器1 比较匹配B TIMER1 COMPB $00E 8两线串行接口TWI$02218定时器/ 计数器1 比较匹配 ATIMER1 COMPA $00C7模拟比较器ANA_COMP $020 17定时器/ 计数器1 事件捕捉TIMER1 CAPT $00A 6EEPROM 就绪EE_RDY $01E 16定时器/ 计数器2 溢出TIMER2 OVF $008 5ADC 转换结束ADC $01C 15定时器/ 计数器2 比较匹配TIMER2 COMP $006 4USART , Tx 结束USART, TXC$01A 14外部中断请求1INT1 $004 3USART 数据寄存器空USART, UDRE $018 13外部中断请求0INT0 $002 2USART , Rx 结束USART, RXC $01612外部引脚电平引发的复位,上电复位,掉电检测复位,看门狗复位,以及JTAG AVR 复位RESET$0001中断定义中断源程序地址向量号中断定义中断源程序地址向量号MCU 控制寄存器— INT0、INT1INTx 的上升沿产生异步中断请求11INTx 的下降沿产生异步中断请求0 1 INTx 引脚上任意的逻辑电平变化都将引发中断1 0 INTx 为低电平时产生中断请求0 0 说明ISCx0 ISCx1MCU 控制与状态寄存器—INT2INT2上升沿产生中断请求1INT2下降沿产生中断请求0 说明ISC2外部中断控制——通用中断控制寄存器GICRGICR 的INTx置位为允许INTx 中断 GICR 的INTx 清零为禁止INTx 中断通用中断标志寄存器-GIFR外部中断产生时,硬件自动置位对应的中断请求标志位 中断响应时,硬件自动清除中断请求标志位 中断请求标志位可以通过软件写“1”实现清零 T/C0控制寄存器TCCR0普通模式和CTC模式下:定时器中断屏蔽寄存器-TIMSKOCIE2(OCIE0): T/C2(T/C1)输出比较匹配中断允许标志位OUTPUT COMPARE INTERRUPT ENABLE TOIE2(TOIE0): T/C2(T/C1)溢出中断允许标志位OC0引脚方波频率:CTC模式下利用比较匹配产生波形输出)1(2/_OCRnNff OICLKOCn+=T0计数寄存器-TCNT0T0比较输出寄存器-OCR0定时器中断标志寄存器-TIFR特殊功能IO 寄存器-SFIPSR10: T/C1 与T/C0 预分频器复位T/C1 与T/C0 共用同一预分频器,且预分频器复位对两个定时器均有影响。

IAR_AVR_C语言中断编程

IAR_AVR_C语言中断编程

四、MCU 控制与状态寄存器-MCUCSR
第 2 页 共 5 页
7 JTD 初始值 0
6 ISC2 0
5 0
4 JTRF
3 WDRF
2 BORF
1 EXTRF
0 PORF
Bit 6 – ISC2: 中断 2 触发方式控制 异步外中断 2 由外部引脚 INT2 激活,如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的 中断屏蔽位置位的话。若 ISC2 写 0, INT2 的下降沿激活中断。 若 ISC2 写 1,INT2 的 上升沿激活中断。 INT2 的边沿触发方式是异步的。只要 INT2 引脚上产生宽度大于 50nS 的 脉冲就会引发中断。若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生 中断。而且只要将引脚拉低,就会引发中断请求。改变 ISC2 时有可能发生中断。因此建议 首先在寄存器 GICR 里清除相应的中断使能位 INT2,然后再改变 ISC2。最后,不要忘记在 重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1’使其清零。 五、通用中断控制寄存器-GICR 7 INT1 初始值 0 6 INT0 0 5 INT2 0 4 0 3 0 2 0 1 IVSEL 0 0 IVCE 0
IAR AVR 中的定义 RESET_vect INT0_vect INT1_vect TIMER2_COMP_vect TIMER2_OVF_vect TIMER_ CAPT_vect TIMER1_COMPA_vect TIMER1_COMPB_vect TIMER1_OVF_vect TIMER0_OVF_vect SPI_STC_vect USART_RXC_vect USART_UDRE_vect USART_TXC_vect ADC_vect EE_RDY_vect ANA_COMP_vect TWI_vect INT2_vect TIMER0_COMP_vect SPM_RDY_vect
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
相关文档
最新文档