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

294 Микроконтроллеры AVR от азов программирования... маски производится при помощи оператора «&». Полученный код тона записывается в переменную fnota. В строке 64 производится вычисление кода длительности. Для этого применяется составное математическое выражение. Операция ( *nota) >>5 сдвигает биты кода ноты на пять шагов вправо. При этом три старших разряда кода становятся тремя младшими. Мы применяем сдвиг вправо потому, что циклический сдвиг влево, использованный нами в Ассемблере, язык СИ не поддерживает. Язык СИ может выполнять только логический сдвиг, но не циклический. На полученное в результате сдвига число налагается маска 0x07. Полученный таким образом код дли ­ тельности записывается в переменную dnota. В строке 65 происходит проверка кода тона на равенство нулю. Если код окажется равным нулю, то управление передается по метке т5, то есть к строке, где формируется пауза, обходя строки, где формируется звук. Звук формируется в строках 66, 67. Сначала в регистр совпадения OCR1A помещается коэффициент деления из массива tabkd. Причем указатель массива равен коду тона. Затем в регистр управления TCCR1 А записывается код, который подключает таймер к выводу ОС1А и, тем самым, включает звук. В строке 68 происходит вызов функции задержки. В качестве пара ­ метра в эту функцию передается коэффициент, извлекаемый из мас ­ сива tabz. Указатель массива при этом равен коду длительности. После выхода из функции задержки звук выключается. Для этого в регистр TCCR1 А записывается нулевое значение (строка 69). В строке 70 формируется пауза между нотами. В качестве параметра для функции delay_ms в этом случае используется нулевой элемент массива tabz, то есть вырабатывается пауза минимальной длительности. В строке 71, как уже говорилось, происходит приращение содержи ­ мого указателя nota. Оператор безусловного перехода в строке 72 замы ­ кает цикл воспроизведения мелодии. 5.11. Кодовый замок Постановка задачи Для завершения практикума я подбирал задачу достаточно сложную и интересную, способную как увлечь, так и научить работать с еще неохва ­ ченными элементами микроконтроллера. Самым удобным примером, на мой взгляд, является кодовый замок. Вообще, микроконтроллеры AVR с их встроенной энергонезависимой памятью (EEPROM) дают широкий простор для разработчика подобных конструкций. Память EEPROM

RkJQdWJsaXNoZXIy MTExODQxMg==