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