Timer 如何在AVR(ATmega8)中使用定时器实现微秒延时?

Timer 如何在AVR(ATmega8)中使用定时器实现微秒延时?,timer,delay,avr,avr-gcc,Timer,Delay,Avr,Avr Gcc,我想在ATmega8中进行可变延迟。但在函数delay_us()中,我只需要输入一个常量值。我想我可以用定时器产生一个可变延迟微秒,但我不知道如何处理这个问题 请帮帮我。您可以使用延迟循环:每次延迟一微秒 迭代,并以微秒为单位进行迭代: void delay_us(无符号长us) { 而(美国)(1);; } 然而,这种方法存在一些问题: 管理迭代需要时间(减少计数器,比较 为零,条件分支…,因此循环内的延迟应 明显短于1µs 调用函数并从中返回需要时间,这应该 从迭代计数中扣除,但由于这一

我想在ATmega8中进行可变延迟。但在函数delay_us()中,我只需要输入一个常量值。我想我可以用定时器产生一个可变延迟微秒,但我不知道如何处理这个问题


请帮帮我。

您可以使用延迟循环:每次延迟一微秒 迭代,并以微秒为单位进行迭代:

void delay_us(无符号长us)
{
而(美国)(1);;
}
然而,这种方法存在一些问题:

  • 管理迭代需要时间(减少计数器,比较 为零,条件分支…,因此循环内的延迟应 明显短于1µs
  • 调用函数并从中返回需要时间,这应该 从迭代计数中扣除,但由于这一次可能不会 在整个微秒数内,您必须在 为了达到下一个完整的微秒
  • 如果编译器将函数内联,则一切都将关闭
试图解决这些问题会产生如下结果:

//仅对16 MHz时钟有效。
void uuu属性uuu((noinline))延迟u us(无符号长us)
{
如果(美国<2)返回;
us-=2;
_延迟(0.4375);
而(美国)(0.3125);;
}
对于能够处理各种时钟频率的更完整版本, 从Arduino AVR上看 核心。请注意,该函数仅对几个离散变量精确 频率。还要注意,延迟循环是在内联汇编中完成的,
为了独立于编译器优化。

您能分享一下您已经做了什么吗?当我写delay_us(I)并且我是一个变量时,codevision出错。请提供一些代码。您不能将变量设置为
delay\u us
,因为
delay\u us(x)
是一个宏,它插入一些额外的代码,生成
x
µ-秒的延迟。当您需要可变延迟时,您必须使用计时器。