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

Шаг 5. Переходим непосредственно к разработке устройств и программ 285 тремя младшими. Для сдвига используется команда rol. Так как сдвиг происходит через ячейку признака переноса (см. рис. 5.15), то нам пона ­ добится четыре команды сдвига. Эти команды занимают в программе строки 70 —73. Затем в строке 74 на полученное в результате сдвигов число наклады ­ вается маска, которая выделяет три младшие бита, а пять старших сбра ­ сывает в ноль. Полученный таким образом код длительности записыва ­ ется в регистр dnota (строка 75). Когда код тона и код длительности определены, производится вызов подпрограммы воспроизведения ноты (строка 76). Оператор г jmp в строке 77 передает управление на начало цикла воспроизведения мело ­ дии, и цикл повторяется для следующей ноты. Подпрограмма воспроизведения ноты занимает строки 85 — 110. Она выполняет следующие действия: ♦ извлекает из таблицы tabkd коэффициент деления, соответствую ­ щий коду ноты; ♦ программирует таймер и включает звук; ♦ затем выдерживает паузу и звук выключает. Если код тона равен нулю (нужно воспроизвести паузу без звука), извлечение коэффициента деления и включение звука не выполняются. Подпрограмма сразу переходит к формированию паузы. Начинается подпрограмма воспроизведения ноты с сохранения всех используемых регистров (строки 85 — 88). Затем производится проверка кода ноты на равенство нулю (строка 89). Если код ноты равен нулю, то оператор breq в строке 90 передает управление по метке ntl, то есть к строке, где происходит вызов процедуры формирования задержки. Если код ноты не равен нулю, то программа приступает к извлече ­ нию коэффициента деления. Для вычисления адреса элемента таблицы tabkd, где находится этот коэффициент, снова используется подпро ­ грамма addw. Код тона помещается в регистр YL (строка 91), а адрес начала таблицы — в регистровую пару Z (строки 92, 93). Вызов подпрограммы addw производится в строке 94. В регистровой паре Z подпрограмма воз ­ вращает адрес элемента таблицы, где находится нужный нам коэффици ­ ент деления. В строках 95,96 из таблицы извлекается этот коэффициент. А в строках 97,98 он помещается в регистр совпадения таймера. В стро ­ ках 99,100 включается звук. В строке 104 вызывается специальная подпрограмма, предназначен ­ ная для формирования задержки. Подпрограмма называется wait и фор ­ мирует задержку с переменной длительностью. Длительность задержки зависит от значения регистра dnota. По окончании задержки звук выключается (строки 102,103).

RkJQdWJsaXNoZXIy MTExODQxMg==