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

Шаг 5. Переходим непосредственно к разработке устройств и программ 263 деления из программной памяти, поместить его в регистр совпадения и подключить сигнал с таймера на внешний выход. Сначала займемся извлечением коэффициента деления. Как уже говорилось выше, все коэффициенты записаны в программную память и составляют таблицу коэффициентов деления (см. строку 63). Для извлечения нужного нам коэффициента воспользуемся командой 1рш. Но сначала нам необходимо вычислить адрес соответствующей ячейки памяти. Для этого вспомним, что каждый коэффициент представляет собой два байта, записанные в две соседние ячейки памяти (по альтернативной адресации). Если адрес начала таблицы равен tabkd, то в альтернативной адресации он будет равен tabkdx2. Очевидно, что коэффициент деле ­ ния для датчика номер ноль будет занимать ячейки с адресами tabkdx2 и tabkdx2+l. Коэффициент деления для датчика номер один мы найдем в ячейках tabkdx2+2 и tabkdx2+3. И так далее. В общем случае адрес ячейки, содержащей первый байт нужного нам коэффициента мы най ­ дем по формуле tabkdx2+Nd х2, где Nd — это номер датчика. Отсюда наша задача: используя номер, записанный в регистре count, вычислить адрес ячейки, где хранится нужный коэффициент деления. Так как любой адрес — это шестнадцатиразрядное двоичное число, нам придется производить операцию шестнадцатиразрядного сложения. В системе команд микроконтроллеров AVR такая команда отсутствует. Поэтому мы будем складывать шестнадцатиразрядные числа побайтно. Команды вычисления адреса занимают строки 49 — 55. В строке 49 про ­ исходит удвоение содержимого регистра count (умножение кода датчика на два). Для удвоения используется команда логического сдвига lsl. Дело в том, что в двоичной системе логический сдвиг на один бит влево эквивалентен умножению на два. Теперь полученное в результате удво ­ ения число необходимо прибавить к адресу начала таблицы. Для этого сформируем два шестнадцатиразрядных слагаемых. Первое слагаемое мы запишем в регистровую пару Y, а второе слагаемое — в регистровую пару Z. Младший байт первого слагаемого (удвоенный код датчика) мы берем из регистра count и помещаем в YL (строка 50). Так как датчиков всего семь (максимальное значение удвоенного кода равно 14), то стар ­ ший байт первого слагаемого всегда будет равен нулю. Запишем этот ноль в регистр YH (строка 51). В качестве второго слага ­ емого мы будем использовать число, равное удвоенному значению метки tabkd. Запишем младший и старший байты этого числа в регистровую пару Z (строки 52, 53). После того, как оба слагаемых сформированы, приступаем к процессу сложения. Сначала складываем младшие байты

RkJQdWJsaXNoZXIy MTExODQxMg==