Assembly 如何使avr微控制器的组装延迟?
我在计算延误时遇到了问题。当我使用atmega128微控制器的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
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
秒 可能的副本它对你有用吗?如果是,请不要忘记更新并接受答案!谢谢