您的位置 首页 芯闻

怎么用好WinAVR里的延时函数

刚对WinAVR自带的延时函数进行一下研究,有些收获,与大家分享,不对之处请斧正,谢谢。先看_delay_loop_1(uint8_t__count)函数,从其函数

刚对WinAVR自带的延时函数进行一下研讨,有些收成,与咱们共享,不对之处请指正,谢谢。

先看_delay_loop_1(uint8_t__count)函数,从其函数注释里边能够了解到,该函数用来推迟3个晶振时钟周 期,不包括程序调用和退出该函数所花费的时刻。该函数的形参__count是一个8位的变量,由此,咱们就能够依据体系选用的晶振频率算出该函数最大的延 迟时刻了:
1MHz时:MAX_DELAY_TIME=(1/1000000)*3*256=0.000768S=768uS
8MHz时:MAX_DELAY_TIME=(1/8000000)*3*256=0.000096S=96uS
…………
F_CPUMAX_DELAY_TIME=(1/F_CPU)*3*256
依此类推。

相同再看_delay_loop_2(uint16_t__count)函数,该函数延时4个晶振周期,形参是一个16位的变量,相同 咱们也能够算出该函数最大的推迟时刻:
1MHz时:MAX_DELAY_TIME=(1/1000000)*4*65535=0.26214S=262.1mS
8MHz时:MAX_DELAY_TIME=(1/8000000)*4*65535=0.03277S=32.8mS
…………
F_CPUMAX_DELAY_TIME=(1/F_CPU)*4*65535
依此类推。

重要提示:_delay_loop_1(0)、_delay_loop_1(256)延时是相同的!!
同理,_delay_loop_2(0)、_delay_loop_2(65536)延时也是相同的!!这些函数的延时都是最长的延时。

重量级函数出 场>>>>>>>>>>>>>_delay_us()and_delay_ms()!!!<<<<<<<<<<<<<<<<< 先说_delay_us(double__us),不要认为该函数的形参是double形就随心所欲,随意付值都不会溢出了,其实这个 函数的调用是有约束的,否则就会呈现延时不对的状况。函数的注释里阐明如下: Themaximalpossibledelayis768us/F_CPUinMHz.
在1MHz时最大延时768us!!!!

也就是说double__us这个值在1M体系时钟时最大只能是768。假如大于768,比方这样调用延时函数 _delay_us(780)会怎么样呢??那就会和调用_delay_loop_1(0)相同的作用了!能推迟多少各位能够算出来。详细在各种体系时钟 之下这个值是多少能够经过一个公式算出来:
MAX_VALUE=256*3000000/F_CPU

同理,剖析程序,能够知道_delay_ms(double__ms)函数,在1MHz体系时钟下其最大延时是262.14ms!在这 里也给出该函数的形参的最大值,调用此函数时的实参都不要大于这个值,大于这个约束值的话就和调用_delay_loop_2(0)相同的延时作用!
MAX_VALUE=65536*4000/F_CPU

总结结束!不正确之处还望各位不吝指正!谢谢

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/258845.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部