【问题标题】:Create Delay in Arduino Uno using Assembly language without using timer在不使用计时器的情况下使用汇编语言在 Arduino Uno 中创建延迟
【发布时间】:2014-05-05 16:56:59
【问题描述】:
我刚开始学习微控制器,我无法理解如何在不使用计时器的情况下在代码中引入延迟。
我的板子有一个 16MHZ 的时钟。假设我想在检查是否按下按钮之前引入 5ms 延迟。我如何确定需要执行多少条指令才能获得 5 毫秒的延迟以及如何对其进行编程?
有没有标准化的方法来做到这一点?它看起来是一个非常标准的东西,但我无法理解它是如何完成的。
我在 Atmega 328 Arduino uno 上使用汇编语言进行编程。
【问题讨论】:
标签:
assembly
delay
instructions
arduino-uno
【解决方案1】:
一般你算出需要烧多少个时钟周期,然后写一个循环。查阅您的数据表以确定您的循环需要多少个周期并计算您需要多少次迭代。
ldi r16, x ; 1 cycle
loop: nop ; 1 cycle
dec r16 ; 1 cycle
brne loop1 ; 2 cycles when jumping, 1 otherwise
根据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
好的,所以我们的循环体现在每次迭代需要 6 个周期。请注意,无论r16 是否在换行,它都是 6 个周期。设置需要 2 个周期,但最终的 brne 给了我们 1 个周期,所以我们得到了 1 个周期的开销。这意味着我们需要 79999 次循环,即 13333 次迭代,还要浪费一个循环。因此x=low(13333)=21 和y=high(13333)=52 并添加nop。
这是大体的想法,我希望我没有误算任何事情。如果您打算对此进行处理,请考虑调用和返回的开销。此外,您可以使其参数化。