Проект tinyAVR 11. Забавные часы

November 15, 2014 by admin Комментировать »

Существует множество часов различных размеров и форм. В наших часах для индикации времени используются разные типы светодиодов. Блок-схема часов приведена на рис. 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<hour_ten;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<hour_one;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<min_ten;o++)

{

//сгенерировать случайное число от 0 до 4

random = TCNT0;

random = random%5;

while(minuteledfrandom] == 1)

{

random++;

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

}

minuteled[random] = 1;

}

//отобразить цифру единиц минут for(u08 о = 0;o<min_one;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 с.: ил. — (Электроника)

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

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