Более длительная временная задержка, когда больше, чем одно "пока".

Микроконтроллер: ATmega328P в ******* Uno Тактовая частота: 16 МГц

void timeDelay_CTC(float sec, unsigned char times) //0.1 <= sec <= 4
{
 OCR1A = (sec / 0.000064f) - 1;
 TCCR1A = 0b00000000;
 TCCR1B = 0b00001101;
 for( unsigned char i = 1; i <= times; i++ )
 {
 while( (TIFR1 & (1<
<p> Вышеуказанная функция используется для вычисления количества циклов временной задержки, а затем реализует ее в режиме CTC. Это работает хорошо. Теперь я хочу написать аналогичную функцию в обычном режиме. Следующее - это код.</p> <pre class="prettyprint linenums">void timeDelay_NORM(float sec, unsigned char times) { unsigned int cycle = (sec / 0.000064f); TCNT1 = 65534 - cycle; TCNT1 = 49910; TCCR1A = 0b00000000; TCCR1B = 0b00000101; for( unsigned char x = 1; x <= 2; x++ ) { while( (TIFR1 & (1<</pre><code> <p> Однако функция нормального режима с аргументом "times"> 1, временная задержка будет намного дольше, чем ожидалось. Итак, я попробовал следующий код.</p> <pre class="prettyprint linenums">void timeDelay_NORM(float sec, unsigned char times) { //unsigned int cycle = (sec / 0.000064f); //TCNT1 = 65534 - cycle; TCNT1 = 49910; //Cycles for 0.5sec TCCR1A = 0b00000000; TCCR1B = 0b00000101; //for( unsigned char x = 1; x <= 2; x++ ) //{ while( (TIFR1 & (1<</pre><code> <p> Я обнаружил, что при выполнении следующей инструкции 2 раза время задержки будет намного дольше, чем ожидалось. Он задерживается около 5 секунд вместо 1 с.</p> <pre class="prettyprint linenums">while( (TIFR1 & (1<</pre><code> <p> Можете ли вы научить меня, как заставить его работать? Или дайте мне несколько намеков.</p> <p> Спасибо за помощь!</p>
1 ответ

Вы не сбрасываете TCNT1 между итерациями цикла.

В первом цикле будет отсчитываться цикл (UINT16_MAX - 49910). После того, как TOV1 установлен, TCNT1 переходит на 0 (переполнение) и подсчитывает весь путь до UINT16_MAX, что вызывает более длительную задержку.

licensed under cc by-sa 3.0 with attribution.