О часах

AVR
В последнее время в больших количествах мне стали попадаться на глаза статьи об изготовлении электронных часов. Я думал, что в связи с обрушившимся на нас разнообразием китайских поделок, интерес к этой теме угас уже лет как 10 – 15, ан, нет – он периодически всплывает, и во все более и более экзотическом виде.
Сами часы представляют из себя обыкновенный счетчик импульсов, поступающих от стабильного генератора и отображающий их в формате времени (обычно часы – минуты). Я не буду говорить об отображении – тут каждый изгаляется как может и как подсказывает ему его фантазия и совесть. Я хотел бы сказать пару слов о самом счетчике.
В качестве такового, в последнее время, чаще всего используют либо микроконтроллер с частотой кварцевого резонатора в несколько мегагерц, либо микросхему часов, как, например DS1307 — в этом случае контроллер используется для управления и отображения времени. Обычно специализированные микросхемы часов применяют в случае, когда необходимо обеспечить сохранение времени при пропадании питающего напряжения и использовании маломощной батарейки в качестве резервного источника питания. Но многие микроконтроллеры, при работе с часовым кварцевым резонатором (32 768 Гц) имеют ток потребления не намного больший, чем специализированные микросхемы и их применение может значительно упростить устройство. Я сейчас говорю о контроллерах AVR – ATtiny24, 25, 26 и ATmega8. Они допускают работу с низкочастотным кварцевым резонатором, содержат по два таймера-счетчика, а два из этих контроллеров – ATtiny26 и ATmega8 – имеют подключаемые внутренние конденсаторы. Кварцевый резонатор к ним подключается без использования других деталей. Такие часы могут иметь максимально простую схему при нормальном выполнении своих функций.

На рисунке приведена схема часов на микроконтроллере ATtiny26. Она, кроме контроллера, содержит четырехразрядный светодиодный семисегментный индикатор (применена динамическая индикация с частотой прерываний 256 Гц, мигающая точка используется для контроля работы часов), восемь токоограничивающих резисторов, блокировочный конденсатор, две кнопки управления. И все. Часы вполне работоспособны, все файлы проекта (на ассемблере) можно скачать ниже. Потребление тока в рабочем режиме – 20 мА, при этом яркости индикаторов вполне хватает. Программа была написана за пару часов для проверки проекта, недостаточно прокомментирована и, наверняка, неоптимальна. В то же время она настолько проста, что проблем разобраться в ней не будет. Желающие могут ее улучшить и применить в своем устройстве. Из-за малого количества выводов микросхемы удалось подключить только две управляющие кнопки. Кнопка Кн1 осуществляет рестарт часов. При инициализации осуществляется очистка всех регистров, кроме регистров часов и минут. Они сначала проверяются на «правильность» – часов должно быть меньше 24, а минут – меньше 60. Если условие не выполняется – эти регистры тоже очищаются и часы начинают идти с 0:00. Если все нормально, то минуты обнуляются, а время округляется до ближайшего часа – вверх или вниз. При нажатой кнопке Кн2 каждую секунду время прибавляется на одну минуту, так длятся 15 секунд, после чего вместо минут начинают прибавляться часы. При отпускании Кн2 более, чем на 1 секунду и повторном нажатии прибавление минут, а потом и часов повторяется. Алгоритм отвратительный, но для одной кнопки за время, пока писал программу, больше ничего не придумал. А применять АЦП для размножения кнопок не захотелось. Тем более, что для снижения потребления все ресурсы контроллера надо было бы отключить – АЦП, компаратор, Watchdog.
Для того, чтобы можно было установить больше кнопок, надо применить ATmega8. У него на 7 выводов больше и с подключениями было бы проще. Но в этом проекте он не понравился мне своими размерами.
Кстати, если бы был один лишний вход (лучше вход компаратора), можно было бы сделать резервирование питания – напряжение от источника подавать через диод (лучше Шоттки), параллельно конденсатору С1 поставить ионистор, например, на 1 Фараду, а свободный вход контроллера подключить до диода. Тогда, если питание выключится, на этом входе напряжение упадет до 0 и контроллер сможет выключить индикацию (вплоть до переключения выходов на вход). Ток потребления будет микроамперы, максимум десятки микроампер (тактовая частота всего 32 кГц), и часы смогут нормально проработать несколько часов. (Идея родилась во время написания статьи, нужна проработка).

Если индикацию делать на регистрах 74HC164, то часы можно сделать на ATtiny24. Только при этом контроллере кварц должен использоваться с конденсаторами 27 пФ.
Зато частоту прерываний в такой схеме, можно снизить до 2 – 4 Гц, что сильно повысит экономичность схемы.

Еще одни часы – на ATtiny25…

Их история такова.
Моему отцу 95 лет. Он в здравом уме, твердой памяти, но возраст – не тетка. Стал он плохо видеть – дистрофия сетчатки. То есть отличает темное от светлого, видит смутные контуры, и только. Он очень любит гулять. Во время прогулки ему нужно ориентироваться во времени – если стемнеет, дойти до дома будет гораздо сложнее – фонари, машины – все путает. Я купил ему китайские говорящие часы, но он ими пользуется только дома – конструкция такова, что можно легко нажать на любую кнопку и сбить время. А переставить их в другой корпус мы не захотели. Соответственно, я сделал ему специальные часы. В них индикатором является пьезопищалка.
Элемент управления, доступный отцу – кнопка Кн1. При нажатии на нее часы начинают пищать – сначала с частотой 4 кГц количество пятнадцатиминуток (четвертей), потом с частотой 2 кГц количество часов. Такой принцип индикации был выбран потому, что отец сказал, что он никуда не спешит и точности в 15 минут ему вполне достаточно.
Например, если время 3 часа 12 минут, то будет один сигнал 4 кГц и 3 сигнала 2 кГц. Цикл – 12 часовой – ночь и день он отличает.
В этих часах выключены все источники потребления – АЦП, компаратор и прочее. Они все время спят и просыпаются по прерыванию таймера два раза в секунду. Ток потребления я не мерил, теперь это сделать не так просто. Но с момента изготовления они работают от одного комплекта батареек уже 9 месяцев, пока все нормально.
Кнопка Кн1 тоже работает по прерыванию.
Установка часов осуществляется этой кнопкой при замкнутом потайном выключателе Кн2. В этом случае при первом нажатии на кнопку Кн1 после замыкания Кн2 производится обнуление минут и округление часов до ближайшего часа, а каждое последующее нажатие – увеличивает количество часов на 1. Нажатия сопровождаются сигналами времени. После установки времени Кн2 необходимо разомкнуть.
Как видно, установку можно производить только в определенные моменты времени – при целых часах, но это приходится делать очень редко (Часы упали, батарейный отсек открылся и батарейки высыпались. После этого его замотали изолентой).

Файлы проекта часов на ATtiny26 narod.ru/disk/18648119001/Clock_26.rar.html

Файлы проекта часов на ATtiny25 narod.ru/disk/18648220001/Sound_Clock.rar.html

P.S. Забыл сказать о программировании контроллеров с низкочастотным кварцем.
Программы я записывал с помощью программатора PonyProg. После программирования Fuses программатор перестает видеть контроллер, поэтому ему нужно изменить параметр SPIBusSpeed=NORMAL на VERYSLOW или ULTRASLOW (я использую первый) в файле PONYPROG2000.INI. При этом программатор работает нормально и с высокочастотными кварцами, только, по-моему, чуточку медленнее. После программирования параметр нужно вернуть в NORMAL (хотя однажды я об этом забыл на целую неделю и все работало, как обычно).
Fuses нужно выставить как для низкочастотного кварца и подключить внутренние конденсаторы.
  • -1
  • 10 июля 2011, 21:05
  • mzw

Комментарии (39)

RSS свернуть / развернуть
Для меня самая большая проблема в девайсах — заставить себя сделать корпус, покажешь фотографии часов, которые получились?
+2
Где-нибудь через неделю. Когда буду у отца.
А корпус использовал вот такой www.chipdip.ru/product/bh341usb.aspx — выкинул изнутри плату со стабилизатором и на ее место поставил свою.
0
Ок, спасибо!
0
У меня в конце 90-х были наручные говорящие часы. Может таки поискать? Должно быть удобней. Или можно и самому сделать…
0
Можно. Но он пользуется и доволен.
0
По кнопкам в принципе несколько решений есть.
1) Добавить диоды по количеству кнопок и опционально — резистор подтяжки (если индикатор с ОА), тогда можно использовать сигналы выборки разрядов для выборки строк матрицы кнопок. Поскольку вход в наличии всего один — то будет матрица на 2-4 кнопки.
2) Заюзать АЦП. На потреблении это заметно не скажется, а в спячке на резервном питании за кнопками следить незачем. Можно сделать как в вогоплеере — там при нажатии любой из АЦП-кнопок открывается транзистор и подает сигнал прерывания на проц.
3) Поставить TSOP и наслаждаться часиками с пультом (правда, в этом случае стоит делать большие часики, а значит, потребуются большие индикаторы и внешние ключи). Либо управлять ими с компа.

Чуть хуже с контролем наличия питания. Проще всего включить RSTDSBL, но нужен HV программатор. Хотя он не сказать чтоб сильно намного сложнее обычного. Еще можно попытаться мультиплексировать датчик напряжения с одной из имеющихся линий, скорее всего сегментной. Но над этим надо подумать)

Еще одно решение — взять (лучше большой) ЖКИ от часов (или другой подходящий, от мультиметра подойдет вроде), халявный I2C драйвер для него из NXP I2C Industrial Promo Pack и МК-осьминожку.
0
  • avatar
  • Vga
  • 11 июля 2011, 03:33
Первый и второй пункты я рассматривал. В первом — увеличивается количество деталей, второй в этой схеме — просто некрасиво. Ну а третий пункт — выпендрежная экзотика.
Тот вариант как у меня близок к тому, как устанавливаются часы у меня в машине. Только нужно будет сделать еще одну градацию скорости установки — десятки минут. Тогда будет удобнее.
0
Первый ИМХО самый оптимум, два диода — это мелочи. Хотя я бы и голые часы не делал. Хотя бы с будильником. А тут уже надо вменяемое управление.
Насчет TSOP-ки я кстати вполне серьезно) Все подумываю выкинуть из своего витека LM-как-ее-там и поставить МК со всякими фишками, вроде нескольких будильников, таймеров, управлением с ПДУ (иначе неудобно оные ставить).

Алсо на одной кнопке можно сделать и другую логику.
Можно сделать переключение работа->установка часов->установка минут по длинному нажатию, автоинкремент с частотой в герц — очень медленно. У ванны я сделал 3Гц и то раздражает медлительностью.
Можно сделать немного иначе. Длинное нажатие переключает режим и затем, через еще полсекунды начинает быстрый автоинкремент. Короткие нажатия же изменяют значение на единицу, но в обратном направлении (потому как при автоинкременте гораздо проще промотать лишку, чем меньше).
А вторую кнопку
1) Оставить ресетом и спрятать под дырочку
2) RSTDSBL и следить за напругой
3) RSTDSBL и будильник на нее
0
Согласен. Просто мне часы не нужны (в каждой комнате по 1-2) а HV программатора нет (правда есть AVR-Dragon, но я пока не разбирался, как его можно использовать для этого), а убивать контроллер не хотелось. А так я бы поставил его следить за напряжением (лучше поменять с PA7 — это вход компаратора. А на этот вывод вывел бы мигающую точку).
0
А вот кстати еще вариант освобождения ножек без лишних деталей. Правда, ценой яркости.
0
Любопытная идея. Вроде должно работать. Еще внимательно посмотрю и надо попробовать.
Только не понял твоего замечания о яркости.
0
Чем больше смоьрю, тем больше нравится. Красивая идея.
Сегмент светится — 1,
Сегмент не светится — третье состояние (просто переключаем Pin па вход и отключаем подтягивающий резистор, хотя он 100 кОм-может быть и не помешает),
отображаемое знакоместо — 0.
Вроде так.
Спасибо за идею.
0
Оно работает в режиме поразрядно-посегментной индикации. Т.е. активируется разряд и затем перебираются сегменты. Так сделано из-за того, что в цепи разряда тоже стоит резистор. Хотя, несколько усложнив разводку платы (беря сегменты после резисторов, а разряды до) это, наверное, можно победить.
0
Попробую
0
Еще есть Charlieplexing
0
Это как?
+1
Тоже самое, что и выше — en.wikipedia.org/wiki/Charlieplex
пример — www.radioland.net.ua/sxemaid-434.html
0
Это я видел. Но нужно управлять цифровыми индикаторами. Хотя можно попробовать скомбинировать.
0
Кстати да, если присмотреться — по моей ссылке чарлиплексинг и есть. Такая же матрица встречно-параллельно включенных диодов.
0
Ну и главное — в текущем виде уж больно неюзабельно. Во-первых, необходимо решить вопрос резервного питания. Ибо от батарейки их не прокормишь (разве что включать индикатор по нажатию кнопки, но это пригодно разве то для карманных часов). Во вторых, их довольно неудобно ставить, чему бутгурта добавляет сетевое питание без бэкапа.
А это значит, что в любом случае придется извращаться с мультиплексированием выводов. Ну или уходить на более многоногий МК, но они по большей части жирноваты для такой задачки.
0
Я думал, что в связи с обрушившимся на нас разнообразием китайских поделок, интерес к этой теме угас
Так и есть. Сейчас интерес сместился в сторону сверхточных часов реализованных на мк или использующих его как вспомогательный блок. Есть идея создать часы на STM8 с внешним кварцем и встроенным в этот мк термодатчиком для коррекции хода часов. Для обеспечения равных тепловых условий работы термодатчика и резонатора, конструкцию поместить в герметичный корпус, при таком решении, фактически отпадает необходимость в термостатировании резонатора и нужно лишь знать зависимость ухода частоты резонатора от температуры.
0
Зачем? Куда лучше сделать синхронизацию через NTP.
0
Что за NTP имеется ввиду?
0
Network Time Protocol ЕМНИП. Та самая хрень, через которую по инету винда время синхронизирует. И не только она.
0
Можно и по gps сверяться но все эти прибамбасы уже сами по себе тянут на отдельный проект :)
0
Собственно, когда я писал статью, я хотел рассказать о максимально простых вариантах, без «лишних сущностей». А все остальное — это, действительно, отдельные проекты.
+1
Алсо
1) Почему второй проект на тини25? 13-я ж вроде доступней.
2) первый на 2313 что-то мешает портировать? Заодно и два пина дополнительных.
0
  • avatar
  • Vga
  • 11 июля 2011, 21:03
13 не работает с кварцем.
Для 2313 не указана возможность работы с низкочастотным кварцем. Так что возможны проблемы с запуском или стабильностью.
0
Гм. Ну, можно 2313 гонять и на ВЧ кварце. Просто постоянно отправлять поспать в режиме резервного питания. В активном, по понятным причинам, потребление МК никого не волнует.
0
На ВЧ кварце точность будет меньше.
Да и таймеры в тини2313 засыпают вместе с МК.
0
Почему меньше?
0
У них вроде как точность ниже, чем у «часовых» кварцев. Хотя китай он и есть китай. Хотя, хз.

У меня часы с часовым кварцем были… с ВЧ не было.
0
Насчет точности не знаю. У китайских часовых кварцев она бывает в районе 10-3, по крайней мере у меня было несколько часов, уходивших на 40 секунд в сутки.
Но погрешность кварца можно скомпенсировать, да и указывается частота обычно до 5-6 знака, что ЕМНИП подразумевает соответствующую точность.
А стабильность у них вроде у всех 10-5 — 10-7, в зависимости от термостабилизации и уплывания параметров схемы генератора.
Главный плюс часового кварца — экономичность. Меньше цепочка делителей, меньше частота переключений.
0
И для стабильности кварц должен работать все время. Поэтому при применении ВЧ кварца жрать будет намного больше (по идее — прямая пропорция по частоте. Если на 1 МГЦ — 700 мкА, то на 32 кГц — в 30 раз меньше — 23 мка.
0
Ну есть же еще МК с асинхронным таймером. Мега16 например, стм32. Те могут работать на более высокой частоте, но почти всегда спать, а тикать будет только часовой. На радиокоте кстати была схемка часиков на меге16 с кучей функций и кварцем на TOSC. Тока они по габаритам с кроносом конкурируют)
Поэтому при применении ВЧ кварца жрать будет намного больше (по идее — прямая пропорция по частоте.
Я именно про это, да.
0
Это голимые китайские кварцы. Ставишь нормальный (гейеровский, например) и все ок.
0
Здраствуйте прошу вашой помощи в правельной зборки часов на тини26, а саме как виставить фюзы.
часи соблал но ани идут както очень быстро наче сикундомер и ещо цыфры в дзеркальном отображении!!! програмирую пони-рог.
С уважениям radi.
0
  • avatar
  • radi
  • 13 ноября 2012, 21:08
Нужно запрограммировать CLKSELx = 1001 — для низкочастотного кварцевого генератора и CKOPT = 1 — для подключения внутренних конденсаторов. Остальные — по умолчанию.
Цифры в зеркальном отображении — скорее всего у индикатора перепутаны выводы.
0
здраствуйте. я так понял, поставил галочку напротив SUT1, CKSEL2, CKSEL1, BODLEVEL.галочка=0.
в пони прог, а МК заблокировалса .....:( подскажыте как всетаки нада виставить фюз осталась одна тини26.
0
  • avatar
  • radi
  • 14 ноября 2012, 22:47
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.