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

Ume*_*ldo 4 microcontroller assembly delay atmel

我在计算延迟方面遇到了问题.1 sec当我使用1MHzatmega128微控制器的时钟速度时,我想延迟一下.

我使用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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

fer*_*ngb 6

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

在您的情况下,1MHz时钟表示1000000每秒周期数.所以1周期等于1/1000000秒或1us.要获得1秒的延迟,您需要1000000循环1us,因此这意味着您必须创建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
Run Code Online (Sandbox Code Playgroud)

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

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

最后,循环Delay1重复Delay2 8次数(值dly1).因此,在这种情况下累积的延迟是1000ms1第二.

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

注2:使用此算法,微控制器在执行延迟时不能执行任何其他操作,因为您使用它来计算周期.如果您想在延迟时做其他事情,请查看微控制器的定时器和中断.