AVR中断详解

发布者:Aq123456258最新更新时间:2022-03-09 来源: eefocus关键字:AVR  中断  定时器 手机看文章 扫描二维码
随时随地手机看文章

Tmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。功能强大,但也非常复杂,不易掌握,欢迎大家讨论:

1、谈谈AVR定时器的学习方法,各定时器的优缺点及最佳使用场合

2、在使用AVR过程中,对AVR定时器的应用,欢迎贴出你的代码

3、你在使用AVR定时器过程中碰到的疑难问题,怎么解决的,或未解决的需要帮忙的



AVR定时器知识要点总结:

1、   定时器数量:分别是T/C0、T/C2、T/C1 ;ATmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。

2、   定时器中断源:ATmega16共有8个定时中断,分别是TIMER2 COMP、TIMER2 OVF、TIMER1 CAPT、TIMER1 COMPA、TIMER1 COMPB、TIMER1 OVF、TIMER0 OVF、TIMER0 COMP;从表1中可以得出如下结论:

a:定时器中断优先级低于复位中断、外部中断0、外部中断1,见表1;TC2的中断优先级高于TC1,TC1的中断优先级高于TC0;

b:定时器的中断向量号是从4~10,还有一个20(可以这样来记:复位中断是最高的,其次是外部中断,最后是定时中断,外部中断2是个特例,TC0比较匹配也是个特例)

c:定时器的匹配中断优先级高于其溢出中断(TC0是个特例,溢出中断优先级高于匹配中断),事件捕捉中断优先级高于匹配中断!

d:TC1有4个中断,TC0,TC2各有两个中断;


  

  表1   mega16的中断向量区

向量号 Flash空间地址     中断源                 中断定义说明

1   $000                 RESET             外部引脚电平引发的复位、

                                          上电复位、掉电检测复位、

                                            看门狗复位、JTAG AVR复位

2   $002                 INT0               外部中断请求0

3   $004                 INT1               外部中断请求1

4   $006               TIMER2 COMP     定时计数器2比较匹配

5   $008               TIMER2 OVF       定时计数器2溢出

6   $00A               TIMER1 CAPT       定时计数器1事件捕捉

7   $00C               TIMER1 COMPA   定时计数器1比较匹配A

8   $00E               TIMER1 COMPB   定时计数器1比较匹配B

9   $010               TIMER1 OVF       定时计数器1溢出

10   $012               TIMER0 OVF       定时计数器0溢出

19   $024               INT2               外部中断请求2

20   $026               TIMER0 COMP     定时计数器0比较匹配




3、    波形发生模式 T/C0、T/C2有4种波形模式,T/C1有16种波形

      a:T/C0、T/C2分别由TCCR0中的两位 WGM0[1:0](位3、6)、TCCR2中的两位 WGM2[1:0](位3、6)来控制;

      b: T/C1则由TCCR1B中的两位WGM1[3:2](位4、3)和TCCR1A中的两位WGM1[1:0](位1、0)

4、    比较匹配输出方式:T/C0、T/C2有4比较匹配输出模式,T/C1有16种波形

a:T/C0中的COM0[1:0](TCCR0位5,4)控制比较匹配输出模式,非PWM模式WGM = [0,2]有4种输出模式,PWM模式WGM = [1,2]有3种输出模式

b:T/C2中的COM2[1:0](TCCR2位5,4)控制比较匹配输出模式,非PWM模式WGM = [0,2]有4种输出模式,PWM模式WGM = [1,2]有3种输出模式

c:T/C1中的COM1A[1:0](TCCR1A位7,6)控制通道A比较匹配输出模式, T/C1中的COM1B[1:0](TCCR1A位5,4)控制通道B比较匹配输出模式,各有四种输出模式

5、    各定时器的最佳使用场合(不知道,望各位网友讨论补充)

a:TC0

b:TC1

c:TC2



第二部分:定时器0 T/C0

定时器0有两个中断源TIMER0 OVF(溢出中断)和TIMER0 COMP(比较匹配中断),中断向量号分别为10和20;在三个定时器中,T/C0的中断级别最低。(PS:既然TIMER0 OVF(溢出中断)比TIMER0 COMP(比较匹配中断)优先级要高,那么T/C0主要用在计数方面吧?^-^ ^-^)

1、   T/C0的时钟源 T/C0的计数时钟源可由来自外部引脚T0(PB0)的信号提供,也可来自芯片的内部。时钟源的选择由TCCR0中的3个标志位CS0[2:0]确定,共有8种选择:无时钟;内部时钟有5种分频选择(1,8,64,256,1024);外部时钟有2种(下降沿和上升沿)。

a:当定时计数器使用系统内部时钟作为计数源时,通常作为定时器和波形发生器使用。

注意:有5种分频选择(1,8,64,256,1024),同T/C1共用一个预定比例分频器,两者分别使用了CS02 CS01 CS00 和 CS12 CS11 CS10 两组控制逻辑来控制最后输出,互不影响;但有一个特定的情况,预分频器复位将会影响所有与其连接的T/C。

b:当定时计数器使用外部时钟作为计数源时,通常作为计数器使用,用于记录外部脉冲的个数。使用时,需注意以下几点:

A、   由于引脚上同步与边沿监测电路的存在,引脚T0/T1 上的电平变化需要延时2.5 到3.5 个系统时钟周期才能使计数器进行更新;

B、   外部时钟脉冲宽度必须大于一个系统时钟周期;

C、   外部时钟源的最高频率不大于 fclk_I/O/2.5;

D、   外部时钟源不送入预分频。

2、T/C0比较匹配单元 8位比较器持续对TCNT0和输出比较寄存器OCR0进行比较。一旦TCNT0等于OCR0,比较器就给出匹配信号。在匹配发生的下一个定时器时钟周期输出比较标志OCF0 置位。

注意:A、PWM 模式时,使能双缓冲功能,CPU 访问的是OCR0缓冲寄存器;

B、正常工作模式和CTC模式,禁止双缓冲功能时CPU 访问的则是OCR0 本身;

C、 强制输出比较,在非PWM 模式时,可以通过对强制输出比较位FOC0写”1” 的方式来产生比较匹配。强制比较匹配不会置位 OCF0 标志,也不会重载/ 清零定时器,但是OC0 引脚将被更新,好象真的发生了比较匹配一样;

D、 写TCNT0 操作将阻止比较匹配, CPU 对TCNT0 寄存器的写操作会在下一个定时器时钟周期阻止比较匹配的发生;

E、OC0 的设置应该在设置数据方向寄存器之前完成;在使用OC0 功能之前首先要通过数据方向寄存器的DDR_OC0 位将此引脚设置为输出;

PS:双缓冲可以将更新OCR0 寄存器与top 或bottom 时刻同步起来,从而防止产生不对称的PWM 脉冲,消除了干扰脉冲。不理解该段描述含意!

3、工作模式 工作模式- T/C 和输出比较引脚的行为- 由波形发生模式(WGM01:0) 及比较输出模式(COM01:0) 的控制位决定。比较输出模式对计数序列没有影响,而波形产生模式对计数序列则有影响。COM01:0 控制PWM 输出是否为反极性。非PWM 模式时COM01:0 控制输出是否应该在比较匹配发生时置位、清零,或是电平取反




表2.1 T/C0的工作模式

模式   WGM01   WGM00   COM01   COM00   T/C0工作模式   计数上限值   OCR0更新   TOV0置位   说明

0   0   0   0   0   普通模式   0xFF   立即   0xFF   PB3为通用I/O引脚

0   0   0   0   1   普通模式   0xFF   立即   0xFF   比较匹配时触发OC0

0   0   0   1   0   普通模式   0xFF   立即   0xFF   比较匹配时清零OC0

0   0   0   1   1   普通模式   0xFF   立即   0xFF   比较匹配时置位OC0

1   0   1   0   0   PWM,相位可调   0xFF   0xFF   0x00   PB3为通用I/O引脚

1   0   1   0   1   PWM,相位可调   0xFF   0xFF   0x00   保留

1   0   1   1   0   

PWM,相位可调   0xFF   0xFF   0x00   向上计数过程中比较匹配时清零OC0

                                        向下计数过程中比较匹配时置位OC0

1   0   1   1   1   

PWM,相位可调   0xFF   0xFF   0x00   向上计数过程中比较匹配时置位OC0

                                        向下计数过程中比较匹配时清零OC0

2   1   0   0   0   CTC模式   OCR0   立即   0xFF   PB3为通用I/O引脚

2   1   0   0   1   CTC模式   OCR0   立即   0xFF   比较匹配时触发OC0

2   1   0   1   0   CTC模式   OCR0   立即   0xFF   比较匹配时清零OC0

2   1   0   1   1   CTC模式   OCR0   立即   0xFF   比较匹配时置位OC0

3   1   1   0   0   快速PWM   0xFF   0xFF   0xFF   PB3为通用I/O引脚

3   1   1   0   1   快速PWM   0xFF   0xFF   0xFF   保留

3   1   1   1   0   快速PWM   0xFF   0xFF   0xFF   比较匹配时清OC0,计数值为0xFF   

                                                      时置位OC0

3   1   1   1   1   快速PWM   0xFF   0xFF   0xFF   比较匹配时置OC0,计数值为0xFF

                                                      时清零OC0


4、T/C0相关存储器

========================================================================


发一个跑表程序,该程序用的是T/C0溢住中断,四位数码管动态扫秒,每为显示2MS,显示时时间0~99.99秒,经过测试正确


/************************************************************

ICC-AVR application builder : 2008-4-17 16:11:30

Target : M16

Crystal: 4.0000Mhz

文件:timer_00

设计:raosibin

时间:2008-4-17

版本:ver1.0

功能说明:T/C0中断溢出实验,每10MS中断一次,刷新显示数据;

      动态扫描显示方式;

硬件说明:PA0~PA3接数玛管的A,B,C,D;PB0~PB6接a,b,c,d,e,f,g;

**************************************************************/

#include

#include


const unsigned char seg7_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

                      0x6f}; //0,1......9 段码

const unsigned char position_data[]={0xf1,0xf2,0xf4,0xf8}; //0,1,2,3, 位选通

unsigned char    timer[4];                    // 秒计数单元

unsigned char posit;

volatile char counter;

volatile char    flag_10ms;

volatile char    flag_2ms;


void port_init(void)

{

PORTA = 0x00;

DDRA = 0xFF;

PORTB = 0x00;

DDRB = 0xFF;

PORTC = 0x00; //m103 output only

DDRC = 0x00;

PORTD = 0x00;

DDRD = 0x00;

}


void display(void)                // 4位LED数码管动态扫描函数

{

  PORTA = 0x00;    

   PORTB = seg7_data[timer[posit]]; 

   PORTA = position_data[posit]; 

   if (++posit >=4 ) posit = 0;

}


//TIMER0 initialize - prescale:64

// WGM: Normal

// desired value: 2mSec

// actual value: 2.000mSec (0.0%)

void timer0_init(void)

{

TCCR0 = 0x00; //stop

TCNT0 = 0x83; //set count

OCR0 = 0x7D; //set compare

TCCR0 = 0x03; //start timer

}


#pragma interrupt_handler timer0_ovf_isr:10

void timer0_ovf_isr(void)

{

//flag_10ms=1;

TCNT0 = 0x83; //reload counter value

flag_2ms=1;

if (++counter >=5)

{

counter=0;

flag_10ms=1;

}

}


//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

timer0_init();


MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x01; //timer interrupt sources

[1] [2]
关键字:AVR  中断  定时器 引用地址:AVR中断详解

上一篇:AVR单片机中断实现 ATmega16 INT ISR(INT0_vect)
下一篇:atmega8 例程:定时器T1 普通模式

推荐阅读最新更新时间:2024-11-10 10:55

STM32-(22):定时器TIM(理论)
STM32系列的CPU,有多达8个定时器。 1、 其中TIM1和TIM8是能够产生三对PWM互补输出的髙级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。 2、 其它6个为普通定时器,时钟由APB1的输出产生。 定时器的作用: 1、 定时功能 2、 计数功能 3、 输入捕获 4、 匹配输出 5、 PWM咏冲波 1、功能描述. 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输 出比较和PWM)。 定时器是完全独立的,而且没有互相共享任何资源。 定时器还可以与定时器形成级联,组建更大的定时范围。 NOTE:只要你使用默认的
[单片机]
STM32-(22):<font color='red'>定时器</font>TIM(理论)
STM32定时器和外部触发同步的应用
一、定时器和外部触发的同步 TIMx定时器能够在多种模式下和一个外部的触发同步:复位模式、门控模式和触发模式。 从模式:复位模式 复位模式时序图如下所示: 配置通道1以检测TI1的上升沿,配置定时器为复位模式,计数器为向上计数模式,选择T1位输入源。每一个计数器时钟周期计数器寄存器自增。当TI1产生一个上升沿时,计数器寄存器清0重新开始计数。 从模式:门控模式 门控模式时序图如下所示: 配置通道1以检测TI1的低电平,配置定时器为门控模式,计数器为向上计数模式,选择T1为输入源。每一个计数器时钟周期计数器寄存器自增。只要TI1为低,计数器开始依据内部时钟计数,在TI1为高电平时停止计数。 从模式:触
[单片机]
STM32<font color='red'>定时器</font>和外部触发同步的应用
S3C2440启动代码 中断分析
1.建立中断向量表 b ResetHandler;hereis the first instrument 0x00这是第一条执行的指令 b HandlerUndef ;handler for Undefined mode b HandlerSWI ;handler for SWI interrupt b HandlerPabort ;handler for PAbort b HandlerDabort ;handler for DAbort b . ;reserved b HandlerIRQ ;handler for IRQ interrupt
[单片机]
单片机学习札记9 定时器模拟PWM呼吸灯
在上一节中,我们交代了为什么要做这样一个项目,以及我们提出了需求,并根据具体的需求分析,将其转化为硬件设计,画出了具体的原理图,但是还有许多的问题没有交代清楚,比如数码管的引脚判断,12个管脚哪8个是数码管的段码?4个是数码管的位码?这个我们刚买来并不清楚,还需要测量,这就要用到万用表了,将万用表拨到二极管档位,二极管有单向导电性,我们知道数码管就是8个小灯组成的,如果我们买的是共阳极的数码管,也就是如下图所示: 如果我们将万用表的红表笔接12个引脚中的任意一个,黑表笔接其余11的任意一个引脚,如果小灯亮的话,说明红表笔管脚是数码管的位码,而我们的数码管有四个,所以有4个位码,可以按照点亮小灯的方法查找,找完位码之后,记下来,
[单片机]
单片机学习札记9 <font color='red'>定时器</font>模拟PWM呼吸灯
avr单片机位操作方法
#include avr/io.h #define SET_BIT(x,y) ((x)|=(0x0001 (y))) /*置X的第Y位为1*/ #define CLR_BIT(x,y) ((x)&=~(0x0001 (y)))      /*置X的第Y位为0*/   #define SET_BIT(x,y) ((x)^=(0x0001 (y)))       /*X的第Y位取反*/ #define SET_BIT(x,y) (((x)$(1 (y)))==0 ? 0:1)     /*读取X的Y位,返回0或1*/ #define SET_BIT(x,y,z) ((x)=(x)&(~(1 (y)))!((z) (y))
[单片机]
LM3S9B96 的UART以中断方式收发数据
lm3s9b96的uart发送和接收都可以进入用户编写的中断处理函数。 uart的配置无非是设置:波特率、数据位、停止位、奇偶校验位等。 下面是用uart1为例,配置成中断方式收发数据 #include inc/lm3s9b96.h #include inc/hw_memmap.h #include inc/hw_types.h #include inc/hw_ints.h #include driverlib/interrupt.h #include driverlib/gpio.h #include driverlib/uart.h #include driverlib/sysctl.h
[单片机]
M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器
分5种工作类型 1 普通模式 WGM1=0 跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时 1 采用内部计数时钟 用于 ICP捕捉输入场合---测量脉宽/红外解码 (捕捉输入功能可以工作在多种模式下,而不单单只是普通模式) 2 采用外部计数脉冲输入 用于 计数,测频 其他的应用,采用其他模式更为方便,不需要像51般费神 2 CTC模式 WGM1=4,12 跟51的自动重载模式差不多 1 用于输出50%占空比的方波信号 2 用于产生准确的连续定时信号 WGM1=4时, 最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断
[单片机]
GD32 Timer定时器周期时间计算公式
有小伙伴反馈GD32 Timer定时器的周期时间不知如何计算,今天就来安排。 我们分成两个系列来讲解——GD32F30x和GD32F4xx系列。 一、GD32F30x系列 要想计算Timer的周期时间,首先要知道Timer的时钟频率,看时钟频率当然就要看时钟树啦,在时钟树的右下方就标注了Timer的时钟频率。 我们把图放大,可以看到Timer1,2,3,4,5,6,11,12,13的时钟源来自于CK_APB1,Timer0,7,8,9,10来自于CK_APB2。而CK_APB1和CK_APB2最高的频率为60M和120M,那这两类Timer的时钟频率是不是就是60M和120M呢? 答案是否定的。我们来看下图方框中的
[单片机]
GD32 Timer<font color='red'>定时器</font>周期时间计算公式

推荐帖子

如果导出arm中的lib.a文件中的函数list
我有arm版的lib.a文件,想看里面到底有什么函数实现,请问如何导出,就像vc下的dumpbin的工具一样的导出函数list如果导出arm中的lib.a文件中的函数list自己顶一个?忘记了,好像gcc工具里就有个能用的。可以直接看程序段。编译linux裸核的时候会用到。名字忘记了,google就会有吧有没有详细点的
tankli01 ARM技术
【X-Nucleo深度评测】——先进行些概念性了解
X-NUCLEO-IDB04A1是一款蓝牙低功耗的开发板,可直接插在STM32Nucleo的开发板上,如图:呵呵,晚上手机拍的不清楚,干脆直接用文档资料中的这张了。不过L053R8的这款引脚比图上的多点,插上去是引脚正好的。现在可以理解为啥有一边凹进去了,正好放按键的这款蓝牙开发板兼容ArduinoUNOR3连接器的布局。ArduinoUNOR3是指ArduinoUno的最新版本R3。Arduino这个词,最近好像一直都能看到,好吧也可能是
770781327 stm32/stm8
stm32库里面是否有sd模式读写sd卡的库?
stm32库里面是否有sd模式读写sd卡的库?stm32库里面是否有sd模式读写sd卡的库?好像没有
yyup stm32/stm8
驱动 起 应用层EXE
各位高手,帮帮忙,急死了,本人刚接触驱动,调试了一星期,都无法成功,在硬编码的时候,可以成功启动,但是改成动态获取的时候,无论如何都启动不起来,有哪位大侠帮忙调试的加我QQ454419771在此感谢各位了,心急如焚啊!!!!__declspec(naked)voidApcCreateProcess(PVOIDNormalContext,PVOIDSystemArgument1,PVOIDSystemArgument2){__asm{pushebp
starliu 嵌入式系统
TMS320C6000系列中断
一、简述本文介绍TMS320C6000系列中断设置的简明方法。通过示例定时器中断,MCBSP串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄存器的配置,中断向量表书写以及中断服务函数。最后提供一个简要的示例程序可供大家下载使用。此示例在DSK6416的TI官方实验板上通过测试。由于定时器和串口工作模式较繁,因此对中断无关部分不做介绍。二、实现DSP中断需要做哪些通用工作设置允许哪些非屏蔽中断设置各个允许的非屏蔽中断的中断来源设置开启总中断设计中断向量表
Jacktang 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved