AVR_中断系统及应用

合集下载

ATmega128的中断系统

ATmega128的中断系统

任意电平变化触发表示只要引脚上有逻辑电平的变化就会 产生中断申请(不管是上升沿还是下降沿都引起中断触发) 产生中断申请(不管是上升沿还是下降沿都引起中断触发)
4种触发方式中,还有以下的一些不同的特点: 种触发方式中,还有以下的一些不同的特点: 种触发方式中 1.低电平触发是不带中断标志类型的,即只要中断输入引脚PD2 低电平触发是不带中断标志类型的,即只要中断输入引脚 低电平触发是不带中断标志类型的 保持低电平, 或PD3保持低电平,那么将一直会产生中断申请。 保持低电平 那么将一直会产生中断申请。 2.MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别 对 和 的引脚上的上升沿或下降沿变化的识别 触发),需要I/O时钟信号的存在 ),需要 时钟信号的存在( 时钟同步检测), (触发),需要 时钟信号的存在(由I/O时钟同步检测), 时钟同步检测 属于同步边沿触发的中断类型。 属于同步边沿触发的中断类型。 3.MCU对INT2的引脚上的上升沿或下降沿变化的识别(触 对 的引脚上的上升沿或下降沿变化的识别( 的引脚上的上升沿或下降沿变化的识别 ),以及低电平的识别 触发)是通过异步方式检测的, 以及低电平的识别( 发),以及低电平的识别(触发)是通过异步方式检测的,不 需要I/O时钟信号的存在。因此,这类触发类型的中断经常作 需要 时钟信号的存在。因此, 时钟信号的存在 为外部唤醒源,用于将处在Idle休眠模式,以及处在各种其它 休眠模式, 为外部唤醒源,用于将处在 休眠模式 休眠模式的MCU唤醒。这是由于除了在空闲(Idel)模式时, 唤醒。 休眠模式的 唤醒 这是由于除了在空闲( )模式时, I/O时钟信号还保持继续工作,在其它各种休眠模式下,I/O时 时钟信号还保持继续工作, 时钟信号还保持继续工作 在其它各种休眠模式下, 时 钟信号均是处在暂停状态的。 钟信号均是处在暂停状态的。

AVR中断嵌套的说明

AVR中断嵌套的说明
如果在初始化中开了总中断 那么AVR在进去中断后会把总中断给关了 中断出来后就会重新开中断 所以如果不用在中断里面嵌套另一个中断 就不用在中断服务程序里面开总中断使能。。。
无论导致引脚电平变化的原因是来自单片机内部还是外部 只要引脚上的电平发生了变化 都可以触发该引脚上的电平变化中断
简单的说 中断就是在中断源触发的时候启动中断程序 而在没有中断源的时候不执行 如果不使用中断 如果要根据某个端口的变化而作相应的动作 就必须不断地查询端口的信号 而中断不用 这就是区别。。。
AVR单片机,其硬件系统不支持自动实现中断嵌套的处理。如果在系统设计中,必须使用中断嵌套处理,则需要由用户编写相应的程序,通过软件设置来实现中断嵌套的功能。
AVR中断嵌套处理是通过软件方式实现的。如在B中断服务中,如需要MCU能及时的响应A中断(不是等本次中断返回后再响应),B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。 用户在编写中断处理服务程序中,应遵循中断服务程序尽量要短的原则
当MCU响应一个中断时,其硬件系统会自动中断返回地址压入系统堆栈,并将关闭全局中断响应(硬件将中断标志I位清0),清除该中断的中断标志位;执行中断返回指令RETI时,硬件会先允许全局中断响应(硬件将中断标志I位置1),然后从系统堆栈中弹出返回地址到PC程序计数器中,继续执行被中断打断的程序。除此之外,MCU的硬件没有对中断保护做其他处理。
中断优先级的概念是针对有多个中断源同时申请中断时,MCU如何响应中断,以及响应哪个中断而提出的。

利用Code Vision AVR C中断程序实现AVR单片机的TWI读写

利用Code Vision AVR C中断程序实现AVR单片机的TWI读写

利用Code Vision AVR C中断程序实现AVR单片机的TWI读写在AVR单片机的开发过程中,TWI(Two-Wire Interface)总线通信协议是较为常用的一种方式。

我们可以利用CodeVision AVR C中断程序来实现AVR单片机的TWI读写。

首先,我们需要了解一下TWI通信协议的基本原理。

TWI总线上有两条线路,一条为SCL时钟线,另一条为SDA数据线。

两条线路上都有上拉电阻,数据传输时由主机(如AVR单片机)控制SCL时钟线和SDA数据线的电平变化来进行数据传输。

在Code Vision AVR C中,我们可以利用TWI库函数进行TWI通信的操作。

在进行TWI读写时,我们需要先发送起始信号,然后发送设备地址和读写指令,接着进行数据传输,最后发送停止信号。

这一系列操作可以使用TWI库函数中的相应函数来完成。

在使用中断程序时,我们需要使TWI模块开启中断功能,并定义好中断服务程序。

在TWI传输过程中,当一个操作完成后,TWI模块会触发中断,执行相应的中断服务程序。

在中断服务程序中,我们可以处理TWI传输过程中出现的各种情况,如传输完成、传输错误等。

下面以TWI读取一个EEPROM芯片中的数据为例,说明如何利用Code Vision AVR C中断程序实现TWI读写。

假设EEPROM芯片的I2C地址为0xA0,我们需要读取从地址0x00开始的8个字节的数据。

首先,我们需要在程序的头文件中引用Code Vision AVR C提供的TWI库。

#include <mega328p.h>#include <delay.h>#include <twi.h>接着,定义TWI芯片地址和读写指令。

#define EEPROM_WRITE 0xA0#define EEPROM_READ 0xA1定义存储数据的缓冲区。

unsigned char EEPROM_Buffer[8];在主函数中初始化TWI模块,并开启TWI中断。

AVR 技术应用笔记:使用 ATtiny1617 上的独立于内核的可配置定制逻辑实现夜灯说明书

AVR 技术应用笔记:使用 ATtiny1617 上的独立于内核的可配置定制逻辑实现夜灯说明书

AN2387使用ATtiny1617上独立于内核的可配置定制逻辑实现夜灯特性•减少CPU使用•使用可配置定制逻辑(Configurable Custom Logic,CCL)模块实现独立于内核的操作•事件系统•TCA0——16位定时器/计数器类型A•SPI0——串行外设接口•AC0——模拟比较器•DAC——数模转换器•EEPROM数据存储器•被动红外探测器•环境光线传感器•16个智能可寻址RGB LED简介本应用笔记介绍了如何使用独立于内核的可配置定制逻辑(CCL)对不同传感器的输入进行滤波以及如何使用Microchip AVR®器件、被动红外(PIR)传感器、环境光线传感器和16个可寻址RGB LED创建特定通信协议。

许多外设被配置为可不依赖于CPU协同工作。

仅当环境足够暗并且PIR传感器前有运动时,灯才会点亮。

该实现使用AVR可配置定制逻辑模块来确定何时发生这种情况。

更新可寻址RGB LED可利用定时器/计数器PWM生成、SPI和CCL来生成特定的单行串行协议。

AN2387目录特性 (1)简介 (1)1.相关器件 (3)1.1.tinyAVR 1系列 (3)2.组件 (4)2.1.STK600 (4)2.2.被动红外探测器 (4)2.3.环境光线传感器 (5)2.4.智能控制LED (5)3.实现 (7)3.1.系统概览 (7)3.2.连接 (7)L配置 (9)3.3.1.LUT0配置 (9)3.3.2.LUT1配置 (10)3.4.程序流 (12)4.从Atmel START获取源代码 (14)5.版本历史 (15)Microchip网站 (16)变更通知客户服务 (16)客户支持 (16)Microchip器件代码保护功能 (16)法律声明 (17)商标 (17)DNV认证的质量管理体系 (18)全球销售及服务网点 (19)相关器件1.相关器件本章列出了本应用笔记的相关器件。

1.1 tinyAVR 1系列下图给出了tinyAVR® 1系列,绘制了不同引脚数型号与存储器大小的关系:•垂直向上移植无需修改代码,因为这些器件的引脚彼此兼容,可提供相同甚至更多的功能。

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、中断寄存器

CodevisionAVR中断的使用(中文翻译)

CodevisionAVR中断的使用(中文翻译)
service routine. Example:
#pragma矢量用来指明接下来的声明函数是一个中断服务程序。例如:
/* Vector numbers are for the AT90S8515 */
AT90S8515的矢量(向量)值
/* Specify the vector number using the #pragma vector directive */
关闭寄存器自动保存
#pragma savereg-
/* interrupt handler */
中断处理程序
interrupt [1] void my_irq(void) {
/* now save only the registers that are affected by the routines in the
#pragma savereg指示是为了保持与早于V1.24.1版本的兼容性。这个指示不建议在新版本中使用。
interrupt handler, for example R30, R31 and SREG */
现在只保存被中断程序影响的寄存器,比如R30,R31和SREG
#asm pusBiblioteka r30 push r31
in r30,SREG
push r30
Example:/* Vector numbers are for the AT90S8515 */
AVR单片机的中断入口由关键词interrupt指示。
例如:AT90s8515的中断向量值
/* Called automatically on external interrupt */
自动调用外部中断

AVR定时器中断初值计算方法

AVR定时器中断初值计算方法

AVR 定时器中断初值计算方法使用芯片AT Mega16 外部晶振定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频要利用定时器定时1秒1,4000000 / 256 = 15625 说明定时器每当1/15625 秒就会触发一次中断2,65535 - 15625 = 49910 计算出要累加多少次才能在1秒后出发定时器1的溢出中断3,49910 <==> C2 F6 将计算后的值换算成16进制4,TCNT1H = 0xC2 ; 对寄存器赋值TCNT1L = 0xF6 ;=================================================例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定时,如何求得初值赋给TCNT165536-(4M/256)*=其中,4M是晶体频率,是定时时长单位秒。

对于8位的定时器T=(2^8-计数初值)*晶振周期*分频数=(2^8-计数初值)/晶振频率*分频数计数初值=2^8-T/晶振周期/分频数=2^8-T*晶振频率/分频数因为AVR一指令一周期IAR For AVR 精确延时C语言中,想使用精确的延时程序并不容易。

IAR 中有这样的一个函数__delay_cycles(),该函数在头文件中定义,函数的作用就是延时N个指令周期。

根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。

实现的方法:建立一个的头文件:#ifndef __IAR_DELAY_H#define __IAR_DELAY_H#include <>#define XTAL 8 //可定义为你所用的晶振频率(单位Mhz)#define delay_us(x) __delay_cycles ( (unsigned lon g)(x * XTAL) )#define delay_ms(x) __delay_cycles ( (unsigned lon g)(x * XTAL*1000) )#define delay_s(x) __delay_cycles ( (unsigned long )(x * XTAL*1000000) )#endif注意:__delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。

AVR教程(十八):AVR 定时器中断程序

AVR教程(十八):AVR 定时器中断程序
LED 控制电路原理图 //应用软件: ICC AVRAVR /*01010101010101010101010101010101010101010101010101010101010101010101 ---------------------------------------------------------------------实验内容: 使用 AVR 的定时器 T1做1S 定时,并使用 PD 口的 LED 指示灯做简单指示。 ---------------------------------------------------------------------硬件连接: 将 PD 口的 LED 指示灯使能开关切换到"ON"状态。 ----------------------------------------------------------------------
输 入: 返 回: --------------------------------------------------------------------*/ #pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) { TCNT1H = 0xE3; //reload counter high value TCNT1L = 0xE1; //reload counter low value DISP_PORT++; //每加1S,显示加1 } /*-------------------------------------------------------------------程序名称: 程序功能: 注意事项:没什么好注意的,不要直接对单片机控制板加220V 电压就行了! 提示说明: 输 入: 返 回: --------------------------------------------------------------------*/ void main(void) { DISP_DDR = 0XFF; //设置显示口为输出 timer1_init(); SEI(); while(1); } 系统调试

AVR ATmega16定时器溢出中断使用小结

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的时间。

iar avr说明

iar avr说明

IAR A VR使用说明总结(以IAR for A VR 5.11B A VR M16为例)iar 是目前编译效率较高的编译器,支持软件仿真和实事仿真,包括简易版M16版jtag ice 。

软件可以从iar官方网站下载使用,demo version 30 days 全功能使用,目前所谓破解版一般是这个版本的破解。

废话不讲了,以m16为例,解释IAR的使用,软件版本5.11b, 30天限制版,希望和大家共同学习IAR FOR A VR 。

IAR A VR使用说明总结(以IAR for A VR 5.11B A VR M16为例)1.新建一个开发环境的1.1单击[IAR Embedded Workbench]图标,选择[Project] / [Create New Project ...], 参考下图1.2设置[Tool chain]选择[A VR];设置[Project templates]选择[Emply project];然后单击[OK],参考下图1.3保存设置,选择保存路径和文件名, 参考如下1.4工具的基本设置,单击[Tool] / [Options], 参考如下1.5单击[Configure], 参考如下1.6工程设置,单击[Project] / [Options],1.7[General Options]选项1.7.1[target]选项卡,[Processor configuation]选择目标mcu, 参考如下1.7.2[Output]选项卡,输出文件设置,选择[Executable], 参考如下1.7.3[Library Configuration]选项卡,[Library]设置,选择[CLIB], 参考如下1.8[C/C++ Compiler]选项1.8.1[Language]选项卡参考如下1.8.2[Optimizations]选项卡参考如下1.8.3[Output]选项卡参考如下1.8.4[List]选项卡参考如下1.9[Linker] 选项卡控制输出文件格式1.10[Debugger] 选项卡, 设置仿真工具,[Simulator]软件仿真,[JTAGEIC]JTAG仿真,参考如下1.11[JTAGICE] 选项卡设置JTAG选项1.12单击[OK],完成设置1.13保存工程设置单击[File] / [save workspace], 选择保存路径和文件名1.14添加文件到工程单击[Project] / [add files], 选择文件,然后单击[OK]2生成可烧写文件(*.hex 和*.eep ,以IAR for A VR 5.11B/W32 (5.11.2.5) 和M16为例)2.1配置[Linker] 选项卡, 在[Format]选择[other],[Output format]选择[ubrof 6 (forced) ],参考下图2.2查看*.xcl文件2.2.1在可以[config]选项卡中看到,如下图红色方框中所示为”cfgm16.xcl’(不同mcu对应的*.xcl文件不同), 默认路径为C:\Program Files\IAR Systems\Embedded Workbench5.0 Evaluation\avr\src\template2.2.2修改次文件, 在“*.xcl”文件末,添加下面两行代码-Ointel-extended,(CODE)=.hex-Ointel-extended,(XDATA)=.eep2.2.3数据定义在eeprom中,使用关键词”__eeprom”, 但是需要增加前前缀”__root”, 使用方法, 参考如下如下__root __eeprom unsigned char table[]={0,1,2,2,3,4};__root __eeprom unsigned char tablex[] @0x10 ={10,11,12,12,13,14}; //绝对地址定义2.定义数到flash空间,使用关键词”__flash” , 使用方法, 参考如下如下__flash unsigned char tablex []={1,2,2,3,4,5,6}__flash unsigned char tablex []@0x10={1,2,2,3,4,5,6} //绝对地址定义3.关键词”__root”功能保证没有使用的函数和变量也能够包含在目标代码中,定义放在flash 空间的数据,在程序编译时会自动生成代码嵌入到flash代码中,对于程序没有使用的也要求编译的数据,必须加入关键词” __root”,编译器才会输出目标代码。

AVR笔记:外部中断

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,此时程序会自动转到中断程序子函数。

然后有硬件自动清零,以等待下一次的中断发生。

AVR一些常用有关中断寄存器介绍

AVR一些常用有关中断寄存器介绍

常配置:●MCU 控制寄存器-MCUCR 外部中断触发方式●SREG:全局中断控制寄存器SEI() ; CLI() ; SREG|=BIT(7);●通用中断控制寄存器- GICR 外部中断请求 INT0 INT1 INT2●定时器/ 计数器中断屏蔽寄存器- TIMSKMCUCSR: MCU 控制与状态寄存器(不常用)表示中断标志的寄存器一般在中断查询时用:●通用中断标志寄存器- GIFR●定时器/ 计数器中断标志寄存器- TIFRMCU 控制寄存器-MCUCR其他各个模块(如定时器,ADC,SPI,IIC,UART,EEPROM,看门狗)的中断控制在其相应的控制寄存器中,状态在其状态寄存器中MCUCSR: MCU 控制与状态寄存器• 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’使其清零。

它的第7位与第四位与I/O 存储器中与边界扫描相关SREG:全局中断控制寄存器GICR:通用中断控制寄存器• B it 7 – INT1: 使能外部中断请求1当INT1 为'1’,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU 通用控制寄存器– MCUCR的中断敏感电平控制1位1/0 (ISC11与ISC10)决定中断是由上升沿、下降沿,还是INT1 电平触发的。

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” ,在单片机中中断的设置,大大提 高了单片机的工作能力。 对于中断的学习是单片机学习中的重点难点,只要掌握了中断,操纵单片机 让它做你想要实现复杂过程就容易多了。 从生活例子来看, 假如说在寝室里只有你一个人, 这个时候你在写一份作业, 写到一半,有人敲门,这时候,你放下笔,走过去开门,是隔壁寝室的同学来还 书,你收下书后,关上门,拿起笔继续写作业。这其中对于你写作业这个事情来 说就是发生了一次中断,而你能够处理这次“开门事件” ,就说明了你有“中断 能力” 。 反过来说,假如你没有中断能力,事情会这样发生:门外有人敲门的时候, 你的作业还没有写完, 你还是继续在写你的作业, 你甚至不知道外面有人在敲门, 于是便漏过了这件事情。 对应于单片机,假如有一段很长的程序要执行,当按键按下的时候,单片机 在执行前面的程序, 按键松开的时候还没有执行到按键扫描程序,一会儿到了执 行按键扫描程序的时候,扫描的结果是按键会是没有按下,这就发生了错误。 假如开启了外部中断,像上面人一样,执行写作业的动作的时候,外面一有 人在敲门,人便立刻知道了,然后放下手中的事情去开门。单片机开启中断后, 一旦有按键按下,单片机便立刻感知,马上去执行按键按下对应的程序。这样便 不会漏过按键对应的命令,保证了程序正常执行。

外部中断的检测及其应用.概要

外部中断的检测及其应用.概要

目录摘要 (1)1 软件介绍 (2)1.1 protues仿真软件 (2)1.2 C编译器Keil介绍 (3)2 外部中断源的特点及控制 (4)2.1 IE 寄存器的特点及设置 (4)2.2 中断标志位TCON的特点及设置 (5)2.3 外部中断标志的编程方式 (6)3 定时/计数器 (7)3.1 定时/计数器的结构和工作原理 (7)3.2 TMOD定时器/计数器方式寄存器 (7)3.3 TCON定时器/计数器控制寄存器 (8)4 定时器/计数器的设计 (10)4.1 任务分析及设计方案 (10)4.2 理论分析 (10)4.3 流程图 (11)4.4 程序设计 (12)4.5 Protues仿真 (13)4.6 仿真结果 (14)5 小结 (15)摘要中断控制是单片机最重要的技术之一,实时控制及人机交换等都是通过中断控制实现的。

使用中断控制技术的主要优点表现在:1)能提高CPU 工作效率。

在中断方式下,当计算机需要进行输入/输出操作时,可以启动相应的外部设备,此后计算机继续执行原来的程序;与此同时,相应外部设备启动后能独立进行操作,只有当它需要与CPU 交换信息时,才发出中断申请。

2)能使几个外部设备并行工作。

当计算机需要与若干外部设备进行输入/输出操作时,可以分别启动不同外部设备,让它们各自进行自己的工作。

当它们准备就绪分别或同时向计算机提出申请时,计算机可根据设置的优先级别,逐个响应外部设备的中断请求,不会造成紊乱。

3)能进行实时处理。

如在监测系统中,对温度、压力、流量、湿度参数的采集,根据捕捉到的信息,利用中断及时进行处理等。

由此可见,中断系统越强大,单片机的应用范围就越广。

本文主要涉及的内容是单片机外部中断、中断系统的应用及其程序的调试。

本次课程设计的要求是:由中断引脚输入500Hz的脉冲信号,要求每中断一次,P1.0输出一个500us的同步负脉冲,P1.1输出一个1ms的同步正脉冲。

AVR的操作步骤和应用

AVR的操作步骤和应用

动手学A VR单片机一、AVR单片机家族概述1.1 AVR单片机家族单片机概述AVR单片机系列齐全,可适用于各种不同场合的要求。

AVR单片机主要包括ATTINY、AT90、ATME GA这三大系列。

低档Tiny系列AVR单片机: 主要有Tiny11/12/13/15/26/28等;ATTINY系列最简单、功能最弱。

适用于比较低档的玩具、仪器仪表和简单的控制系统。

中档AT90S系列AVR 单片机: 主要有AT90S1200/2313/8515/8535等;目前AT90系列正在停产或转型到Mega系列。

高档ATmega系列AVR单片机: 主要有两个系列:ATmega8/16/32/64/128系列(存储容量为8/16/32/ 64/128 KB)、ATmega48/88/168系列。

ATmega系列使用了更加先进、可靠的制造工艺,高中低档齐全,正在逐步取代AT90系列的产品。

AVR单片机还根据不同的应用推出了各具特色的单片机:如汽车类AVR、CAN总线AVR、智能电池A VR、LCD(液晶显示)AVR、USB总线AVR、灯光专用AVR、Z-Link AVR、微型AVR等9大类型,这些单片机几乎涵盖了8位单片机的所有应用领域。

1.2 AVR单片机的型号与编号AVR单片机型号众多,基本上每种型号都有不同用途,每个系列AVR单片机芯片上都有不同的编号;如何根据芯片上的编号来识别呢?我们以下面这个编号为例来进行说明:ATmega8L-8PI1.AT表示该单片机是ATMEL公司的产品;2.mega表示该单片机为ATmega系列的单片机;3.数字8表示mega系列型号为8的单片机,同时指名了该型号单片机内部flash容量位8KB(8K字节)。

4.字母L表示该单片机为低功耗类型的单片机,同理如果没有L,则表示该单片机为普通类型的单片机;5.“-”后面的数字8表示该芯片允许的最大时钟频率为8MHz,如果是16则表示允许最大时钟频率为16M Hz;6.字母P表示该单片机的封装形式,P是DIP封装(双列直插),A表示有引脚扁平封装(即贴片封装),M表示无引脚扁平封装(对于个人学习,很少使用这种封装)。

AVR单片机嵌入式系统原理与应用——马潮(著)第02章

AVR单片机嵌入式系统原理与应用——马潮(著)第02章

第二章 AVR单片机的基本组成单片机是构成单片机嵌入式系统的核心器件。

本章首先将介绍一般单片机的基本组成和结构,使大家对单片机片内的硬件有基本了解和认识。

掌握了单片机的基本结构和组成,对学习、了解任何一种类型单片机的工作原理,编写单片机的系统软件以及和设计外围电路都是非常重要的。

作为一个实例,本章重点以新型的,采用RISC指令的AVR高速单片机作为主要介绍对象,以本书中主要讲解和使用的一款AVR单片机ATmega16为主线,详细介绍AVR单片机的基本结构和系统构成。

§2.1 单片机的基本组成2.1.1 单片机的基本组成结构单片机嵌入式系统的核心部件是单片机,其结构特征是将组成计算机的基本部件集成在一块晶体芯片上,构成一片具有特定功能的单芯片计算机—单片机。

一片典型单片机芯片内部的基本组成结构如图2-1所示。

外部中断外部数据/地址总线图2-1 典型单片机的基本组成结构从单片机的基本组成可以看出,在一片(单片机)芯片中,集成了构成一个计算机系统的最基本的单元:如CPU、程序(指令)存储器、数据存储器、各种类型的输入/输出接口等。

CPU同各基本单元通过芯片内的内部总线(包括数据总线、地址总线和控制总线)连接。

一般情况下,内部总线中的数据总线宽度(或指CPU的字长)也是标定该单片机等级的一个重要指标。

一般讲,低档单片机的内部数据总线宽度为4位(4位机),普通和中档单片机的内部数据总线宽度一般为8位(8位机),高档单片机内部数据总线宽度为16或32位。

内部数据总线宽度越宽,单片机的处理速度也相应的提高,功能也越强。

2.1.2 单片机基本单元与作用下面分别对单片机芯片中所集成的各个组成部分予以简要介绍。

1.MCU单元MCU单元部分包括了CPU、时钟系统、复位、总线控制逻辑等电路。

CPU是按照面向测控对象、嵌入式应用的要求设计的,其功能有进行算术、逻辑、比较等运算和操作,并将结果和状态信息与存储器以及状态寄存器进行交换(读/写)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章 中断系统及应用
8.1 中断源 AT90S8535 有16 个中断源 每个中断源在程序空间都有一个独立的中断向量 所有的中断事件都有
自己的使能位 当使能位置位 且I 也置位的情况下 中断可以发生
程序空间的最低位置定义为复位及中断向量 完整的中断表见表8.1 在中断向量表中处于低地址的中 断具有高的优先级 所以 RESET 具有最高的优先级
在通常情况下 中断向量处为一个相对跳转指令 此跳转要花2个时钟周期 如果中断在一个多周期指令执
行期间发生 则在此多周期指令执行完后MCU 才会执行中断程序 中断返回亦需4 个时钟 在此期间 PC 将被弹出栈 SREG 的位I 被置位 如果在中断期间发生了其
它中断 则AVR 在退出中断程序后 要执行一条主程序指令之后才能再响应被挂起的中断
ISC01
ISC00
描述
0
0
低电平中断
0
1
保留
1
0
下降沿中断
1
1
上升沿中断
为了防止无意间使MCU 进入休眠
建议与SLEEP 指令相连使用 位5 4 SM1 SM0 休眠模式
这两位用于选择休眠模式
表8.2 睡眠模式选择
SM1
SM0
睡眠模式
0
0
空闲
0
1
保留
1
0
掉电
1
1
省电
位3 2 ISC11 ISC10 中断检测控制1 位1 和位0
选择 INT1 中断的边沿或电平 如表 8.3 所示
8.6 MCU 控制寄存器 MCUCR
BIT 7
6
5
4
3
2
1
0
$35($55)
-
SE
SM1
SM0 ISC11 ISC10 ISC01 ISC00 MCUCR
读/写: R
R/W R/W
R/W
初始化值: $00R/W Nhomakorabea/WR/W R/W
位7 Res 保留位 位6 SE 休眠使能
执行SLEEP 指令时
SE 必须置位才能使MCU 进入休眠模式
ISC11 和ISC10 定义中断1是上升沿中断还是下降沿中断 或者是低电平中断 即使管脚被定义为输出 中断仍可产生
位6 INT0 外部中断0 请求使能
当INT0 和I 都为 1 时 外部引脚中断使能 MCU 通用控制寄存器 MCUCR 中的中断检测控制 位I/0 ISC01 和ISC00 定义中断0是上升沿中断还是下降沿中断 或者是低电平中断 即使管脚被定义为 输出 中断仍可产生
R/W
R/W R/W
R/W
初始化值: $00
R
R/W
位7 OCF2 T/C2 输出比较标志 当T/C2 与OCR2 的值匹配时 OCF2 置位 此位在中断例程里硬件清零 或者通过对其写 1 来清
零 当SREG 中的位I OCIE2 和OCF2 一同置位时 中断例程得到执行
位6 TOV2 T/C2 溢出中断标志位 当T/C2 溢出时 TOV2 置位 执行相应的中断例程后此位硬件清零 此外 TOV2 也可以通过写 1
$00f
RJMP EE_RDY
EEP 准备好
$010
RJMP ANA_COMP
模拟比较器
$011
MAIN LDI R16,HIGH(REMEND)
主程序开始
$012
OUT SPH, R16
$013
LDI R16,LOW(REMEND)
$014
OUT SPL, R16
$015 8.2 中断处理
<指令> XXX
得到执行
位4 OCF1A 输出比较标志1A 当T/C1 与OCR1A 的值匹配时 OCF1A 置位 此位在中断例程里硬件清零 或者通过对其写 1 来
清零 当SREG 中的位I OCIE1A 和OCF1A 一同置位时 中断例程得到执行
位3 OCF1B 输出比较标志1B 当T/C1 与OCR1B 的值匹配时 OCF1B 置位 此位在中断例程里硬件清零 或者通过对其写 1 来
要注意AVR 硬件在中断或子程序中并不操作状态寄存器 SREG SREG 的存储由用户软件完成 对于那些由可以保持为静态的事件 如输出比较寄存器1 与T/C1 值相匹配 驱动的中断 事件发生后中断
标志将置位 如果中断标志被清除而中断条件仍然存在 则标志只有在新事件发生后才会置位 外部电平
中断会一直保持到中断条件结束
位5 0 Res 保留
二 通用中断标志寄存器 GIFR
位7
6
5
4
3
2
1
0
$3A($5A) INTF1 INTF0
-
-
-
-
-
-
GIFR
读/写: R/W
R/W
R
R
R
R
R
R
初始化值: $00
位7 INTF1 外部中断标志1 当INT1 管脚有事件触发中断请求时 INTF1 置位 1
都为 1 则MCU 将跳转到中断地址$002 中断例程执行后
志位也可以通过软件写 1 来清除
当一个符合条件的中断发生后 如果相应的中断使能位为 0 则中断标志位挂起 并一直保持到中
断执行 或者被软件清除
如果全局中断标志被清零 则所有的中断都不会被执行 直到I置位 然后被挂起的各个中断按中断优
先级依次中断
注意 外部电平中断没有中断标志位 因此当电平变为非中断电平后 中断条件即终止
1 来清除
位5 0 Res 保留位 三 T/C 中断屏蔽寄存器
TIMSK
位7
6
5
4
3
2
1
0
$39($59) OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1
-
TOIE0 TIMSK
读/写: R/W R/W
R/W
R/W
R/W R/W
R
R/W
初始化值: $00
位7 OCIE2 T/C2输出比较匹配中断使能 当TOIE2和I都为 1 时 输出比较匹配中断使能
OCF1B 置位 中断例程 $007 将执行
当T/C1 的比较B 匹配发生
或TIFR 中的
位2 TOIE1 T/C1 溢出中断使能 当TOIE1 和I 都为 1 时 T/C1 溢出中断使能 当T/C1 溢出 或TIFR 中的TOV1 位置位时 中断
例程 $008 得到执行
位1 Res 保留位 位0 TOIE0 T/C0 溢出中断使能
T1 比较B 匹配 T1 溢出
$009
RJMP TIM0_OVF
T0 溢出
$00a $00b
RJMP SPI_STC RJMP UART_RXC
SPI 传输结束 UART 接收结束
$00c
RJMP UART_DRE
UART 数据空
$00d $00e
RJMP UART_TXC RJMP ADC
UART 发送结束 AD 转换结束
的ICF1 置位 中断例程 $005 将执行
或TIFR 中
位4 OCIE1A T/C1输出比较A 匹配中断使能 当TOIE1A 和I 都为 1 时 输出比较A 匹配中断使能
OCF1A 置位 中断例程 $006 将执行
当T/C1 的比较A 匹配发生
或TIFR 中的
位3 OCIE1B T/C1 输出比较B 匹配中断使能 当TOIE1B 和I 都为 1 时 输出比较B 匹配中断使能
在$0000 改变计数方向时 TOV1 置位 位 1 Res 保留位
位0 TOV0 T/C0 溢出中断标志位
当T/C0 溢出时 TOV0 置位 执行相应的中断例程后此位硬件清零 此外 TOV0 也可以通过写 1 来清零 当SREG 中的位I TOIE0 和TOV0 一同置位时 中断例程得到执行
8.4 外部中断
$006
TIMER1 COMPA
T/C1 比较匹配A
8
$007
TIMER1 COMPB
T/C1 比较匹配B
9
$008
TIMER1 OVF
T/C1 溢出
10
$009
TIMER0 OVF
T/C0 溢出
11
$00A
SPI STC
串行传输结束
12
$00B
UART RX
UART 接收结束
13
$00C
UART UDRE
当TOIE0 和I 都为 1 时 T/C0 溢出中断使能 当T/C0 溢出 或TIFR 中的TOV0 位置位时 中断
例程 $009 得到执行
四 T/C 中断标志寄存器
位7
6
TIFR 5
4
3
2
1
0
$38($58) OCF2 TOV2 ICF1 OCF1A OCF1B TOV1
-
TOV0 TIFR
读/写: R/W R/W
UART 数据寄存器空
14
$00D
UART TX
UART 发送结束
15
$00E
ADC
ADC 转换结束
16
$00F
EE_RDY
EEPROM 准备好
17
$010
ANA_COMP
模拟比较器
设置中断向量地址最典型的方法如下
地址
标号
代码
注释
$000
RJMP RESET
复位
$001
RJMP EXT_INT0
IRQ0
外部中断由INT0 和INT1 引脚触发 应当注意 如果中断使能 则既使INT0/INT1 配置为输出 中断 照样会被触发 此特点提供了一个产生软件中断的方法 触发方式可以为上升沿 下降沿或低电平 这些
相关文档
最新文档