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

Шаг 5. Переходим непосредственно к разработке устройств и программ 233 Далее в программе с этой константой сравнивается содержимое счет ­ ного регистра таймера Т1, который тоже имеет шестнадцать разрядов. Однако микроконтроллеры AVR работают лишь с восьмиразрядными величинами. Счетный регистр таймера Т1 представляет собой два вось ­ миразрядных регистра TCNT1L и TCNT1H. Используемый для сравне ­ ния оператор brio также работает с восьмиразрядными величинами. Как же выполняется такое сравнение? Сравнение происходит в два этапа. Сначала сравниваются младшие разряды обеих величин, затем старшие. Младшее и старшее значение счетного регистра хранятся в двух соответствующих регистрах TCNT1L и TCNT1H. А для выделения младшего и старшего байта константы в языке Ассемблер существуют специальные функции low и high. Рассмотрим действие этих функций на конкретном примере. Значение нашей константы kdel равно 780. В шестнадцатиричном виде это выгля ­ дит как ОхОЗОС. Используя вышеописанные функции, мы можем найти старший и младший байты числа: high(kdel) = 0x03 low(kdel) = OxOC. Данные функции используются в строках 44 и 47 программы. Следующая доработка модуля инициализации — это две команды, выбирающие режим работы таймера (строки 16,17). Эти команды запи ­ сывают в регистр TCCR1B константу 0x05. В качестве вспомогательного регистра используется temp. Регистр TCCR1B — это один из двух регистров выбора режимов работы таймера Т1. При записи кода 0x05 в этот регистр устанавлива ­ ется коэффициент предварительного деления 1/1024, и таймер перехо ­ дит в режим счета. Второй регистр конфигурации таймера называется TCCR1 А. Его значение нужно оставить по умолчанию. Подробнее о реги ­ страх и режимах работы таймера смотрите в Шаге 6. Последние изменения основной части программы коснулись команд вызова подпрограммы задержки. Вызов задержки происходит в строках Т7 и 35. Других изменений основной части программы не потребовалось. Новая подпрограмма задержки занимает строки 39 — 50. Начинается подпрограмма традиционно сохранением содержимого всех используе ­ мых ею регистров. В данном случае потребовалось сохранить лишь содер ­ жимое одного регистра temp (см. строку 39). Следующие три команды производят запись нулевого значения в счетный регистр таймера Т1. Сначала ноль записывается в регистр temp (строка 40). А затем содер ­ жимое temp поочередно помещается в регистры TCNT1H и TCNT1L (строки 41,42). Порядок записи информации в пару регистров TCNT1H, TCNT1L неслучайный. Эти два регистра обладают свойством так называемой двойной буферизации. Правила работы с такими регистрами требуют,

RkJQdWJsaXNoZXIy MTExODQxMg==