Існує безліч годин різних розмірів і форм. В наших часах для індикації часу використовуються різні типи світлодіодів. Блок-схема годинника приведена на рис. 3.41.

Рис. 3.41. Блок-схема годин

Цей годинник можуть показувати час з точністю до однієї секунди. У них три блоки світлодіодів: для годин, хвилин і секунд. Число світлодіодів в кожному блоці різне. Блок для індикації годин має два стовпці: старша і молодша цифра годин. Наші годинник показує час в 24-годинному форматі, тому значення можуть бути від 0 до 23. Тобто в якості старшої цифри годин можуть світитися або один, або два світлодіоди (Або жодного). В якості молодшої цифри годин може світитися від нуля до дев’яти світлодіодів. Точно так же (двома блоками) відображаються і хвилини. Шість світлодіодів відображають секунди. Ми назвали ці годинник забавними тому, що світлодіоди, що відображають години та хвилини перемикаються випадковим чином кожні п’ять секунд. Наприклад, якщо час 15:35, то буде горіти будь світлодіод старшої цифри годин. Будуть світитися також будь-які п’ять світлодіодів (з дев’яти) у молодшій цифрі годин. Через п’ять секунд загоряться інші п’ять світлодіодів (з дев’яти). Таким чином, “вогники” на годиннику будуть весь час змінюватися. Однак той, хто знає принцип відображення часу на цьому годиннику, зможе правильно зрозуміти свідчення.

На рис. 3.42 години відображають час 15:35 (двома різними способами).

Рис. 3.42. Забавні годинник показує час 15:35

Специфікація проекту

Мета цього проекту – створити забавні годинник, для зчитування часу з яких потрібно знати їх секрет. Час (години, хвилини і секунди) відображається за допомогою кольорових світлодіодів. Щоб годинник був точними, ми вирішили тактіровать мікроконтролер від зовнішнього кварцу.

Для підключення такої великої кількості світлодіодів ми застосували мультиплексування методом Чарлі. Однак ми розбили наявні контакти вводу / виводу на три блоки: три контакти для управління шістьма світлодіодами індикації секунд, чотири контакти для управління 11 світлодіодами для годинників, п’ять контактів для мультиплексування (методом Чарлі) 14 світлодіодів для хвилин.

Передбачено два перемикача для установки часу. Вторинний джерело живленнялінійний стабілізатор з низьким падінням напруги LM2940, первинне джерело – батареї.

Опис пристрою

На рис. 3.43 показана принципова схема проекту. Оскільки є стабілізатор напруги LM2940 на 5 В, то вхідна напруга може варіюватися від приблизно 6 до 20 В. D1 – це діод Шотткі (1Ν5819), використовуваний в якості захисного (це вже пояснювалося раніше). Конденсатор С4 служить для фільтрації викидів і небажаних перешкод джерела живлення, а СЗ підключений до виходу LM2940. Конденсатори С1 і С2 припаяні близько контактів живлення мікроконтролера (щоб додатково розв’язати виникаючі в схемі перешкоди). Мікроконтроллер- ATtiny261. Світлодіоди мультиплексируются методом Чарлі в трьох групах: HOURS, MINUTES і SECONDS. Група SECONDS має шість світлодіодів і відображає секунди в двійковому форматі. LED6- молодший розряд, а LED1- старший. Група MINUTES складається з 14 світлодіодів. Світлодіоди від LED7 до LED11 представляють десятки хвилин (від 0 до 5). Світлодіоди від LED12 до LED20 представляють одиниці хвилин.

У групі HOURS 11 світлодіодів. Світлодіоди LED21 і LED22 представляють десятки годин, а світлодіоди від LED23 до LED31 – одиниці годин. Рекомендуємо для різних цифр вибрати світлодіоди різних кольорів.

Резистори з Rl по R12 по 50 Ом обмежують струм через світлодіоди. Через R13 на контакт RESET мікроконтролера подається напруга живлення Vcc. Q1 – це кварц частотою 1,8432 МГц для тактирования мікроконтролера. У нашому пристрої мікроконтролер відраховує час, а для цього потрібен дуже точний генератор. Наявний всередині мікроконтролера RC-генератор недостатньо стабільний, тому потрібно кварц.

Рис. 3.43. Принципова схема годин

Дві кнопки для установки часу підключені не так, як у попередніх проектах. ATtiny261 має 15 контактів вводу / виводу (не рахуючи скидання). З них 12 контактів використані для світлодіодів, а два – для кварцу. У нас залишається один контакт і дві кнопки. Однак ми знаємо, що виходи, керуючі секундами, періодично знаходяться або в стані 0, або в стані 1. Більш того, при мультиплексировании методом Чарлі в будь-який момент включений тільки один світлодіод (це вже пояснювалося раніше). Перші контакти кнопок з’єднані з входом СОМО мікроконтролера, а другий контакти кнопок підключені до виходів, керуючим світлодіодами секунд. Якщо логічний 0 присутній на SW1, то зміна логічного рівня СОМО розглядається як натискання кнопки S1, а якщо логічний 0 присутній на SW2, то зміна логічного рівня СОМО розглядається як натискання кнопки S2.

Точний час відраховується за допомогою таймерів. Кнопки S1 і S2 призначені для корекції часу.

Конструкція

Компонування плати в програмі EAGLE (разом з принциповою схемою) можна завантажити за адресою: www.avrgenius.com/tinyavrl.

Плата одностороння (на стороні компонентів всього кілька перемичок). Зібране пристрій показано на рис. 3.44.

Рис. 3.44. Забавні годинник в зборі

Програмування

Відкомпільований вихідний код (разом з файлом MAKEFILE) можна завантажити за адресою: www.avrgenius.com/tinyavrl.

Програма виконується на тактовій частоті 1,8432 МГц, яка надходить із зовнішнього кварцу (тому потрібно налаштувати fuse-біти). Пояснимо найважливіші фрагменти коду.

Лістинг 3.8

if ((PORTA&0x80)==0)&&((DDRA&0x80)==0x80))

// Якщо PA7 оголошений як вихід і дорівнює нулю

{

if(!(PINB&0X40))

{

switch_l_pressed = 1;

}

if (((РШВ & 0х40) == 0x40) && (switch_JL_pressed == l)) {

switch_l_re leased = 1;

}

}

if (! (PORTA&Ox20)&&(DDRA&0x20)==0x20)

// Якщо PA5 оголошений як вихід і дорівнює нулю

{

if(!(PINB&0x40))

{

switch_2__pressed = 1;

}

if ( ( (ΡΙΝΒ&0χ40) ==0x40) && (switch_2_pressed==l)) {

switch_2_released = 1;

}

}

Лістинг 3.8 – частина процедури обробки переривання по переповненню таймера TimerO, яка використовується для читання перемикачів. Для кнопки 1 спочатку перевіряється, чи рівний нулю рівень на контакті РА7. Якщо так, то зчитується РВ6 (для виявлення натискання або відпускання кнопки). Якщо РВ6 дорівнює нулю, то switch_i_pressed отримує значення ι (щоб вказати стан натискання кнопки). Якщо РВ6 дорівнює одиниці і switch_i_pressed = i, значить відбулося натиснення і відпуск кнопки 1 і змінної switch_i_reieased присвоюється значення 1. Основна програма виконує відповідну функцію. Аналогічно все відбувається і для кнопки 2 (коли на РА5 виставляється нуль).

void display (void) {

display_on = 0;

uO 8 hour_ten, hour_one, min_ten, min_one ;

hour_one = hour%10;

hour_ten = hour/10;

min_one = min%10;

min_ten = min/10;

// Відобразити секунди for (u08 h = 0; h < = 5; h ++)

{

secondled[5-h] = ( (sec& (l«h) ) == (l«h));

}

if (display_onl==l)

// Час змінити випадкову індикацію

{

display_onl=0;

// Вимкнути всі світлодіоди годин і хвилин for (u08 о = 0; про <9; про ++)

{

minuteled[o+5]=0;

// Скинути цифру десятків хвилин hourled [o + 2] = 0;

// Скинути цифру десятків годин if (про <5)

minuteled[o] = 0;

// Скинути цифру одиниць хвилин if (про <2)

hourled[o] = 0;

// Скинути цифру одиниць годин

}

// Відобразити цифру десятків годин for (u08 о = 0; o

{

// Згенерувати випадкове число від 0 до 1

random = TCNT0;

random = random%2;

while(hourled[random] == 1)

{

random++;

if(random==2) random = 0;

}

hourled[random] = 1;

}

// Відобразити цифру одиниць годин for (u08 о = 0; o

{

// Згенерувати випадкове число від 2 до 10

random = TCNT0;

random = random%9+2;

while(hourled[random] == 1)

{

random++;

if(random == 11) random = 2;

}

hourled[random] = 1;

}

// Відобразити цифру десятків хвилин for (u08 о = 0; o

{

// Згенерувати випадкове число від 0 до 4

random = TCNT0;

random = random%5;

while(minuteledfrandom] == 1)

{

random++;

if (random == 5) random = ,0;

}

minuteled[random] = 1;

}

// Відобразити цифру одиниць хвилин for (u08 о = 0; o

{

// Згенерувати випадкові числа від 5 до 13

random = TCNT0;

random = random%9+5;

while(minuteled[random] == 1)

{

random++;

if(random == 14) random = 5;

}

minuteled[random] = 1;

}

}

}

Функція відображення (лістинг 3.9) – найважливіший компонент вихідного коду. Вона викликається щосекунди для поновлення світлодіодів секунд. Однак якщо dispiay_oni = i, то це означає, що нинішнє значення секунд кратно п’яти і що потрібно згенерувати нове випадкове відображення хвилин і годин. Значення timero використовується для обчислення випадкових чисел. Код був написаний так, щоб в індикації різних цифр не було однакових випадкових чисел.

Інша частина коду відраховує час і реагує на натискання кнопок користувачем.

Робота пристрою

У цьому проекті немає вимоги зберігати відлік часу, тому при кожному включенні годин індикація починається з 00:00. Ви можете змінити свідчення хвилин і секунд, натискаючи кнопки S1 і S2. Зверніть увагу, що кнопки не будуть реагувати до тих пір, поки на підключених до них контактах введення / вьщода чи не з’являться одиниці. Час відображається в 24-годинному форматі.

Джерело: Гадре, Д., Цікаві проекти на базі мікроконтролерів tinyAVR / Дхананья Гадре, Нігула Мелхотра: Пер. з англ. – СПб .: БХВ-Петербург, 2012. – 352 с .: іл. – (Електроніка)