如何延迟 avr 微控制器的组装?

Posted

技术标签:

【中文标题】如何延迟 avr 微控制器的组装?【英文标题】:How to make a delay in assembly for avr microcontrollers? 【发布时间】:2014-06-07 13:07:24 【问题描述】:

我在计算延迟时遇到问题。当我为 atmega128 微控制器使用 1MHz 时钟速度时,我想延迟 1 sec

我使用 proteus 进行模拟,使用 avr studio 为 atmel 微控制器进行汇编编码。

例如此代码用于8MHz 时钟微控制器

Delay_15mS:                 ; For CLK(CPU) = 8 MHz
    LDI     dly1,   120     ; One clock cycle;
Delay1:
    LDI     dly2,   250     ; One clock cycle
Delay2:
    DEC     dly2            ; One clock cycle
    NOP                     ; One clock cycle
    BRNE    Delay2          ; Two clock cycles for true 1 clock for false

    DEC     dly1            ; One clock Cycle
    BRNE    Delay1          ; Two clock cycles for true 1 clock for false
RET

你能教我如何计算这个延迟需要的时间吗?所以我可以在 1 MHz 时延迟 1 秒

谢谢

【问题讨论】:

Create Delay in Arduino Uno using Assembly language without using timer 的可能重复项 【参考方案1】:

要计算延迟,您需要计算周期时间,然后计算达到所需延迟所需的周期数。

在您的情况下,1MHz 时钟意味着每秒 1000000 个周期。所以1 循环等于1/1000000 秒或1us。要获得 1 秒的延迟,您需要 1us1000000 周期,因此这意味着您必须创建 1000000 周期的算法。

基于您的示例,1 秒延迟 @ 1MHz 时钟将是:

Delay_1sec:                 ; For CLK(CPU) = 1 MHz
    LDI     dly1,   8       ; One clock cycle;
Delay1:
    LDI     dly2,   125     ; One clock cycle
Delay2:
    LDI     dly3,   250     ; One clock cycle
Delay3:
    DEC     dly3            ; One clock cycle
    NOP                     ; One clock cycle
    BRNE    Delay3          ; Two clock cycles when jumping to Delay3, 1 clock when continuing to DEC

    DEC     dly2            ; One clock cycle
    BRNE    Delay2          ; Two clock cycles when jumping to Delay2, 1 clock when continuing to DEC

    DEC     dly1            ; One clock Cycle
    BRNE    Delay1          ; Two clock cycles when jumping to Delay1, 1 clock when continuing to RET
RET

在这种情况下,内部循环 Delay34 周期长,因为在跳转到延迟 3 时 DEC=1NOP=1BRNE=2。所以,4 循环重复250 次(dly3 的值)是1000 循环或1000us = 1ms

然后循环Delay2 重复Delay3 125 次(dly2 的值)。所以这种情况下累积的延迟是125ms

最后,循环Delay1 重复Delay2 8 次(dly1 的值)。所以这种情况下的累积延迟是1000ms1 秒。

注意:这个示例延迟实际上比1sec 长一点,因为我没有考虑Delay2Delay1 的指令时间。影响很小,但是对于精确的1sec延迟,必须计算这些指令,并且必须调整dly1dly2dly3的值,以保证算法恰好是1000000周期长.

注意2:使用此算法,微控制器在执行延迟时无法执行任何其他操作,因为您正在使用它来计算周期数。如果你想在做延迟的同时做其他事情,看看timers和微控制器的中断。

【讨论】:

它对你有用吗?如果是这样,请不要忘记更新并接受答案!谢谢【参考方案2】:

为此使用计时器/计数器更容易。您可以使用 timer/counter0 和 prescalar=10241MHz 时钟来创建 250ms 延迟。每250 毫秒将产生一个中断。 4 中断意味着 1 秒!

【讨论】:

以上是关于如何延迟 avr 微控制器的组装?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法处理 AVR/Arduino 微控制器中的堆内存碎片?

Linux / Windows Arduino IDE 上的 avr-gcc Atmel AVR 微控制器

使用带有 AVR 微控制器的旋转编码器

使用预分频器确定微控制器 (AVR) 中时钟周期的周期

AVR 微控制器记忆游戏

是否可以在 AVR 微控制器中永久保存一些数据?