Годинник на базі мікроконтролера давно всім відомі. Але пропонований пристрій відрізняється від інших. У цьому проекті (замість відображення цифр на LCD або світлодіодному індикаторі) години, хвилини і секунди прокручуються повз вертикальної риси на екрані. Саме тому ці години і називаються “безглуздими”. Блок-схема наведена на рис. 4.26.

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

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

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

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

На рис. 4.27 зображена принципова схема пристрою. У ній використаний мікроконтролер Tiny861 і дисплей Nokia. До микроконтроллеру підключений зовнішній кварц із частотою 7,3728 МГц. Та ж сама тактова частота служить і для відліку реального часу. Пристрій живиться від батареї в 9 В (можна також взяти чотири батарейки по 1,5 В). Напруга від батарей стабілізує мікросхема LP2950-3.3 (для харчування мікроконтролера і дисплея Nokia).

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

На схемі показані ще деякі компоненти (операційний підсилювач і роз’єм для конденсаторного мікрофона), але вони до проекту годин відношення не мають. Дві кнопки S1 і S2 призначені для настройки часу і прокручування дисплея. На годиннику відображаються секунди, хвилини, години і дні тижня. Однак через обмежений розміру дисплея одночасно можна бачити тільки три елементи. Кнопкою S2 можна прокручувати ці елементи.

Конструкція

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

Рис. 4.28. Плата пристрої (сторона компонентів)

Рис. 4.29. Плата пристрої (сторона друкованих провідників)

Плата одностороння (на стороні компонентів є всього декілька перемичок). Боку друкованої плати наведено на рис. 4.28 і 4.29. Дві фотографії пристрою під показані на рис. 4.30 і 4.31.

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

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

Тактова частота обрано рівної 7,3728 МГц. Контролер запрограмований за допомогою STK500 в режимі програмування ISP. Для роботи пристрою на зовнішній тактовій частоті необхідно перед програмуванням контролера встановити його fuse-біти CKSEL в 1101. Деякі фрагменти коду такі ж, як і в попередніх проектах на основі дисплея Nokia 3310, тому ми включили до складу проекту бібліотеку для роботи з LCD (що позбавляє від необхідності повторно писати код для сполучення з LCD). Всі необхідні функції для сполучення з LCD і відображення даних взяті безпосередньо з цієї бібліотеки.

Для формування зображення ми створили дві функції: boxes і centerline. Перша малює символи відображення часу на нульовий, другої та четвертої сторінках, а друга-центральну лінію, яка відзначає минулий час. Ця лінія має координати X, рівні 41 і 42 – і присутній на кожній сторінці. Дані (секунди, хвилини, години) зберігаються в таблиці в пам’яті програм. Для відображення символу або цифри потрібно 12 стовпців, а таблиця складається з 60 таких символів – Тому все потрібно 720 стовпців. У таблиці tabie2 зберігаються символи днів тижня. Для відображення символу одного дня тижня потрібно 18 стовпців, т. е. загальний розмір масиву дорівнює 18 х 7 = 126.

TIMER0 инициализируется частотою в 7200 Гц, одержуваної шляхом ділення системної частоти на 1024; за допомогою виставлення в 1 біта toieo регістра timsk активізується переривання по переповнення. Подальше поділ виконується програмно, як показано в процедурі обробки переривання (лістинг 4.9).

Лістинг 4.9

ISR (TIMERO_OVF_vect)

// Процедура обробки переривання таймера

{

TCNT0L=(255-225); count++; if(count==8)

‘// Поділ на 8

{

count=0;

if (s.с == 0) // число секунд s. з = 1;

if (ш.с <20) // число хвилин ш.с ++;

if (h.с <1200) // число годин

h. C++;

if (d.c <19200) // число днів d.c ++;

}

}

У цій процедурі регістр таймера инициализируется таким чином, що переповнення відбувається при значенні таймера 225 (а не 255). Таймер працює на частоті 7200 Гц, тому переривання по переповнення відбувається через 225/7200 секунд. Коли значення змінної count досягає 8? виконується процедура обробки переривання. Це означає, що тіло процедури виконується кожні 225×8 / 7200 секунди, а це одна чверть секунди.

Секунда закінчується після того, як 12 стовпців проходять повз центральної лінії. Тому на кожному восьмому перериванні таймера (т. Е. Кожну чверть секунди) повз центральної лінії повинні проходити три стовпці. Це робиться в головному циклі програми. Нескінченний цикл while відстежує секунди, які потрібно відображати на LCD. У цьому нескінченному циклі є чотири функції з бібліотеки rtc library: seconds (), minutes (), hours () І days (). Функція seconds () наведена в лістингу 4.10.

I Лістинг 4.10 if (s.end! = 723)

// Якщо end НЕ дорівнює межі таблиці tablel

{

cursorxy(0/s. row);

// Встановити курсор на сторінку секунд for (i = s. Start; i

// Записати вміст start в end

{

coluitin=pgm_read_byte ( (tablel+i) ) ; writedata(column) ;

}

centerline (); // Відобразити центральну лінію if (sc == l) // перевірити count {

s.start+=3; s.end+=3; s.c=0;

}

}

else if(s.end==723)

// Якщо end досяг межі tablel {

centerline ();

cursorxy(0,s. row);

for(i=s.start;i<(s.end-3);i++)

// Відобразити вміст починаючи зі start

{

column=pgm_read_byte( (tablel+i) ) ; writedata(column);

}

for(i=0;i<s.x;i++)

// Відобразити з першого елемента таблиці table 1 {

column=pgm_read_byte( (tablel+i) ) ; writedata(column);

}

centerline (); // Тимчасова лінійка if (sc == l) // перевірити count {

s.start+=3; s.x+=3; s.C=0;

}

if(s.x==84)

// Перевірити – чи дійшов start до end {

s.end=84; s.start=0;

S.x=3;

}

}

Всі відображаються на дисплеї символи (секунди, хвилини, години і дні) мають у структурі rtepara свої набори змінних:

□ start – початкова Х-координата підлягають відображенню даних;

□ end – кінцеве значення Х-координати підлягають відображенню даних;

□ х – зміщення X, що використовується для відображення даних з початку таблиці PROGMEM (коли end досягає свого граничного значення);

□ с – лічильник числа, який збільшується в процедурі обробки переривання.

□ row – сторінка відповідного числа.

У попередній процедурі її перша частина виконується тоді, коли s.end не дорівнює граничному значенню (723). Після цього дані виводяться на сторінку s.raw від s.start до s.end (це 84 шпальти, тому дані виводяться на повну сторінку). Потім включається centerline або timeline (для відображення минулого часу) і перевіряється sc Якщо sc = i, то s.start і s.end збільшуються на 3 та sc знову присвоюється 0. Друга частина виконується тоді, коли s.end досягає максимального значення. Спочатку дані відображаються від s. start до s.end-з (оскільки s.end в першій частині була збільшена на 3) на сторінці s.row. Потім дані виводяться з початку таблиці progmem до sx Це продовжується до тих пір, поки s .х не досягне значення 84. В цей момент s. start присвоюється 0, a s. end – значення 84. Відбувається така ж перевірка s. с, як і в першій частині, і включає centerline.

Хвилини, години і дні відображаються за допомогою аналогічних (визначених у rtc.c) процедур. Крім цього, код містить початкову установку часу (за допомогою кнопок) і відстежує переривання по зміні стану контакту для перемикання між відображенням днів і секунд.

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

Для роботи годинника потрібно подати напругу і встановити поточний час. Потім ви побачите, як “пролітають” по дисплею секунди. Хвилини йдуть повільніше секунд, а годинник – ще повільніше. Натисніть кнопку S2, і ви побачите день тижня. Натисніть S2 ще раз, і ви повернетеся назад.

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