📜  AVR微控制器中的时间延迟

📅  最后修改于: 2021-06-28 16:27:14             🧑  作者: Mango

在本文中,我们将看到如何为AVR创建延迟。另外,我们将讨论指令流水线。

AVR的延迟计算:
在汇编语言说明中,要创建时间延迟,必须考虑两个重要因素。

  1. 晶振频率–
    连接到XTAL1和XTAL2的晶体振荡器的频率是计算时间延迟的一个因素。指令周期的时钟周期持续时间是该晶振频率的函数。
  2. AVR设计–
    AVR微处理器能够在一个周期内执行一条指令。有三种方法可以做到这一点。
    1. 使用哈佛体系结构将最大数量的代码和数据输入CPU。
    2. 使用RISC体系结构功能,例如固定大小的指令。
    3. 使用流水线来重叠指令的获取和执行。

流水线:
在早期的微处理器中,CPU可以在给定时间获取或执行。换句话说,CPU必须从内存中获取一条指令,然后执行该指令,然后再次获取下一条指令,执行该指令,依此类推。流水线化允许CPU同时读取并执行给定指令。

我们可以使用管道来加快指令的执行速度。在管道中,执行过程分为多个较小的步骤,这些步骤全部并行执行。在执行指令时,我们必须确保指令序列完好无损,并且没有不同的执行方式。

AVR的指令周期时间:
CPU执行一条指令需要花费一定的时间。该时间称为机器周期。 AVR中的所有指令均为2字节或4字节,因此大多数指令执行不超过2个机器周期(某些指令可能需要3到4个机器周期来执行)。在AVR系列中,机器周期的持续时间取决于连接到AVR系统的振荡器的频率。在AVR中,一个机器周期由一个振荡器周期组成,这意味着每个振荡器时钟都会经过一个机器周期。因此,为了计算AVR的机器周期,我们采用晶体频率的倒数。

示例1:
对于给定的晶体频率,计算指令周期。

a) 8 MHz    b) 16 MHz

Solution : a) instruction cycle = 1/ 8 MHz = 0.125 us (microsecond)   
           b) instruction cycle = 1/ 16 MHz = 0.0625 us

不同指令所需的指令周期(以1 MHz为晶振频率):

Instruction Instruction cycles Time to execute
LDI 1 1 us
DEC 1 1 us
OUT 1 1 us
ADD 1 1 us
NOP 1 1 us
JMP 3 3 us
CALL 4 4 us
BRNE 2/1 2 us if taken, 1 us if it fails

示例2:
如果晶振频率为10 MHz,请在下面的代码段中找到我们的延迟。

Instruction Cycles
DELAY :   LDI        COUNT, 0XFF                  0
Again :   NOP                                     1          
          NOP                                     1
          NOP                                     1
          DEC        COUNT                        1
          BRNE       AGAIN                       2/1
          RET                                     4
          
Solution :  Time Delay = [1 +(( 1+ 1+ 1+ 1 + 2 ) x 255) + 4 ] x 0.1 us = 153.5 us