use*_*100 1 assembly delay instructions arduino-uno
我刚刚开始学习微控制器,我无法理解如何在不使用定时器的情况下在代码中引入延迟.我的主板有16MHZ的时钟.假设我想在检查是否按下按钮之前引入5ms延迟.我如何确定需要执行多少指令才能获得5 ms的延迟以及如何对其进行编程?这样做有标准化的方法吗?它看起来像一个非常标准的东西,但我无法理解它是如何完成的.
我在Atmega 328 Arduino uno上使用汇编语言进行编程.
通常,您需要计算出需要刻录的时钟周期数,然后编写一个循环.请查阅数据表以确定循环所需的循环次数并计算所需的迭代次数.
ldi r16, x ; 1 cycle
loop: nop ; 1 cycle
dec r16 ; 1 cycle
brne loop1 ; 2 cycles when jumping, 1 otherwise
Run Code Online (Sandbox Code Playgroud)
根据值的不同x,此循环将占用x * 4周期.对于16MHz板,1ms是16000个周期,因此5ms将是80000个周期.这比8位循环更能管理,所以我们需要制作一个16位计数器.
ldi r16, x ; 1 cycle
ldi r17, y ; 1 cycle
loop: nop ; 1 cycle
dec r16 ; 1 cycle
brne skip ; 2 cycles when jumping, 1 otherwise
dec r17 ; 1 cycle
skip: brne loop ; 2 cycles when jumping, 1 otherwise
Run Code Online (Sandbox Code Playgroud)
好的,所以我们的循环体现在每次迭代需要6个循环.请注意,无论是否r16包装,它都是6个循环.设置需要2个周期,但最后brne给我们1个循环,所以我们得到1个循环开销.这意味着我们需要79999次循环,这是13333次迭代,还有一次循环浪费.因此x=low(13333)=21,y=high(13333)=52并添加一个nop.
这是一般的想法,我希望我没有错误计算任何东西.如果您打算使用此函数,请考虑调用和返回的开销.此外,您可以进行参数化.
| 归档时间: |
|
| 查看次数: |
4746 次 |
| 最近记录: |