如何延迟 avr 微控制器的组装?
Posted
技术标签:
【中文标题】如何延迟 avr 微控制器的组装?【英文标题】:How to make a delay in assembly for avr microcontrollers? 【发布时间】:2014-06-07 13:07:24 【问题描述】:我在计算延迟时遇到问题。当我为 atmega128 微控制器使用 1MHz
时钟速度时,我想延迟 1 sec
。
我使用 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 秒
谢谢
【问题讨论】:
Create Delay in Arduino Uno using Assembly language without using timer 的可能重复项 【参考方案1】:要计算延迟,您需要计算周期时间,然后计算达到所需延迟所需的周期数。
在您的情况下,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
周期长,因为在跳转到延迟 3 时 DEC=1
、NOP=1
和 BRNE=2
。所以,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:使用此算法,微控制器在执行延迟时无法执行任何其他操作,因为您正在使用它来计算周期数。如果你想在做延迟的同时做其他事情,看看timers和微控制器的中断。
【讨论】:
它对你有用吗?如果是这样,请不要忘记更新并接受答案!谢谢【参考方案2】:为此使用计时器/计数器更容易。您可以使用 timer/counter0 和 prescalar=1024
和 1MHz
时钟来创建 250ms
延迟。每250
毫秒将产生一个中断。 4
中断意味着 1
秒!
【讨论】:
以上是关于如何延迟 avr 微控制器的组装?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法处理 AVR/Arduino 微控制器中的堆内存碎片?