使用汇编语言在不使用计时器的情况下在Arduino Uno中创建延迟

时间:2014-05-05 16:56:59

标签: assembly delay instructions arduino-uno

我刚开始学习微控制器,但我无法理解如何在不使用定时器的情况下引入代码延迟。 我的主板有16MHZ的时钟。让我们说我想在检查是否按下按钮之前引入5ms延迟。我如何确定需要执行多少指令才能获得5 ms的延迟以及如何对其进行编程? 这样做有标准化的方法吗?它看起来非常标准,但我无法理解它是如何完成的。

我在Atmega 328 Arduino uno上使用汇编语言进行编程。

1 个答案:

答案 0 :(得分:6)

通常,您需要计算出需要刻录多少个时钟周期,然后再写一个循环。请查阅数据表以确定循环所需的循环次数并计算所需的迭代次数。

       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)=21y=high(13333)=52并添加nop

这是一般的想法,我希望我没有错误计算任何东西。如果您打算使用此函数,请考虑调用和返回的开销。此外,您可以进行参数化。