Дверной звонок - что может быть проще? Как правило об изготовлении дверного звонка никто не задумывается - возьми готовый в магазине. Но приобретение в магазине не окупается моральным удовлетворением от проделанной работы. Не важно как, но старый звонок времен СССР решено было отправить на заслуженный отдых, взамен водрузив что то издающее приятный или уж по крайней мере не режущий ухо звук. Задача в общем не ахти какая сложная, но интересная.
Глаз попремерявщись к имеющимся в заначке микроконтроллерам выбрал восьми ногую ATTiny12. Эх была бы ATTiny11.... или выпущенная недавно ATTiny10... глаз непременно упал бы на нее. Но в наличии только ATTiny12.
И так ознакомимся что же мы имеем в составе ATTiny12. Интервальный таймер, 1024 слова программной памяти, встроенный RC генератор до 1МГЦ, пять линий IO из которых одна линия может работать как внешнее прерывание INT0. Не плохо! Подойдем к задаче творчески. Что бы нам хотелось? А хотелось бы нам, что бы звонок мог проигрывать мелодию! Это означает нужно издавать определенную ноту с определенной длительностью по списку партитуры. Насчет ноты все более менее ясно, имея интервальный таймер ничего не мешает проигрывать ноты, задавая их частотой меандра. Формировать его можно в прерывании по переполнению таймера, в этом случае имеющийся интервальный таймер задает период колебания. А вот с длительностью уже так легко не выйдет, если мы задаем ее через кол-во периодов сигнала - нам становится очень неудобно жить. Периоды будут обязательно не кратные целым числам ms, придется использовать целые числа бОльших разрядностей. Сплошная головная боль да и только. Вот если бы нам еще один таймерок бы в помощь, тогда задавать длительность было бы так просто и однозначно... По счастью AVR снабжен еще одним таймером могущим отрабатывать несколько вариантов задержек - это Watch Dog timer, "сторожевая собака" не дающая AVR впасть в маразм - например бесконечный цикл по вине программиста или помехи из вне. Как правило работа с этим устройством происходит по принципу - взвел таймер на случай ошибки и "виса", а если таковой не случился и процедура отработала нормально - "собаку" вернем в будку на цепь (инструкцией WDR) и пусть опять ждет в будке пока не завершится сторожевой интервал. Если все таки "собаке" вовремя не дали "укорот" - она "кусает" кнопку RESET. В принципе этот сброс ничем не отличается от внешнего, но идентифицировать что именно привело к сбросу возможно. Регистр MCUSR содержит информацию о событии предшествующем сбросу.
рис.1. Схема формирования сигнала RESET для MK AVR фирмы Atmel.
И так возьмем эту собаку в оборот и не станем "дергать ее за цепь" возвращая на место преждевременно - пусть срабатывает как и положено через интервал Twdg который к слову достаточно гибок и может настроиться отдельным делителем на разные интервалы (см. рис.2).
рис.2. Пределитель для "сторожевого пса" MK AVR фирмы Atmel.
Таким образом WATHCDOG будет таймером задатчиком интервала работы основного таймера издающего тональный сигнал. Надо заметить что у данного метода будет один не очень существенный но заметный на слух недостаток - так как WATHCDOG именно сбрасывает МК, то состояние всех портов, в том числе и порта используемого для формирования тонального сигнала будет сбрасываться в логический ноль. Практически это означает, что с определенным периодом задаваемым таймером WATCHDOG будет происходить срыв внутри периода генерации на время восстановления. Время восстановления конечно не значительное, но ухо все равно будет слышать срывы из за их периодичности. На качество инструмента аля "дверной свисток" влияет не сильно :) Можно окончательно избавиться и от этого изъяна отключив WATCHDOG в процедуре обработки прерывания Timer0 (тонального сигнала), тогда интервал работы тона будет слегка варьироваться на половину периода, но никогда не будет обрываться внутри периода тональной посылки. Мне показалось что борьба за чистый и незамутненный звук инструмента достойного Амати, не так уж и важна.
Само собой мелодию надо хранить в виде записи последовательности ДЛИТЕЛЬНОСТЬ, ТОН в памяти программ. Кроме того необходимо отлавливать прерывание от внешнего источника (дверной кнопки) и осуществлять старт проигрыша сигнала. После проигрывания сигнала вполне допустимо уложить контроллер в летаргический сон - дабы минимизировать потребление (а вдруг проще будет менять батарейки чем возиться с источником питания?).
Рис.3. Схема электронного музыкального многотонального программируемого дверного звонка.
Конечно писать программу для такого устройства на Си можно, но невероятно глупо - ибо чего там писать то?
Исходный текст программы на ассемблере AVR.
P.S. Расширение этого устройства может быть весьма забавным - например добавление к имеющимся возможностям атаки звука или вариации звука по громкости в зависимости от установки пользователем. Но это уже совсем другая история.
Рис.4. Автопортрет дверного звонка.
Используемая литература:
1. ATTiny11-ATTiny12 Atmel datasheet.
Эти чарующие гармоники прямоугольного сигнала в громкоговорителе ;)
ОтветитьУдалитьДа-да! Этот "пердеж", пардон стон у нас песней зовется :) Так напоминает времена 86РК и ZX-Spectrum! Кстати для твоих робо-платформ не сгодится?
ОтветитьУдалитьА, может и пригодится, для леденящего душу боевого вопля робота :)
ОтветитьУдалитьТы в дополнение к автопортрету оцифруй десяток секунд этой песни и выложи в OGG формате? Чтобы иметь представление
Виталий я бы с удовольствием, но не представляю как втиснуть в блок что то кроме видео или изображения.:) Может ты подскажешь?
ОтветитьУдалить