Электронные часы с будильником на микроконтроллере AT90S2313-10PI
Аннотация
В данном проекте описаны электронные часы с будильником, выполненные на AVR - микроконтроллере типа AT90S2313-10PI. Часы имеют светодиодный индикатор отображения текущего времени и встроенный аккумулятор для поддержания хода при пропадании сетевого напряжения, что очень актуально в условиях непрекращающегося экономического кризиса. Устройство содержит минимум комплектующих и имеет несложную электрическую схему. Часы были испытаны автором на протяжении нескольких месяцев, что показало их надежность и работоспособность.
Краткое описание устройства часов
Предлагаемый вашему вниманию проект был выполнен "по ходу дела" при освоении автором микроконтоллеров семейства AVR фирмы ATMEL. Один из этих "жучков" и был использован при разработке часов. Выбор именно AT90S2313-10PI объясняется широкой доступностью и невысокой ценой этого кристалла, а также наличием в нем памяти программ объемом 2 КБ и программно реализованного стека.
На рисунке представлена принципиальная электрическая схема часов. Как видно, микроконтроллер является основной и единственной микросхемой, используемой в данной разработке. Для задания тактовой частоты контроллера используется кварцевый резонатор на 10 МГц, но управляющую программу очень легко переделать и для резонаторов с другими частотами. В качестве устройства отображения использованы два индикатора красного цвета свечения с общим анодом, каждый индикатор состоит из двух цифр с десятичными точками. Цифры имеют отдельные аноды. Можно применить любые индикаторы с общим анодом, лишь бы ток сегмента не превышал 20 миллиампер и каждая цифра имела бы собственный анод. Рекомендуется выбирать индикаторы с большими цифрами, тогда часы будут хорошо видны в темноте.
Индикация текущего времени осуществляется динамически, в данный конкретный момент времени отображается лишь одна цифра, что позволяет значительно снизить аппаратные затраты. Происходит это так. Аноды каждой из четырех цифр обоих индикаторов являются раздельными, что позволяет в данный момент времени подключить к источнику питания только один анод и отобразить одну цифру. Для этого часы имеют четыре транзисторных кюча, выполненных на транзисторах типа КТ361Е (VT1 … VT4), и резисторах (R2 … R9). Ключи управляются микроконтроллером, причем соответствующий ключ открыт, если на выводе контроллера присутствует логический ноль. Одноименные сегменты всех четырех цифр соединены вместе и через токоограничивающие резисторы R21 … R27 подключены к выводам порта "B" (выводы PB.0 … PB.6). Десятичная точка не используется, она "принесена в жертву" добавленному в часы будильнику и всегда выключена. Управляющая программа один за другим подключает цифры к источнику питания , и одновременно на соответствующие выводы порта "B" выставляется код отображаемой цифры. Поскольку сканирование индикатора происходит очень быстро, мерцание цифр становится незаметным.
Для перевода минут, часов и установки будильника используются кнопки S1 … S3. Обновление показаний индикатора происходит каждую секунду. При нажатии более чем на одну кнопку управляющая программа игнорирует нажатие кнопок. Для установки будильника следует нажать кнопку "ALARM" и подождать двукратного звукового сигнала (не более секунды) для входа в режим будильника. Для перехода обратно в режим часов кнопку "ALARM" нужно удерживать до подачи однократного сигнала. В качестве выхода для сигнала будильника используется вывод PB.7 порта "B", а в качестве усилителя - схема на транзисторе VT5. В роли сигнализатора применен звонок от импортных часов сопротивлением около 15 Ом. Для отключения будильника используется выключатель S4 (лучше всего - кнопка с фиксацией).
Питаются часы от стабилизированного источника напряжением 6 Вольт. Причем индикация работает только при работе часов от сети. Ток потребления при наличии индикации - около 80 мА. При работе от аккумуляторов (четыре аккумулятора типа Д-0,26) индикация отключается, но часы продолжают идти и функционирует будильник . Диоды D5 … D7 обеспечивают правильное использование источников питания при работе от сети и от аккумуляторов, сами же аккумуляторы при работе часов от сети заряжаются через резистор R10. Поскольку при отсутствии индикации часы потребляют ток около 6 мА, предложенный "UPS" способен поддерживать работу часов более суток, что чрезвычайно удобно. Лично я не люблю наводить часы всякий раз после броска сетевого напряжения . Кстати, это явилось одной из движущих сил данного проекта.
Краткое описание управляющей программы
Управляющая программа часов написана на Ассемблере.
Сразу после включения часов программа разрешает прерывания, настраивает порты контроллера соответствующим образом и устанавливает указатель стека на старшие адреса внутренней памяти данных (стек растет "сверху вниз", как в семействе 80X86). Далее программа переводит устройство в режим часов, настраивает будильник на 6 часов 55 минут, после чего запускает цикл сканирования индикатора и цикл счета времени. Вся дальнейшая работа программы состоит в реализации пустого цикла, из которого ее выводят запросы прерываний от таймеров - счетчиков и в который она снова возвращается после завершения обработчика.
Основой программы являются два обработчика прерываний от таймеров. Обработчик прерывания от таймера-счетчика Т/С0 используется для динамической индикации, а обработчик от таймера-счетчика Т/С1 считает время. Естественно, можно было бы организовать сканирование индикатора и без привлечения прерывания от таймера и применить более дешевый кристалл, например, AT90S1200. Но непривычность работы с аппаратным стеком (автор много лет до этого занимался 80X86), недостаточный объем памяти и незначительное отличие между этими контроллерами в цене говорят явно не в пользу такого решения.
Обработчик счета времени вызывается каждую секунду. Он является более приоритетным, чем обработчик сканирования индикатора. В этом обработчике также выполняется определение состояия клавиш часов и при необходимости - перевод времени, переход в режим часов/будильника а также проверяется равенство текущего времени установкам будильника. Обработчик сканирования индикатора вызывается около 1600 раз в секунду и по очереди отображает каждую из цифр текущего времени, то есть каждая цифра появляется на индикаторе примерно 400 раз в секунду. Кстати, изменяя в разумных пределах частоту сканирования, легко регулировать яркость свечения индикатора.
Дальнейшие пояснения работы программы Вы сможете получить, просмотрев ее текст с подробными комментариями.
Резюме
К сожалению, мне не удалось численно определить точность хода часов. Могу сказать лишь одно - за месяц часы отстали примерно на минуту, что, согласитесь, вполне приемлемо для устройства такого класса …
Вы можете загрузить следующие файлы, относящиеся к проекту: prog.bin — двоичный код управляющей программы 2313def.inc — Inc-файл для процессора AT90S2313 clock_10.a90 — исходник управляющей программы clock.zip — разработка в формате PROTEL