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); } 系统调试
  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 配置为输出 中断 照样会被触发 此特点提供了一个产生软件中断的方法 触发方式可以为上升沿 下降沿或低电平 这些
相关文档
最新文档