2016-10-29 3 views
0
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, я не могу понять, что пустые петли делает здесь? также что делает второй цикл?Пустой смысл цикла в коде таймера с использованием C

+0

Неоднозначный вопрос; есть три петли, две из которых пусты. Прочтите, какие петли вы имеете в виду. – Clifford

+0

Это не хороший способ задержки; 8-разрядный таймер будет обнулять от 255 до нуля, но цикл проверяет в то время как 'TCNT0 <255', что является ложным только тогда, когда' TCNT0' составляет ровно 255, это состояние может быть легко пропущено, если происходит прерывание и занимает больше времени, чем один рассчитывать на процесс, делая задержку недетерминистически дольше, чем предполагалось. Скорее, прерывание таймера должно использоваться для увеличения счетчика, и этот счетчик опросил, а не «TCNT0». – Clifford

ответ

0

Они выглядят как занятые ожидания. Они блокируются до тех пор, пока условие не будет выполнено.

2

TCNT0 - текущий счетчик таймера для таймера 0, 8-разрядный таймер. Поскольку он рассчитывается асинхронно из вашего кода, он будет увеличиваться, даже если процессор находится в режиме ожидания ожидания.

Но поскольку avr-libc обеспечивает довольно точные отклики спина в util/delay.h, вам обычно лучше использовать их.

for (int i = 0; i < delay; i++) 
    _delay_us(1); 
+0

Первый цикл 'delay/256' рассчитывается до' TCNT0' равен 255. Последний цикл подсчитывает остаток 'delay% 256'. Код будет терпеть неудачу, если таймер перевернется между циклами. – UncleO

0

Величина задержки генерироваться зависит от prescalar тактового сигнала источника, установленного для Timer0 Обе петли просто блокируют до тех пор, TCNT0 отсчитывает не достигнет некоторого конкретного значения Однако это не является хорошим способом реализации delay loop Вместо того, чтобы подсчитывать точку, когда TCNT0 достигает 255, пользователь должен проверить бит TOL0 переполнения в регистре TIFR для установки. Вы можете обратиться к примечанию к приложению от atmel на таймерах Mega http://www.atmel.com/Images/Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf