Проект tinyAVR 18. "Дурацкие" часы

January 13, 2015 by admin Комментировать »

Часы на базе микроконтроллера давно всем известны. Но предлагаемое устройство отличается от остальных. В этом проекте (вместо отображения цифр на 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<s. end;i++)

//записать содержимое start в end

{

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

}

centerline(); //отобразить центральную линию if(s.c==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(s.c==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 (для отображения прошедшего времени) и проверяется s.c. Если s.c=i, то s.start и s.end увеличиваются на 3 и s.c опять присваивается 0. Вторая часть выполняется тогда, когда s.end достигает максимального значения. Сначала данные отображаются от s. start до s.end-з (поскольку s.end в первой части была увеличена на 3) на странице s.row. Затем данные выводятся с начала таблицы progmem до s.x. Это продолжается до тех пор, пока s .х не достигнет значения 84. В этот момент s. start присваивается 0, a s. end — значение 84. Происходит такая же проверка s. с, как и в первой части, И ВКЛЮЧаеТСЯ centerline.

Минуты, часы и дни отображаются при помощи аналогичных (определенных в rtc.c) процедур. Помимо этого, код содержит начальную установку времени (при помощи кнопок) и отслеживает прерывание по изменению состояния контакта для переключения между отображением дней и секунд.

Работа устройства

Для работы часов нужно подать напряжение и установить текущее время. Затем вы увидите, как "пролетают" по дисплею секунды. Минуты идут медленнее секунд, а часы — еще медленнее. Нажмите кнопку S2, и вы увидите день недели. Нажмите S2 еще раз, и вы вернетесь обратно.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты