Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

234 Микроконтроллеры AVR от азов программирования... чтобы при записи значения в эти регистры сначала записывался стар ­ ший регистр TCNT1H, а потом младший TCNT1L. Дело в том, что при записи старшего байта в регистр TCNT1H он не попадает сразу по назна ­ чению, а сохраняется в специальном внутреннем регистре. Когда же поступает команда записи младшего байта в регистр TCNT1L, оба байта записываются одновременно. В этом и состоит двойная буферизация. Использование двойной буферизации позволяет менять значение счет ­ ного регистра на ходу, не останавливая таймера. После записи нулевого значения в счетный регистр начинается цикл проверки. Он занимает строки 43 — 48 программы. Сравнение происхо ­ дит в два этапа. В строках 43 — 45 сравнивается младшая часть счетного регистра с младшим байтом коэффициента деления. В строках 46 — 48 сравниваются старшие байты. Рассмотрим это подробнее. В строке 43 содержимое регистра TCNT1L помещается в регистр temp. В строке 44 происходит сравнение содержимого регистра temp с млад ­ шим байтом константы. Команда условного перехода в строке 45 пере ­ дает управление на начало цикла сравнения только в том случае, если содержимое регистра еще не достигло требуемого значения. В строках 46 — 48 такие же операции сравнения производится для регистра TCNT1H. При этом используется старший байт константы kdel. Если старший разряд счетного регистра не достиг требуемого зна ­ чения, то управление передается на метку wtl. То есть в этом случае про ­ грамма опять повторяет сравнение младших разрядов. Такой порядок также диктуется наличием двойной буферизации. При чтении младшей части регистра старшая его часть запоминается в специ ­ альном внутреннем буфере. Команда чтения старшей части регистра на самом деле читает содержимое этого буфера. Пока происходит цикл сравнения, счетчик находится в режиме счета. Содержимое счетного регистра постепенно увеличивается и, в конце концов, достигает требуемого значения. Пока происходит очередной цикл проверки, содержимое счетного регистра может даже превысить значение константы. В этом случае переходов в строке 45 и в строке 48 не произойдет. В результате подпрограмма перейдет к своему завершению. В строке 49 происходит восстановление содержимого регистра temp. А в строке 50 — выход из подпрограммы. Программа на языке СИ Возможный вариант той же программы на языке СИ приведен в листинге 5.12. Эта программа представляет собой доработанный вариант программы из предыдущего примера (листинг 5.10). Причем доработка

RkJQdWJsaXNoZXIy MTExODQxMg==