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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE PAGE # AVR定时器中断初值计 算方法 -CAL-FENGHAI.-(YICAI)-Conipany One AVR?定时器中断初值计算方法 使用芯片ATMegal6外部晶振? 定时器1? (16位定时器)寄存器?TCCRlB=0x04设定?256预分 频 要利用定时器定时1秒 4000000/256=15625说明定时器每当71/15625?秒?就会触发 一次中断 65535-15625=49910计算出要累加多少次才能在1秒后岀发 定时器1的溢出中断 49910==C2F6将计算后的值换算成16进制 4, TCNTlH=0xC2;对寄存器赋值 TCNTlL=0xF6; 例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定 时,如何求得初值赋给TCNT1 65536-(4M/256)*= 其屮,4M是晶体频率,是定时时长单位秒。 对于8位的定时器 T二(2八计数初值广晶振周期*分频数=(2八8 ?计数初值)/晶振频率* 分频数计数初值=2八8?T/晶振周期/分频数=2“8?尸晶振频率/分频 数 因为AVR —指令?一周期 ■ lARForAVR精确延时 ■ C语言中,想使用精确的延时程序并不容易。IAR?中有这样的一 个函数?_delay_cycles(),该函数在头文件屮定义,函数的作用就 是延时N个指令周期。根据这个函数就可以实现精确的延时函 数了(但不能做到100%精确度)。 实现的方法: 建立一个的头文件: #ifndef_IAR_DELAY_H #define_IAR_DELAY_H #in clude? #defineXTAL8〃可定义为你所用的晶振频率(单位Mhz) #definedelay_us(x)_delay_cycles((unsignedlong)(x*XTAL))#defined elay_ms(x)_delay_cycles((unsignedlong)(x*XTAL*1000))#definedel ay_s(x)_delay_cycles((unsignedlong)(x*XTAL* 1000000)) #endif? 注意:_delay_cycles(x),x必须是常量或则是常量表达式,如果 是变量则编译报错! ■ 关于溢出屮断不管是哪个单片机都是不断累加,使其寄存器溢 出触发中断,然后跳转到屮断函数处执行中断服务程序。对于 定时器初值的设定可以加深对定时器的工作原理的理解。 ATMegal6里面有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次就会产生屮断,显然第一次设定的时间要 比第二次的长。 定时器不仅可以定时,而且我们用到定时器的时候往往是需要 精确定时的时候。我们可以计算岀我们设定的初值会在多长时 间后进入屮断。 实验平台:ATMegal6? 晶振:MHz 对初值的计算: /1024=10800设定为1024倍分频, 得到每1秒需要进行多少次累加 10800/100=108 得到 10ms? 的定时需要进行多少次累加。 256-108=148计算范围最大值减去要累加的时间,得到初 值,即从哪里开始累加才能在溢出时为10ms的时间。 148==0x94得到十六进制值,赋值给TCNT0 代码:定时10ms #in clude? unsign edcharflag=0;void?timer_i nit(void) { TCCR0=0x05;//进行 1024 分频 TCNT0=0x94;//赋计数初值 TIMSK_TOIEO=1;// 开使能 SREG」=2;〃开总中断 } #pragmavector=TIMERO_OVF_vect _in terruptvoidtimeO_ normal(void) { TCNT0=0x94;//重新赋初值 flag++; } void?main(void) { timer _in it(); while(l) if(flag==100)//10ms 重复 100 次,即为 1 秒 { PORTB

文档评论(0)

497721292 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档