ATMega16单片机外部中断的使用
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();//流水灯函数}}。
第4章avrmega16单片机中断实例

• 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 的过程
ATMEGA16 中断GCC模式

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

快速PWM模式:1、设置端口输出
2、设置PWM波形模式以及时钟选择(TCCR1A,TCCR1B)
3、设置PWM波形的频率(OCR1A)
4、设置PWM波形的占空比(OCR1B)
定时器:1、根据需要选择时钟源(寄存器TCCR1B)
AVR单片机操作步骤
外部中断:1、设置外部中断的触发方式(寄存器MCUCR)
2、使能外部中断(寄存器GICR)
3、设置中断管脚(是否需要上拉电阻)
4、打开全局中断(寄存器SREG)
5、选择中断号,写中断服务函数
5、在置EEMWE为1的4个时钟周期内向EEWE中写入1
USART使用步骤:1、初始化工作模式,帧结构等(UCSRC)
2、波特率设置(UBBRL,UBBRH)
3、中断的相关设置(UCSRB)
4、选择中断号,编写中断服务函数
注意:从ADCH和ADCL中读取到的数据是BCD码格式
EEPROM写写入EEAR
3、把EEPROM的数据写入EEDR
4、置EEMWE为1
2、根据定时器时间的时钟源确定定时器的初值(寄存器TCNT1H和TCNT1L)
3、设置中断使能位 TIMSK |= BIT(2); SREG |= BIT(7);
4、选择中断号,编写中断服务程序
注意:在中断服务函数里面需要重新设置定时器初值
ADC使用步骤: 1、ADC输入端在初始化
2、基准电压设置,数据对齐方式,通道选择(寄存器ADMUX)
3、AD使能,启动转换及中断设置(寄存器ADCSRA)
4、触发源选择(寄存器SFIOR)
5、选择中断号,编写中断服务函数,读取ADC转换结果(ADCH、ADCL)
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”语句通知编译器,该子程序是一个中断操作。
第07章 ATM16的中断系统应用PPT课件

第9章 编译器和集成开发环境
广西大学电气工程学院
mega16的中断向量表(3)
向量 序号
15 16 17 18 19 20 21
中断向量 中断源代码 flash 地址
$001C $001E $0020 $0022 $0024 $0026 $0028
ADC EE-RDY ANA-COMP TWI INT2 TIMER0 COMP SPM-RDY
第9章 编译器和集成开发环境
广西大学电气工程学院
中断返回:
三、中断返回:
在中断子程序的最后,安排一条中断返回指令(RETI), 将堆栈内保存的进入中断时被中断的程序位置值弹出。并自 动开启全局中断标志位I,以便CPU能响应新的中断请求。
在C编译器中,中断返回与恢复现场和保护现场一样,不 需要用户编写完成。
2、GICR---通用中断控制寄存器: 3、GIFR---通用中断标志寄存器: 4、MCUCR---微控制器控制寄存器: 5、MCUSCR ---微控制器状态与控制寄存器:
第9章 编译器和集成开发环境
广西大学电气工程学院
GICR--通用中断控制寄存器
Bit
765 4 3 2 1 0
INT1 INT0 - - - - IVSEL IVCE GICR
第9章 编译器和集成开发环境
广西大学电气工程学院
外中断1 触发方式控制
ISC11 ISC10 说明
0
0 INT1为低电平时产生中断请求
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、中断寄存器
单片机外部中断详解及程序

单片机外部中断详解及程序单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。
比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。
在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。
如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。
但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。
因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。
下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。
电路结构和接线不变,仅把程序改为下面的形式。
#include ;unsigned int t=500; //定义一个全局变量t,并设定初始值为500次//===========延时子函数,在8MHz晶振时约1ms=============void delay_ms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//============主函数==================================void main( void ){DDRB = 0xFF; //设置端口B为输出方向PORTB = 0xFF; //设置端口B的输出为全高电平DDRD = 0x00; //设置端口D为输入方向PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态MCUCR = 0x0A; //设定INT0、INT1为下降沿触发GICR = 0xC0; //使能INT0、INT1中断SREG = 0x80; //使能总中断while(1){PORTB = 0x55; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个msPORTB = 0xAA; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个ms}}//============中断函数(外部0)==========================#pragma vector = INT0_vect__interrupt void INT0_Server(void){t = 100; //设定t的值为100次}//============中断函数(外部1)==========================#pragma vector = INT1_vect__interrupt void INT1_Server(void){t = 500; //设定t的值为500次}把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。
实验5-外部中断

实验5-外部中断外部中断是指由CPU外部发出的中断请求,例如外部设备的输入/输出请求或定时器中断。
在此实验中,我们将学习如何使用ATmega16的外部中断功能。
硬件连接:- 将按钮连接到MCU的外部中断引脚(INT0或INT1)- 将LED连接到MCU的输出引脚软件实现:1. 配置外部中断在ATmega16中,外部中断引脚被分为INT0和INT1,可以使用MCU的寄存器来配置它们。
下面是一些相关的寄存器:- MCUCR:MCU控制寄存器,用于设置外部中断引脚的触发方式(如下降沿、上升沿、逻辑电平等)。
- GICR:全局中断控制寄存器,用于启用/禁用外部中断。
下面是一些示例代码来配置INT0为下降沿触发:```c// 设置INT0引脚的触发方式为下降沿MCUCR |= (1 << ISC01);MCUCR &= ~(1 << ISC00);// 启用INT0中断GICR |= (1 << INT0);```2. 实现中断服务程序中断服务程序(ISR)是在响应中断时自动调用的函数。
在此实验中,我们将为INT0编写一个简单的ISR,使连接到MCU的LED闪烁。
```c#include <avr/io.h>#include <avr/interrupt.h>#define LED PB0#define BUTTON PD2// INT0中断服务程序ISR(INT0_vect){PORTB ^= (1 << LED); // 翻转LED状态}// 启用全局中断sei();while (1){// 延时一段时间for (volatile uint16_t i = 0; i < 10000; i++);}}```在ISR中,我们将LED引脚的状态翻转,以使其闪烁。
注意,ISR应该尽可能地短,以便快速地响应中断请求。
3. 测试实验现在将MCU连接到计算机,并上传上述代码。
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寄存器了。
AVR ATmega16定时器溢出中断使用小结

关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。
对于定时器初值的设定可以加深对定时器的工作原理的理解。
ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。
而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产生中断,这就是中间消耗的时间和指令周期就是我们要去设定的时间;再比如:初值是200,所以定时器从200开始累加,累加了56次,加到256后产生中断,可以看到第一定时要累加156次才会中断而第二次只要累加56次就会产生中断,显然第一次设定的时间要比第二次的长。
定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。
我们可以计算出我们设定的初值会在多长时间后进入中断。
下面的是8位定时器设定的时候需要用的寄存器:实验平台:ATMega16晶振: 11.0592 MHz对初值的计算:1,11059200 / 1024 = 10800 设定为1024倍分频,得到每1秒需要进行多少次累加2,10800 / 100 = 108 得到10ms 的定时需要进行多少次累加(第一步计算出每一秒进行的累加次数,由于一秒是100个10ms,故除数为100)3,256 - 108 = 148 计算范围最大值(8位寄存器)减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。
4,148 <==> 0x94 得到十六进制值,赋值给TCNT0#实验代码:定时10ms_ICCAVR#include <iom16.h>unsigned char flag = 0;void timer_init(void){TCCR0 = 0x05; //进行1024分频TCNT0 = 0x94; //赋计数初值TIMSK_TOIE0 = 1; //开使能SREG_I = 1; //开总中断}#pragma vector = TIMER0_OVF_vect__interrupt void time0_normal(void){TCNT0 = 0x94; //重新赋初值flag++;}void main(void){timer_init();DDRB_Bit0 = 1;while(1){if(flag == 100) //10ms 重复100次,即为1秒 {PORTB_Bit0 = ~PORTB_Bit0; //让LED闪烁flag = 0;}}}//+++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++//实验平台:ATMega16晶振:11.059216位定时器初值设定:1,11059200 / 256 = 43200 设定256倍分频,得到每1秒需要进行多少次累加2,65536 - 43200 = 22336 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。
蓝桥杯单片机外部中断的基本操作

一、引言在单片机的学习和应用中,外部中断是一个非常重要的功能。
蓝桥杯单片机外部中断的基本操作,对于单片机编程的初学者来说是一个重要的知识点。
本文将从蓝桥杯单片机外部中断的定义、原理、具体操作以及个人观点等方面进行全面的介绍和讨论。
二、蓝桥杯单片机外部中断的定义和原理蓝桥杯单片机外部中断是指当单片机在执行程序时,外部的某个事件(比如按键触发、传感器检测等)发生时,可以通过中断的方式及时通知单片机,使单片机停止当前的工作,转而去处理这个事件,处理完成后再返回原来的工作。
外部中断的原理是通过单片机的外部中断引脚,当引脚的电平变化时,让单片机执行相应的中断服务程序。
三、蓝桥杯单片机外部中断的具体操作1. 设置外部中断引脚:首先需要配置单片机的外部中断引脚,使其能够检测到外部事件的变化。
2. 初始化外部中断:在程序中需要对外部中断进行初始化,包括中断触发方式(上升沿触发、下降沿触发等)、中断服务程序的位置区域等。
3. 编写中断服务程序:针对不同的外部事件,编写相应的中断服务程序,确保可以及时响应外部中断。
4. 开启外部中断:在程序运行过程中,需要开启外部中断功能,以便单片机能够正常地接收外部中断请求。
四、个人观点和理解对于蓝桥杯单片机外部中断的基本操作,我认为非常重要且实用。
通过外部中断,单片机可以更加灵活地响应外部事件,提高系统的实时性和可靠性。
在实际的项目开发中,合理地运用外部中断能够有效地简化系统的设计,并提高系统的整体性能。
五、总结蓝桥杯单片机外部中断的基本操作对于单片机编程的学习和应用具有重要的意义。
通过本文的介绍,我们对外部中断的定义、原理、具体操作以及个人观点有了更深入的了解。
希望能够在今后的学习和实践中,充分利用外部中断这一功能,提高单片机系统的性能和可靠性。
六、结语通过本文的介绍,相信读者对蓝桥杯单片机外部中断的基本操作有了更深入的了解。
希望读者在今后的学习和实践中,能够充分利用这一功能,提高单片机系统的性能和可靠性。
AVR笔记:外部中断

A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。
我们现在只关心需要用的部分,其他的暂且放弃不管。
和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。
资料上对后面四位(第四位)的作用有介绍。
ISC11与ISC10控制中断1的触发方式。
下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。
下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。
至于INT2下面有介绍。
②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。
ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。
同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。
这才是应该说明的最重要的点。
他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。
(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。
③通用中断控制寄存器(GICR)他就是个中断开关。
前面三位依次赋值便会打开响应中断。
当然总中断开关也要打开才行(SREG|=BIT(7))。
④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。
然后有硬件自动清零,以等待下一次的中断发生。
AT mega系列单片机原理及应用第4章 ATmega 单片机的中断系统及定时器

表4.1 中断1 触发方式控制
ISC11 ISC10 说明
0
0 INT1为低电平时产生中断请求
0
1 INT1引脚上任意的逻辑电平变化都将引发中断
1
0 INT1的下降沿产生中断请求
1
1 INT1的上升沿产生中断请求
• 如果SREG寄存器的标志位和相应的中断屏蔽位置 位的话。外部中断0 由引脚INT0激发。触发方式如 表4.2所示。在检测边沿前MCU首先采样INT0引脚 上的电平。
• 例4.1 设置寄存器MCUCR,响应外部中断INT0为上升沿 产生中断要求使用方法。
• MCUCR |= 0x0c; //设置MCUCR寄存器位2、3(对照表 4.1可知表示外部中断INT1为上升
• 沿产生中断要求)
• 例4.2 利用寄存器MCUCR,响应外部中断INT0, 上升沿有效。
• MCUCR |= 0x03; //设置MCUCR寄存器位0、1 (对照表4.2可知表示外部中断INT0为上升沿产生 中断要求)
• 当一个符合条件的中断触发置位了中断标志位, 但相应的中断允许位为“0”,此时,这个中断标 志将挂起为“1”,一直保持到该中断被响应或中 断标志被软件清为“0”。
• 对于一些条件中断(如外部中断)来讲,它们没 有中断标志位,在中断条件成立时,将一直不断 的向MCU申请中断,如果在中断允许响应前,中 断条件由成立状态变成不成立状态,该中断即宣
告终止了。
4.1.2 外部中断
• 外部中断通过引脚INT0,INT1(ATmega16L多一 个INT2外部中断)触发。即使引脚INT0,1配置 为输出,只要电平发生了合适的变化,中断也会 触发。这个特点可以用来产生软件中断。通过设 置MCU控制寄存器MCUCR,中断可以由下降沿、 上升沿,或者是低电平触发。
atmege16外部中断程序

atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include;#include;#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) ;//INT0,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应用案例

图 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 输送带队列:用一个无符号长整型变量,程序中定义
ATmega16中断

有中断请求?
Y
开中断?
Y
由硬件 自动完成
• 中断的响应(2)
当满足“中断的响应(1)”的条件后,CPU立即响 应中断,转入中断周期,CPU做以下几件事:
✓ 关中断 ✓ 保留断点 ✓ 保护现场 ✓ 给出中断入口,转入相应的中断服务程序 ✓ 恢复现场 ✓ 开中断与返回
中 断 的 检 测 与 响 应 示 意 图 (2)
外部中断1、在0I中CC断AV请R求C开信发号系方统式中:,可
通过编程向导对位3~0进行设
ISCx1
置。
中断请求信号
ISCx0
有效方式
ISCx1 ISCx0
中断请求信号 有效方式
0
0
低电平
1
0
下降沿
0
1
上升沿或下降沿
1
1
位7~4:与外部中断的设置无关。
上升沿
MCU控制和状态寄存器 —— MCUCSR
ATmega16
Vcc
E2
PC2
PD2
(INT0)
感谢
谢 谢 !!
保护现场和 恢复现场的 过程中不允 许中断,以 免现场遭到 破坏。
关中断
保护现场
开中断 中断服务 关中断
保护和恢复现场之后 的开中断是为了允许 有更高级中断打断此 中断服务程序。
恢复现场
开中断
中断返回 断点地址由堆栈弹入PC
硬件自 动完成
中断服务程序的转入(1)
当CPU响应中断,在关 中断、保留断点后, 一个十分重要的问题 是如何转入中断服务 程序的入口。
外部中断源
ATmega16有3个外部中断 源:
管脚
外部中断
PD2 INT0(外部中断0输入)
单片机中断机制与外部中断引脚应用原理解读

单片机中断机制与外部中断引脚应用原理解读单片机中断机制是指在单片机运行过程中,当某个特定事件发生时,可以中断正在执行的程序,转而去处理这个事件。
中断机制可以提高单片机的响应速度和效率,在许多实时控制系统和嵌入式系统中被广泛应用。
本文将解读单片机中断机制的原理,并重点介绍外部中断引脚的应用。
一、中断机制的原理单片机中断机制的核心是中断向量表和中断优先级控制。
当中断事件发生时,中断请求线将信号发送给单片机,单片机根据中断源的优先级以及当前正在执行的程序的状态来判断是否执行中断处理程序。
1. 中断源常见的中断源包括外部中断、定时器中断和串口中断等。
外部中断是通过单片机的外部引脚与外部设备连接,当外部设备触发中断条件时,会发送中断请求信号给单片机。
定时器中断是通过单片机内部的定时器模块来触发的,可以用来实现精确的时间控制。
串口中断是通过单片机与外部设备进行串口通信时,当接收到数据或发送完成时触发的中断。
2. 中断处理程序当中断事件发生时,单片机会执行对应的中断处理程序,中断处理程序是一段特定的代码,用来处理中断事件和保存现场。
中断处理程序执行完毕后,会根据中断优先级控制来判断是否返回到原来的程序继续执行。
3. 中断向量表中断向量表是存储中断处理程序地址的表格,它们按照中断源的编号排列。
当中断事件发生时,单片机会根据中断源的编号找到对应的中断向量表项,从而确定要执行的中断处理程序。
4. 中断优先级控制中断优先级控制是用来确定在多个中断事件同时发生时,单片机选择哪个中断事件优先响应的机制。
通过设置中断源的优先级,单片机可以根据优先级来选择执行对应的中断处理程序。
二、外部中断引脚的应用原理外部中断引脚是单片机上的专门引脚,用于接收外部设备发送的中断请求信号。
外部中断引脚通常分为多个引脚,每个引脚可以连接一个外部设备。
在外部设备满足中断触发条件时,会向单片机发送中断请求信号,单片机根据引脚的电平变化来判断中断事件的发生。