Комментарии 46
НЛО прилетело и опубликовало эту надпись здесь
Спорный вопрос, но уж делая плату, я бы поставил на нее и МК, тем более, что насколько я вижу, ардуинка у вас с DIP-вариантом атмеги в панельке, то есть никаких проблем впаять уже зашитую микросхему, не морочась с программированием на плате.
Ну, в том-то и дело, что я не был уверен, что я не буду перепрограммировать. Последние изменения в код я внёс уже после того, как припаял всё (нашёл один небольшой косяк в коде). Постоянно перепаивать не будешь, да и к тому же я не исключал добавление новых фич.
Фи! Собирать часы на логических элементах как пушкой по воробьям. Было бы гораздо интересней, если бы часы собирались на транзисторах или лампах.
Переключение 12/24 на бинарных часах, это оригинально! Я не сразу понял в чем будет разница, пока не заметил отдельностоящую пару светодиодов. Хотя в любом случае непонятно зачем это переключение в устройстве конструируемом не для массового рынка.
А, туплю, разница-то будет. Просто для этого можно было бы задействовать светодиод старшего разряда. В общем, первая часть комментария не имеет смысла.
Ну, на самом деле я долго думал, делать переключение, или нет. Я его сделал в первую очередь потому, что я равнялся на обычные цифровые часы, у которых оно есть. Светодиод старшего разряда я не стал использовать потому, что было бы неочевидно, в каком формате выводится время, если не знать заранее. К тому же светодиоды AM/PM имеют дополнительную функцию в режиме таймера (AM — таймер остановлен, PM — таймер идёт, AM+PM — таймер на паузе).
Всё здорово, кроме применяемой базы компонентов. Одна MAX7219/7221 позволит вам заменить все сдвиговые регистры и токозадающие резисторы. А еще она умеет программно изменять яркость и кучу других приятных плюшек.
Если же говорить о этапе прототипирования, то и тут она сэкономит кучу нервов: чем меньше контактов на такой макетке, тем меньше проблем с ними.
И еще. Ардуина вам тут совсем не нужна. Поставьте atmega328p на плату с часами в такую же цанговую кроватку, из рассыпухи для запуска надо 3 конденсатора, резистор, кварц. А если вам сойдет 8Мгц системной частоты, то просто 1 конденсатор. Наконец RTC можно также реализовать на атмеге, поставив 32.768кГц кварц на ноги второго генератора и по нему тактировать таймер атмеги.
В общем, успехов в доработке)
Если же говорить о этапе прототипирования, то и тут она сэкономит кучу нервов: чем меньше контактов на такой макетке, тем меньше проблем с ними.
И еще. Ардуина вам тут совсем не нужна. Поставьте atmega328p на плату с часами в такую же цанговую кроватку, из рассыпухи для запуска надо 3 конденсатора, резистор, кварц. А если вам сойдет 8Мгц системной частоты, то просто 1 конденсатор. Наконец RTC можно также реализовать на атмеге, поставив 32.768кГц кварц на ноги второго генератора и по нему тактировать таймер атмеги.
В общем, успехов в доработке)
Можно вовсе выбросить отдельный контроллер светодиодов, собрать из них матрицу 6*8, а динамическую индикацию генерировать самим контроллером. Дополнительные транзисторы не нужны — выводов контроллера хватит на запитку светодиодов.
У автора ток на светодиод — 22мА. А у атмеги328 по питанию максимум — 200мА. Так что не хватит(если «в лоб»). Конечно, можно накрутить ШИМ для светодиодов, но получится значительно сложнее. К тому же, тогда придеться вернуть токоограничивающие резистора на плату, а их много. Зачем усложнять себе жизнь, если уже есть хорошие инструменты для решения подобных задач?
Так одновременно будут светить максимум 6 светодиодов, 6*22=132, 132 < 200. 6 резисторов потребуется поставить, разве это много?
(5 В — 2,2 В) / 220 Ом = 13 мА на светодиод сейчас. На синих и белых поменьше, т.к. больше падение напряжения на светодиоде.
Ну и для индикаторных нужд в домашней обстановке при приличных светодиодах обычно можно и 5-7 мА ставить, они яркие, — тогда в 200 мА атмеги вписаться легко.
Ну и для индикаторных нужд в домашней обстановке при приличных светодиодах обычно можно и 5-7 мА ставить, они яркие, — тогда в 200 мА атмеги вписаться легко.
Ну, насколько я понял, MAX7219 и 7221 — это драйверы для матричных светодиодных дисплеев? Мне они не нравятся, таких часов на матричных дисплеях у китайцев хватает.
Насчёт Ардуины не спорю, вполне можно было собрать на голой атмеге, я думал насчёт этого. Но с Ардуиной проще править код, можно легко добавить фичи или вообще задействовать плату для какой-нибудь другой задачи. Постоянно перетыкать атмегу между Ардуино и платой как-то неудобно. А основной плюс отдельного RTC в том, что он благодаря батарейке сохраняет время при выключенной ардуине.
Насчёт Ардуины не спорю, вполне можно было собрать на голой атмеге, я думал насчёт этого. Но с Ардуиной проще править код, можно легко добавить фичи или вообще задействовать плату для какой-нибудь другой задачи. Постоянно перетыкать атмегу между Ардуино и платой как-то неудобно. А основной плюс отдельного RTC в том, что он благодаря батарейке сохраняет время при выключенной ардуине.
На этот драйвер можно и отдельные светодиоды сажать, и матрицу, и семисегментники. Все зависит от того, как запрограммировать. А голая атмега хороша тем, что когда закончится этап отладки кода, то захочется все на одной плате, а не мезонины с проводами...)
Я ещё добавлю про MAX72xx, что у них ток всех светодиодов задаётся одним резистором — поэтому легко регулировать яркость.
Перетыкать всё время не надо, погуглите ArduinoISP. В кратце можно вывести пины для программирования и програмировать так же. Ещё вариант приобрести USBUART и программировать через бутлоадер.
Как красиво разведена печатка, да Вы, батенька, эстет!
>>DS1307
Если нужна точность хода юзайте DS3231 или DS3232
Если нужна точность хода юзайте DS3231 или DS3232
Маленькая подсказка: дорожки на плате можно проводить и по диагонали тоже.
А можно и так...
Бессеточный трассировщик TopoR, отечественная разработка, не имеет аналогов :)
Да, я знаю, я сознательно развёл плату именно таким образом :) Я сначала хотел как раз диагональными дорожками соединить, но потом решил, что дорожки лесенкой будут смотреться интереснее, чем просто набор диагональных дорожек.
А можно узнать во склько вышло производства и доставка плат?
Внимание грабли.
Ты пишешь «проверка RTC-таймера вложена в обработчик таймера на 1/8 секунды.»
Если в момент проверки пропадет питание, то время испортится. Какая вероятность? Я опрашивал 100 раз в секунду и часы сбрасывались часто. После этого переписал алгоритм и стал опрашивать раз в сутки.
Правильное же решение сделать супервизор питания. Перед операцией чтения выполнять замер напряжения питания и только убедившись что оно в норме начинать операцию чтения. И при этом надо немного модифицировать цепи питания, рассчитать на сколько хватит заряда конденсатора,…
Еще у большинства RTC есть выход «1гц». Его можно подцепить на пин контроллера и обрабатывать прерывания от него.
Проблема касается любых RTC. Эти грабли проверены на DS1307, DS3231, PCF2129T, PCF8523.
Ты пишешь «проверка RTC-таймера вложена в обработчик таймера на 1/8 секунды.»
Если в момент проверки пропадет питание, то время испортится. Какая вероятность? Я опрашивал 100 раз в секунду и часы сбрасывались часто. После этого переписал алгоритм и стал опрашивать раз в сутки.
Правильное же решение сделать супервизор питания. Перед операцией чтения выполнять замер напряжения питания и только убедившись что оно в норме начинать операцию чтения. И при этом надо немного модифицировать цепи питания, рассчитать на сколько хватит заряда конденсатора,…
Еще у большинства RTC есть выход «1гц». Его можно подцепить на пин контроллера и обрабатывать прерывания от него.
Проблема касается любых RTC. Эти грабли проверены на DS1307, DS3231, PCF2129T, PCF8523.
на ds1307 выход SQW/OUT дает синхру нужной частоты (1гц, 4, 6, 32 кгц)
Хм, интересно, не знал. Пока ещё ни разу не наступал. Я сначала тоже думал переделать синхронизацию с RTC, например, на 1 раз в час, а в остальное время тикать родным резонатором, но это было бы чревато другими багами, т.к. код был изначально написан в расчёте на то, что время изменяется с разрешением в 1 секунду, а здесь бы появилась возможность отката на несколько секунд назад/вперёд в момент синхронизации, которую нужно было бы корректно обрабатывать. Поэтому я выбрал наиболее простой вариант решения проблемы. В принципе, раз в полсекунды вполне хватило бы, но для этого нужно было бы отдельный таймер писать. На платке RTC-модуля, который у меня выведены только питание с землёй и два пина I2C, так что прицепиться к пину 1 Гц достаточно сложно.
Последователям на заметку — использовать чистый сдвиговый регистр типа 77HC595 неразумно, тк. он всего лишь восьмибитный и требует по резистору на каждый светодиод. Сейчас существует масса микросхем-драйверов LED, которые, являются и сдвиговыми регистрами, и стабилизаторами тока LED одновременно. Лично я использовал stp16cp05, который поддерживает 16 светодиодов, и тербует всего 1 резистора для настройки тока по всем выходным ногам сразу. В принципе подобные микросхемы(из тех, что я встречал) поддерживают до 28 светодиодов.
но при этом не потребуются внешние резисторы для подавления дребезга
Подтягивающие резисторы совсем не для подавления дребезга используются, что внутренние, что внешние.
Да, я знаю, что они не для подавления дребезга предназначены. Просто в данном случаи их можно было использовать в этих целях. Мне очень не хотелось добавлять ещё 6 внешних (не подтягивающих) резистора для кнопок на плату, и так 25 резисторов вышло на плате.
Резисторами дребезг не давится ни в каком случае вообще.
Либо RC-цепочка (для надёжности — с триггером Шмитта после, но в общем и без него будет работать), либо программное подавление: если кнопки опрашиваются циклом — опрашивать, скажем, раз в 100-200 мс (дребезг длится несколько десятков миллисекунд). Если нажатие генерирует прерывание, то желательно делать аппаратное подавление, иначе после каждого нажатия контроллер будет получать лавину прерываний.
Либо RC-цепочка (для надёжности — с триггером Шмитта после, но в общем и без него будет работать), либо программное подавление: если кнопки опрашиваются циклом — опрашивать, скажем, раз в 100-200 мс (дребезг длится несколько десятков миллисекунд). Если нажатие генерирует прерывание, то желательно делать аппаратное подавление, иначе после каждого нажатия контроллер будет получать лавину прерываний.
Хм, интересно. Спасибо, буду знать. Видимо, это распространённое заблуждение, т.к. я в нескольких местах читал, что резистор на кнопку вешается именно для этого. Правда, тогда остаётся непонятным, почему у меня дребезг никак не проявляется. Программного подавления нет и опрос кнопок идёт напрямую из loop, который выполняется довольно быстро (если не срабатывает таймер с тяжёлым телом).
Кнопки хорошие (тактовые — вообще одни из самых приличных с точки зрения дребезга). При хорошей кнопке дребезг вполне может миллисенкуд в пять укладываться, совет опрашивать раз в 100-200 мс — это, во-первых, для довольно дрянных кнопок, во-вторых, исходя из того, что при такой задержке реакции человек эту задержку, как правило, ещё не замечает.
А требование RC-цепочки довольно очевидно: дребезг — это пачка ВЧ-импульсов, возникающая в момент срабатывания кнопки. Чтобы её задавить, нужен фильтр, простейший фильтр — RC. Вот тут всякое на тему, например: esxema.ru/?p=4416 (простейшее: esxema.ru/wp-content/uploads/2012/12/18.jpg)
Триггер Шмитта нужен, чтобы на выходе сформировать прямоугольный импульс из сравнительно плавного изменения напряжения на конденсаторе, потому как вообще обычная логика, включая микроконтроллер, не обязана адекватно реагировать на плавное изменение. На практике при нормальных кнопках и, соответственно, небольшой потребной ёмкости конденсатора и без него всё обычно нормально.
Но проще всего с микроконтроллером таки тупо опрашивать по таймеру раз в 100-200 мс :)
А требование RC-цепочки довольно очевидно: дребезг — это пачка ВЧ-импульсов, возникающая в момент срабатывания кнопки. Чтобы её задавить, нужен фильтр, простейший фильтр — RC. Вот тут всякое на тему, например: esxema.ru/?p=4416 (простейшее: esxema.ru/wp-content/uploads/2012/12/18.jpg)
Триггер Шмитта нужен, чтобы на выходе сформировать прямоугольный импульс из сравнительно плавного изменения напряжения на конденсаторе, потому как вообще обычная логика, включая микроконтроллер, не обязана адекватно реагировать на плавное изменение. На практике при нормальных кнопках и, соответственно, небольшой потребной ёмкости конденсатора и без него всё обычно нормально.
Но проще всего с микроконтроллером таки тупо опрашивать по таймеру раз в 100-200 мс :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Бинарные часы с будильником и таймером на Arduino Uno