首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何延缓AVR微控制器的组装?

如何延缓AVR微控制器的组装?
EN

Stack Overflow用户
提问于 2014-06-07 21:07:25
回答 2查看 38.8K关注 0票数 4

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

我使用proteus进行仿真,使用avr studio对atmel微控制器进行汇编编码。

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

代码语言:javascript
复制
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秒

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-13 22:26:59

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

在您的例子中,1MHz时钟表示每秒1000000周期。所以1周期等于1/1000000秒或1us。要获得1秒的延迟,您需要1us1000000周期,因此这意味着您必须创建1000000周期的算法。

根据您的示例,1秒延迟@ 1MHz时钟将为:

代码语言:javascript
复制
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周期长的,因为DEC=1NOP=1BRNE=2在跳转到Delay3时很长。因此,重复250次数(dly3的值)的4周期是1000周期或1000us = 1ms

然后循环Delay2重复Delay3 125时间(dly2的值)。因此,在这种情况下,累积延迟是125ms

最后,循环Delay1重复Delay2 8时间(dly1的值)。因此,在这种情况下,累积延迟为1000ms1秒。

注意:这个例子的延迟实际上比1sec要长一点,因为我没有考虑Delay2Delay1指令的时间。影响非常小,但为了获得精确的1sec延迟,必须对这些指令进行计数,并且必须调整dly1dly2dly3的值,以确保算法恰好是1000000周期长。

NOTE2:使用这种算法,微控制器在执行延迟时不能做其他任何事情,因为您正在使用它来计算周期。如果你想在延迟的同时做其他的事情,可以看看微控制器的timers和中断。

票数 10
EN

Stack Overflow用户

发布于 2015-06-01 05:05:43

为此,使用计时器/计数器更容易。您可以将定时器/计数器0与prescalar=10241MHz时钟一起使用,以创建250ms延迟。每个250毫秒将生成一个中断。4中断意味着1秒!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24097526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档