历史上的今天
返回首页

历史上的今天

今天是:2025年08月13日(星期三)

正在发生

2021年08月13日 | Freescale MC9S08AW60汇编学习笔记(六)

2021-08-13 来源:eefocus

延时,汇编中经常要用到的功能,也就是MCU什么也不做,仅仅是拖延一段时间而已。MCU本身就有定时器、计数器,用来实现延时当然不在话下,但是一个编程的人自然更希望要实现的功能更加易于掌控,我们就用代码、用程序来实现延时,也就是采用软件进行延时。具体做法是:通过A、H:X增减指令、空操作指令nop和brn以及相应的转移指令,再利用循环结构就可以实现延时功能。既然是延时,能知道延时多长时间最好了,我们知道的是:MCU总线时钟频率为4MHz,所以一个总线周期占用的时间为0.25us,这样,只要知道每条指令所占用的总线周期就可以计算我们的程序运行了多久。实现延时自然也是这样,这些当然要用到数学知识了,放心的是还不至于用到微积分,只要耐心一点精确地计算出延时的时间并不是难事。


例子:设计一个延时10ms的延时子程序,已知MCU总线时钟频率为4MHz。

分析:由于总线时钟频率为4MHz,故一个总线周期占用的时间为0.25us,10ms延时需要执行相当于40000个总线周期的指令。我们可以先设计一个实现较小延时的子程序Re_cycle,然后多次循环调用该子程序来实现较长的时延。代码如下:


 org $0070
num ds.b 1
count1 ds.b 1

 org $1860
re_cycle:                              ;4+7*70+6=500T=125us
  mov #70T,num              ;4T
  dbnz num,*                    ;7T
  rts                                  ;6T
delay_10ms:                        ;[4+78*(5+7+500)]+4+7*7+6=39999T
  mov #78T,count1          ;4T
re_call:
  bsr re_cycle                    ;5T
  dbnz count1,re_call         ;7T
  mov #07T,count1           ;4T
  dbnz count1,*                 ;7T
  rts                                   ;6T

main:
  bsr delay_10ms               ;5~6T
again:
  nop
  jmp again


 org $fffe
 dc.w main


每一条指令所占用的时间皆已标出,需要的就是精巧的设计和精准的计算,比如Re_cycle子程序的设计三条指令刚好500T,这里要解释一下DBNZ这个指令,它所实现的功能就是前面变量中的数自减1与0比较,不等就转移到后面的地址并执行,相等就结束该指令(也就是减1不为0转移指令)。这里肯定要问*代表什么,它代表的就是它本身所在指令的地址,dbnz num,*   指令就可以解释为num自减1不等于0就回来再执行该语句,知道num自减1等于0后结束。由注释看出,delay_10ms子程序执行完所占用的总时间为39999T,再加上在main主程序中对delay_10ms子程序的调用占用5~6T,这样没调用delay_10ms一次,便可以实现40004~40005个总线周期约10ms的延时。当然,如果设计足够好,还可以更精确,越靠近40000个T越好。


上面实现了延时10ms,那如果要实现100ms,500ms,1ms,0.1ms呢,同样的办法,全靠精巧的设计和精准的计算。下面给出延时1ms和500ms的子程序:


 org $0070
num ds.b 1
count1 ds.b 1
count2 ds.b 1

 org $1860
re_cycle:                          ;4+7*70+6=500T=125us
  mov #70T,num
  dbnz num,*
  rts

delay_1ms:                      ;[4+(5+7+500)*8+6]=4106T
  mov #08t,count
  re_call:
  bsr re_cycle                
  dbnz count,re_call
  rts

delay_10ms:                    ;39999T
  mov #78T,count1
re_call:
  bsr re_cycle
  dbnz count1,re_call
  mov #07T,count1
  dbnz count1,*
  rts

delay_500ms:                      ;想法是将delay_10ms重复执行50次,这样肯定有不精确的地方,还请见谅。
  mov #50T,count2
re:
  bsr delay_10ms
  dbnz count2,re
  rts


main:

  bsr delay_1ms
  bsr delay_10ms

  bsr delay_500ms
again:
  nop
  jmp again


 org $fffe
 dc.w main


推荐阅读

史海拾趣

CR Magnetics公司的发展小趣事

为了更好地服务全球客户,CR Magnetics积极在全球范围内拓展业务。公司在东亚、欧洲和美洲等地设立了制造和销售办事处,以便更快速地响应市场需求和提供更好的服务。同时,公司还与国际知名厂商建立了合作关系,共同推动电子行业的发展。

GSME Electronics公司的发展小趣事

GSME Electronics深知品质是企业发展的生命线。因此,公司积极寻求并通过了ISO9001:2000质量管理体系、ISO14001环境管理体系以及IECQ QC080000危害物质流程管理体系等三项认证。同时,公司还遵循欧盟ROHS指令,通过了无铅、汞、无公害认证,确保产品符合国际环保标准。这些举措不仅提升了公司的市场竞争力,也赢得了国内外客户的广泛认可。

GardTec Inc公司的发展小趣事

背景:在电子产品行业,产品品质和安全合规性至关重要。GardTec深知这一点,始终将产品品质放在首位。

发展:公司建立了严格的质量控制体系,确保每一件产品都符合最高的品质标准。同时,GardTec还积极遵循国际安全标准和法规要求,如REACH/RoHS等,确保产品的合规性。

影响:高品质的产品和严格的合规性要求,使得GardTec在电子行业中赢得了客户的信赖和好评,进一步提升了公司的品牌形象和市场竞争力。

Dantona Industries公司的发展小趣事

作为一家有社会责任感的企业,Dantona Industries始终关注环境保护和社会公益。他们积极推广绿色生产理念,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与社会公益活动,为贫困地区的教育、医疗等事业提供援助。这些举措不仅展现了公司的社会担当精神,也为公司赢得了良好的社会声誉和品牌形象。

世纪金光(CENGOL)公司的发展小趣事

在碳化硅材料技术取得突破后,世纪金光迅速将这一技术应用于功率器件的研发与生产。公司成功开发出额定电压650-1700V、额定电流5-100A的碳化硅肖特基二极管(SBD)以及额定电压650-1200V、额定电流20-100A的金属-氧化物半导体场效应晶体管(MOSFET)。这些高性能的功率器件在电源PFC、充电桩充电模组、光伏逆变器、特种电源等领域得到了广泛应用,为客户提供了高效、可靠的解决方案。

e2v technologies公司的发展小趣事

e2v Technologies自成立以来,一直致力于技术创新和科学合作。公司曾与多个国际知名科研机构合作,参与了诸如哈勃天文望远镜、Envisat气象环境遥感卫星等著名科学项目。这些项目对图像传感器的精度和稳定性提出了极高的要求,e2v凭借其卓越的技术实力,成功为这些项目提供了高质量的图像传感器,进一步巩固了其在图像传感器领域的领先地位。

问答坊 | AI 解惑

mini2440的按键控制LED小程序~~~

看到坛子里很多人拿到板子后不知道第一步该如何做, 在网上看到一个朋友的博客,感觉还不错,对于购买板子的朋友应该有所帮助,所以呈现出来: 来源:http://adreaman.com/0524arm-mini2440-led-key-non-os.html mini2440是当前最经济的arm9开 ...…

查看全部问答>

Stellaris系列资料汇总(欲打造最强帖哦)

Keil uv3快速入门 demo https://bbs.eeworld.com.cn/thread-98020-1-1.html…

查看全部问答>

请教51多任务操作系统

我最近在网上找到这么个简单的基于51单片机的多任务操作系统,但是我不知道其中task-swith和task-load这两个函数是怎么切换任务的,用堆栈管理实现任务的切换,请高手帮我解释下,谢谢 我主要想知道51单片机怎样去识别任务切换 程序 /* ...…

查看全部问答>

求wince5.0书籍

麻烦大家介绍几本wince5.0的开发书籍,最好是直接针对5.0的,谢谢~~…

查看全部问答>

运行时关闭UPLL的问题

系统:s3c2440a +wince5 想在系统运行时,关闭UPLL,不产生48Mhz,在需要时再打开UPLL 查看s3c2440a的datasheet,上写控制CLKSLOW寄存器的UCLK_ON即可 CLKSLOW[7] --> UCLK_ON --> = 0 UCLK_ON (UPLL turn on)         ...…

查看全部问答>

(重分答谢)AT 命令 STATE: IP IND(连线失败,接受场景配置)

我再WinCE5.0上用GPRS上网发信息到服务器上: AT+CREG? // check if registration network in 2 seconds interval +CREG: 0,1 // module responses AT+CGATT? // check if attach PDU for 2 seconds interval +CGATT: 1 // module response ...…

查看全部问答>

如何知道一个WinCE SDK裁剪了哪些内容?

我现在手上有一个针对某个设备的 WinCE5.0 SDK包。 如何知道其在原版WinCE上做了哪些裁剪? 相关目录如下: [Atl] [Help]                   [Include]     & ...…

查看全部问答>

关于wince上的中文输入法

如果想在wince中自己开发一个中文输入法,要是用EVC的话,应该如果建立拼音和汉字字库的检索? 有没有相关的API函数? 要是想开发一个手写中文输入软件呢?都需要怎么去开发?…

查看全部问答>

请问一下各位,2.8寸320X240的TFT最便宜的多少钱一片

                                 请问一下各位,2.8寸320X240的TFT 最便宜的多少钱一片,谢谢!!…

查看全部问答>

乘法型的DA和普通的DA有什么区别呢?

希望大虾能够解析下乘法型的DA和普通的DA的区别…

查看全部问答>