Представленное устройство не слишком рентабельно для серийного производства, но представляет собою весьма неплохой пример «плотного» использования микроконтроллера. Идея родилась после того как в автомагнитоле украли морду. Захотелось использовать встроенное радио и микросхему регулировок громкости и тембра TDA7407. К сожалению, оживить радио от Kenwood KDC-2092 не удалось, тогда было решено использовать плату радио-тюнера от компьютера (отпилив ненужное).
1. Радио – управление по 3 проводам (DATA, Clock, Write Enable), плюс вывод моно/стерео (система команд и прочее в PDF от TEA5757H), учитывать надо только то, что для ввода в тюнер надо использовать «реальную частоту» +10,7 МГц.
2. Регулятор громкости и тембра TDA7407D – управление по шине I2C (система команд и прочее в PDF)
3. Термометры DALLAS. Поддерживается до 8 термометров (отобразить показания можно только двух).
Для вывода изображений на графический индикатор используется микросхема FLASH памяти AMD29F010B можно использовать и AT29C512 с вдвое меньшим объемом памяти. Программирование осуществлялось программатором WillemProg.
По адресу 0000-00FF расположены все команды необходимые для работы индикатора. По остальным адресам необходимые изображения.
Был использован графический индикатор Powertip PE12864URT-003-IY1 со встроенным контроллером ST7565. Знаки на экране организованы следующим образом: 128 колонок на 8 страниц ("больших" строк), каждая страница 8 точек в высоту, группа из 8 точек в одной колонке описывается восьмизначным двоичным числом. Итого: 8*128=1024 числа требуется для формирования одного экрана. Все графические изображения, текст, и цифры были нарисованы собственноручно в Adobe PhotoShop 7.0 и «оцифрованы» вручную (тяжелая работа, но, к огромному сожалению, так и не нашел программы способной это сделать), затем превращены в прошивку для микросхемы Flash-памяти.
Программа для микроконтроллера написана на AVR Assembler (в AVR Studio 4.12). И имеет нижеприведенную блочную структуру.
Основной переменной является счетчик нажатия кнопки «Select» (Butt0, прерывание INT0). В зависимости от этого числа программа преступает к выполнению соответствующей подпрограммы.
Управление часами осуществляется при помощи трех кнопок: «Select» и «+»/«-». Кнопкой «Select» выбирают необходимы режим, кнопки +/- меняют соответствующий параметр (Selector12).
Режимы работы устройства следующие (цикл):
1. Часы
2. Регулировка громкости, низких, средних, высоких частот.
3. Фиксированные настройки тюнера (6 шт.), поиск станции. (запоминание новой станции осуществляется в выбранный номер настройки при выходе из этого меню)
4. Установки часов, будильника, яркости свечения индикатора, вкл./выкл. Будильника.
5. Полное отключение дисплея с сохранением работы остальных частей устройства.
6. В режиме часов при нажатии +/- отображаются состояния двух термометров.
То что будильник взведен отображается на экране тонкой полоской под цифрами часов. После срабатывания будильника громкость плавно нарастает. Нажатие кнопки «Select» в это время приводит к выключению радио. Будильник при этом переводится на 7 минут вперед. Через 7 мин он опять включается. Выключить его можно последовательно нажав кнопки: «Select» - «+» - «-» - «Select». На следующий день он опять сработает в тоже время (изначальное, без учета +7 мин, даже если их было несколько). Выключить его можно окончательно только через меню.
Все основные параметры (будильники и константы работы с различными устройствами) хранятся в EEPROM микроконтроллера. Так что выключение питание не вызовет серьезного сбоя. После пропадания питания (RESET) – показания будильника грузятся из EEPROM – а показания часов приравниваются к показаниям будильника, что вызывает срабатывание будильника и радио.
Предусмотрена поддержка работоспособности при отсутствии питания. Микроконтроллер регулярно проверяет напряжение на выводе PB7 (контролируется супервизором питания DD10), если там единица, то все ОК, при обнаружении 0, микроконтроллер переходит в режим работы без индикатора, все периферия отключается. Питание для микроконтроллера берется от батарейки (или аккумулятора). Вариант с использованием батарейки не был опробован автором.
На микросхеме DD7 собрано устройство подавления дребезга кнопок. Сделано это было для максимального уменьшения времени выполнения прерываний INT1,INT2, чтобы не ухудшать точность хода часов. При желании борьбу с дребезгом можно передать микроконтроллеру и убрать DD7.
Для предотвращения сбоев и экономного использования процессора в течение каждого секундного цикла работы он примерно 50% времени находится в спящем режиме. Для блокировки/разрешения работы усилителя и микросхем термометров используются ключи (VT2, DD6 соответственно) на которые непрерывно должно подаваться управляющее напряжение. А в спящем режиме все выводы Atmega8515 переводятся в состояние Z. Для устранения этого эффекта используется триггер DD5, который «помнит» состояние соответствующего входа независимо от перехода микроконтроллера в состояние Z.
И, наконец, фотографии работающего устройства в разных режимах:
Автор: Владислав Шаповалов
Архив для статьи "Продвинутые радио-часы/будильник с термометрами на графическом LCD" | |
Описание: Файлы прошивок для микроконтроллера и Flash памяти | |
Размер файла: 16.38 KB Количество загрузок: 1 212 | Скачать |
Комментарии
Вопрос: фьюзы для мк какие устанавливать надо?
Low: 0xED, High: 0xD9
Mega8515L можно использовать с этой прошивкой? И фьюзы для 8515L?
СПАСИБО!
По DD6: чем заменить? Может полевой тр-р с логическим упр-м.
Спасибо!
Приветствую. Можно, фьюзы такие же Low: 0xED, High: 0xD9
Не знаю почему автор использовал твердотельное реле DD6, а не обычный ключ на транзисторе. Аналоги реле DD6: PRAC37S, KAQW212S, AQW212S
Благодарю за ответы!
Если возможно в посте #1 отредактировать ник на CHERUB, там опечатка.
Спасибо.
Вопрос по распайке DD9 и DD10:
-DD9 на "/RES" МК?
-DD10 на "(RB) РВ7" МК и "/RES" ЖКИ?
Спасибо!
Здравствуйте.
DD10(R)-DD1(PB7)-LCD(Res),
DD9(R)-DD1(Res)
Благодарю за ответ. По сути адресация та же, что и содержится в вопросе.
По DD5: микросхема д.б. типа CD4013A (561ТМ2). Вывод C2 в таком триггере не может быть жёстко на "0". Первый D-триггер работает, т.к. там C1 подтянут на "1". Необходимо УТОЧНЕНИЕ схемы !!!
Спасибо.