Простые электронные часы на микроконтроллере ATtiny26,
с использование микросхемы часов реального времени 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 414 hits)
Программа часов в "Algorithm Builder" (6,3 КиБ, 5 411 hits)
Программа часов в HEX коде (3,1 КиБ, 3 996 hits)
Даташит DS1307 на русском языке (312,1 КиБ, 7 255 hits)
Второй вариант программы часов в АБ (для тех у кого нескачивается верхний)
Программа часов в АБ (11,4 КиБ, 2 977 hits)
Печатная плата часов от Анатолия Пильгук в формате .lay (61,2 КиБ, 1 851 hits)
Скачать программу с ЯндексДиска
Другие конструкции на микроконтроллерах
1. Простой термометр на микроконтроллере ATmega8 и датчика температуры DS18B20
2. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Трехканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602
Добрый день! Разобрался с прошивкой, прошил, часы запустились. Алгоритм установки времени, конечно, своеобразный. Устанавливаются только минуты. Часы не могу выставить, делаю это сдвигая часы переходом через 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.
Есть предложение , о более точном измерении реального времени.Нуждаюсь в вашей помощи,как программиста
Доброго дня Игорь!
Давайте обсудим Ваше предложение и попробуем претворить в жизнь.
С уважением, Admin.
Подскажите как называется в АВ константа содержащая конец ОЗУ для инициализации стека. если такая существует?
(у меня не задача инициализировать стек настройщиком, а немного другая)
Работаю над диспетчером задержек/задач.
Доброго дня Mihail_nik!
Такой константы (не только в АВ) — нет.
Адрес ячейки памяти ОЗУ с которой будет определяться начало стека записывается в специальные регистры ввода-вывода (РВВ):
— если объем ОЗУ менее 256 байт используется один восьмиразрядный регистр SPL (восьмиразрядный адрес стека)
— если объем ОЗУ более 256 байт — используются два регистра: SPL и SPH (шестнадцатиразрядный адрес стека)
По умолчанию АВ автоматически записывает в эти регистры конечный адрес ОЗУ, который вы самостоятельно можете изменить.
С уважением, Admin.