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

Шаг 5. Переходим непосредственно к разработке устройств и программ 273 Это полезно запомнить. Паузы — это промежутки времени, когда ни один звук не звучит. Длительность музыкальных пауз принимает точно такие же значе ­ ния, как и длительность нот. В связи с этим удобно представить паузу как еще одну ноту. Ноту без звука. Такой ноте логично присвоить нулевой код. Кодируем мелодии Для экономии памяти удобнее каждую ноту кодировать одним байтом. Договоримся, что три старших бита мы будем использовать для кодиро ­ вания длительности ноты, а оставшиеся пять битов — для кодирования ее тона. Пятью битами можно закодировать до 32 разных нот, что вполне хватит для музыкальной шкатулки. Итак, если использовать приведенный выше способ кодирования, то код ноты ля первой октавы длительностью 1/4 в двоичном виде будет равен 010 01001 = 73 ^-Код ноты (9) L — Код длительности (2) Теперь мы можем приступать к кодированию мелодий. Для того, чтобы закодировать мелодию, нам нужна ее нотная запись. Используя нотную запись, мы должны присвоить каждой ноте и каждой музыкаль ­ ной паузе свой код. Цепочка таких кодов и будет представлять собой закодированную мелодию. По условиям задачи наша музыкальная шкатулка должна уметь воспроизводить семь разных мелодий. Коды всех семи мелодий мы раз ­ местим в программной памяти микроконтроллера. Как определить конец каждой мелодии? Для того, чтобы компьютер знал, где заканчивается каждая мелодия, используем код 255 в качестве признака конца. Теперь нам нужно придумать, как микроконтроллер будет находить начало каждой мелодии. Все мелодии имеют разную длину, а в памяти они будут записаны одна за другой. Поэтому адрес начала каждой мело ­ дии зависит от длины всех предыдущих. Удобнее всего просто по факту определить адрес начала каждой мелодии и поместить все семь адресов в специальную таблицу. Кроме этой таблицы, нам еще понадобится таблица коэффициентов деления для всех 32 нот и таблица, хранящая константы задержки для всех используемых нами музыкальных длительностей.

RkJQdWJsaXNoZXIy MTExODQxMg==