Найпростіші годинник на avr

Найпростіші годинник на avr

Задумав я до дня народження улюбленої зібрати годинник. Випаяв зі старою плати мікрохвильовки семисегментний індикатор з двокрапкою і поліз в інтернет шукати схему і прошивку на предмет простого повторення.

І ось переглядаю я одну за однією величезні статті з описом годин з величезною кількістю функцій, будильником, таймером, календарем і датчиком температури і думаю: в годинах мені потрібно тільки відображення часу, і за великим рахунком, в тих, що висять у мене на стінці , не вистачає тільки нічний подстветки. Так що мені потрібні тільки функції часу. І тому схему і програму потрібно максимально спростити.

Все, що нам потрібно - підключити семісегментнік в режимі динамічної індикації, дві кнопки для установки годин і хвилин і організувати годинник.

Мало не забув! Потрібно зробити резервне живлення, щоб при відключенні основного джерела годинник не скидалися, але вимикалася індикація і споживання знижувалося до мінімуму.

Схема вийшла ось така:

Індикатор із загальним анодом, аноди підключені безпосередньо до порту C мікоконтроллера, резистори сегментів я поставив 220 Ом, можна навіть менше більше, вночі дуже яскраво світяться (Тобто, можна і менше, але не менше 100 Ом, тоді на кожну ніжку порту буде навантаження 35мА максимум, а по даташіту можна 40мА). Неправильно порахував. Треба більше. Набагато більше ... переробив на 560 Ом, і то струм більше ніж по даташіту. Але працює.
На транзисторі Q1 зроблений детектор напруги харчування. Він, як і кнопки, підключений на лінії зовнішніх переривань, у ATMega16 їх всього три.

Годинники організовуються за допомогою асинхронного режиму Тimer2. В цьому режимі таймер тактується від зовнішнього кварцу на 32768 Гц і не зупиняється в сплячому режимі мікроконтролера, що ми і будемо використовувати при роботі годинника від резервного джерела.

Тепер розберемо код:
Динамічна індикація використовує Timer0, годинник на Timer2, кнопки на зовнішніх переривання Int0 і Int1, контроль харчування на зовнішньому перериванні Int2.
В основному циклі залишилося тільки перетворення часу в двійковій-десяткове і догляд в сплячку, причому функцію Bin2BCD спеціально скоротив, бо хвилин і годин не буває більше 100, значить, немає сенсу перевіряти її на 10000, 1000 і 100.
Сама функція часу була взята з AVR ApNote134 і урізана до необхідних розмірів.
Установку годин і хвилин спочатку помістив в обробку переривання лічильника секунд, але потім вирішив, що крок в одну секунду - це занадто повільно і перемістив в обробник динамічної індикації, підібравши досвідченим шляхом кількість переповнень таймера для нормальної швидкості корекції.


Для початку я зібрав макет на Pinboard2:

Найпростіші годинник на avr

Найпростіші годинник на avr

Після того, як все запрацювало, на радощах швидко розвів хустці, витравив, просвердлив запаяв, але коли почав припаювати проводки для прошивки, побачив, що після недавньої роботи з Mega8, забув про найголовніше - висновок скидання))). Довелося кидати проводок.
Найпростіші годинник на avr

Плату робив лутом. Спочатку спробував ламінатором, але, мабуть, температури в 170 градусів виявилося недостатньо і перевелося все погано. Так що зробив по-старому праскою. У цій платі я вперше провів дві доріжки під резистором 1206. Як бачите, вийшло нормально.

У фьюз потрібно виставити внутрішній RC-генератор на 4 або 8 МГц і відключити JTAG.

Ну і, як завжди, кілька фоток:

Найпростіші годинник на avr

Найпростіші годинник на avr

Найпростіші годинник на avr

У доданому файлі исходник, схема, файл Протеуса для моделювання, прошивка.

UPD: Оформив в корпус:

Найпростіші годинник на avr

Коробочку взяв від автомобільного ароматизатора. Під індикатор підклав антистатический пакетик в один шар.
До речі, параметри подільника датчика напруги харчування в підсумку вийшли 39кОм і 6.2кОм.
END_UPD

+5V на будь-який пін (краще INT) через резистор (чисто для захисту, 1-10к). Чи не надійне рішення. У AVR Піни - ТШ з порогом близько 1.5В. Чуєш, чим це загрожує? Розрядом батареї.
При пропажі живлення напруга в точці 5V впаде до

3V, а далі харчування буде йти від батарейки. При цьому конденсатор на вході буде дуже повільно розряджатися через пін МК налаштований на купівлю (продаж і краще б на ньому не було налаштоване підтяжки). А разом з ним і резервна батарейка.
Хоча б резисторний дільник або dummy навантаження для розряду ємностей нижче рівня відключення (В даній схемі ними служить дільник в базовій ланцюга).

Навіть через цей дільник відключається індикатор тільки через секунду-дві після відключення зовнішнього живлення. Тому і подумав про компаратор.

Досить трохи зменшити номінали. Зробити скажімо 4.7к + 1к. Тоді при досягненні 3-х вольт на базі буде 0.5В і менше, чого вже буде досить для виключення транзистора. У робочому ж режимі струм через базу не перевищити 1 мА, побоюватися нічого не варто. А зайвий міліампер від БП не настільки критичний, враховуючи що підсвічування споживає значно більше.
Вообщем компаратор - це зайве. Просто підберіть номінали резисторів для надійного відключення при 3В (а бажаного при 4-3.5В, тобто простір є).
Єдина проблема, що бачу, при відключенні підсвічування напруга трохи покращився -> знову включаємо підсвічування -> знову впало ... (в БП великий кондер, а дроти вони не ідеальні).

По-перше, зараз там такий же поріг. По-друге, можна (точніше, навіть потрібно) передбачити швидкий розряд конденсаторів при пропажі живлення (наприклад, якщо живити індикатори через ключі немає від харчування МК, а від зовнішнього живлення, то вони швидко вижрут кондери і згаснуть). Ну і по-третє, можна включити не через резистор, а через дільник і підняти поріг до будь-якого бажаного значення.

По-перше, зараз там такий же поріг. Ні, зараз там відрубування при 1В, і один вольт досягається швидше, тому що вже їсть ь якась ланцюг розряду у вигляді подільника в базі (точніше навіть резистор і базовий перехід).
Ну і по-третє, можна включити не через резистор, а через дільник і підняти поріг до будь-якого бажаного значення. Ви забули про гістерезис у пинов МК. Прагнучи досягти більш високого рівня напруги для відключення підсвічування, ми отримаємо відмову від її включення при появі харчування.
У поточній версії звичайно прісутвтует «дребізг», і він може стати проблемою, але і від нього є деяка захист у вигляді того самого гістірезіса Піна. Малі коливання повинен нейтралізувати, від великих передбачити затримку включення.
Транзистор виявляється не зайвим :)

Ні, зараз там відрубування при 1В Там дільник 1: 1, порогове напруга транзистора - приблизно 0.7В - виходить близько 1.4В. Навантаження (або інша схема швидкого розряду основного харчування) - це так, я її мав на увазі, але забув про неї сказати.
Ви забули про гістерезис у пинов МК. Прагнучи досягти більш високого рівня напруги для відключення підсвічування, ми отримаємо відмову від її включення при появі харчування. Гістерезис, наскільки я пам'ятаю, що не настільки великий, щоб перешкодити надійному переключенню Піна при зміні напруги між 3В і 5В.

Ну давайте глянемо. У мене ось завалявся даташит на ATtiny2313 (які ж незручні даташіта у АВР, фіг знайдеш те, що треба).
У відповідності з ним, для того, що б мати нульовий рівень, при досягненні 3В в харчуванні нам треба отримати 0.9В на піне для низького рівня, який може бути максимум 0.3Vcc - далі вже можна не писати :)
Тобто який би не був дільник для отримання низького рівня в 0.3Vcc (максимальний рівень нуля), ми ніколи з допомогою цього ж подільника не отримаємо 0.6Vcc (мінімальний рівень одиниці).

які ж незручні даташіта у АВР, фіг знайдеш те, що треба І то правда. Причому в шите (правда, preliminary) на мегу16 потрібних даних навіть немає (хоча в шите на тіні13 я їх точно знаходив).
Але ти не ті денние дивишся. Це вимоги до логічним рівням цифрового сигналу, нас же тут цікавлять конкретні параметри ТШ на вході Піна.
У даташіте на ATMEGA8A ці дані вже є. Малюнки 26-37..26-39. верхній поріг

2.2В, гістерезис 0.45В. Правда, вони прив'язані до напруги харчування (дивно, а по даташіту на тіні13 мені здавалося що не прив'язані), ось це вже ускладнює завдання. Для розрізнення 3В і 5В дільник доведеться робити з стабілітрона на 2В і резистора. Ну або замислитися над швидкої розрядкою зовнішнього живлення і не морочитися на розрізнення 3В і 5В взагалі (собсна, зараз так і є, незважаючи на транзистор).

Я от дивлюся і все більше схиляюся до компаратору, здається, його використання позбавляє від всіх цих проблем разом. Правда, потрібно все переробити, і плату і програму ... А я вже іншим цікавим проектом зайнявся. Так що поки так.

Схожі статті