完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
【AVR单片机学习入门初级】使用AVR软件延时精确计算指导 首先,我们编写一个for循环的延时语句,如下:非关键代码省略 。 void delay(unsigned char n){ for(;n!=0;n--) ;}void main(void){ init_devices(); delay(254);/*计算结果,本条语句延时约138微秒,avr studio仿真结果延时141微妙,以仿真的为准。*/ while(1) ;}正常编译,按照常规方法打开JTAG下载并进入调试。我们要想办法获取程序的运行指令个数。 按下图操作调出汇编程序框:
AVR多数指令的执行时间是晶振频率分之一,也就是一个时钟周期,部分指令的时钟周期是2-4个时钟周期,详细内容请查看数据手册。那么delay(254);的总运行时间1020个时钟周期,即为1020/(7.3728×1000000)秒,约和1020/7.3728 =138微秒。在要求不高的延时中,就可以使用for循环来多次调用这个delay作为100微秒使用,而不用考虑外层for循环造成的时钟周期延时。 结语:这里只是给出了一个软件延时的简单例子,并不具有很强的使用性,实际操作中可以定义delay100us,delay1ms,delay1s等函数直接使用。 /***************************************************************************延时 M32 7.3728M 粗略计算*/void Delay100us(uint8 x){ uint8 i; //4clock for(i=147;x!=0;x--) while(--i); //5 * i clock}void Delay1ms(uint16 n){ for (;n!=0;n--){ Delay100us(10); }}void Delay1s(uint16 m) // m <= 6 ,when m==7, it is 1. { m=m*40; for (;m!=0;m--){ Delay100us(250); }}/***************************************************************************/ 软件准确仿真延时时间 使用AVRstudio软件仿真可以看到准确的程序运行的时间,设置中断的方式就可以了解到。调入AVR Studio,为观察延时时间,点击左侧Workspace中的Processer,注意看其中的几个参数:Cycle Counter和Stop Watch,前一个是执行周期数,即从复位开始到目前为止共执行了多少个周期,而Stop Watch则表示从复位开始到目前为止共用去的时间数,如果Frenance中的频率值正确,那么这个时间就是正确的。这样,我们可以通过观察这个时间来调循环次数,将时间基本精确地调整到延时1ms。 在运行到第一个中断的时候stop watch的值是6.68,当运行到第二个中断的时候,stop watch的值为148.11,可以得到delay(254)这条语句的执行时间约为148.11—6.86=141.25us。我们看到软件仿真的时钟周期是1028个,与上面计算的1020个有一定差距,因为上面的计算我们忽略了调用程序所花的时间。 由于笔者技术有限,错漏之处在所难免,还望高手指点,以期我们更正。 |
|
相关推荐
11 个讨论
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5667 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
8123 浏览 0 评论
3370 浏览 2 评论
3354 浏览 1 评论
10525 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 01:29 , Processed in 0.909874 second(s), Total 63, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
13520