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

合集下载

单片机定时器初值计算公式(51单片机和AVR单片机的初值计算三种方法)

单片机定时器初值计算公式(51单片机和AVR单片机的初值计算三种方法)

单片机定时器初值计算公式(51单片机和A VR单片机的初值计算三种方法)单片机定时器初值计算公式
一、51单片机定时器初值计算1、方法一
void main(void)
{
s1=1;
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-46083)/256; //定时器T0的高8位设置初值
TL0=(65536-46083)%256; //定时器T0的低8位设置初值
函数功能:定时器T0的中断服务函数
********************************************************/
void TIme0(void )interrupt 1 using 0 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //每产生1次中断,中断累计次数加1
if(count==20)//如果中断次数计满20次
count=0; //中断累计次数清0
s++; //秒加1
网络上阅读一段程序,定时器初值46083 是怎么计算出来的?一般我们如用AT892051的话定时50MS 就是TH0=(65536-50000)/256;
猜想应该是使用的12M晶体,20次为1S.
2、方法二
10MS定时器初值的计算:
1)晶振12M
12MHz除12为1MHz,也就是说一秒=1000000次机器周期。

10ms=10000次机器周期。

65536-10000=55536(d8f0)。

avr单片机的定时器、中断和PWM(转)

avr单片机的定时器、中断和PWM(转)

/s/blog_4aa25f130100go4v.html转中断:我的理解就是cpu执行时,遇到中断——根据对应的中断源(硬件或软件)——pc定位中断入口地址,然后根据这里的函数指针——跳转到相应的服务程序之所以上面()了硬件或软件,这里还涉及到向量中断和非向量中断:区别就在于确定中断源,如果是硬件编码了中断源的,直接跳转相应的服务函数则是向量中断。

而非向量中断指的是:如果发生中断了,但此时还不清楚是那个中断,需要查找标志位来确定跳转到那个中断区域。

可以发现向量中断肯定来的快些,这里为定时器的中断来做好准备。

再来看看avr单片机的定时器:定时器/计数1(16位)————分为普通模式,CTC模式,快速pwm模式,相位修正pwm模式,相位频率修正pwm模式,输入捕获模式。

普通模式:*1 寄存器TCCR1B(控制寄存器)7 6 5 4 3 2 1 0ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10CS12 CS11 CS10控制分频(内:预分频器):取值0-5对应了停止,无分频,8,64,256,1024当为110为下降沿驱动,111为上升沿驱动(外部):用于对外部信号的计数*2上面的计数结果放在计数寄存器TCNT1,TCNT0中(高低8位)*3中断屏蔽寄存器(TIMSK)OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1OCIE0 TOIE0TOIE1 :设置为溢出中断,置1嘿嘿,有了上面的3个寄存器就可以做秒表等了——思路为:设定控制寄存器(内分频,还是外部计数?)——装初值——设置中断方式(这里用了溢出)——打开中断注意点:装初值时需要先写高位TCNT1,再写低位TCNT0,读时相反TCCR1B=0x01;无分频TCNT1H=0x88;TCNT1L=0x88;TIMSK|=BIT(2); 再开中断SREG|=bit(7); 这样初始化oK!由于avr不像51无int code等之类定义的方法,用的是#pragma data:code 底下为存储的内容写中断也类似:#pragma interrupt_handler (中断函数名:向量号)miao:9(现在该理解向量中断吧)写好申明后就写函数体了void miao(){中断服务程序}这样作为普通用法就小功告成了总结一下就是模式,初值,中断(对应的3个寄存器)和具体C函数的写法CTC模式比较输出模式:用于输出50%占空比的方波信号,用于产生准确的连续定时信号硬件:对应了pd4,pd5输出比较b和a比较输出*1 寄存器TCCR1A(控制寄存器)功能多了寄存器也分a、b了^_^7 6 5 4 3 2 1 0com1A1 COM1A0 com1B1 COM1B0 FOC1A FOC1B W GM11 WGM10用到了4567和01 4、5控制b 6、7控制acom1A(B)1 COM1A(B)0 一般用00和01 WGM11,WGM10放在底下讲0 0 普通i/00 1 比较匹配时输出取反1 0 比较匹配时输出01 1 比较匹配时输出1*2 寄存器TCCR1B(控制寄存器)7 6 5 4 3 2 1 0ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10CS12、CS11、CS10为设置时钟源的WGM13,WGM12,WGM11,WGM10用于波形产生描述的位选择,有对应的表0-15 这里选了4:CTC-OCR1A-立即更新-最大 OCR1A (16位)输出比较寄存器-这里存放了上限值设置的目的是,计数上升到了设定的上限后就电平取反思路:先初始话,对应的复用i/o为输出——设定com1A(B)1,COM1A(B)0 为比较输出取反——设定上限值为ocr1A 就ok了0CR1A可以根据公式计算:具体公式看手册,这里因为我打不起来o(∩_∩)o...哈哈总结一下就是控制寄存器a,b以及上限的值即可产生方波快速PWM分8位9位10位快速pwm,以及自定义方式我的理解:OCR1A存放上限值,这样用上了A的功能,由上面可知A只能为方波了,且计数到这个值时取反下限值通过OCR1B来确定的,从而计数到这个值置0,从而可以发现在一个周期内 OCROB即为高电平的时间(确定占空比)如图TCCR1A=0x63;TCCR1B=0x1B; 工作方式(快速pwm15,64分频)和分频系数OcR1A=1249;OCCR1B=250; 设为100Hz PWM信号,和2毫秒的高电平时间总结一下就是控制寄存器:由上限值,和分频系数可以确定计数的时间,确定频率由下限值可以确定占空比怎么样?明白了吗?o(∩_∩)o...相位修正PWM和快速pwm一样,模式分8位9位10位快速pwm,以及自定义方式共5种对应123和10,11相位修正其实和上面的方法相同,只不过到最大值时,不是取反,而是计数--,直到到了下限时取反由上可以发现2图的区别吧,一个为到TOP后,直接置0,后者为--,且在top 不取反而是到了最小值是取的,周期故而也比快速的长了一倍,故频率为快速pwm的一半,但是占空比不变,这也是为什么叫快速pwm的原因TCCR1A=0x63;TCCR1B=0x13 工作方式(相位修正pwm11,64分频)和分频系数OcR1A=1249;OCCR1B=250; 设为100Hz PWM信号,和2毫秒的高电平时间相位频率修正PWM和相位修正的类似输入捕获。

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必须是常量或则是常量表达式,如果是变量则编译报错!关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。

定时器初值计算公式

定时器初值计算公式

定时器初值计算公式
定时器是一种常见的计时设备,它在嵌入式系统中有着广泛的应用。

通常情况下,我们需要设置定时器的初值,以确定计时的周期和触发时间。

那么,如何通过初值计算公式来计算定时器的周期呢?
我们需要了解定时器的工作原理。

在定时器开始计时时,它会从一个初始值开始递减,直到减到0时触发定时器中断。

这个初始值就是我们所说的初值。

因此,我们可以根据定时器的时钟频率和初值来计算定时器的周期和触发时间。

假设定时器的时钟频率为F,初值为N,定时器的周期为T,那么根据初值计算公式有:
T = (N + 1) / F
这个公式可以帮助我们快速计算定时器的周期。

需要注意的是,初值是一个整数,因此在计算周期时需要将初值加1。

例如,假设我们要设置一个定时器的周期为10ms,时钟频率为10MHz,那么我们可以通过初值计算公式来计算出初值为:
N = T × F - 1 = 10 × 10^(-3) × 10^7 - 1 = 99999
因此,我们可以将定时器的初值设置为99999,这样就能够实现10ms的定时器周期。

需要注意的是,定时器的实际周期可能会受到时钟频率精度和误差的影响,因此在实际应用中,我们需要根据实际情况进行调整和校准。

初值计算公式是计算定时器周期和触发时间的重要工具,它可以帮助我们快速地设置定时器的初值,实现精确的计时功能。

在实际应用中,我们需要根据具体的需求和系统环境进行调整和优化,以达到最佳的性能和稳定性。

AVR 定时器使用范例及详解

AVR 定时器使用范例及详解

AVR 定时器使用范例及详解作者:HJJourAV…文章来源:本站原创点击数:56 更新时间:2010-11-12 8:17:29/*************************************************** AVR 定时器使用范例 ******* ******* 作者: HJJourAVR ******* 编译器:WINAVR20050214 ******* **************************************************//*本程序简单的示范了如何使用ATMEGA16的定时器AVR定时器的要点介绍T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波T1工作于快速PWM模式兼输入捕捉T2工作于相位修正PWM模式,输出490Hz的8bit PWM波出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器对于定时器,AVRstudio的软件仿真是不准确的。

*/#include <avr/io.h>#include <avr/signal.h>#include <avr/interrupt.h>//时钟定为8MHz,F_CPU=8000000//管脚定义#define ICPKEY 6 //ICP1 PD6 按键模拟ICP输入#define PWM0 3 //OC0 PB3#define PWM1A 5 //OC1A PD5#define PWM1B 4 //OC1B PD4#define PWM2 7 //OC2 PD7//宏定义#define PWM1A_ON() PORTD|= (1<<PWM1A) //输出高电平,灯亮#define PWM1A_OFF() PORTD&=~(1<<PWM1A) //输出低电平,灯灭//全局变量volatile unsigned int ICP_Time; //记录ICP输入捕捉事件的发生时刻volatile unsigned char T2PWM; //设置T2的PWM值volatile unsigned char T0OCR; //设置T0的时间值//仿真时在watch窗口,监控这些变量。

定时器初值计算方法

定时器初值计算方法

定时器初值计算方法
定时器初值是指定时器被设置时的初始值,通常用于控制定时器的工作时间或计数器。

以下是一些常见的定时器初值计算方法:
1. 使用默认初值:大多数定时器都有一个默认的初值,可以在定时器配置中设置。

如果忘记了初值,可以使用默认值。

2. 计算定时器的时钟频率:可以使用定时器的时钟频率来计算
初值。

时钟频率是指定时器每秒钟所执行的计数次数。

可以通过以下公式来计算定时器初值:初值 = 2 / 时钟频率。

例如,如果定时器的频率为100MHz,则可以使用以下公式计算初值:初值 = 2 / 10000000 = 0.00002。

3. 计算定时器的工作周期:可以使用定时器的中断周期来计算
初值。

中断周期是指定时器在发生中断时执行的计数器次数。

可以通过以下公式来计算定时器初值:初值 = 中断周期 / 工作周期。

例如,如果定时器的中断周期是10秒钟,工作周期是1秒,则可以使用以下公式计算初值:初值 = 10 / 1 = 10。

4. 根据定时器的地址计算初值:如果想根据定时器的地址计算
初值,需要知道定时器的段寄存器地址和功能寄存器地址。

可以使用以下公式计算初值:初值 =段寄存器地址 / 功能寄存器地址。

例如,
如果定时器的段寄存器的地址是0x4000,功能寄存器的地址是
0x3000,则可以使用以下公式计算初值:初值 = 0x4000 / 0x3000 = 0.2。

需要注意的是,使用这些方法计算初值时,应该考虑到定时器的精度和实际时钟频率等因素。

单片机定时器初值计算公式

单片机定时器初值计算公式

单片机定时器初值计算公式
对于51单片机和AVR单片机,它们的定时器初值计算方法略有不同。

下面将介绍51单片机定时器初值计算的三种方法和AVR单片机定时器的
初值计算方法。

首先,我们来介绍51单片机定时器初值计算的三种方法:
方法一:常规方法
假设定时器的工作频率为F,计时周期为T,定时器的分频系数为N。

定时器初值的计算公式为:
方法二:递推
对于一个周期为T的定时器,其初值可以通过递推来计算。

首先,选择一个适当的计数器初值,可以通过假设初值为0,计算出
一个相对误差较小的初值近似值。

然后,根据初值近似值和定时器分频系
数N,可以计算出定时器工作频率F'。

最后,将F'带入到计算公式中,
得到更精确的初值。

方法三:查表法
在实际应用中,我们可以根据常见的定时周期需求,事先制定好一个
初值-分频系数表,根据需求直接查表获得初值即可。

以下是AVR单片机定时器初值计算的方法:
AVR单片机的定时器初值计算与51单片机类似,可以通过常规方法、递推或查表法来计算。

以常规方法为例,假设定时器的工作频率为F,计时周期为T,定时器的分频系数为N。

则初值的计算公式为:
需要注意的是,AVR单片机的定时器有不同的工作模式,不同的工作模式需要进行相应的计算。

总结起来,单片机定时器初值的计算方法有常规方法、递推法和查表法。

选择一种合适的计算方法,根据工作频率、计时周期和分频系数计算出初值,即可实现定时功能。

详细说明定时器的初值计算过程

详细说明定时器的初值计算过程

定时器是计算机中常用的一种功能模块,它可以用来精确地计时、触发某些操作或者产生精确的时标信号。

在实际应用中,定时器的初值计算是很重要的一环,它决定了定时器的工作精度。

本文将详细说明定时器的初值计算过程。

二、定时器的工作原理定时器是一种内部计时功能模块,主要由一个计数器和一组控制寄存器组成。

计数器以某种特定的时钟信号为基准进行计数,当计数器的值达到设定的初值时,定时器将触发相应的中断或者产生特定的输出信号。

三、初值计算公式定时器的初值计算通常使用以下公式:初值 = 计时器时钟周期 / 设定的时间 - 1其中,计时器时钟周期是指计时器工作时钟的周期,通常是计时器所使用的计时模块提供的时钟信号。

设定的时间是用户期望的定时时间,单位可以是毫秒、微秒或者其他时间单位。

四、初值计算过程1. 确定计时器时钟周期首先需要确定计时器所使用的计时模块提供的时钟信号的周期。

这通常可以在计时器的手册或者相关的资料中找到。

假设计时器的时钟周2. 设定定时时间用户需要确定需要定时的时间,例如需要定时500毫秒。

3. 计算初值根据以上公式,可以计算出初值:初值 = T / 500 - 1五、初值计算实例假设计时器的时钟周期为10微秒,需要定时500毫秒。

则初值 = 10微秒 / 500毫秒 - 1 = 50000 - 1 = 49999六、注意事项在进行初值计算时,需要注意以下几点:1. 确保计时器时钟周期的准确性,计时器的手册或者相关资料中通常会提供时钟周期的信息。

2. 设定的时间需要与实际需求相符,否则计算出的初值可能不准确。

七、结语定时器的初值计算是定时器应用中的重要环节,合理的初值计算能够保证定时器的工作精度。

通过本文的介绍,希望读者能够对定时器的初值计算过程有所了解,并在实际应用中能够正确地进行初值计算。

八、初值计算的精度影响初值的计算精度对定时器的工作精度有着重要的影响。

如果初值计算不准确,定时器可能无法准确地达到所期望的定时时间,从而影响整个系统的正常运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

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

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

对于定时器初值的设定可以加深对定时器的工作原理的理解。

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次就会产生中断,显然第一次设定的时间要比第二次的长。

定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。

我们可以计算出我们设定的初值会在多长时间后进入中断。

实验平台:ATMega16
晶振:MHz
对初值的计算:
1,/1024=10800设定为1024倍分频,得到每1秒需要进行多少次累加
2,10800/100=108得到10ms的定时需要进行多少次累加。

3,256-108=148计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。

4,148<==>0x94得到十六进制值,赋值给TCNT0
代码:定时10ms
#include<>
unsignedcharflag=0;
voidtimer_init(void)
{
TCCR0=0x05;//进行1024分频
TCNT0=0x94;//赋计数初值
TIMSK_TOIE0=1;//开使能
SREG_I=1;//开总中断
}
#pragmavector=TIMER0_OVF_vect
__interruptvoidtime0_normal(void)
{
TCNT0=0x94;//重新赋初值
flag++;
}
voidmain(void)
{
timer_init();
DDRB_Bit0=1;
while(1)
{
if(flag==100)//10ms重复100次,即为1秒{
PORTB_Bit0=~PORTB_Bit0;//让LED闪烁flag=0;
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++//
实验平台:ATMega16
晶振:
16位定时器初值设定:
1,/256=43200设定256倍分频,得到每1秒需要进行多少次累加
2,65536-43200=22336计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。

3,22336<==>0x570x40得到十六进制值,赋值给TCNT1H,TCNT1L :定时1s
#include<>
unsignedcharflag=0;
voidtimer_init(void)
{
TCCR1B=0x04;
TCNT1H=0x57;
TCNT1L=0x40;
TIMSK_TOIE1=1;
SREG_I=1;
}
#pragmavector=TIMER1_OVF_vect __interruptvoidtime1_normal(void) {
TCNT1H=0x57;
TCNT1L=0x40;
flag++;
}
voidmain(void)
{
timer_init();
DDRB_Bit0=1;
while(1)
{
if(flag==1)
}
}。

相关文档
最新文档