Задумав я до дня народження улюбленої зібрати годинник. Випаяв зі старою плати мікрохвильовки семисегментний індикатор з двокрапкою і поліз в інтернет шукати схему і прошивку на предмет простого повторення.
І ось переглядаю я одну за однією величезні статті з описом годин з величезною кількістю функцій, будильником, таймером, календарем і датчиком температури і думаю: в годинах мені потрібно тільки відображення часу, і за великим рахунком, в тих, що висять у мене на стінці , не вистачає тільки нічний подстветки. Так що мені потрібні тільки функції часу. І тому схему і програму потрібно максимально спростити.
Все, що нам потрібно - підключити семісегментнік в режимі динамічної індикації, дві кнопки для установки годин і хвилин і організувати годинник.
Мало не забув! Потрібно зробити резервне живлення, щоб при відключенні основного джерела годинник не скидалися, але вимикалася індикація і споживання знижувалося до мінімуму.
Схема вийшла ось така:
Індикатор із загальним анодом, аноди підключені безпосередньо до порту C мікоконтроллера, резистори сегментів я поставив 220 Ом, можна навіть менше більше, вночі дуже яскраво світяться (Тобто, можна і менше, але не менше 100 Ом, тоді на кожну ніжку порту буде навантаження 35мА максимум, а по даташіту можна 40мА). Неправильно порахував. Треба більше. Набагато більше ... переробив на 560 Ом, і то струм більше ніж по даташіту. Але працює.
На транзисторі Q1 зроблений детектор напруги харчування. Він, як і кнопки, підключений на лінії зовнішніх переривань, у ATMega16 їх всього три.
Годинники організовуються за допомогою асинхронного режиму Тimer2. В цьому режимі таймер тактується від зовнішнього кварцу на 32768 Гц і не зупиняється в сплячому режимі мікроконтролера, що ми і будемо використовувати при роботі годинника від резервного джерела.
Тепер розберемо код:
Динамічна індикація використовує Timer0, годинник на Timer2, кнопки на зовнішніх переривання Int0 і Int1, контроль харчування на зовнішньому перериванні Int2.
В основному циклі залишилося тільки перетворення часу в двійковій-десяткове і догляд в сплячку, причому функцію Bin2BCD спеціально скоротив, бо хвилин і годин не буває більше 100, значить, немає сенсу перевіряти її на 10000, 1000 і 100.
Сама функція часу була взята з AVR ApNote134 і урізана до необхідних розмірів.
Установку годин і хвилин спочатку помістив в обробку переривання лічильника секунд, але потім вирішив, що крок в одну секунду - це занадто повільно і перемістив в обробник динамічної індикації, підібравши досвідченим шляхом кількість переповнень таймера для нормальної швидкості корекції.
Для початку я зібрав макет на Pinboard2:
Після того, як все запрацювало, на радощах швидко розвів хустці, витравив, просвердлив запаяв, але коли почав припаювати проводки для прошивки, побачив, що після недавньої роботи з Mega8, забув про найголовніше - висновок скидання))). Довелося кидати проводок.
Плату робив лутом. Спочатку спробував ламінатором, але, мабуть, температури в 170 градусів виявилося недостатньо і перевелося все погано. Так що зробив по-старому праскою. У цій платі я вперше провів дві доріжки під резистором 1206. Як бачите, вийшло нормально.
У фьюз потрібно виставити внутрішній RC-генератор на 4 або 8 МГц і відключити JTAG.
Ну і, як завжди, кілька фоток:
У доданому файлі исходник, схема, файл Протеуса для моделювання, прошивка.
UPD: Оформив в корпус:
Коробочку взяв від автомобільного ароматизатора. Під індикатор підклав антистатический пакетик в один шар.
До речі, параметри подільника датчика напруги харчування в підсумку вийшли 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В взагалі (собсна, зараз так і є, незважаючи на транзистор).
Я от дивлюся і все більше схиляюся до компаратору, здається, його використання позбавляє від всіх цих проблем разом. Правда, потрібно все переробити, і плату і програму ... А я вже іншим цікавим проектом зайнявся. Так що поки так.