Ds1307 питание. RTC модуль DS1307 подключение к Arduino. Тестовый проект для DS1307

Модуль часов реального времени DS1307
Tiny RTC I2C module 24C32 memory DS1307 clock

Небольшой модуль, выполняющий функции часов реального времени. Выполнен на базе микросхемы DS1307ZN+ . Непрерывный отсчет времени происходит благодаря автономному питанию от батареи, установленной в модуль. Также модуль содержит память EEPROM объемом 32 Кбайт, сохраняющую информацию при отключении всех видов питания. Память и часы связаны общей шиной интерфейса I2C. На контакты модуля выведены сигналы шины I2C. При подключении внешнего питания происходит подзарядка батареи через примитивную цепь подзарядки. На плате имеется место для монтажа цифрового датчика температуры DS18B20. В комплект поставки он не входит.
Использование этого устройства происходит при измерении временных интервалов более недели приборами на основе микроконтроллера. Задействовать собственные ресурсы МК для этой цели неоправданно, а зачастую невозможно. Обеспечить бесперебойное питание на длительный срок дорого, установить батарею для питания МК нельзя из-за значительного тока потребления. Тут на выручку приходит модуль часов реального времени DS1307.
Также модуль часов реального времени DS1307 благодаря наличию собственной памяти позволяет регистрировать данные событий, происходящих несколько раз в сутки, например измерения температуры. Журнал событий в дальнейшем считывается из памяти модуля. Эти возможности позволяют использовать модуль в составе автономной автоматической метеостанции или для исследований климата в труднодоступных местах: пещерах, вершинах скал. Становится возможным регистрировать тензопараметры архитектурных сооружений, например опор мостов и других. При оснащении прибора радиосвязью достаточно установить его в исследуемой местности.

Характеристики

Напряжение питания 5 В
Размеры 27 х 28 х 8,4 мм

Электрическая схема

Устройство обменивается данными с электроникой прибора с помощью сигналов SCL и SDA. Микросхема IC2 - часы реального времени. Конденсаторы С1 и С2 снижают уровень помех в линии питания VCC. Резисторы R2 и R3 обеспечивают надлежащий уровень сигналов SCL и SDA. С вывода 7 микросхемы IC2 поступает сигнал SQ, состоящий из прямоугольных импульсов частотой 1 Гц. Он используется для проверки работоспособности МС IC2. Компоненты R4, R5, R6, VD1 обеспечивают подзарядку батареи BAT1. Для хранения данных модуль часов реального времени DS1307 содержит микросхему IC1 - долговременная память. US1 - датчик температуры. Сигналы модуля и линии питания выведены на соединители JP1 и P1.

Информационная шина

I2C это стандартный последовательный интерфейс посредством двух сигнальных линий SCL, SDA и общего провода. Линии интерфейса образуют шину. К линиям интерфейса I2C можно подключить несколько микросхем, не только микросхемы модуля. Для идентификации микросхемы на шине, а именно записи данных в требуюмую МС и определения от какой МС поступают данные. Каждая микросхема имеет уникальный адрес для проложенной шины. DS1307 имеет Адрес 0x68. Он записан на заводе-изготовителе. Микросхема памяти имеет адрес 0x50. В программное обеспечение Arduino входит программная библиотека, обеспечивающая поддержку I2C.

Микросхема часов реального времени

DS1307 обладает низким энергопотреблением, обменивается данными с другими устройствами через интерфейс I2C, содержит память 56 байт. Содержит часы и календарь до 2100 г. Микросхема часов реального времени обеспечивает другие устройства информацией о настоящем моменте: секунды, минуты, часы, день недели, дата. Количество дней в каждом месяце учитывается автоматически. Есть функция компенсации для високосного года. Имеется флаг, чтобы определить, работают часы в 24-часовом режиме или 12-часовом режиме. Для работы в режиме 12 часов микросхема имеет бит, откуда считываются данные для передачи о периоде времени: до или после обеда.

Микросхема долговременной памяти

Рисунок модуля часов реального времени DS1307 со стороны батареи с установленным датчиком температуры U1.

Батарея

В держатель на обратной стороне платы устанавливается литиевая дисковая батарея CR2032. Она выпускается множеством производителей, например изготовленная фирмой GP обеспечивает напряжение 3,6 В и ток разряда 210 мАч. Батарея подзаряжается во время включения питания, с таким режимом работы литиевой батареи мы сталкиваемся на материнской плате компьютера.

Подзарядка батареи

Программное обеспечение

Для работы модуля в составе Arduino вполне подойдет устаревшая библиотека с сайта Adafruit под названием RTCLib. Скетч называется DS1307.pde. Существует обновленная версия . Следует скачать архив, распаковать его, переименовать и скопировать библиотеку в свой каталог библиотек Arduino.

Подключение к Arduino Mega

Для этого следует использовать скетчи
SetRTC устанавливает время в часах в соответствии со временем, которое указано в скетче.
GetRTC выводит время.
Оба скетча требуют библиотеку Wire и определить адрес I2C. Чтобы установить адрес часов на шине I2C, используйте этот I2C сканер .

Соединение с Arduino Mega.

Подключите SCL и SDA к соответствующим контактам 21 и 20 на Arduino Mega 2560. Подключите питание.

Соединение с Arduino Uno


Установите время в скетче SetRTC и загрузите в Arduino. Затем нажмите кнопку сброса для установки часов. Теперь загрузите скетч GetRTC. Откройте последовательный монитор и смотрите. Есть специальная библиотека времени . Она имеет много различных функций, которые могут быть полезны в зависимости от ситуации. Чтобы установить время, используя библиотеку нужно скачать . При использовании скетча можно синхронизировать часы реального времени с часами персонального компьютера.

Здравствуйте!
Сегодня я хочу Вам поведать о такой интересной микросхеме как DS1307. Это чудные часики плюс календарь и самое замечательное что к этой микрухе есть библа в CVAVR. Да и просто она мне под руку попалась и я решил ее помучить 8) Первым делом нам понадобится схема ее подключения. Она довольно проста и была взята из даташита. Но тут есть небольшое исключение. В даташите требуют подключить резистор между ножкой питания и ножкой вывода прямоугольных импульсов. Так как я делал отдельную плату, дабы иметь возможность на ней тестировать дальнейшие проекты, приляпал еще светодиод. Очень удобно получилось. Видно например секундные импульсы.
Собственно схема.

А вот как это выглядит в сборе.

Испытания я проводил в связке ATmega32 + LCD 16x2 + DS1307. Далее есть два варианта. Первый, можно сгенерить код прям генератором CVAVR. Второй, самому все написать. Я предлагаю писать самому, но сначала давайте пройдемся по функциям DS1307.
1. rtc_init(rs, sqwe, out) Эта самая первая функция для инициализации микросхемы. Теперь все аргументы по порядку. rs нужен для того чтобы задать частоту выходных прямоугольных импульсов на ноге SQW/OUT . 0 - 1 Гц 1 - 4096 Гц 2 - 8192 Гц 3 - 32768 Гц sqwe нужен для разрешения выхода прямоугольных импульсов. 1 - можно 0 - нет. out нужен для определения логического уровня на выходной ноге если нет разрешения на вывод прямоугольных импульсов. Во загнул. Короче если не нужно дергать ногой SQW/OUT , то параметр sqwe ставим в 0 и теперь если out равен 1 , то и на ножке будет 1 , а если запишем 0 , то и на ноге тоже 0 . Пример: rtc_init(0,1,0); Это значит включить вывод прямоугольных импульсов с частотой 1 Гц. 2. rtc_set_time(hour, min, sec) Ну из названия видно что эта функция устанавливает время. Тут все просто, аргументы часы, минуты и секунды. 3. rtc_set_date(day, month, year) Та же шляпа но с датой. 4. rtc_get_time(&hour, &min, &sec) А вот тут по подробнее. Эта функция нужна для получения текущего времени. Аргументы функции являются адреса переменных куда она потом запишет значения. Это сделано из-за того что функции могут возвращать лишь один параметр (такой вот С). То есть перед вызовом функции нужно проинициализировать три беззнаковые переменные char. 5. rtc_get_date(&day, &month, &year) То же самое но с датой. Теперь все то же на примерах. rtc_set_time(15, 0, 0); Установили время 15:00:00 rtc_set_date(14, 2, 14); Установили дату 14 февраля 2014 г. Заметьте что год пишется двумя числами. Кусок даташита: Real-Time Clock (RTC) Counts Seconds, Minutes, Hours, Date of the Month, Month, Day of the week, and Year with Leap-Year Compensation Valid Up to 2100 До 2100 года, а так как у нас в функцию передается unsigned char, то значение может приниматься от 0 до 255. Я не пробовал загонять больше ста, но записанный с перепугу 2014 год отображался как 144 8) unsigned char hour, min, sec; rtc_get_time(&hour, &min, &sec); Сначала инициализируем переменные, а после вызываем функцию. После ее вызова можно смело оперировать временем которое запишется в переменные. unsigned char day, month, year; rtc_get_date(&day, &month, &year); В принципе тут тоже самое только в переменных будет лежать дата. Ну и наконец вся программа с коментами как и обещал. /***************************************************** Программа для работы с часами реального времени DS1307 Микроконтроллер: ATmega32 Частота кварца: 3,686400 MHz *****************************************************/ #include // Указываем порт и пины для шины I2C #asm .equ __i2c_port=0x1B ;PORTA .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include // Подключаем библиотеку для работы с DS1307 #include // Указываем к какому порту подключен ЖКИ #asm .equ __lcd_port=0x12 ;PORTD #endasm // Подключаем библиотеку для работы с ЖКИ #include // Подключаем библиотеку для работы со строками #include void main(void) { // Инициализация массива для строки и переменные для данных unsigned char string; unsigned char c, m, s, d, me, g; PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // Инициализация шины I2C i2c_init(); // Инициализация DS1307 rtc_init(0,1,0); // Инициализация дисплея lcd_init(16); // Эти функции я использовал один раз для установки времени и даты. // rtc_set_time(16, 0, 0); // rtc_set_date(13, 2, 14); while (1) { // Получили время rtc_get_time(&c, &m, &s); lcd_gotoxy(0,0); // Отформатировали sprintf(string, "Время %02i:%02i:%02i ", c, m, s); // Вывели время lcd_puts(string); // Получили дату rtc_get_date(&d, &me, &g); lcd_gotoxy(0,1); // Отформатировали sprintf(string, "Дата %02i.%02i.20%2i ", d, me, g); // Вывели дату lcd_puts(string); }; } Ну вроде как и все. Для старта я думаю понятно, а там кому как. Вот как это выглядит в работе.



Роман 29.10.15 21:30

Спасибо за статью, все понятно и без воды.

Алексей 29.10.15 22:47

Стараюсь)

Женя 07.11.15 09:33

Алексей спасибо большое!

Алексей 07.11.15 10:23

Пожалуйста.

Петр 05.04.16 00:11

А в проге flowcode реально это повторить?

Алексей 05.04.16 08:52

А что это за программа?

Михаил 09.09.16 00:18
Алексей 09.09.16 12:16
Сергей 20.11.16 12:28

Спасибо за подробное объяснение примеров. Не могли бы Вы дополнить пример ручной установки времени в RTC? Иногда корректировка времени все таки нужна.

Алексей 20.11.16 15:33

Для полноценной работы с часами реального времени DS1307 и DS3231 мной написаны функции которые входят в библиотеку . Рекомендую использовать для боле упрощенной генерации проекта под Atmel Studio. Так же можно посмотреть видео о использовании данной библиотеки.

Вениамин 10.12.16 23:33

Rtc_set_date(13, 2, 14);
На такую запись компилятор может ругаться "too few arguments" так как должно передаваться 4 аргумента, первый из которых - день недели. Поэтому передавать нужно 4 числа, и забирать - тоже 4. Насколько мне известно в некоторых версиях codevision прокатывает с тремя, но я лично порядком повозился, пока выяснил почему у меня время спокойно пишется и читается, а дата - нет.

Алексей 11.12.16 00:00

Вот поэтому я забил на CVAVR с ее косяками (а они не только в часах), перешел на AtmelStudio и написал библиотеку под нее а-пя CVAVR. Теперь у меня все работает и не глючит.)))

АНОНИМ 02.03.17 00:39

Всем советую заменять Ds1307 на 3231 т.к 32я намного точней, а 1307 только для таймеров подходит.

АНТОНИМ 03.04.17 15:18

Намного точней - это на сколько именно? ИМХО точность часов определяется на 99,9999999 % точностью кварцевого резонатора.

Алексей 03.04.17 16:09

Ну не совсем. Человек наверное просто имел в виду термокомпенсацию, так как частота кварца зависит еще и от температуры.

ИгорьКазанце 31.07.19 16:54

Ситуация: Купил микруху DS1307. Спаял Вашу схему. Нужна единственная функция - выход секундных импульсов. Больше ничего не нужно. Что делать? Какой использовать программатор? [email protected]

Алексей 01.08.19 10:50

Программатор не нужен. Нужно написать программу под любой МК который передаст команду для задания частоты выходной ножки SQW/OUT. Далее пока есть напряжение на микросхеме, на выходе будет меандр в 1ГЦ.

Во многих конструкциях полезно знать текущее время, но не всегда есть возможность, да и если контроллер будет сильно загружен, то часы будут постоянно отставать или спешить, что не очень хорошо. Выходом может стать внешний готовый источник времени – часы реального времени — DS1307.

Часы состоят из микросхемы DS1307, кварца на 32,768Кгц, батарейки и 2-х подтягивающих резисторов на линии SDA и SLC. Благодаря батарейке они продолжают идти при отключении внешнего питания. Также у DS1307 есть свободные 56 байтов энергозависимой статической ОЗУ, которые можно использовать в своих целях.

Линии SCL и SDA – это I2C. На линии SQW – находиться тактовый импульс с частотой от 1 Гц до 32,768 Кгц, обычно она не используется.

У часов есть пара особенностей:

1. что бы они работали, в них должна быть батарейка или на крайний случай резистор на 4-10кОм, иначе они не будут работать и отвечать всяким мусором.
2. вокруг дорожек кварца должен быт замкнутый контур земли и корпус кварц тоже лучше подключить к земле

Немного теории

Хронометр имеет фиксированный адрес 68h, в 7 битовом адресе + 1 бит указывает на действие – чтение/запись.
Для записи используется следующий алгоритм:
Первый байт – адрес часов 68h + 0 бит указывающий на запись, итого D0h. После получения подтверждения передаётся адрес регистра. Это установит регистровый указатель. Затем начинается передача байтов данных, чтобы остановить его – генерируется условие окончания.
Для чтения:
Первый байт – адрес часов 68h + 1 бит указывающий на запись, итого D1h. После декодирования адреса и выдачи подтверждения устройство начинает передавать данные с указанного адреса (храниться в регистре указателя). Если перед началом чтения указатель регистра не записан, то первый читаемый адрес — это адрес, который был сохранён в нём последним. DS1307 должен принять «неподтверждение» для окончания чтения.

Для включения часов следует установить бит CH в ноль, это следует сделать принудительно, т.к. часы после включения по умолчанию выключены.

Часы хранят информацию в двоично-десятичном виде – для получения данных достаточно прочитать соответствующий им регистр.

DS1307 может работать как в 24, так и в 12 часовом режиме – за это отвечает бит 12/24 (02h 6 бит). При 24 часовом режиме 5 и 4 биты регистра 02h соответствуют текущему десятку часа, при 12 часовом режиме 4 бит хранит десяток, а 5 признак до полудня / после полудня.

7 регистр отвечает за выходной тактовый генератор часов, SQW вывод. Бит OUT инвертирует выходной сигнал, бит SQWE включает тактовый генеретор, а биты RS0 и RS1 устанавливают частоту тактового импульса.

Практика

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

Плата содержит микросхему DS1307 в SMD исполнении. К ней подпаян кварц на 32,768 КГц, в корпусе DT-38, вокруг кварца должно быть кольцо земли и корпус самого кварц тоже стоит подключить к земле, для этого рядом с ним предусмотрено специальное отверстие. Для работы часов в автономном режиме предусмотрена батарейка на 3В CR120. Также для индикации работы модуля можно установить SMD светодиод с резистором на 470 Ом в корпусе типоразмера 0805.

PIC16F628A не содержит аппаратного I2C, поэтому он был реализован программно. Программный I2C был написан с нуля, он немного отличается от стандартного протокола, тем, что не ждёт подтверждения от слейва. Программный I2C будет рассмотрен в одной из следующих статей. На основе функций работы с I2C были реализованы следующие функции управления DS1307:

Void ds_write(unsigned char addr,unsigned char data) { i2c_start(); i2c_write(0xD0); i2c_write(addr); i2c_write(data); i2c_stop(); } unsigned char ds_read(unsigned char addr) { unsigned temp; i2c_start(); i2c_write(0xD0); i2c_write(addr); i2c_stop(); i2c_start(); i2c_write(0xD1); temp=i2c_read(0); i2c_stop(); return temp; } void ds_off() { ds_write(0x00,ds_read(0x00)|0x80); } void ds_on() { ds_write(0x00,ds_read(0x00)&~0x80); } void ds_init() { unsigned char i; // устанавливаем режим 24 часа i=ds_read(0x02); if((i&0x40)!=0) { ds_write(0x02,i&~0x40); } // Если часы выключены - то включаем их i=ds_read(0x00); if((i&0x80)!=0) { ds_write(0x00,i&~0x80); } } unsigned char IntToBoolInt(unsigned char data) { data=data%100; return data/10*16+data%10; }

ds_write(адрес, байт данных) — отправляет 1 байт данных по указанному адресу DS1307
байт данных ds_read(адрес) — считывает 1 байт данных из указанного адреса DS1307
ds_off() — выключить DS1307
ds_on() — включить DS1307
ds_init() — инициализация DS1307
байт IntToBoolInt(байт) — функция перекодировки числа в двоично-десятичный вид

Во время инициализации проверяются и устанавливаются, если выключены следующие биты: бит отвечающий за 24-х часовой режим работы часов и бит отвечающий за включенное состояние часов. Были реализованы 2 функции для включения и отключения часов. DS1307 может отправлять и принимать как однобайтовые посылки, так и много байтовые, но для упрощения работы с часами функции для чтения и записи только однобайтовые. Для установки часов есть ещё функция для преобразования привычной десятичной формы представления числа в двоично-десятичную, в которой микросхема хранит показатели времени. Приведённых функция для работы с часами вполне достаточно.

В прошивки реализованы функции для считывания и вывода на дисплей времени – time() , даты – date() . В бесконечном цикле через некоторые промежутки времени эти функции вызываются для вывода времени и даты на дисплей. Рассмотрим, как устроена функция для чтения с последующим выводом текущего времени:

Void time() { unsigned char i; SetLCDPosition(1, 0); i=ds_read(0x02); buffer = i/16+"0"; buffer = i%16+"0"; buffer = ":"; i=ds_read(0x01); buffer = i/16+"0"; buffer = i%16+"0"; buffer = ":"; i=ds_read(0x00); buffer = i/16+"0"; buffer = i%16+"0"; buffer = "\0"; ShowStr(buffer); }

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

В прошивки есть функция для установки часов и минут – set_time() . Эта функция с помощью одной кнопки устанавливает время. Как это делается: нажимаем на кнопку – на дисплее высвечивается надпись «Set hour:» и количество часов, увеличиваем час по средством коротких нажатий на кнопку; установив час длительным нажатием переходим на установку минут, о чём свидетельствует надпись «Set min:», таким же образом устанавливаем минуты, а длительным нажатием возвращаемся в бесконечный цикл к часам. Но т.к. эта функция большая приведём из неё только одну строчку, которая записывает в DS1307 значение минут:

Ds_write(0x02,IntToBoolInt(time));

Записываем в регистр, который соответствует минутам желаемое значение, предварительно приведённое к двоично-десятичному виду.

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

56 байт энергонезависимого ОЗУ для хранения данных

2-х проводной последовательный интерфейс

Программируемый генератор прямоугольных импульсов. Может выдавать 1 ГЦ, 4.096 кГЦ, 8,192 кГЦ и 32,768 кГц.

Автоматическое определение отключения основного источника питания и подключение резервного

24-х часовой и 12-ти часовой режим

Потребление не более 500 нA при питании от резервной батареи питания при температуре 25C°

Микросхема выпускается в восьмипиновых DIP и SOIC корпусах. Распиновка для всех одинакова. Далее приведу строки из даташита для полноты картины.

Документация на микросхему (datasheet)

Назначение выводов:

. X1, X2 - Служат для подключения 32.768 кГц кварцевого резонатора

. Vbat - Вход для любой стандартной трёхвольтовой литиевой батареи или другого источника энергии. Для нормальной работы DS1307 необходимо, чтобы напряжение батареи было в диапазоне 2.0 ... 3.5 В. Литиевая батарея с ёмкостью 48 мА/ч или более при отсутствии питания будет поддерживать DS1307 в
течение более 10 лет при температуре 25°C.

. GND - общий минус

. Vcc - Это вход +5 В. Когда питающее напряжение выше 1.25 * VBAT, устройство полностью,доступно, и можно выполнять чтение и запись данных. Когда к устройству подключена батарея на 3 В, и Vcc ниже, чем 1.25 * VBAT, чтение и запись запрещены, однако функция отсчёта времени продолжает работать. Как только Vcc падает ниже VBAT, ОЗУ и RTC переключаются на батарейное питание VBAT.

. SQW/OUT - Выходной сигнал с прямоугольными импульсами.

. SCL - (Serial Clock Input - вход последовательных синхроимпульсов) - используется для синхронизации данных по последовательному интерфейсу.

. SDA - (Serial Data Input/Output - вход/выход последовательных данных) - вывод входа/выхода для двухпроводного последовательного интерфейса.

Работа с выводом SQW/OUT .

Для начала рассмотрим структуру регистров DS1307.

Структура регистров микросхемы DS1307

Нас интересует "Управляющий регистр" находящийся по адресу 0x7, т.к. он определяет работу вывода SQW/OUT.

Если бит SQWE = 1. то начинается формирование прямоугольных импульсов, если SQWE = 0, то на выходе вывода будет значение бита OUT.

За частоту импульсов отвечают биты RS0 и RS1, а именно:

RS0 RS1 Частота
0 0 1 Гц
0 1 4.096 кГц
1 0 8.192 кГц
1 1 32.768 кГц

Приведем пример:

Если нам нужно начать формирование прямоугольных импульсов с частотой 1 Гц, то необходимо в 0x7 регистр микросхемы, которая имеет адрес 0x68 отправить байт 00010000 или 0x10 в шестнадцатиричной системе счисления.

При помощи библиотеки Wire.h , это можно сделать следующим образом:

Wire .beginTransmission (0x68); Wire .write (0x7); Wire .write (0x10); Wire .endTransmission ();

Подключение к Arduino:

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся.

Необходимые библиотеки:

для работы с DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
для работы со временем: http://www.pjrc.com/teensy/td_libs_Time.html

Установка времении

. Вручную в коде

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

Пример программного кода

#include #include void setup () { Serial .begin (9600); while (!Serial ) ; // Только для платы Leonardo // получаем время с RTC Serial //синхронизация не удаласть else Serial .println ("RTC has set the system time" ); //установим вручную 16.02.2016 12:53 TimeElements te; te.Second = 0; //секунды te.Minute = 53; //минуты te.Hour = 12; //часы te.Day = 16; //день te.Month = 2; // месяц te.Year = 2016 - 1970; //год в библиотеке отсчитывается с 1970 time_t timeVal = makeTime(te); RTC .set (timeVal); setTime (timeVal); } void loop () { digitalClockDisplay(); //вывод времени delay (1000); } void digitalClockDisplay() { Serial Serial .print (" " ); Serial .print (day ()); Serial .print (" " ); Serial .print (month ()); Serial .print (" " ); Serial .print (year ()); Serial //выводим время через ":" Serial .print (":" ); if (digits < 10) Serial .print ("0" ); Serial .print (digits); }

. Установкой из "Монитора порта"

Более точный вариант установки времени. Время задается через "монитор порта" по ходу работы контроллера.

Открываем монитор, вводим данные в нужном формате, смотрим на эталонные часы, подлавливаем момент и шелкаем "отправить".

Пример программного кода

//формат указания текущего времени "ДД.ММ.ГГ чч:мм:сс" //где ДД - день, ММ - месяц, ГГ - год, чч - часы, мм - минуты, сс - секунлы //ГГ - от 00 до 99 для 2000-2099 годов #include #include bool isTimeSet = false ; //флаг, указывающий на то, была ли уже задана дата void setup () { Serial .begin (9600); while (!Serial ) ; // Только для платы Leonardo setSyncProvider (RTC .get ); // получаем время с RTC if (timeStatus () != timeSet) Serial .println ("Unable to sync with the RTC" ); //синхронизация не удаласть else Serial .println ("RTC has set the system time" ); } void loop () { if (Serial .available ()) { //поступила команда с временем setTimeFromFormatString(Serial .readStringUntil ("\n" )); isTimeSet = true ; //дата была задана } if (isTimeSet) //если была задана дата { digitalClockDisplay(); //вывод времени } delay (1000); } void digitalClockDisplay() { Serial .print (hour ()); printDigits(minute ()); printDigits(second ()); Serial .print (" " ); Serial .print (day ()); Serial .print (" " ); Serial .print (month ()); Serial .print (" " ); Serial .print (year ()); Serial .println (); } void printDigits(int digits) { //выводим время через ":" Serial .print (":" ); if (digits < 10) Serial .print ("0" ); Serial .print (digits); } void setTimeFromFormatString(String time) { //ДД.ММ.ГГ чч:мм:сс int day = time.substring(0, 2).toInt(); int month = time.substring(3, 5).toInt(); int year = time.substring(6, 8).toInt(); int hours = time.substring(9, 11).toInt(); int minutes = time.substring(12, 14).toInt(); int seconds = time.substring(15, 17).toInt(); TimeElements te; te.Second = seconds; te.Minute = minutes; te.Hour = hours; te.Day = day ; te.Month = month ; te.Year = year + 30; //год в библиотеке отсчитывается с 1970. Мы хотим с 2000 time_t timeVal = makeTime(te); RTC .set (timeVal); setTime (timeVal); }

Часы реального времени с последовательным интерфейсом DS1307 — это малопотребляющие полные двоично-десятичные часы-календарь, включающие 56 байтов энергонезависимой статической ОЗУ. Адреса и данные передаются последовательно по двухпроводной двунаправленной шине. Часы-календарь отсчитывают секунды, минуты, часы, день, дату, месяц и год. Последняя дата месяца автоматически корректируется для месяцев с количеством дней меньше 31, включая коррекцию високосного года. Часы работают как в 24-часовом, так и в 12-часовом режимах с индикатором AM/PM. DS1307 имеет встроенную схему наблюдения за питанием, которая обнаруживает перебои питания и автоматически переключается на питание от батареи.

Работа микросхемы.

DS1307 на последовательной шине работает как ведомое устройство. Доступ к нему достигается установкой условия START и передачей устройству идентификационного кода, за которым следует адрес регистра. К следующим за ним регистрам доступ осуществляется последовательно, пока не будет выполнено условие STOP.
Если V CC падает ниже 1.25 * V BAT , DS1307 прерывает процесс доступа и сбрасывает счётчик адреса, причем в это время внешние сигналы не воспринимаются (чтобы предотвратить запись ошибочных данных).
Если V CC падает ниже V BAT , DS1307 переключается в низкоточный режим батарейной поддержки.
При включении питания DS1307 переключается от батареи к Vcc, когда значение Vcc превышает V BAT + 0.2 В . Входящие сигналы начинают восприниматься тогда, когда Vcc превышает 1.25 * V BAT .
Скачать русское описание Скачали 3077 раз

Скачать оригинальную документацию