Мои поделки: Часы-Будильник-Таймер-Секундомер на МК ATtiny85V [май-октябрь 2013]

Здесь, представлена моя первая электронная разработка на микроконтроллере: в которой я «собрал Часы-Таймер».

Содержание:
- Схема принципиальная (Hardware)
- Прошивка (Firmware)
- Технология изготовления
- Пользовательский Интерфейс
- Отработка узлов
Далее, будет много фоток (все кликабельны и ведут на полноразмерное изображение)...
Схема принципиальная (Hardware)
Поскольку это устройство учебное, то схемотехника в нём выбрана умышленно неоптимальной (много избыточных компонентов и «узких мест») — это чтобы создать себе «полигон граблей» и героически их преодолеть, для опыта…
В схеме использован микроконтроллер «ATtiny85V» — низковольтный, с напряжением питания от 1.8V до 5.5V, чтобы устройство могло питаться от двух пальчиковых батареек или аккумуляторов. Это оптимальный выбор: поскольку батареи или аккумуляторы, при разряде, могут выдавать минимум по 0.9V. Все узлы и цепи схемы — также рассчитаны на работу при широком разбросе напряжения питания: 2..3V.
Микроконтроллер «ATtiny85» нафарширован очень функциональной начинкой, обладает большим объёмом памяти, а также, серия имеет низковольтные модификации (как и все «tiny»). Хотя, он ощутимо дорогой (в 2-3 раза дороже, чем «ATmega8»!) и редкий (трудно купить) — непопулярен, вследствие того, что у него мало выходов-ножек, несбалансированный. Но мне, для обучения, он здорово помог создать «узкое горлышко»: на взаимодействие со всей периферией ввода-вывода — у меня осталось всего три вывода!
Таким образом, я получил возможность вплотную заняться задачами мультиплексирования выводов и наращивания функционала, за счёт внешних цифровых микросхем. Замечу, что походу решения, внезапно возникла необходимость использования даже нетривиальных способов наращивания портов! Всё это было очень забавно…


Хотя, изначально, когда компоновал плату, то собирался сделать девайс на «ATtiny13». (Хотел попробовать «предельное решение»: взять самый слабый микроконтроллер и решить на нём «сложную задачу», в учебных целях.) Мда, я был «молод и наивен»! ;-)
- Впоследствии, при программировании, оказалось, что прошивка не влазит в память (сейчас, со всеми фичами, прошивка занимает до 4Кб).
- Но ещё, что главнее: я недосмотрел, по неопытности, что «ATtiny13» не поддерживает подключение внешнего Кварца! А так хотелось, чтобы «Часы Реального Времени» шли точно...
- К моему счастью, нашлась серия микроконтроллеров «ATtiny25/45/85», в точности совпадающая по распиновке с «ATtiny13», и предназначенная для апгрейда последнего в дизайнах.
Прошивка (Firmware)
FIRMWARE для «Мои поделки: Часы-таймер-секундомер на МК ATTiny85V [май-октябрь 2013]» опубликован на GitHub (это веб-сервис для хостинга IT-проектов и их совместной разработки), на условиях лицензии GNU GPLv3 (копилефтной opensource, несколько ограничивающей коммерческое применение). Код прошивки предназначен для образовательных целей. Ответвляйтесь!
Архитектура программы: Суперцикл + Прерывания.
Поддержка режимов интерфейса реализована: [Недетерминированным] Конечным Автоматом, машину состояний которого реализует «модель прикладных данных», хранимая в ячейках ОЗУ (в DSEG)…
Код прошивки снабжён многочисленными самопоясняющими комментариями — поэтому, в данной статье, дополнительно разбираться не будет.
Замечу, что в ходе разработки именно этого Устройства, были созданы вспомогательные ассемблерные библиотеки, опубликованные ранее:
- AVRASM: Библиотека базовых Макроопределений «MACROBASELIB.INC» [2013.12.05]
- AVRASM: Библиотека процедур для интеллектуальной обработки ВВОДА в МК: событий от Кнопок и Энкодеров [2013.12.12]
Технология изготовления
Паяем
Устройство собрано на двух «универсальных односторонних макетных платах».
Вместо дорожек — все соединения выполнены перемычками из проводов МГТФ.
Примечание: Платы запилил, точно под размер, с помощью своего «станочка»...

Для сборки устройства, был куплен вариант исполнения микросхемы микроконтроллера: «ATTiny85V-10SU», в корпусе SOIC-8 (5.3mm width). Поскольку, в какой-то момент, я затруднился найти в продаже, на Украине, «ATTiny85V-10PU» (низковольтный, в DIP-8 корпусе) — редко используется, вот магазины и редко возят.
Для корпуса SOIC-8 был спаян самодельный переходник-адаптер на DIP-8, вставленный в панельку DIP-8 на плате. На фото, ниже, под бузером, белеет тонкая фторопластовая плёнка, в которую укутан корпус SOIC-8 микроконтроллера, с подпаянными к его ножкам МГТФ отводами. Укутан — для электрической и механической защиты. Получился довольно компактный переходник, в итоге — не выше, чем оригинальный DIP-8 корпус! А для меня это было очень критично, чтобы всё устройство влезло в корпус: там, в крышке, выпилены соответствующие утопы, на доли миллиметров всё подогнано...

Здесь, «колбаса в чёрной термоусадке», рядом с батарейным отсеком — это брейкаут со схемой прерывания питания индикаторов (семисегментных индикаторов и бузера). Данный узел был введён уже после того, как основная схема была распланирована и компоненты запаяны — на плате уже совсем не осталось места! А учитывая что корпус маленький, компоновка очень плотная, всё впритык… Пришлось выкрутиться таким брейкаутом: спаять элементы объёмным монтажом и запаять в термоусадку. Примечание: В составе этой связки присутствует МОП-транзисторный ключ (Q2 на схеме принципиальной), исполненный в корпусе SOT-23 (Micro3), для его монтажа — придумана специальная технология...
Разъём ISP-программатора на плате выполнен в виде: однорядной цанговой панели (низкопрофильной и малогабаритной!)...
Пакуем в корпус
Устройство упаковано в корпус: Kradex Z-8A.
Сначала платы складываются «гармошкой», с батарейным отсеком и брейкаутом — получается вот такой «бутерброд»:

В передней панели корпуса пропилены отверстия под органы управления (сначала, наметил по трафарету; затем, просверлил Дремелом отверстия меньшего диаметра; наконец, распилил надфилями вручную, подогнал точно под размеры — штучная работа, не серийная). Также, в толстой передней стенке корпуса выбраны ниши (Дремелом с гравировальной насадкой), около 1мм глубиной, под микроконтроллер и энкодер — едва-едва по высоте уместил…

Когда всё устройство помещается в корпус, то батарейный отсек, как раз, находится под крышкой корпуса — удобно менять батарейки, концепция юзабельности соблюдена. (Примечание: на этом фото представлена ещё предыдущая итерация устройства — с батарейным отсеком 2xAA. Но после введения дополнительных компонентов, размер устройства увеличился — пришлось уменьшить батарейный отсек, до 2xAAA.)

Поскольку конструкция корпуса не предполагает штатного вскрытия: здесь, для крепления крышки, не предусмотрены ни шурупы, ни защёлки — всё минималистично. Предполагается, что крышку готового устройства посадят на клей… В этом же прототипе: крышка батарейного отсека фиксируется скотчем.




Было решено: доточить толкатели тактовых кнопок, используя резиновые колпачки от гелевых стержней (но только, от тех, что подороже — они идут с резиновыми колпачками; в то время как, замечено, самые дешёвые гелевые стержни — продаются с пластиковыми заглушками). Отверстия в панели, также, были слегка расширены, под резиновые колпачки… В итоге, получилось простое и эргономичное решение: на ощупь, кнопки нажимаются мягко и вязко.

Пользовательский Интерфейс
Функционально, Устройство содержит:
- одни Часы Реального Времени (отсчитывают «часы-минуты-секунды», с периодичностью в сутки; но на индикаторе отображаются всегда только «ЧЧ-ММ»; ход секунд отражается мигающей чёрточкой, на среднем индикаторе; Дата не обрабатывается вовсе)
- один Суточный Будильник (классика: пользователь устанавливает заданное время «ЧЧ-ММ»; вкл/выкл «звонка»; при наступлении заданного времени на Часах — включается звуковая и световая индикация)
- два одинаковых Таймера/Секундомера, направление счёта которых переключается: либо сверху вниз, либо от нуля до бесконечности (текущий режим работы этой функции отражается положением дополнительной чёрточки на среднем индикаторе — сверху или снизу, соответственно).
- Таймер — счётчик обратного счёта. Работает так: пользователь устанавливает заданное время (часы-минуты-секунды); стартует счётчик — и он отсчитывает заданное время, по убыванию; когда досчитает до нуля — счёт останавливается, включается Зуммер («Яйца сварились! Пора снимать кастрюльку с огня!»).
- Секундомер — счётчик прямого счёта. Работает так: пользователь может только сбросить показания на секундомере в ноль; затем, стартует счётчик — и он начинает отсчитывать пройденное время (ЧЧ-ММ-СС) от нуля и до «бесконечности» (с периодом в сутки, разумеется).
- Для Таймера/Секундомера реализована фича «дисплей с динамической разрядностью»: пока на счётчике часы==0, то они не отображаются — индикатор показывает «ММ-СС»; как только счётчик набирает первый час — индикатор сдвигается и показывает уже «ЧЧ-ММ», при этом, секунды больше не отображаются...
- Знакоместо «точки», на семисегментных индикаторах, показывают: с которой из четырёх функций пользователь оперирует в данный момент. А когда срабатывает «сигнал», для любой из функций — то соответствующая точка помигивает, и дисплей автоматически переключается на последнюю сработавшую функцию (прелести эргономики)...
Ввод
Управление устройством реализовано с помощью 5шт. Тактовых Кнопок и одного инкрементального Энкодера. Из них: три отдельно стоящие кнопки — только переключают разные функции; две оставшиеся кнопки — управляют самой функцией; а энкодер используется для подстройки значений в «счётчиках времени» (ЧЧ/ММ/СС).

Для описания модели интерфейса и режимов работы устройства, вместо пространного UserManual, приведу здесь только технические UML-диаграммы (описывающие схему и условия переключения режимов):





Принципы написания прикладного кода, реализующего обработку событий от «органов пользовательского ввода» и переключения режимов интерфейса — описаны в разделе «Методика проектирования прикладного кода (обработчики событий)» статьи про «Библиотеку процедур для интеллектуальной обработки ВВОДА в МК»…
Рекомендую вам обратить внимание на эту методику, поскольку с ней, написание кода, обслуживающего интерфейс — у меня заняло всего пару вечеров. Это реальный профит! В то время как, саму библиотеку я разрабатывал около двух месяцев. А разработка «модели данных» самого ядра Устройства (счётчики времени, регистры флагов, процедуры счёта и индикации, обработка Таймеров и Будильников) — заняла больше трёх месяцев...
Вывод
Вывод Устройства осуществляется через: 5-разрядный семисегментный светодиодный индикатор (набранный из пяти отдельных «SM420361N/8»); и через один Звукоизлучатель (Бузер с генератором «KPX1201B»). Индикация: статическая, на сдвиговых регистрах.

Против природы не попрёшь: светит — значит, кушает… Но Устройство «кухонный таймер» (а глубоко в основе идеи — лежало именно это назначение) эксплуатируется ведь не круглые сутки, не так ли? Поэтому Устройство, срочным образом, было дооборудовано «спящим режимом»:

Теперь, Устройство питается от комплекта из двух аккумуляторов (2xAAA: NiMH 1000mAh 1.2V). При неинтенсивном использовании, одной зарядки хватает больше, чем на 2 недели…
Отработка узлов
К статье приложен рабочий проект Proteus для моделирования Устройства. А также, тех.паспорта электронных компонентов, использованные при разработке Устройства.
Про подробности схемотехнической реализации? о том, как подбирались параметры в схеме? и почему всё сделано именно так, а не иначе? — читайте вторую часть статьи: «Отработка узлов»...
- +5
- 22 декабря 2013, 05:56
- Celeron
- 2
Файлы в топике:
proteus.zip, datasheet.zip
Тебе не кажется, что в твоих статьях слишком много выделений и ссылок? Читаемости статьи это совсем не способствует.
Нормально. Зато подробностей вагон без раздувания статьи. А те кто читает все подряд еще поди и помнит что под каждой ссылкой прячется, а благодаря человечным названиям даже открывать их не надо.
Зато подробностей вагон без раздувания статьиЧестно говоря, статьи автора и так раздуты до состояния tl;dr. При этом состоят на 90% из воды.
А те кто читает все подряд еще поди и помнит что под каждой ссылкой прячетсяНу я читаю все подряд и помню, но от того не легче. И какой смысл давать ссылки, например, на конкретную модель батареек (при том, что по ссылке даже даташита нет), энкодера и так далее? Или на статью про гитхаб в вики. Или на достаточно широко известные термины вроде «макетная плата».
Я так мыслю: пишу фразу, но подразумеваю — концепцию, образ, модель…
Связь кодирую гиперссылкой.
А выделения фраз в тексте (жирный, курсив, подчёрк, абзацы, списки, врезки) — это как полифония в музыке: для донесения до читателя «отдельных голосов» (мыслей) в общей «симфонии»…
Связь кодирую гиперссылкой.
"… гиперссылка является уникальным компонентом новостного Интернет-дискурса, обеспечивающим его целостность на нескольких уровнях." (с) Е.А. Кротова / статья «Функциональный потенциал гиперссылочного аппарата электронной новости»
А выделения фраз в тексте (жирный, курсив, подчёрк, абзацы, списки, врезки) — это как полифония в музыке: для донесения до читателя «отдельных голосов» (мыслей) в общей «симфонии»…
за сцылки не скажу (инфы мало не бывает:), а вот выделение обычного текста таким же цветом, как и ссылок, действительно раздражает и отвлекает.
- podkassetnik
- 22 декабря 2013, 18:32
- ↑
- ↓
Поэтому выделение подчёрком я, практически, не использую.
А выделение цветом же невозможно настраивать, здесь, при вёрстке статьи?
Хотя, было замечено, что сложно-форматированный текст, в статьях, иногда произвольно менял свой цвет, от абзаца к абзацу — предполагаю, что это CSS данного сайта глючит.
Ещё пробельные отступы, между фрагментами текста, плохо контролируются при вёрстке. (а это тоже, было бы, мощное стредство структурирования текста)
А выделение цветом же невозможно настраивать, здесь, при вёрстке статьи?
Хотя, было замечено, что сложно-форматированный текст, в статьях, иногда произвольно менял свой цвет, от абзаца к абзацу — предполагаю, что это CSS данного сайта глючит.
Ещё пробельные отступы, между фрагментами текста, плохо контролируются при вёрстке. (а это тоже, было бы, мощное стредство структурирования текста)
Так хорошо, и я бы сказал, тщательно написана статья и такая плата на проводках — сплошная порнография!
Простите мне мою грубость, но WTF????
Я полюбому покажусь грубым, злым человеком, но для начала скажу, за огромный труд, вам спасибо (без сарказма, потрудились со статьей и еще больше, с устройством)
а теперь мои плохие впечатления, я с удовольствием читаю длинные статьи, но при одном условии, когда название, картинки и содержание (порядок этих слов отражает порядок просмотра мной статьи) имеет для меня интерес. Название — как автор собирал то, что собирали все, картинки — автор собрал пипец трудоемкую вещь, на текст меня не хватило, поглядел мельком схему и принял для себя решение, я это читать не буду.
Автор, исходя из того что я увидел (название и картинки), вы трудолюбивый человек, но путь которым вы пошли, лично у меня вызывает негативные эмоции… простите…
Я полюбому покажусь грубым, злым человеком, но для начала скажу, за огромный труд, вам спасибо (без сарказма, потрудились со статьей и еще больше, с устройством)
а теперь мои плохие впечатления, я с удовольствием читаю длинные статьи, но при одном условии, когда название, картинки и содержание (порядок этих слов отражает порядок просмотра мной статьи) имеет для меня интерес. Название — как автор собирал то, что собирали все, картинки — автор собрал пипец трудоемкую вещь, на текст меня не хватило, поглядел мельком схему и принял для себя решение, я это читать не буду.
Автор, исходя из того что я увидел (название и картинки), вы трудолюбивый человек, но путь которым вы пошли, лично у меня вызывает негативные эмоции… простите…
Охохо, зачем так сложно то? Можно было бы динамическую индикацию прикрутить, да и кнопки на АЦП повесить больше свободных ног бы было. Меньше деталей — меньше ошибок: проще к повторению.
В данной конструкции, использование клавиатуры на резистивных делителях — недопустимо, поскольку требуется различать одновременное нажатие нескольких кнопок сразу. «Кнопочные аккорды» — широко используются в интерфейсе данного Устройства.
Но, кстати, замечу: опрашивать Энкодер, через сдвиговый регистр, как я это сделал в данной конструкции — вам, в реальных устройствах, настоятельно НЕ рекомендую! Обнаружил, что это сильно замедляет опрос Энкодера!
Особенно, на частоте работы микроконтроллера 32кГц, как здесь — ручку энкодера приходится вращать уже настолько медленно, чтобы тики фиксировались, что юзабилити такого решения — полностью несостоятельна.
(поэтому, рассматривайте данную схему — как учебный пример, и как иллюстрацию идей)
Особенно, на частоте работы микроконтроллера 32кГц, как здесь — ручку энкодера приходится вращать уже настолько медленно, чтобы тики фиксировались, что юзабилити такого решения — полностью несостоятельна.
(поэтому, рассматривайте данную схему — как учебный пример, и как иллюстрацию идей)
вопрос в другом — какой смысл использовать tiny85? и тини вообще? есть мега8 и мега48 за те же деньги, но с бОльшим количеством ног и нормальных аппаратных интерфейсов. если юзать ее — все регистры можно выкинуть.
- podkassetnik
- 27 декабря 2013, 13:38
- ↑
- ↓
Да, ATmega48A (низковольтная) была бы рациональнее для промышленного решения…
Но здесь, в учебных целях, я хотел попробовать «предельное решение»: взять самый слабый микроконтроллер (изначально, ATtiny13) и решить на нём «сложную задачу». И походу, поиграться периферией: цифровыми микросхемами… Не ради выгоды, а ради науки! (цель другая)
Но здесь, в учебных целях, я хотел попробовать «предельное решение»: взять самый слабый микроконтроллер (изначально, ATtiny13) и решить на нём «сложную задачу». И походу, поиграться периферией: цифровыми микросхемами… Не ради выгоды, а ради науки! (цель другая)
Комментарии (24)
RSS свернуть / развернуть