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

Простые электронные часы на микроконтроллере ATtiny26,
с использование микросхемы часов реального времени DS1307


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

Часы на микроконтроллере с DS1307Конструкция собрана на микроконтроллере ATTiny26 и часов реального времени DS1307. В качестве индикатора текущего времени использован четырехразрядный семисегментный светодиодный индикатор (ультраяркий, голубого цвета свечения, что неплохо смотрится в темное время, и, заодно, часы играют роль ночника). Управление часами происходит двумя кнопками. Благодаря использованию микросхемы часов реального времени DS1307, алгоритм программы получился довольно простым. Общение микроконтроллера с часами реального времени происходит по шине I2C, и организованно программным путем.

Схема часов:

К сожалению, в схеме есть ошибка:
— выводы МК к базам транзисторов нужно подключать:
РВ0 к Т4, РВ1 к Т3, РВ2 к Т2, РВ3 к Т1
или поменять подключение коллекторов транзисторов к разрядам индикатора:
Т1 к DP1 ….. Т4 к DP4

Детали, используемые в схеме часов:

♦ микроконтроллер ATTiny26:

♦ часы реального времени DS1307:

♦ 4-разрядный семисегментный светодиодный индикатор – FYQ-5641UB -21 с общим катодом (ультраяркий, голубого цвета свечения):

♦ кварц 32,768 кГц, с входной емкостью 12,5 пф (можно взять с материнской платы компьютера), от этого кварца зависит точность хода часов:

♦ все транзисторы — NPN-структуры, можно применить любые (КТ3102, КТ315 и их зарубежные аналоги), я применил ВС547С
♦ микросхемный стабилизатор напряжения типа 7805
♦ все резисторы мощностью 0,125 ватт
♦ полярные конденсаторы на рабочее напряжение не ниже напряжения питания
♦ резервное питание DS1307 – 3 вольтовый литиевый элемент CR2032

Для питания часов можно использовать любое ненужное зарядное устройство сотового телефона (в этом случае, если напряжение на выходе зарядного устройства в пределах 5 вольт ± 0,5 вольта, часть схемы — стабилизатор напряжения на микросхеме типа 7805, можно исключить)
Ток потребления устройством составляет — 30 мА.
Батарейку резервного питания часов DS1307 можно и не ставить, но тогда, при пропадании напряжения в сети, текущее время придется устанавливать заново.
Печатная плата устройства не приводится, конструкция была собрана в корпусе от неисправных механических часов. Светодиод (с частотой мигания 1 Гц, от вывода SQW DS1307) служит для разделения часов и минут на индикаторе.

Установки микроконтроллера заводские: тактовая частота — 1МГц, FUSE-биты трогать не надо.

Алгоритм работы часов (в Algorithm Builder):
1. Установка указателя стека
2. Настройка таймера Т0:
— частота СК/8
— прерывания по переполнению (при такой предустановленной частоте вызов прерывания происходит каждые 2 миллисекунды)
3. Инициализация портов (выводы РА0-6 и РВ0-3 настраиваются на выход, РА7 и РВ6 на вход)
4. Инициализация шины I2C (выводы РВ4 и РВ5)
5. Проверка 7-го бита (СН) нулевого регистра DS1307
6. Глобальное разрешение прерывания
7. Вход в цикл с проверкой нажатия кнопки

При первом включении, или повторном включении при отсутствии резервного питания DS307, происходит переход в первоначальную установку текущего времени. При этом: кнопка S1 – для установки времени, кнопка S2 – переход к следующему разряду. Установленное время – часы и минуты записываются в DS1307 (секунды устанавливаются в ноль), а также вывод SQW/OUT (7-й вывод) настраивается на генерацию прямоугольных импульсов с частотой 1 Гц.

При нажатии кнопки S2 (S4 — в программе) происходит глобальный запрет прерываний, программа переходит в подпрограмму коррекции времени. При этом, кнопками S1 и S2 устанавливаются десятки и единицы минут, затем, с 0 секунд, нажатием кнопки S2 происходит запись уточненного времени в DS1307, разрешение глобального прерывания и возвращение в основную программу.

Часы показали хорошую точность хода, уход времени за месяц — 3 секунды.
Для улучшения точности хода, кварц рекомендуется подключать к DS1307, как указано в даташите:

Программа написана в среде «Algorithm Builder».
Вы можете, на примере программы часов, ознакомиться с алгоритмом общения микроконтроллера с другими устройствами по шине I2C (в алгоритме подробно прокомментирована каждая строчка).

Фотография собранного устройства и печатная плата в формате .lay от читателя сайта Анатолия Пильгук, за что ему огромное спасибо!

В устройстве применены: Транзисторы — СМД ВС847 и ЧИП резисторы

Аналогичные часы можно собрать и на основе платы Arduino.


 Приложения к статье:

  Схема часов в SPL7 (42,9 КиБ, 4 269 hits)

  Программа часов в "Algorithm Builder" (6,3 КиБ, 5 255 hits)

  Программа часов в HEX коде (3,1 КиБ, 3 587 hits)

  Даташит DS1307 на русском языке (312,1 КиБ, 7 069 hits)


Второй вариант программы часов в АБ (для тех у кого нескачивается верхний)

  Программа часов в АБ (11,4 КиБ, 2 848 hits)

  Печатная плата часов от Анатолия Пильгук в формате .lay (61,2 КиБ, 1 572 hits)

Скачать программу с ЯндексДиска


Примечание: к этой записи прикреплена форма для оценки. Чтобы оценить её, зайдите на сайт.

Другие конструкции на микроконтроллерах
1. Простой термометр на микроконтроллере ATmega8 и датчика температуры DS18B20
2. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Трехканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602


18 ответов к “Часы на микроконтроллере AVR ATtiny26 с DS1307”

Добрый день! Разобрался с прошивкой, прошил, часы запустились. Алгоритм установки времени, конечно, своеобразный. Устанавливаются только минуты. Часы не могу выставить, делаю это сдвигая часы переходом через 59 минут. Это правильно? И по схеме. То, что нарисовано, время показывает так — если время 23-59, согласно схемы подключения разрядов выглядит так : 95-32. Пришлось резать проводники и вставлять перемычки между разрядами

Здравствуйте Анатолий!
Да, сейчас присмотрелся, в схеме подключение разрядов с ошибкой, виноват.
Алгоритм установки тоже не очень, согласен.
С уважением, Admin.

Плату переделал с учетом всех обнаруженных ошибок. Работает 100%. Могу прислать, если интересно.
Что еще обнаружил, что ДС-ка не сбрасывает настройки при отключении батарейки и обесточивании. Ждал более 5 минут, но, как только вставляю батарейку, сразу появляется сохраненное время. Из-за этого были трудности с повторной установки точного времени. Переводил время на 01-59, ждал до 2-00, потом ставил 02-59, ждал до 03-00 и так до 09-59. Когда время показывает 10-01 и далее, при установки времени часы устанавливают любое время, но не 10-23 или еще какое реальное. Сбиваются на 00-00, 02-00 и прочее. Пришлось ночью установить время, чтобы иметь реально действующее время.

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

Еще раз доброго дня Анатолий!
1. При отключении питания DS1307 и повторном подключении питания (батарейки и +5 вольта) БИТ 7 регистра 0 (по которому определяется — перейти программе или нет в начальную установку) не всегда устанавливается в логическую 1 (условие перехода в подпрограмму начальной установки времени), в даташите написано, что «при включении питания начальное состояние всех регистров не определено». У меня был только один экземпляр DS1307 который стабильно устанавливал 7-й бит нулевого регистра при отключении всего питания и повторном включении в логическую единицу.
Попробуйте выключать/включать устройство без батарейки.
2. Вывести индикацию точки на семисегментном индикаторе при динамической индикации проблематично (хотя и возможно). Как вариант, пристроить светодиод между разрядами и подключить его к DS1307 — вывод SQW, как на схеме.
3. Подключение кнопок и разрядов индикатора к МК переделать могу, если еще нужно (просто напишите пожелания, а я вышлю переделанную прошивку).
4. За плату буду очень благодарен.

С уважением, Admin.

Добрый день
кто может сделать на заказ 5 таких часов и сколько будет стоить?
Цвет табло синий, размер 20х60мм примерно, кнопки для перевода выведены отдельно на гибких проводах.
Заранее спасибо за ответ.

Здравствуйте Александр!
Достоинство часов в том, что они просты.
Но есть и недостаток (некритичный)- программа «сыроватая», писалась на скорую руку.
Если найдете желающего их изготовить для Вас — напишите, я еще раз просмотрю и подправлю программу.
С уважением, Admin.

Файл _.7z не открывается:

«Не удалось открыть файл как [7z] архив
неожиданный конец данных»

Что делать?

Здравствуйте zbv_AVR!
Попробуйте второй вариант, он ниже:
«Программа часов в АБ»
С уважением, Admin.

Сделал такие часы.Идут , но S1 и S2 не выставлют минуты и часы. Допишите пожалуйста программу в АБ. Пожалуйста, очень надо.

Доброго дня Snis!
Программа работает в действующем экземпляре часов, кнопки работают, время выставляется.
Может ошибка в монтаже кнопок?
С уважением, Admin.

Здравствуйте!
Спасибо за программу на АБ для DS1307.
Давно хотел такой пример. Но как ни старался, а запустить схему не смог.
Здесь исходник не скачивается. Взял его не с этого сайта. И наверное с ошибкой.
Помогите пожалуйста. Отправьте исходник на мою электронную почту.
с Уважением Андрей

Есть предложение , о более точном измерении реального времени.Нуждаюсь в вашей помощи,как программиста

Доброго дня Игорь!
Давайте обсудим Ваше предложение и попробуем претворить в жизнь.
С уважением, Admin.

Подскажите как называется в АВ константа содержащая конец ОЗУ для инициализации стека. если такая существует?
(у меня не задача инициализировать стек настройщиком, а немного другая)
Работаю над диспетчером задержек/задач.

Доброго дня Mihail_nik!
Такой константы (не только в АВ) — нет.
Адрес ячейки памяти ОЗУ с которой будет определяться начало стека записывается в специальные регистры ввода-вывода (РВВ):
— если объем ОЗУ менее 256 байт используется один восьмиразрядный регистр SPL (восьмиразрядный адрес стека)
— если объем ОЗУ более 256 байт — используются два регистра: SPL и SPH (шестнадцатиразрядный адрес стека)
По умолчанию АВ автоматически записывает в эти регистры конечный адрес ОЗУ, который вы самостоятельно можете изменить.
С уважением, Admin.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *