void Tmr_Wait1us (uint16_t delay) {
uint16_t i;
TCNT0 = 0; // will start to count from 0 up to 255 (if 8-bit timer)
for (i = 0; i < delay / 256; i++)
while (TCNT0 < 255)
;
while (TCNT0 <= delay % 256)
;
}
此代码用于设置定时器等待精确的时间量,应用于AVR-Atmega32a,我无法理解空循环在这里做什么?还有第二个循环呢?
答案 0 :(得分:2)
TCNT0
是定时器0的当前定时器计数,是一个8位定时器。由于它与代码异步计数,即使CPU处于旋转等待状态,它也会递增。
但是由于avr-libc在util/delay.h
中提供相当精确的旋转等待,所以通常最好不要使用它们。
for (int i = 0; i < delay; i++)
_delay_us(1);
答案 1 :(得分:0)
他们看起来像忙碌的等待。它们会阻塞,直到满足条件。
答案 2 :(得分:0)
产生的延迟量取决于为timer0设置的源时钟的预分频 两个循环都阻塞直到TCNT0计数达到特定值 然而,这不是实现延迟循环的好方法 用户应检查TIFR寄存器中的溢出位TOV0以进行设置,而不是计算TCNT0达到255时的点。 您可以参考atmel on Mega timers http://www.atmel.com/Images/Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf
上的应用说明