#1楼主:请教一个IAR定时delay的问题
文章发表于:2008-10-09 11:13
我想问下在使用IAR的时候,写一个delay(n)的函数,怎么能够知道到底延时了多少,通过IAR怎么能够知道
#2
文章发表于:2008-10-09 16:06
我也正在为这个问题困扰呢....
如果想精确延时的话最好用定时器
我再做精确延时的时候总是出现误差 而且会积累 T_T
给你看下这篇文章 也许会有些帮助吧 不过是讲单片机的(两者应该相差不大吧)
本文摘自http://www.mcublog.com/blog/user1/10605/archives/2006/14667.html
在单片机编程中常常要用到延时子程序,而有时则要求延时相当精确,如精确到几微妙。为此结合网上的资料编拉一个精确延时计算小程序。我们先来看看下面的例子:
void delay_500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--);
for(j=202;j>0;j--);
for(k=81;k>0;k--);
}
产生的汇编代码:
C:0x0800 7F0F MOV R7,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
分析一下程序共有三层循环:
一层循环k: R5*2 = 81*2 = 162us DJNZ 2us
二层循环j: R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
三层循环i: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5=[(2*k+3)*j+3]*i+5
以上是按照12M晶振来计算的,12M晶振的一个振荡周期是1/12us,一个子令周期刚好是1us,所以其他晶振还得乘上(12/?).“?”为晶振频率.