Как рассчитываются задержки в функции Delay_ms при программировании на ATmega32?

Рейтинг: 1Ответов: 1Опубликовано: 14.12.2014

Добрый день!

Подскажите, пожалуйста, уже пару часов ломаю голову... В microC есть функция Delay_ms. Например, Delay_ms(11). Она устанавливает задержку на 11 миллисекунд.
Тактовая частота - 8 МГц. В ассемблере эта инструкция выглядит так:

;Delay_ms(11);
        LDI        R17, 115
        LDI        R16, 72
L_main8:
        DEC        R16
        BRNE       L_main8
        DEC        R17
        BRNE       L_main8

DEC выполняется 1 такт, BRNE - 1 такт, если нет перехода, 2 такта, если есть. Теперь если посчитать количество тактов, то можно узнать время (11 миллисекунд).
Я пытаюсь посчитать количество тактов так:

((1+2)*71 + 2) * 115 * (1+2) + 1 = 74 176

Теперь, чтобы узнать время задержки, надо разделить на частоту:

74 176 / 8*10^6  = 0,009272 = 9 мс

Итого, вместо 11 миллисекунд я получаю 9. Подскажите, пожалуйста, в чем я наврала? Предполагаю, что ошибка в подсчете количества тактов, но не вижу ее.

Ответы

▲ 2Принят

Хм. Насколько я понимаю, внутренний цикл имеет длину в 72 итерации только на первой итерации внешнего цикла, правильно? Все остальные итерации прогоняют от максимального значения R16.

Обновление

Подождите, ещё ж надо учесть остальные внутренние циклы! В точке L_main8 у нас получаются такие значения R16 и R17:

 72  115
 71  115
   ...
  1  115 (проход во внешний цикл)
  0  114
255  114 (или что получается из 0 после DEC?)
254  114
  ...
  1  114
  0  113

и т. д.