Двоичные часики на atmega8

Двоичные часики на ATmega8

Двоичные часики на atmega8

Двоичные часики на ATmega8

Двоичные часы – это часы показывающие время в двоичном (бинарном) виде.

В двоичной системе счисления используются только два числа (0 и 1), в отличии от десятичной, которой принято воспользоваться людьми.

Так, к примеру, время 11:33.06 в двоичной системе счисления будет выглядеть так: 1011 : 100001 : 000110

Индикация времени в данных часах осуществляется светодиодами,

При всем этом свечение светодиода значит 1, а отсутствие свечения — 0.

Двоичные часы — это надежное средство для обучения счету в уме малышей, приобщения их, в некоторой игровой форме, к информатике, арифметике, электронике и программированию.

Вот и у меня мысль сделать подобные часы появилась тогда, когда у моего отпрыска, в школе, появился таковой предмет как информатика. Чтобы как-то не назойливо заинтересовать его данным предметом, а не кислым ом из одной формы счисления в другую и разъяснения принципа представления двоичных чисел я решил сделать сей аксессуар.

Потому что у меня залежалось около 10-ка микросхем ATmega8 в DIP-корпусе, её было и решено использовать в этом устройстве.

Принципная схема представлена на последующем рисунке:

Схему было решено делать очень обычной, чтоб было меньше паять. Потому что в устройстве употребляется динамическая индикация, то было решено исключить из схемы токоограничительные резисторы в цепях светодиодов. При всем этом импульсный ток через светодиод при динамической индикации не будет превосходить очень допустимого.

Для питания часов я решил использовать зарядное устройство с USB-разъемом, с напряжением на выходе 5 Вольт.

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

Посмотрев из того что есть под рукою, было решено использовать отрезок кабель канала типоразмера 16×16. В нем через однообразное расстояние были просверлены отверстия, в которые были вставлены светодиоды, и приклеены при помощи термо клея.

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

Чтобы не травмировать психику юзеров и не оторвать чего или во время разборки данной конструкции фото “потрохов” я выкладывать не буду, а приведу только фото и видео работы законченного устройства. Часики были повешены вертикально на стенку, над компьютерным столом малыша.

Ну и в заключении расскажу как установить правильное время, все просто,

После нажатия кнопки “mode”, светодиоды, отвечающие за показания часов, начнут мигать. Кнопкой “set” нужно установить необходимое время. Следующие нажатия на кнопку “mode” приведут к редактированию показаний минут и потом секунд.

В часиках имеется функция авто-выхода из режима установки времени, устройство выходит из этого режима по истечении 30сек. если при всем этом не одна из кнопок не нажимается.

Если микроконтроллер новый, то фьюзы можно бросить по дефлоту.

Он тактируется от встроенного RC-генератора на частоте 1МГц.

На всякий случай приведу скрин, как должны быть выставлены фьюзы.

В прилагаемом архиве содержится начальный код в WinAVR, файл прошивки и проект в программке Proteus.

Перечень радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот U1 МК AVR 8-бит ATmega8A-AU 1 Поиск в win-sourceВ блокнотQ1-Q3 Биполярный транзистор S8550 3 Поиск в win-sourceВ блокнотX1 Кварцевый резонатор32768 Гц1 Поиск в win-sourceВ блокнотC1, C3 Конденсатор100 нФ2 Поиск в win-sourceВ блокнотC2 Электролитический конденсатор47 мкФ1 Поиск в win-sourceВ блокнотR1-R3 Резистор 4.7 кОм 3 Поиск в win-sourceВ блокнотR4 Резистор 10 кОм 1 Поиск в win-sourceВ блокнот Светодиод16 Поиск в win-sourceВ блокнотДобавить все

Скачать перечень частей (PDF)

Clock_Binary_M8.rar (131 Кб)
WinAVR Часы Микроконтроллер Proteus AVR

Источник: http://bloggoda.ru/2018/03/21/dvoichnye-chasiki-na-atmega8/

Часы на микроконтроллере AVR

 

   В качестве примера использования событийной системы на таблице я выбрал такой популярный девайс как часы на микроконтроллере. Чтобы пример был понятен как можно более широкому кругу людей функционал часов ограничивается отображением и установкой времени. Программа носит учебный характер и не претендует на оптимальность.

   Итак, попытаюсь сформулировать, как я кодил эту программу. 

   Программа учебная, а значит, все должно быть по минимуму. Отображение часов и минут, двоеточие, моргающее раз в секунду, и возможность это самое время выставить. 

   Из аппаратных средств нужен микроконтроллер AVR – atmega8535, символьный lcd и  кнопки –  для навигации по одноуровнему меню часов и установки времени. Трех штук – Enter, Up, Down вполне хватит. Кнопкой Cancel пренебрежем. 

   Кнопки будут опрашиваться в прерывании таймера Т0, а с помощью таймера Т1 будут формироваться секундные интервалы. Можно, конечно, использовать таймер Т2 с внешним часовым кварцем, но не суть.. точность сейчас не главное. 

   В прерываниях таймеров в очередь будут помещаться события. Событий будет четыре — по одному на каждую кнопку + секундный тик. 

   У часов будет три состояния — отображение времени, установка часов, установка минут. 

   Исходя из всего этого, можно расписать логику работы часов в виде таблице переходов. 

 Чтобы описать таблицу в Си коде, нужно определить коды состояний и событий, а также написать обработчики. Коды состояний и событий я вынес в заголовочный файл list_event.h, он используется в некоторых программных модулях. 

//коды событий

#define EVENT_NULL              0

#define EVENT_KEY_UP          1

#define EVENT_KEY_DOWN     2

#define EVENT_KEY_ENTER     3

#define EVENT_SYS_TIMER      4

//коды состояний

#define STATE_NO_CHANGE     0

#define STATE_NORMAL           1

#define STATE_SET_HOUR        2

#define STATE_SET_MINUTE     3

   Обработчики я поместил в модуль intrface.h, interface.c. На начальном этапе их можно заменить пустой функцией EmptyFunc (она есть в заготовке событийной системы) или создать функции-обработчики без тела, как делал я.

   В модуле interface нет комментариев, но там все довольно просто – функции делают в точности то, что описано в последнем столбце таблицы переходов. Думаю, разберетесь.

//interface.h прототипы функций

void GUI_General(void);

void GUI_SelectHour(void);

void GUI_SelectMinute(void);

void GUI_IncHour(void);

void GUI_DecHour(void);

void GUI_IncMinute(void);

void GUI_DecMinute(void);

void GUI_SetTime(void);

void GUI_ChangeTime(void);

Таблицу переходов закодил в заготовке событийной системы — event-system.c

__flash struct ROW_TABLE table[] = {

         //STATE                        EVENT                       NEXT STATE                   STATE_FUNC    

    {STATE_NORMAL,        EVENT_KEY_ENTER,        STATE_SET_HOUR,           GUI_SelectHour},

    {STATE_NORMAL,        EVENT_SYS_TIMER,        STATE_NO_CHANGE,         GUI_ChangeTime},

    {STATE_SET_HOUR,     EVENT_KEY_ENTER,        STATE_SET_MINUTE,       GUI_SelectMinute},

    {STATE_SET_HOUR,     EVENT_KEY_UP,             STATE_NO_CHANGE,        GUI_IncHour},

    {STATE_SET_HOUR,     EVENT_KEY_DOWN,        STATE_NO_CHANGE,        GUI_DecHour},

    {STATE_SET_MINUTE,   EVENT_KEY_ENTER,       STATE_NORMAL,              GUI_General},

    {STATE_SET_MINUTE,   EVENT_KEY_UP,            STATE_NO_CHANGE,         GUI_IncMinute},

    {STATE_SET_MINUTE,   EVENT_KEY_DOWN,        STATE_NO_CHANGE,        GUI_DecMinute},

    {        0,                                 0,                                  0,                          EmptyFunc}

};

Дальше. 

Сделал модуль timer.c, timer.h. Там три функции — функция инициализации таймеров Т0 и Т1 и функции прерываний. Т0 вызывает прерывания каждые 10мс, Т1 — каждую секунду.

void TIM_Init(void)

{

   …..

}

//опрос кнопок

#pragma vector = TIMER0_COMP_vect

__interrupt void Timer0Comp(void)

{

  BUT_Debrief();  //функция опроса кнопок из модуля button.c

}

//секундный таймер

#pragma vector = TIMER1_COMPA_vect

__interrupt void Timer1CompA(void)

{

  ES_PlaceEvent(EVENT_SYS_TIMER);  

}

  Остальные модули buttons.c, bcd.c, lcd_lib.c у меня уже были готовы — остались от проекта «термометр на микроконтроллере». Я подключил их к проекту и настроил   заголовочные файлы:

в button.h — пины, к которым подключены кнопки и порт

в lcd_lib.h – пины, к которым подключен lcd, порт, частоту кварца, опрос флага занятости и тип контроллера.

в bcd.h – переопределил функцию вывода на lcd

Далее, включил в main заголовочные файлы необходимых модулей и вписал функции инициализации — таймеров, дисплея, событийной системы и кнопок. 

//модуль main

#include<\p>

#include<\p>

#include “lcd_lib.h”

#include “buttons.h”

#include “event-system.h”

#include “interface.h”

#include “timer.h”

int main( void )

{

  unsigned char event = 0;

  LCD_Init();

  BUT_Init();

  TIM_Init();

  ES_Init();

  GUI_General();

  __enable_interrupt();  

  while(1){

    event = ES_GetEvent();

    if (event){

      ES_Dispatch(event);

    }

  }

  return 0;

}

И последним этапом было написание кода обработчиков и отладка программы. 

Вот собственно и все. 

Источник: http://chipenable.ru/index.php/item/75

Учимся работать с 7-ми сегментником (часть вторая). Делаем простые часы на ATmega8

0Спам14 лол   (02.08.2014 00:07)что за критин это написал? как же антидребезг? я в шоке с таких авторов
Читайте также:  Модернизация ноутбука. жёсткий диск вместо оптического привода

0Спам13 Giga   (28.03.2014 18:50)Не получается потушить первый сегмент если там 0. Делал условие если часы 00 01 02 03 04 05 06 07 08 09, то порт Б 0=0. Номер не прошел))

0Спам12 belazov   (02.02.2012 18:53)спаял такие часы (в машине сломались). сделал по статье, но индикатор с общим анодом (код переделал под общ анод). Но часы не пошли. Переделал прогу – часы пошли. Но как зажечь точку секундную в разряде единиц часов – пока не въехал. Код пока без учета кнопок управления и интервал секунд составляет 0,1сек для проверки работы- чтоб не ждать долго. создал тему на форуме http://my-avr.at.ua/forum/3-132-1#773 но не нашел как вставить туда файлы, а то б выложил схему , печатку и фото.

0Спам10 Watch-Maker   (21.10.2011 14:16)Я использую не транзисторные ключи, а дешифратор 74145 или 74LS145. Индикаторы с общим КАТОДОМ, до 10 разрядов, на управление разрядами всего 4 ноги контроллера – итого 12 ног на весь 10-разрядный дисплей.

0Спам11 HiSER   (21.10.2011 14:18)Прям без резисторов? У тебя сколько один сегмент потребляет?Допустимый ток этой МС на ногу 12мА.

0Спам9 Reloader   (21.05.2011 15:16)Господа. я только начинаю изучать AVR. это 1-я конструкция, которую я хотел собрать. но в коде ошибка!!! часы неработают!! на экране – белеберда! АФФтар – ты нехороший человек! если уж взялся учить – сам бы сначала проверил. Господа, просьба большая, ежели кто знает, как исправить – киньте инфу на почту : serowsw@yandex.ru Готовый код ненужно – просто объясните принцип 🙁 Данная схема с общим АНОДОМ!а как переделать на схему с общим катодом? заранее всем благодарен!

0Спам8 qwerty   (07.02.2011 09:01)Помогите переконвертировать на контроллер мега48

0Спам7 Виталий   (04.09.2010 02:31)”Гавно часы! Лузер автор уже второй раз! Я начинающй и то вижу сразу что если пропадет питание то и всё по нулям станет! Автор читай книги про АВР!!!!!! Или описывай подробнее! Хватит копировать чужие тексты!” – Вместо того что бы критиковать, лучше бы включил мозги и модифицировал батарейкой, ишак!Вот автор реально молоток, на сколько я заметил здесь собраны чисто на cb? а это редкость, автор спасибо, основы очень хорошо рассписаны, так держать!!!

0Спам6 misha   (15.03.2010 18:44)Гавно часы! Лузер автор уже второй раз! Я начинающй и то вижу сразу что если пропадет питание то и всё по нулям станет! Автор читайкниги про АВР!!!!!! Или описывай подробнее! Хватит копировать чужие тексты!

0Спам5 mexx   (14.02.2010 20:05)Привет! Взял все исходники в файлах запускаю Proteus н че не работает!!

0Спам4 Anymorf   (15.03.2009 12:58)И ещё вспомнил лично я не решил занимать линии SPI мало ли чего… потому поменял местами порты для выбора сегмента и опроса кнопок. Оставил только две кнопки(+Н +М) как в примере с Жк часами и Ресет. Но это уже так сказать мое представление этой схемы…

Источник: http://my-avr.at.ua/publ/1-1-0-22

Схема бинарных часов своими руками

На картинке вы видите доделанную сборку бинарных часов,сделанных своими руками. Ничего сложного в определении времени нет,и рассмотрим в статье подробно.Каждый вертикальный ряд светодиодов отвечает за десятки,и единицы времени.

Схема часов

Часы выполнены на микроконтроллере atmega8.

К будущим часам на этапе создания сразу были предъявлены следующие требования:

  • сравнительно небольшие габариты как платы, так и устройства в целом;
  • использование максимально доступных компонентов;
  • презентабельный внешний вид корпуса.

    В качестве микросхемы часов реального времени – доступная DS1307. Также параллельно линиям питания вблизи МК и на входе питания установлены неполярный конденсаторы 100 нФ и полярный (танталовый) на 47 мкФ.

Все резисторы и конденсаторы – в SMD-корпусах типоразмера 0805. Из выводных компонентов – лишь светодиоды, колодка для батарейки и кнопки настройки.

Кнопки – любые без фиксации; для корпусного варианта подойдут кнопки с длинными “пимпочками”, например такие:

Резисторы R1..R6, R14..R18 могут варьироваться в достаточно широких пределах. Габариты светодиодов значения не имеют, однако корпус и плата рассчитаны на 5 мм круглые светодиоды. “Reserved port” – вывод на плате, который предусмотрен на плате для потенциального расширения функционала часов, например, добавления динамика.

Ниже представлена печатная плата устройства:

     Так как число различных связей между светодиодами и МК достаточно велико, а большое число “висячих” перемычек делать не хотелось, устройство реализовано на двусторонней ПП. Толщина стеклотекстолита – 1,5 мм, габаритные размеры платы – 80 х 50 мм.

Плата с органами управления (пятью кнопками) выполнена отдельно и будет представлена ниже.

На плате дополнительно находятся (не указаны в схеме): разъем для подключения питания + программатора; дополнительный отверстия для подключения проводом питания; резистор в цепи сброса; пятачки для конденсаторов в цепи часового кварца (про них будет сказано ниже).

Плата изготовлена на фрезерном станке с ЧПУ, что позволило получить практически заводское качество. Фото собранной платы представлено ниже:

Так как прозрачные светодиоды обладают слишком высокой яркостью, их поверхность пришлось обработать грубой тканью типа “скотч-брайт” для придания матовости, что позволило получить более тусклый и рассеянный свет.

Плата с органами управления соединяется основной при помощи семипроводного шлейфа (2 – питание, 5 – кнопки); размер – 68 х 22 мм.

После сборки платы и прошивки МК осталось выполнить последний пункт – создать красивый корпус для устройства.

Ввиду наличия фрезерного станка с ЧПУ, было принято решение вырезать стенки из стеклотекстолита толщиной 1,5 мм и соединить их между собой при помощи пайки; переднюю панель – из алюминия толщиной примерно 1 мм.

Общая длина корпуса – 104 мм, высота (с ножками и кнопками) – 77 мм, толщина – 25 мм. Разметка корпуса со всеми отверстиями находится в одном файле с печатной платой. Боковые, верхняя и нижняя стенки соединены друг с другом при помощи латунных стоек под винт М3:

Естественно, предварительно у стоек была удалена винтовая часть. Разные стадии результата сборки представлены ниже (последнее фото было сделано уже после окончательной сборки, поэтому явно видны следы краски):

Плата с кнопками крепится к верхней панели на две стойки (с одной стороны такой стойки – гладкая поверхность, с другой – винт М3) при помощи гаек, для этого на плате предусмотрены отверстия. Высота стоек компенсирует высоту кнопок, поэтому над корпусом последние возвышаются незначительно:

   Лицевая сторона передней панели была обработана мелкозернистой наждачкой, затем пастой ГОИ.

Обратная сторона, наоборот, обработана грубой наждачкой для крепления к боковым стенкам через 5 мм деревянные бруски при помощи эпоксидной смолы.

В задней стенке предусмотрен micro-USB разъем для подачи питания, а также отверстие для потенциального динамика; крышка крепится на вышеупомянутые латунные шестигранники при помощи четырех винтов М3 х 15 мм.

Торцевые и задняя стенка была окрашены автомобильной краской из баллончика.

На нижней панели предусмотрены отверстия для крепления ножек, однако потом было решено использовать резиновые ножки, закрепленные на суперклей.

Собранный корпус получился достаточно прочным, неоднократные случайные падения не нарушили целостность конструкции. Основная плата крепится к стенкам корпуса за счет олова и латунных стоек. Такое решение было принято в связи с тем, что батарейка и разъем для программирования становятся доступными путем снятия задней крышки; то есть, снятие платы не имеет смысла.

Правильное собранное устройство в наладке не нуждается и начинает работать сразу. Настройка времени осуществляется следующим образом:

  • примерно на 2,5 с необходимо зажать кнопку “0”SEC/SET (находится над секундами). После этого счетчик секунд сбросится в ноль, часы остановят ход;
  • затем при помощи кнопок настройки времени необходимо установить нужное время;
  • затем нажать кнопку “0”SEC на 2,5 с; часы возобновят свой ход с обновленным временем.

Собранное устройство было успешно подарено другу и служит уже более года, замечаний по работе и неполадок выявлено не было.

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

Результатом такого отклонения является плохая точность хода: так, отклонение от «эталонной» частоты на 2 герца приводит к отставанию в 5,27 секунд в сутки, или две с половиной минуты в месяц.
Частоту часового кварца можно подстроить, путем установки последовательно или параллельно кварцу конденсатора емкостью в несколько пикофарад.

Таким образом, автору удалось снизить разницу частот до 0,1Гц, что приводит к гораздо меньшей погрешности – 7 секунд в месяц.

Проект в Proteus и прошивка с исходниками находится в архиве-скачать

Источник: http://radioshemka.ru/2016-06-20-08-39-33/chasy/138-binarnye-chasy-svoimi-rukami-skhema

Девайсы. Часы с большими цифрами

Концепция часов с большими цифрами Конструктивно девайс будет состоять из двух плат – одна над другой. Первая плата – матрица светодиодов, образующих разряды часов и минут, Вторая – силовая часть (управление светодиодами), логика и питание.

Такая конструкция сделает часики более компактным (без корпуса примерно 22см х 9 см, толщиной сантиметра 4-5) + даст возможность прикрутить матрицу к другому проекту, если что то пойдет не так. Силовая часть будет построена на базе драйвера UL2003 и транзисторных ключах. Логическая – на Atmega8 и DS1307.

Питание: 220В – трансформатор; логика 5В (через 7805), силовая часть – 12В (через LM2576ADJ). Отделено будет предусмотрена кроватка для батарейки 3В для автономного питания часов реального времени – DS1307.

Думаю использовать Atmega8 и DS1307 (часики планирую подвесить под потолком, и что бы в случае пропадания электричества каждый раз не лазить за настройкой), однако разводка платы будет предполагать возможность работы девайса и без DS1307 (на первое время, а может и навсегда – уж как получится).

Таким образом, в зависимости от комплектации алгоритм работы программы часов будет следующим:

Atmega8 – счетчик времени по таймеру. Работа в цикле без пауз: опрос клавиатуры, корректировка времени (если необходимо), отображение 4 разрядов и разделителя.

Читайте также:  Bluetooth термометр

Atmega8 + DS1307. Работа в цикле без пауз: опрос клавиатуры, корректировка времени DS1307 (если необходимо), зачитка времени с DS1307, отображение 4 разрядов и разделителя. Или другой вариант – зачитка с DS1307 по таймеру, остальное в цикле (пока не знаю как лучше).

Сегмент представляет собой 4 красных светодиода, соединенных между собой последовательно. Одна цифра – 7 сегментов с общим анодом. Сегменты не планирую разделять шаблоном «восьмерки», как это сделано в обычных индикаторах.

Силовая часть часов

Силовая часть часов построена на драйвере UL2003 и транзисторных ключах VT1 и VT2. UL2003 отвечает за управление сегментами индикатора, ключи – за управление разрядами. Отдельно управляется разделитель часов и минут (сигнал K8). Управление сегментами, разрядами и разделителем осуществляется от микроконтроллера подачей положительного потенциала (т.е. подачей +5В) на К1-К8, Z1-Z4.

Подача сигналов на сегменты и разряды должна осуществляться синхронно и с определенной частотой, для того, что бы обеспечить динамический вывод информации (часов и минут). В качестве транзистора VT1 (BCP53) можно использовать транзистор BCP52.

Схема силовой части часов с большими цифрами

Печатная плата семисегментного индикатора для часов с большими цифрами

Как я говорил ранее, конструктивно часы будут состоять из двух печатных плат – плата индикатора + логика и силовая часть. Начнем с разработки и изготовления печатной платы индикатора.

Разработка печатной платы семисегментного индикатора для часов с большими цифрами

Печатная плата семисегментного индикатора для часов с большими цифрами в формате “lay” находится конце статьи, в присоединенных файлах.

О технологии изготовления печатных плат методом ЛУТ можно почитать тут.

Если вы сделали все правильно, готовая печатная плата будет выглядеть примерно так.Готовая печатная плата семисегментного индикатора для часов с большими цифрами

Сборка семисегментного индикатора

Поскольку плата индикатора является двухсторонней, первое, что надо сделать это выполнить межслоевые переходы. Я делаю это с помощью ножек ненужных деталей – продеваю их в отверстия и припаиваю с двух сторон. Когда все переходы выполнены, зачищаю их плоским мелким напильником – получается очень аккуратно и симпатично.

Межслоевые переходы на плате индикатораСледующий шаг, собственно говоря, сборка индикатора. Для чего нам понадобится пачка красных (зеленых, белых, синих) светодиодов. Я, например, брал эти.Подготовка к сборке индикатораПри установке диодов не забываем, что мы делаем индикатор с общим анодом – т.е.

“+” диодов должны быть соединены вместе. Общие аноды на печатной плате – это большие фрагменты меди. Обязательно обратите внимание на анод разделительной точки.

Расположение анодов на печатной плате индикатораВ итоге, после 2 часов кропотливой работы должно получиться вот что:Семисегментный индикатор

Цифровая часть часов

Цифровую часть часов с большими цифрами будем собирать по схеме:Схема часов с большими цифрамиСхема часов довольно прозрачна, поэтому объяснять как она работает не вижу смысла. Печатную плату в формате *.lay можно скачать в конце статьи. Замечу, что печатная плата в основном разработана под детали для поверхностного монтажа.

Итак, элементная база, которую использовал я: 1. Диодный мост DFA028 (подойдет любой компактный для поверхностного монтажа); 2. Регуляторы напряжения LM2576ADJ в корпусе D2PAK, 78M05 в корпусе HSOP3-P-2.30A; 3. Транзисторные ключи BCP53 (корпус SOT223) и BC847 (корпус SOT23); 4. Микроконтроллер Atmega8 (TQFP); 5.

Часы реального времени DS1307 (SO8); 6. Блок питания 14В 1,2А от какого-то старого устройства; 7. Остальные детали – любого типа, подходящие по размерам для установки на печатную плату. Разумеется, если вы хотите применить другие корпуса деталей, вам потребуется внести некоторые изменения в печатную плату.

Обратите внимание на номиналы сопротивлений R3 и R4 – они должны быть именно такими, какие указаны на схеме – не больше не меньше. Это сделано для того, что бы обеспечить на выходе регулятора напряжения LM2576ADJ ровно 12В.

Если все таки не удастся найти такие номиналы резисторов, то значение сопротивления R4 может быть рассчитано по формуле:

R4=R3(12/1.23-1) или R4=8.76R3

Сборка цифровой части. Версия 1, без DS1307

Если при изготовлении печатной платы часов вы придерживались рекомендаций, изложенных в этой статье, то тогда вам излишне напоминать, что перед сборкой печатная плата должна быть просверлена, все видимые короткие замыкания на ней устранены, а плата покрыта жидкой канифолью? Тогда приступаем к сборке часов.

https://www.youtube.com/watch?v=hs-IpfZ9nQU

Я рекомендую начать со сборки блока питания и только за тем выполнить монтаж цифровой части. Это общая рекомендация по самостоятельной сборке девайсов. Почему? Просто потому, что если блок питания собран с ошибкой можно пожечь всю низковольтную электронику, которая должна питаться этим блоком питания.

Если все сделано правильно – блок питания должен заработать сразу. Проверяем сборку блока питания – замеряем напряжение в контрольных точках. На рисунке показаны контрольные точки, в которых следует проверить напряжение питания. Если напряжение соответствует заявленному, можно приступать к сборке цифровой части часов.

Иначе проверяем монтаж и работоспособность элементов блока питания.Контрольные точки и значения напряжений для блока питания часовПосле того, как проверка блока питания выполнена приступаем к сборке цифровой части часов – устанавливаем все остальные элементы на печатную плату. Проверяем на КЗ, особенно в ногах микроконтроллера Atmega и драйвера UL2003.

Монтаж цифровой части часовОбратите внимание на то, что сборку часов мы выполняем БЕЗ установки часов реального времени DS1307, однако вся обвязка этой микросхемы должна быть выполнена.

В будущем, если возникнет необходимость, это сэкономит нам время на доработку часов под вторую версию, там где все таки будут использоваться отдельные, независимые часы реального времени на DS1307.

Предварительная проверка микроконтроллера ATMEGA8

Для того, что бы проверить правильность и работоспособность микроконтроллера нам потребуется:

1. Программатор, например USBASP.

2. Дата-кабель V4 для внутрисхемного программирования микроконтроллера. 3. Программа AVRDUDESHELL. Подключаем плату часов к дата-кабелю. Дата-кабель подключаем к программатору. Программатор к компьютеру, на котором установлена программа AVRDUDESHELL. Подключать плату часов к питающей сети 220В не следует. Пытаемся прочитать, например, фьюзы микроконтроллера. Если все ОК – поздравляю. Работу по изготовлению часов с большими цифрами можно считать практически законченной.Удачное чтение данных с микроконтроллера программой AVRDUDESHELL

Если при чтении фьюзов возникла проблемы – проверяйте монтаж – возможно где то есть короткое замыкание или “непропай”. Еще один совет – возможно микроконтроллер находится в режиме низкоскоростного программирования, тогда достаточно переключить программатор в этот режим (тык) и заново попробовать прочитать микроконтроллер.

Сборка цифровой и силовой частей

Конструкция часов разработана с таким расчетом, что плата семисегментного индикатора должна крепиться над платой электроники. Так и поступаем. Соединяем многожильным (13 проводов) шлейфом платы. Длина шлейфа – сантиметров 5-6.

Соединение шлейфом печатных платСами платы соединяем на расстоянии 3 см. В качестве распорок между платами я использовал разрезанный в соответствующий размер фломастер. Была проблема найти достаточно длинные винты М3, поэтому в качестве крепления использовал провод.

Крепление плат

Загрузка программы часов в микроконтроллер

Для загрузки программы нам потребуется программатор USBASP и дата-кабель V4, а так же архив, размещенный в конце статьи.

Часы подключаем к программатору (расстояние в 3 см между платами как раз позволяет это сделать).

Архив распаковываем в любую папку.

Архив содержит в себе программу для прошивки микроконтроллеров (программа называется avrdude), поэтому достаточно перейти в папку “prog” и по очереди запустить файлы fuseprog.

bat а за тем progprog.bat. Первый настроит фьюзы, второй запишет программу.

И еще, если вы используете программатор отличный от USBASP, вам необходимо скорректировать “батники”, указав там свой программатор.

Результат

Примечание: Если вы будете повторять конструкцию – не сочтите за труд – вышлите мне свои фотографии готовых часов для того, что бы я мог разметить их в этом блоге.

Скачать схему, печатную плату и программу часов с большими цифрами

Источник: http://matrex-notes.blogspot.com/2015/04/blog-post.html

AVR134: часы реального времени на tinyAVR и megaAVR

В даташите AVR134 [1] описывается реализация часов реального времени (Real Time Clock, RTC) со следующими возможностями:

• RTC с очень малым энергопотреблением (4 мкА при напряжении питания 3.3V)• Очень недорогое решение• Подстраиваемый прескалер с настраиваемой точностью• Подсчет времени, даты, месяцев, года с конфигурацией автоматического високосного года• Формат даты, совместимый с 2000 годом• Можно использовать на всех микроконтроллерах AVR, оборудованных модулем RTC

• Вместе с апноутом поставляется код на языке C для ATMega128

В этом апноуте показано, как сделать RTC на микроконтроллерах AVR®, у которых есть на борту модуль RTC. Реализация требует подключения только одного внешнего компонента – часовой кварцевый резонатор на 32.768 кГц.

Приложение потребляет очень мало энергии, потому что микроконтроллер основную часть времени проводит в режиме пониженного энергопотребления. В этом режиме вычислительное ядро AVR “спит”, работает только таймер, тактируемый от подключенного внешнего кварца.

При каждом переполнении таймера происходит подсчет времени, даты, месяца и года. Эта реализация RTC написана для ATmega128, и может быть с успехом портирована на другие микроконтроллеры AVR с модулем RTC.

Достоинства использования предложенного варианта RTC в сравнении с применением внешнего специального RTC-чипа очевидны:

Читайте также:  Пироэлектрический сигнализатор в охранной системе

• Низкая стоимость• Мало внешних компонентов, простота схемы (только 1 кварц)• Низкое энергопотребление

• Большая гибкость

Прим. переводчика: на самом деле микроконтроллеров AVR, в которых есть модуль RTC, не так много, и многие из них дешевыми назвать нельзя. Ниже приведен их полный перечень на сегодняшний день 150104.

8-битные AVR c модулем RTC: AT90CAN32, AT90CAN64, AT90CAN128, AT90USB1286, AT90USB1287, AT90USB646, AT90USB647, ATmega128, ATmega128A, ATmega1280, ATmega1281, ATmega1284, ATmega16, ATmega16A, ATmega162, ATmega164, ATmega165, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega32A, ATmega324, ATmega324A, ATmega325, ATmega325A, ATmega3250, ATmega328, ATmega329, ATmega329A, ATmega3290, ATmega3290A, ATmega406, ATmega48, ATmega48A, ATmega64, ATmega64A, ATmega640, ATmega644, ATmega644A, ATmega645, ATmega645A, ATmega6450, ATmega6450A, ATmega649, ATmega649A, ATmega6490, ATmega6490A, ATmega8, ATmega8A, ATmega8535, ATmega88, ATmega88A, ATtiny1634, ATtiny167, ATtiny828, ATtiny87.

8-битные AVR XMEGA c модулем RTC: ATxmega128A1, ATxmega128A1U, ATxmega128A3, ATxmega128A3U, ATxmega128A4U, ATxmega128B1, ATxmega128B3, ATxmega128C3, ATxmega128D3, ATxmega128D4, ATxmega16A4, ATxmega16A4U, ATxmega16C4, ATxmega16D4, ATxmega16E5, ATxmega192A3, ATxmega192A3U, ATxmega192C3, ATxmega192D3, ATxmega256A3, ATxmega256A3B, ATxmega256A3BU, ATxmega256A3U, ATxmega256C3, ATxmega256D3, ATxmega32A4, ATxmega32A4U, ATxmega32C3, ATxmega32C4, ATxmega32D3, ATxmega32D4, ATxmega32E5, ATxmega384C3, ATxmega64A1, ATxmega64A1U, ATxmega64A3, ATxmega64A3U, ATxmega64A4U, ATxmega64B1, ATxmega64B3, ATxmega64C3, ATxmega64D3, ATxmega64D4, ATxmega8E5.

32-битные AVR c модулем RTC: AT32UC3A0128, AT32UC3A0256, AT32UC3A0512, AT32UC3A1128, AT32UC3A1256, AT32UC3A1512, AT32UC3A3128, AT32UC3A3256, AT32UC3A364, AT32UC3A4128, AT32UC3A4256, AT32UC3A464, AT32UC3B0128, AT32UC3B0256, AT32UC3B0512, AT32UC3B064, AT32UC3B1128, AT32UC3B1256, AT32UC3B1512, AT32UC3B164, AT32UC3C0128C, AT32UC3C0256C, AT32UC3C0512C, AT32UC3C064C, AT32UC3C1128C, AT32UC3C1256C, AT32UC3C1512C, AT32UC3C164C, AT32UC3C2128C, AT32UC3C2256C, AT32UC3C2512C, AT32UC3C264C, AT32UC3L0128, AT32UC3L016, AT32UC3L0256, AT32UC3L032, AT32UC3L064, ATUC128D3, ATUC128D4, ATUC128L3U, ATUC128L4U, ATUC256L3U, ATUC256L4U, ATUC64D3, ATUC64D4, ATUC64L3U, ATUC64L4U.

[Немного теории: как это работает]

Реализация RTC задействует асинхронное функционирование модуля RTC. В этом режиме Timer/Counter0 работает независимо от тактовой частоты ядра AVR.

На рис. 2-1 показано, как микроконтроллер AVR работает в обычном режиме от основной тактовой частоты 4 МГц. Когда нужно работать с пониженным потреблением энергии, AVR переключается в режим Power-down, в котором работает только асинхронный таймер от частоты внешнего кристалла 32.768 кГц.

Программно Real Time Clock (RTC) реализован с использованием 8-разрядного таймера/счетчика, работающего в режиме прерывания по переполнению (Timer/Counter Overflow Interrupt).

Программа управляет прерыванием переполнения для вычисления времени и переменных календаря.

Прерывание Timer Overflow используется для корректного обновления программных переменных second (секунды), minute (минуты), hour (часы), date (дата), month (месяц) и year (год).

Рис. 2-1. Подключение генератора к RTC.

Поскольку количество времени, проходящее между переполнениями таймера счетчика одно и то же, каждая из этих переменных будет инкрементироваться на фиксированное число с каждым переполнением таймера. Для этой задачи используется обработчик прерывания переполнения таймера (Interrupt Service Routine, ISR).

Для снижения энергопотребления микроконтроллер AVR входит в режим сохранения энергии (Power-save mode), в котором все модули микроконтроллера запрещены, кроме RTC.

Как показано в таблице 2-1, ядро AVR обычно потребляет в этом режиме меньше 4 мкА. Микроконтроллер проснется, когда произойдет прерывание по переполнению таймера (Timer Overflow Interrupt).

Запустится код обработчика прерывания в активном режиме ядра, который обновит переменные таймера.

Затем микроконтроллер AVR снова запустит режим сохранения энергии (Power-save mode), и будет оставаться в нем, пока не произойдет следующее прерывание Timer Overflow. На рис. 2-2 и 2-3 показано время, когда AVR работает в режиме сохранения энергии (Power-save mode) в сравнении с активным режимом (Active mode).

Чтобы вычислить общее энергопотребление, нужно сложить потребление энергии Power-save mode с потреблением энергии в Active mode. Время, которое требуется на обновление переменных таймера в обработчике прерывания, составляет менее 100 циклов тактовой частоты ядра, что на частоте 4 МГц составит 25 мкс.

Потребление мощности за этот короткий промежуток времени получается несущественным. Гораздо важнее время пробуждения микроконтроллера (wake-up time). Оно может быть запрограммировано на 35 мс при использовании внешнего кварцевого резонатора, или 1 мс для использования внешнего керамического резонатора.

Пример схемы, которые пробуждаются каждую секунду для обновления переменных RTC, показывают энергопотребление для двух типов источников тактирования:

Рис. 2-2. Диаграмма потребляемого тока для кварцевого резонатора, время старта 35 мс (Startup Time).

Общее потребление тока на одну секунду:

= (1 с * 4 мкA) + (35 мс * 6 мА) = 4 мкАс + 210 мкАс = 214 мкАс (микроампер за секунду)

Это показывает, что основная часть потребления тока приходится на Active mode.

Рис. 2-3. Диаграмма потребляемого тока для керамического резонатора, время старта 1 мс (Startup Time).

Общее потребление тока на одну секунду:

= (1 с * 4 мкА) + (1 мс * 6 mA) = 4 мкАс + 6 мкАс = 10 мкАс

Получается, что уменьшение длительности запуска приведет к уменьшению потребляемого тока с 214 мкАс до 10 мкАс.

Таблица 2-1. Потребление тока микроконтроллером AVR в каждом режиме.

Режим Обычное потребление Max
Active 4 МГц, 3.3V питание 4 мА 6 мА
Idle 4 МГц, 3.3V питание 1.8 мА 2 мА
Power-down 4 МГц, 3.3V питание < 1 мкА 2 мкА
Power-save 4 МГц, 3.3V питание < 4 мкА 6 мкА

[Вычисления]

Зная частоту часового кварца, пользователь может определить время для каждого типа таймера/счетчика выбором нужного коэффициента деления прескалера.

Как показано в таблице 3-1, биты CS02, CS01 и CS00 в регистре TCCR0 (Timer/Counter0 Control Register) определяют выбор частоты с выхода прескалера для тактирования таймера/счетчика, где CK равно частоте часового кварца.

Например, если CK равно 32768 Гц, то таймер/счетчик получит частоту тактирования 256 Гц, если коэффициент деления прескалера будет CK/128.

Таблица 3-1. Выбор коэффициента деления прескалера для тактовой частоты Timer/Counter0.

CS02 CS01 CS00 Описание(1) Период переполнения
Timer/Counter0 остановлен
1 CK 1/128 сек
1 CK/8 1/16 сек
1 1 CK/32 1/4 сек
1 CK/64 1/2 сек
1 1 CK/128 1 сек
1 1 CK/256 2 сек
1 1 1 CK/1024 8 сек

Примечание (1): CK = 32.768 кГц.

[Пример конфигурации]

Как показано на рис. 2-1, кварцевый резонатор должен быть напрямую подключен к выводам микроконтроллера TOSC1 и TOSC2.

Более новые устройства требуют наличия на этих выводах дополнительных внешних конденсаторов (из-за различий в реализации внутреннего генератора), поэтому обратитесь к даташиту на используемый микроконтроллер, чтобы узнать подробности по поводу подключения внешнего резонатора.

Генератор оптимизирован на работу с частой 32.768 кГц от внешнего часового кварца, или от внешнего тактового сигнала в интервале от 0 Гц до 256 кГц. В этом примере реализации 8 светодиодов (LED) подключены к порту B микроконтроллера, и используются для отображения состояния RTC.

LED на ножке PB0 будет показывать изменение состояния каждую секунду. Еще 6 LED (PB6..PB1) показывают минуты в двоичном виде, и последний LED, подключенный к PB7, горит в течение часа, и погашен в течение другого часа.

Необходимо учитывать некоторые условия, когда таймер/счетчик тактируется от источника, асинхронного по отношению к системной тактовой частоте. Кварцевый резонатор на 32.768 кГц имеет время стабилизации до одной секунды после включения питания.

Таким образом, микроконтроллер не должен входить в режим Power-save раньше, чем после 1 секунды после включения питания. Нужно также позаботиться о переключении режима таймера на асинхронный режим. Подробности по этим вопросам см.

в даташите на используемый микроконтроллер. Данные регистра таймера передаются во временный регистр и защелкиваются там после 2 циклов внешних тактов.

Регистр статуса асинхронных операций (Asynchronous Status Register, ASSR) содержит флаги состояния, которые можно проверить, чтобы контролировать, когда записанный регистр обновился.

[Реализация]

Программное обеспечение состоит из в основном двух подпрограмм.

Процедура counter является обработчиком прерывания переполнения таймера (Timer/Counter Overflow ISR), она обновляет все переменные таймера, когда происходит переполнение счетчика таймера (это событие происходит каждую секунду).

Вторая процедура not_leap корректирует дату, учитывая високосные года. Основная программа настраивает все нужные регистры ввода/вывода, чтобы разрешить работу модуля RTC, и управлять последовательностью входа в режим экономии энергии (Power-down).

Бит AS0 в регистре ASSR (Asynchronous Status Register) устанавливается для конфигурирования Timer/Counter0 для тактирования от внешнего источника. Только после этого таймер может работать асинхронно.

Таймер сбрасывается, и для него устанавливается нужный коэффициент деления прескалера (чтобы частота тактирования была 256 Гц, и таймер переполнялся после каждого 256-го импульса, т. е. каждую секунду). Для синхронизации с внешним тактовым сигналом программа ждет, пока обновится регистр ASSR.

Затем устанавливается бит TOIE0 в регистре TIMSK (Timer/Counter Interrupt Mask Register), чтобы разрешить прерывание Timer/Counter0 Overflow. Также устанавливается бит общего разрешения прерываний (Global Interrupt Enable) в регистре SREG (Status Register) – чтобы разрешить работу всех прерываний.

Биты SM1 и SM0 в регистре MCUCR (MCU Control Register) устанавливаются для выбора режима пониженного энергопотребления (Power-save mode). Затем инструкция SLEEP переводит микроконтроллер в режим сна. Главный бесконечный цикл основной программы периодически выполняет инструкцию SLEEP.

Подпрограмма counter. Это обработчик прерывания переполнения таймера, он выполняется каждый раз, когда происходит событие Timer Overflow. Это прерывание пробуждает ядро микроконтроллера, чтобы обновить переменные таймера.

Процедура обработчика прерывания не принимает какие-либо входные параметры, и не возвращает из себя данные, как может делать обычная функция. Вместо этого она работает с глобальными переменными.

Для этого декларируется глобальная структура, используемая для хранения времени, с полями second, minute, hour, date, month и year. Поскольку известно время, которое прошло между прерываниями таймера (1 секунда), то поле second будет каждый раз инкрементироваться на 1.

Как только поле second достигнет 60, то поле minute будет инкрементировано на 1, и поле second установится в 0.

Рис. 5-1. Алгоритм работы подпрограммы обработчика прерывания Counter.

//Обработчик прерывания по переполнению таймера 0. Здесь отслеживается // изменение счетчиков времени, даты, месяца и года. ISR(TIMER0_OVF_vect) { if (++t.second==60) { t.second=0; if (++t.minute==60) { t.minute=0; if (++t.hour==24) { t.hour=0; if (++t.date==32) { t.month++; t.date=1; } else if (t.date==31) { if ((t.month==4) || (t.month==6) || (t.month==9) || (t.month==11)) { t.month++; t.date=1; } } else if (t.date==30) { if(t.month==2) { t.month++; t.date=1; } } else if (t.date==29) { if((t.month==2) && (not_leap())) { t.month++; t.date=1; } } if (t.month==13) { t.month=1; t.year++; } } } } PORTB=~(((t.second & 0x01)|t.minute

Источник: http://microsin.net/programming/avr/avr134-real-time-clock-with-asynchronous-timer.html

Ссылка на основную публикацию
Adblock
detector