返回该小组首页 回复主题
dongdong19

dongdong19

小组等级:     E币:167  (E币换礼)

#1楼主:请教一个IAR定时delay的问题

文章发表于:2008-10-09 11:13

我想问下在使用IAR的时候,写一个delay(n)的函数,怎么能够知道到底延时了多少,通过IAR怎么能够知道

jjh5600

   小组等级:    E币:684  (E币换礼)

#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/?).“?”为晶振频率.

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章