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秒
谢谢
要计算延迟,您需要计算周期时间,然后计算达到所需延迟所需的周期数.
在您的情况下,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)
在这种情况下,存在内部循环Delay3是4周期长,因为DEC=1,NOP=1并BRNE=2跳转到延迟3时.因此,4循环重复250次数(值dly3)是1000循环或1000us= 1ms.
然后循环Delay2重复Delay3 125次数(值dly2).所以这种情况下的累积延迟是125ms.
最后,循环Delay1重复Delay2 8次数(值dly1).因此,在这种情况下累积的延迟是1000ms或1第二.
注意:这个例子实际上延迟长于一点点1sec,因为我没有考虑指令的时间Delay2和Delay1.影响非常小,但是为了精确1sec延迟,必须对这些指令进行计数dly1,dly2并且dly3必须调整这些指令的值,以保证算法的1000000周期长.
注2:使用此算法,微控制器在执行延迟时不能执行任何其他操作,因为您使用它来计算周期.如果您想在延迟时做其他事情,请查看微控制器的定时器和中断.