我刚开始学习微控制器,但我无法理解如何在不使用定时器的情况下引入代码延迟。 我的主板有16MHZ的时钟。让我们说我想在检查是否按下按钮之前引入5ms延迟。我如何确定需要执行多少指令才能获得5 ms的延迟以及如何对其进行编程? 这样做有标准化的方法吗?它看起来非常标准,但我无法理解它是如何完成的。
我在Atmega 328 Arduino uno上使用汇编语言进行编程。
答案 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)=21
和y=high(13333)=52
并添加nop
。
这是一般的想法,我希望我没有错误计算任何东西。如果您打算使用此函数,请考虑调用和返回的开销。此外,您可以进行参数化。