Белов, А.В. Микроконтроллеры 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). Причем доработка
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==