我在计算延迟时遇到了问题。当我为我的1 sec微控制器使用1MHz时钟速度时,我想为atmega128设置一个延迟。
我使用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 MHz的情况下延迟1秒
谢谢
发布于 2014-06-13 22:26:59
要计算延迟,您需要计算周期时间,然后计算达到所需延迟所需的周期数。
在您的例子中,1MHz时钟表示每秒1000000周期。所以1周期等于1/1000000秒或1us。要获得1秒的延迟,您需要1us的1000000周期,因此这意味着您必须创建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周期长的,因为DEC=1、NOP=1和BRNE=2在跳转到Delay3时很长。因此,重复250次数(dly3的值)的4周期是1000周期或1000us = 1ms。
然后循环Delay2重复Delay3 125时间(dly2的值)。因此,在这种情况下,累积延迟是125ms。
最后,循环Delay1重复Delay2 8时间(dly1的值)。因此,在这种情况下,累积延迟为1000ms或1秒。
注意:这个例子的延迟实际上比1sec要长一点,因为我没有考虑Delay2和Delay1指令的时间。影响非常小,但为了获得精确的1sec延迟,必须对这些指令进行计数,并且必须调整dly1、dly2和dly3的值,以确保算法恰好是1000000周期长。
NOTE2:使用这种算法,微控制器在执行延迟时不能做其他任何事情,因为您正在使用它来计算周期。如果你想在延迟的同时做其他的事情,可以看看微控制器的timers和中断。
发布于 2015-06-01 05:05:43
为此,使用计时器/计数器更容易。您可以将定时器/计数器0与prescalar=1024和1MHz时钟一起使用,以创建250ms延迟。每个250毫秒将生成一个中断。4中断意味着1秒!
https://stackoverflow.com/questions/24097526
复制相似问题