Виберіть свою мову

Не так давно електронні годинники будували на так званих часових мікросхемах серії К176 і спеціалізованих мікросхемах серій К145 (К145ИК1901) і КР1016 (КР1016ВИ1). Головний їх недолік - обмежені можливості вдосконалення (будь-яка зміна вимагало апаратної доопрацювання). Вигідно відрізняються годинник, зібрані на базі мікроконтролера. Схема значно спрощується, а "апгрейд" можна проводити без будь-яких змін апаратної частини. Навіть налаштування ходу годин може бути чисто програмної. Саме такі годинники описані в публікується нижче статті.

Пропоновані годинник-будильник з четырехразрядным світлодіодним індикатором виконані на базі мікроконтролера (МК) і показують час у 24-годинному форматі з гасінням незначащего нуля в розряді десятків годинника. Передбачені режим відображення хвилин і секунд, подача короткого (тривалістю 1 с) звукового сигналу на початку кожної години (при необхідності цю функцію можна выклю-i чить), два вимикаються будильника і програмна налаштування коефіцієнта корекції часу, від якого залежить точність ходу годинника. Значення коефіцієнта і встановлення будильників записуються в енергонезалежну пам'ять (EEPROM) МК. Стан будильників і сигналу "Кожну годину" відображається світлодіодами.

Принципова схема пристрою зображена на рис. 1. Його основа - мікроконтролер PIC16F84 (DD1), робоча частота якого задається генератором з зовнішнім резонатором ZQ1 на 4 МГц. Вхід скидання МК (MCLR) безпосередньо підключений до шини живлення +5 Ст.

Пятіразрядний порт А, всі лінії якого налаштовані на висновок, що управляє світлодіод HL1 і перемикає розряди індикатора HG1. Чотири старших розряди порту (RB4-RB7) налаштовані на введення і приймають сигнали від кнопок SB1 - SB4, які підключені до висновків без "підтягуються" резисторів, тому що такі є в МК. Розряди RB0 і RB1 порту використовуються для завантаження регістр DD2 семиэлементного коду, відповідного відображення цифрі. Розряд RB2 - вихід сигналу 3Ч або спрацьовування будильника (в залежності від версії програми), який можна підключити безпосередньо до пьезоизлучателю (ЗП-1, ЗП-3 і їм подібні), до входу підсилювача 3Ч або до виконавчого пристрою, наприклад, реле, яке в момент спрацьовування будильника буде включати радіоприймач, телевізор чи інший прилад.

Світлодіоди HL1 і HL2 индицируют стан відповідно сигналу "Кожну годину" і будильників: HL1 світиться, якщо сигнал "Кожну годину" включений, a HL2 - якщо включений хоча б один з будильників або якщо включені обидва.

У пристрої застосовано спеціалізований часовий світлодіодний індикатор фірми Kingbright, що містить чотири семиэлементных розряду з загальним анодом і дві точки індикації секунд між середніми розрядами. Оскільки висновки елементів a-g є загальними для всіх розрядів, управління індикатором можливо тільки в динамічному режимі. Для даної конструкції індикатор підійшов як не можна краще: число ліній вводу/виводу загального призначення у МК P1C16F84 не дозволяє реалізувати статичну індикацію, а при динамічної з іншим індикатором довелося б об'єднувати висновки однойменних елементів різних розрядів на платі.

Резистори R3-R10 обмежують струм через світлодіоди індикатора. Сдвиговый регістр DD2 введений для економії висновків МК - він перетворює послідовний код паралельний в ході динамічної індикації.

Конденсатор С4 фільтрує пульсації в ланцюзі живлення МК. Місце для нього на платі не передбачено, припаюють його безпосередньо до висновків розетки МК з боку друкованих провідників.

Керуюча програма для МК написана на стандартному асемблері MPASM фірми Microchip і скомпільована в середовищі MPLAB тієї ж фірми. З комірок пам'яті 1024 програм МК використано близько восьмисот, так що ресурси для удосконалення є.

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

Основне завдання програми - формування точних часових інтервалів тривалістю 1с - вирішується з допомогою переривань від таймера 0. Його предцелитель підключається до кварцевому генератора МК і налаштовується на коефіцієнт розподілу 16. У регістр таймера 0 при кожній обробці переривання записується число від 00h до OFh (це і є коефіцієнт корекції часу, у вихідному тексті програми він називається TIME_SET), тому таймер переповнюється не за 256, а до наприклад, за 250 циклів тактової частоти (при TIME_SET=5).

У такому випадку при використанні кварцового резонатора на частоту 4 МГц переривання від таймера 0 відбуваються з частотою 1 000 000 Гц/250/16 = 250 Гц. Після ініціалізації програма переходить в цикл очікування цих переривань і підраховує їх. Коли число переривань стане рівним 250, поточний час збільшується на секунду.

Переривання від таймера 0 забезпечують динамічну індикацію. Під час їх обробки МК встановлює нульовий рівень на висновках RA0 - RA3 і тим самим гасить індикатор. Далі в регістр DD2 через висновки МК RB0 і RB1 завантажується семиэлементный код, відповідний символу, який потрібно відобразити. Потім на одному з висновків RAO-RA3 встановлюється високий логічний рівень, завдяки чому запалюється одна з знакомісць. Все це відбувається 250 разів в секунду, і завдяки інерції зору користувач бачить включеними відразу всі розряди.

Старший біт завантажується в регістр DD2 коду служить для управління секундними точками індикатора, які блимають з частотою 1 Гц. Таким чином, з допомогою переривань від таймера 0 вирішуються відразу два завдання. Крім того, в підпрограмі обробки переривання МК перевіряє, чи не є виведена цифра незначущим нулем у лівому розряді, і якщо це так, то замість семиэлементного коду цифри ПРО МК завантажує в регістр двійкове число 11111111 (індикатор з загальним анодом, тому одиниця відповідає погашеному сегменту).

Клавіатура опитується приблизно 10 разів в секунду, але після першого натискання деяких кнопок і їх комбінацій програма не реагує на повторні натискання в протягом 1 с (наприклад, якщо кнопки утримувати). Це потрібно для зручності управління годинами.

При спрацьовуванні сигналу на виводі RB2 на 1 хв з'являється переривчастий сигнал 3Ч або, залежно від версії програми, - високий рівень (точніше, імпульси з частотою повторення 1 Гц). Блимають світлодіоди HL1 і HL2. Після закінчення хвилини викликається спеціальна підпрограма, яка відновлює правильний світіння світлодіодів.

Пристроєм керують кнопками SB1-SB4, кожна з яких поєднує кілька функцій (див. мнемосхему, показану на рис. 2). Годинник працює в трьох режимах: основному (індикація поточного часу), з коефіцієнтом корекції часу і режимі установки будильників.

В основному режимі індикатор HG1 відображає годинник і хвилини, при цьому секундні точки блимають з частотою 1 Гц. Поточний час встановлюють кнопками SB1 (годинник) і SB2 (хвилини): кожне їх натискання збільшує свідчення на одиницю, а якщо це робиться при натиснутій SB4, - зменшує. При досягненні нульових значень розрядів хвилин перенесення в розряд годин не відбувається.

Якщо утримувати кнопку SB4 протягом трьох секунд, на індикатор замість годин і хвилин виводяться хвилини і секунди поточного часу.

Сигнал "Кожну годину" включають і вимикають кнопкою SB3 при утримуваної SB4 (світлодіод HL1 відповідно загоряється або гасне).

Для переходу в режим установки будильників натискають на кнопку SB3. На індикаторі з'являються свідчення першого будильника, секундні точки світяться безперервно. Години та хвилини встановлюють тими ж кнопками SB1 і SB2 (в даному випадку тільки збільшення показань). Натискання на кнопку SB4 призводить до вимкнення будильника, і на індикаторі залишаються лише прочерки (світяться елементи G). При подальшому включення будильника цієї ж кнопкою на індикаторі з'являються, а в регістри будильника записуються нулі (а не попередні значення). Якщо ще раз натиснути на кнопку SB3, на індикаторі з'являться показання другого будильника, однак секундні точки згаснуть. Обидва будильника налаштовуються однаково.

Третє натиснення на кнопку SB3 переводить годинники в режим роботи з коефіцієнтом корекції часу: на індикатор виводяться символи "ЇЇ X", де ЇЇ означає EEPROM, а X - поточне значення коефіцієнта в шістнадцятковому вигляді; секундні точки продовжують блимати. Кнопкою SB1 можна збільшувати, а кнопкою SB2 - зменшувати значення коефіцієнта в інтервалі від Oh до Fh. Встановлене число буде записуватися в таймер 0 в підпрограмі обробки переривання за його переповнення.

При четвертому натисканні на кнопку SB3 установки будильників і значення коефіцієнта записуються в EEPROM: перший будильник - за адресами 02h-05h (відповідно хвилини, десятки хвилин, години й десятки годин), другий - за адрес 06h-09h (в тому ж порядку), коефіцієнт - за адресою 01 h.

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

Без будь-яких змін у плані та програмі МК можна застосувати PIC16C84 - одноразово програмований аналог PIC16F84. Зазначений на схемі індикатор замінимо будь-яким іншим четырехразрядным з загальним анодом (бажано, щоб висновки однойменних елементів розрядів були з'єднані всередині індикатора). Допустимо використання чотирьох одноразрядных індикаторів, в цьому випадку в якості секундних точок можна застосувати два окремих світлодіода, підключених катодами до правого (за схемою) висновку резистора R10 (якщо необхідно - через ключ на транзисторі). Резистори, конденсатори, світлодіоди, кнопки - будь-які малогабаритні.

Для годин розроблені три версії керуючої програми. Версія 1.10 - основна (її НЕХ-файл наведено в таблиці). При спрацьовуванні будильників на виведенні RB2 з'являється сигнал (меандр) частотою 1 Гц. Його можна використовувати для управління різними виконавчими механізмами і генераторами сигналів 3Ч: від найпростіших на двох-трьох логічних елементів до складних систем цифрового синтезу звуку [1, 2]. Динамічна індикація в цій версії працює постійно.

(натисніть для збільшення)

У версії 1.11 індикація теж працює безперервно, але при спрацьовуванні будильників і в момент генерації сигналу "Кожна година" на виводі RB2 з'являються пачки імпульсів з частотою повторення 1 Гц (частота коливань, заповнюють пачки, відповідає частоті переривань від таймера 0 - 250 Гц). Цей сигнал можна подати безпосередньо на випромінювач або на вхід підсилювача 3Ч.

Версія 1.20 відрізняється від 1.11 тільки тим, що за замовчуванням динамічна індикація в ній вимкнена (при цьому всі інші функції годин працюють у звичайному режимі). Вона починає працювати, якщо натиснути на кнопку SB4, та автоматично вимикається через 10 с. При натисканні кнопок і спрацьовуванні будильника відлік цього інтервалу починається заново. Якщо будильник спрацював при вимкненій індикації, вона не включається: потрібно двічі натиснути кнопку SB4, щоб вимкнути будильник і включити індикацію. Цю програму доцільно використовувати, якщо для живлення годинника використовується батарея, складена з гальванічних елементів або акумуляторів: вимикання індикації економить енергію батареї.

При програмуванні МК в слові конфігурації вказують тип генератора - XT, Power-up таймер - включений, сторожовий таймер і захист коду - вимкнені. Крім того, в клітинку 01 h енергонезалежної пам'яті даних потрібно занести число від Oh до Fh (коефіцієнт корекції часу), а за адресами 02h-09h - установки будильників.

Якщо програмна налаштування точності ходу годинника виявиться грубої (що цілком ймовірно), слід встановити зображений на схемі штриховими лініями підлаштування конденсатор C3 (на друкованій платі місце для нього передбачено).

НЕХ-файли версії 1.11 та 1.20, а також вихідні тексти всіх версій

Література

  • Довгий А. Як записати у ПЗУ аудіодані з wav-файлу і "програти" їх. - Радіо, 2001, № 4, с. 25-27; № 5, с. 23, 24.
  • Партії А. Звуковий модуль на одній мікросхемі. - Радіо, 2002, № 11, с. 40, 41.
  • Прожирко Ю. Електронні годинник-будильник з радіоприймачем. - Радіо, 2001, № 7, с. 16, 17; № 8, с. 17, 18.
  • Автор: А. Вакуленко, р. Тюмень