Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使avr微控制器的组装延迟?_Assembly_Delay_Microcontroller_Atmel - Fatal编程技术网

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

Assembly 如何使avr微控制器的组装延迟?,assembly,delay,microcontroller,atmel,Assembly,Delay,Microcontroller,Atmel,我在计算延误时遇到了问题。当我使用atmega128微控制器的1MHz时钟速度时,我想延迟1秒 我使用proteus进行模拟,使用avr studio为atmel微控制器进行汇编编码 例如,该代码用于8MHz时钟微控制器 Delay_15mS: ; For CLK(CPU) = 8 MHz LDI dly1, 120 ; One clock cycle; Delay1: LDI dly2, 250 ; One

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

我使用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兆赫的频率下延迟1秒


谢谢

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

在您的情况下,
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
在这种情况下,存在内部循环
Delay3
,即
4
周期长,因为当跳到Delay3时,
DEC=1
NOP=1
BRNE=2
。因此,
4
循环重复
250次(
dly3
的值)是
1000个循环或
1000us
=
1ms

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

最后,循环
Delay1
重复
Delay2
8
次(dly1
的值)。因此,这种情况下的累积延迟为
1000ms
1

注意:这个例子的延迟实际上比代码<1秒要长一点,因为我没有考虑<代码> > Delay2和<代码> Delay1的时间。影响非常小,但对于精确的

1秒
延迟,必须对这些指令进行计数,并且必须调整
dly1
dly2
dly3
的值,以确保算法的周期长度恰好为
1000000


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

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

可能的副本它对你有用吗?如果是,请不要忘记更新并接受答案!谢谢