Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
286 Микроконтроллеры AVR от азов программирования... На этом можно было бы закончить процесс воспроизведения ноты. Однако это еще не все. Для правильного звучания мелодии между двумя соседними нотами необходимо обеспечить хотя бы небольшую паузу. Если такой паузы не будет, ноты будут звучать слитно. Это исказит мело дию, особенно если подряд идет несколько нот с одинаковым тоном. Формирование паузы между нотами происходит в строках 104,105. Вспомогательная пауза формируется при помощи уже знакомой нам подпрограммы задержки. В строке 104 коду паузы присваивается нуле вое значение (выбирается самая минимальная пауза). Затем в строке 105 вызывается подпрограмма wait. После окончания паузы остается только восстановить содержимое всех со храненных регистров из стека (строки 106 — 109) и выйти из подпрограммы (строка 110). Подпрограмма формирования задержки И последнее, что нам осталось рассмотреть, — это подпрограмма фор мирования задержки. Текст подпрограммы занимает строки 111 — 135. Как и любая другая подпрограмма, подпрограмма wait в начале сохра няет (строки 111 — 114), а в конце — восстанавливает (строки 131 — 134) все используемые регистры. Рассмотрим, как работает эта подпрограмма. Сначала определяется длительность задержки. Для этого извлекается соответствующий элемент из таблицы tabz. Номер элемента соответствует коду задержки, нахо дящемуся в регистре dnota. Извлечение значения из таблицы произво дится уже знакомым нам образом. Команды, реализующие вычисление адреса нужного элемента таблицы, находятся в строках 115 — 118. Затем в строках 119 и 120 производится чтение элемента таблицы. Прочитанный код задержки помещается в регистровую пару Y. Теперь наша задача: сформировать задержку, пропорциональную содер жимому регистровой пары У. Так как микроконтроллер ATtiny2313 имеет только один шестнадцатиразрядный таймер, который уже занят формиро ванием звука, будем формировать задержку программным путем. Ранее мы уже применяли один вариант такой подпрограммы (см. раздел 5.5). Но в дан ном случае цикл формирования задержки построен немного по-другому. Вообще-то, способов построения подобных подпрограмм может быть бесконечное множество. Все зависит от изобретательности программи ста. Использованный в данном примере способ более удобен для форми рования задержки переменной длительности, пропорциональной задан ному коэффициенту. Главной особенностью нового способа является шестнадцатиразрядный параметр цикла. Для хранения этого параметра используется регистровая пара Z. Перед началом цикла задержки в нее записывается ноль. Затем начина
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==