⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr使用范例--avr软件延时精确计算指导.htm

📁 avr硬件软件开发的一些总结 用AVR单片机模拟的串口程序 AVR基本硬件线路设计与分析 等等
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0049)http://www.avrvi.com/avr_examples/soft_delay.html -->
<HTML 
xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>AVR使用范例--AVR软件延时精确计算指导</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="AVR 新手入门 单片机 AVR与虚拟仪器网站提供" name=description>
<META content="古欣 guxin[at]mail.sdu.edu.cn" name=author>
<META content="AVR 单片机 新手入门 手把手教程 avr程序 avr范例" name=keywords>
<STYLE title=css_design_by_guxin type=text/css media=all>@import url( ../inc/article.css );
</STYLE>
<LINK media=all href="AVR使用范例--AVR软件延时精确计算指导.files/article.css" type=text/css 
rel=stylesheet>
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY>
<DIV class=m>
<H1 class=c>AVR与虚拟仪器 www.avrvi.com</H1></DIV>
<DIV class=m>
<DIV id=head>
<P class=c>AVR与虚拟仪器致力于提供最优质的AVR和labview技术服务,最全的技术资料,最好的开发板方案。</P>
<P class=c>我们将以AVR DB-CORE Ver2.3 Atmega16开发板为平台,一步一步,教会大家AVR单片机编程。</P>
<P class=c>本站所有范例都采用ICC编写,ICC编译器加AVR Studio下载调试,下载器为JTAG&amp;ISP下载编程器。 
</P></DIV></DIV>
<DIV class=m>
<DIV id=now>你现在的位置:<A href="http://www.avrvi.com/">AVR与虚拟仪器</A>&gt;&gt;<A 
href="http://www.avrvi.com/index_avr_examples.html">AVR使用范例</A>&gt;&gt;AVR软件延时精确计算指导<SPAN><A 
title=AVR与虚拟仪器论坛 href="http://bbs.avrvi.com/">论坛</A></SPAN></DIV></DIV>
<DIV class=m>
<H3>AVR使用范例--AVR软件延时精确计算指导</H3>
<DIV class=pad10>
<P>和软件延时时间长短有关的因素有,单片机,晶振,延时语句,此处以for循环语句为例。</P>
<P>首先,我们编写一个for循环的延时语句,如下:非关键代码省略,<A title=查看延时程序文件 
href="http://www.avrvi.com/avr_examples/soft_delay.txt">点击查看全部代码</A>。</P><PRE>void delay(unsigned char n)
{
 for(;n!=0;n--)
 ;
}

void main(void)
{
 init_devices();
 delay(254);<SPAN class=gray>/*计算结果,本条语句延时约138微秒,avr studio仿真结果延时141微妙,以仿真的为准。*/</SPAN>
 
 while(1)
 ;
}</PRE>
<P>正常编译,按照常规方法打开JTAG下载并进入调试。我们要想办法获取程序的运行指令个数。</P>
<P>按下图操作调出汇编程序框:</P>
<P class=c><IMG height=488 alt=调出汇编程序框后的样子 
src="AVR使用范例--AVR软件延时精确计算指导.files/soft_delay_1.gif" width=733></P>
<P>打开watch窗口,找到delay(254);,使用常规调试方法F10,F11,使当前光标指向delay(254);的下一行,如下图:</P>
<P class=c><IMG height=488 alt=程序情况 
src="AVR使用范例--AVR软件延时精确计算指导.files/soft_delay_2.gif" width=733></P>
<P>使用F11逐条语句执行,你会看到如下图的运行规律,按照1234567的方向运动,最后循环,这就是我们想要找的执行语句条数,同时注意观察watch窗口的数值变化。通过更改watch窗口的数值,使循环结构快速结束。</P>
<P class=c><IMG height=488 alt=程序运行方向 
src="AVR使用范例--AVR软件延时精确计算指导.files/soft_delay_3.gif" width=733></P>
<P>我们由此得到语句的条数是3+3*(n+1),这里是3+254*(3+1)=1020条。在普通的计算中,我们可以这样认为,for循环的语句数量是n*4+4。</P>
<P>AVR多数指令的执行时间是晶振频率分之一,也就是一个时钟周期,部分指令的时钟周期是2-4个时钟周期,详细内容请查看数据手册。那么delay(254);的总运行时间1020个时钟周期,即为1020/(7.3728×1000000)秒,约和1020/7.3728 
=138微秒。在要求不高的延时中,就可以使用for循环来多次调用这个delay作为100微秒使用,而不用考虑外层for循环造成的时钟周期延时。</P>
<P>结语:这里只是给出了一个软件延时的简单例子,并不具有很强的使用性,实际操作中可以定义delay100us,delay1ms,delay1s等函数直接使用。</P><PRE>/***************************************************************************
延时 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 &lt;= 6 ,when m==7, it is 1. 
{
	m=m*40;                
	for (;m!=0;m--){
		Delay100us(250);
	}
}
/***************************************************************************/
</PRE>
<P class=title>软件准确仿真延时时间</P>
<P>使用AVRstudio软件仿真可以看到准确的程序运行的时间,设置中断的方式就可以了解到。</P>
<P>调入AVR Studio,为观察延时时间,点击左侧Workspace中的Processer,注意看其中的几个参数:Cycle Counter和Stop 
Watch,前一个是执行周期数,即从复位开始到目前为止共执行了多少个周期,而Stop 
Watch则表示从复位开始到目前为止共用去的时间数,如果Frenance中的频率值正确,那么这个时间就是正确的。这样,我们可以通过观察这个时间来调循环次数,将时间基本精确地调整到延时1ms。</P>
<P class=c><IMG height=537 alt="AVR软件延时 avrstudio仿真观察" 
src="AVR使用范例--AVR软件延时精确计算指导.files/sofr_delay_3.jpg" width=768></P>
<P>在运行到第一个中断的时候stop watch的值是6.68,当运行到第二个中断的时候,stop 
watch的值为148.11,可以得到delay(254)这条语句的执行时间约为148.11—6.86=141.25us。我们看到软件仿真的时钟周期是1028个,与上面计算的1020个有一定差距,因为上面的计算我们忽略了调用程序所花的时间。</P>
<P>由于笔者技术有限,错漏之处在所难免,还望高手指点,以期我们更正。</P></DIV></DIV>
<DIV class=m>
<H4 id=link><A href="http://www.avrvi.com/">AVR 与虚拟仪器</A>欢迎交换链接,请与小古联系 
avrvi【at】163.com </H4>
<SCRIPT src="AVR使用范例--AVR软件延时精确计算指导.files/links.js" 
type=text/javascript></SCRIPT>

<SCRIPT src="AVR使用范例--AVR软件延时精确计算指导.files/footer.js" 
type=text/javascript></SCRIPT>
</DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -