【转】关于PIC常用软件延时的精确计算公式

星期三,十月17日, 2007  |  07:00:10分类:嵌入式相关  |  标签:  |  

原帖地址:http://www.pic16.com/bbs/dispbbs.asp?boardID=9&ID=22973

延时在单片机应用中经常要用到,不管是测试还是正是的开发的程序中延时子程序都是随处可见。而延时又分硬件延时和软件延时。本贴所要说的延时是指常用的二重循环的软件延时,并推导出准确的计算公式,该公式能精确到一条指令都不差。因为软件延时比较耗CPU资源,所以可能用的地方不多,也没必要精确一条不差那么准,但我推导的公式也许对这有兴趣的人可能有用。

二重循环延时公式:T(x,y,n)=nxy+3xy+4x+5(x为外循环变量值, y为内循环变量值,n为内循环中nop指令的个数)

三重循环延时公式:T(x,y,z,n)=(3+n)xyz+4xy+4x+5; (x为最外层循环变量值,y为第二层循环变量值,z为最里层循环变量值,n为内循环中nop指令的个数)

n重循环:T(a1,a2,..,an,n)=(3+n)a1a2..an+4(a1a2..an-1+a1a2..an-2+..+a1)+5;(a1为最外层循环变量值,a2为第二层循环变量值,其他的依次类推,an为最里层循环变量值,n为最里层循环nop指令的个数)

具体的延时程序格式以其测试程序见下面的程序:

  1. list p=16f877a,r=hex
  2.  #include"p16f877a.inc"
  3. ;***************************************
  4.  cblock 21h
  5.    del_count1,del_count2
  6.  endc
  7. ;***************************************
  8. #define  x .100
  9.  
  10. #define  y .32
  11.  
  12. ;***************************************
  13.           org     0000h
  14.           nop
  15.           goto   main
  16.           org     0008h
  17. main
  18.           nop                                             ;该处设一个断点,运行到此处,stopwatch应清0
  19.           call     delay
  20.           nop                                             ;该处再设一个断点,运行到此处的stopwatch的值应减1才为Delay的准确时间
  21.           goto   $
  22. ;**************************************************
  23. ;*  延时时间T(x,y)=nxy+3xy+4x+5(us)假设晶振为4MHz           *
  24. ;*  x为外循环变量值,y为内循环变量值。                               *
  25. ;*  n为内循环中nop指令的个数。                                          *
  26. ;*  计算过程:                                                                   *
  27. ;*    T(x,y)=2+1+1+[1+1+(1+2)*y-1+1+2]*x-1+2                 *
  28. ;*          =nxy+3xy+4x+5                                                   *
  29. ;**************************************************
  30. delay
  31.           movlw       x
  32.           movwf      del_count1
  33. del01
  34.           movlw      y
  35.           movwf     del_count2
  36. del02
  37.           nop                         ;此处的nop指令个数n可以随意添减,此处为2条,但建议1到5条为宜,再多就没意义了。
  38.           nop
  39.           decfsz     del_count2,f
  40.           goto       del02
  41.           decfsz     del_count1,f
  42.           goto       del01
  43.           return
  44. ;******************************************
  45.           end
  46.  
  47. ;当内循环nop指令为0个时: Tmax=T(255,255)=196100us=196.1ms
  48.  
  49. ;                                     Tmin=T(1,1)=12us=0.012ms
  50.  
  51. ;故在该情况下延时范围为:(12us~196.1ms)

注:因为本公式为正向推导的过程,所当确定一个需要延时的时间T时,反向推导它会有多种x,y,n的组合,但肯定有一种时最佳(既最接近)的组合,有兴趣的朋友可以写个程序来计算出这个最佳组合。

喜欢本文,那就收藏到: Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

发表您的评论