Учебный курс AVR. Использования TWI модуля. Работа с DS1307. Дешево и сердито. Ч3. Статические электрические характеристики. Абсолютные максимальные значения.


DS1307 8-выводный DIP (300 миллидюймов)

DS1307 8-выводный SOIC (150 милидюймов)

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

V CC - первичный источник питания;

X1, X2 - подключение 32.768 кГц кварцевого резонатора;

V BAT - вход батареи +3 В;

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

SDA - последовательные данные;

SCL - последовательные синхроимпульсы;

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

Описание

Часы реального времени с последовательным интерфейсом 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 .

Блок-схема на Рис. 1 показывает основные элементы RTC с последовательным интерфейсом.


Рис. 1. Блок-схема DS1307

Описание выводов

V CC , GND - на эти выводы подается питание.

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

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

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

SDA (Serial Data Input/Output - вход/выход последовательных данных) - вывод входа/выхода для двухпроводного последовательного интерфейса. Вывод SDA - с открытым стоком и требует внешнего подтягивающего резистора.

SQW/OUT (Square Wave/Output Driver - сигнал с прямоугольными импульсами) - когда включен, т.е. бит SQWE установлен в 1, вывод SQW/OUT выдаёт прямоугольные импульсы с одной из четырёх частот (1 Гц, 4 кГц, 8 кГц, 32 кГц). Вывод SQW/OUT - с открытым стоком и требует внешнего подтягивающего резистора. SQW/OUT будет работать как при питании от V CC , так и при питании от V BAT .

X1, X2 - выводы для стандартного кварцевого резонатора с частотой 32.768 кГц. Схема внутреннего тактового генератора разработана для работы с кварцевым резонатором, имеющим входную ёмкость 12.5 пФ.

Более детальную информацию по выбору и расположению кварцевого резонатора вы сможете найти в примере применения № 58 "Рассмотрение кварцевого резонатора для часов реального времени от Dallas" (Application Note 58, "Crystal Considerations with Dallas Real-Time Clocks"). DS1307 также может тактироваться внешним тактовым генератором с частотой 32.768 кГц. В этом случае вывод X1 подключается к сигналу внешнего тактового генератора, а вывод X2 остаётся неподключенным.

Точность часов

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

Более подробную информацию смотрите в примере применения № 58 " Рассмотрение кварцевого резонатора для часов реального времени от Dallas" (Application Note 58, "Crystal Considerations with Dallas Real-Time Clocks"). Дополнительную информацию вы можете посмотреть в примере применения № 95 "Сопряжение DS1307 с 8051-совместимым микроконтроллером" (Application Note 95, "Interfacing the DS1307 with a 8051-Compatible Microcontroller").

RTC и карта адресации памяти

Карта адресов для RTC и регистров ОЗУ представлена на Рис. 2. Регистры RTC расположены в ячейках адресов от 00h до 07h. Регистры ОЗУ расположены в ячейках адресов от 08h до 3Fh. В процессе многобайтного доступа, когда адресный указатель достигает 3Fh (конец пространства ОЗУ), он перемещается на ячейку 00h - начало пространства RTC.

Рис. 2. Карта адресов DS1307

Часы и календарь

Информация от часов и календаря получается чтением соответствующих байтов регистра. Регистры RTC показаны на Рис. 3 . Время и календарь устанавливаются или инициализируются записью соответствующих байтов регистра. Содержимое регистров времени и календаря имеет двоично-десятичный формат. Бит 7 регистра 0 - это бит останова часов (clock halt - CH). Когда этот бит установлен в 1, тактовый генератор выключен . Когда сброшен в 0, - тактовый генератор включен.

Имейте в виду, что при включении питания начальное состояние всех регистров не определено. Поэтому необходимо принудительно включать тактовый генератор (бит CH = 0) во время начальной инициализации.

DS1307 может работать и в 12-часовом, и в 24-часовом режимах. Бит 6 регистра часов отвечает за выбор 12- или 24-часового режима. Когда он установлен в 1, выбран 12-часовой режим. В этом режиме бит 5 - это бит AM/PM, при этом высокий логический уровень означает PM. В 24-часовом режиме бит 5 - это бит второго десятка часов (20 - 23 часа).

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


Рис. 3. Регистры хронометра DS1307

Управляющий регистр

Управляющий регистр используется для управления работой вывода SQW/OUT.

БИТ 7 БИТ 6 БИТ 5 БИТ 4 БИТ 3 БИТ 2 БИТ 1 БИТ 0
OUT 0 0 SQWE 0 0 RS1 RS0

OUT (Output control - управление выходом) - этот бит управляет логическим уровнем на выводе SQW/OUT, когда выход сигнала с прямоугольными импульсами отключен. Если SQWE = 0, то логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0.

SQWE (Square Wave Enable - включение сигнала с прямоугольными импульсами) - когда этот бит установлен в 1, включается генерация прямоугольных импульсов. Их частота зависит от значения битов RS0 и RS1. (Если частота выходного сигнала установлена в 1Гц, регистры часов обновляются по заднему фронту этих импульсов).

RS (Rate Select - выбор частоты) - эти биты управляют частотой прямоугольных импульсов, когда бит SQWE=1. В Таблице 1 приведены частоты, которые можно выбрать с помощью битов RS.

Таблица 1. Частота выхода SQW

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

Двухпроводная последовательная шина данных

DS1307 поддерживает обмен данными по протоколу I2C по двухпроводной двунаправленной шине. Устройство, которое передаёт данные на шину, является передатчиком, а устройство, принимающее данные, - приёмником. Устройство, управляющее передачей данных, называется ведущим. Устройство, которым управляет ведущий, называется ведомым. Ведущее устройство генерирует синхроимпульсы (serial clock - SCL), управляет доступом к шине и генерирует условия START и STOP. DS1307 работает на шине как ведомое устройство. Типовая конфигурация шины с использованием протокола I2C показана на Рис. 4 .


Рис. 4. Типовая конфигурация двухпроводной шины

На Рис. 5, 6 и 7 подробно показан процесс передачи данных по двухпроводной шине.

Основные принципы передачи данных по шине I2C:

1) Передача данных может быть инициирована только когда шина свободна.

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

Таким образом, возможны следующие состояния шины:

- Шина не занята - на линиях SDA и SCL сохраняется высокий уровень.

- Начало передачи данных (условие START) - изменение состояния линии SDA с высокого на низкий, в то время как на линии SCL высокий уровень.

- Окончание передачи данных (условие STOP) - изменение состояния линии SDA с низкого на высокий, в то время как на линии SCL высокий уровень.

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

Каждая передача данных инициируется условием START и завершается условием STOP. Число байтов данных, передаваемых между условиями START и STOP, не ограничено и определяется ведущим устройством. Информация передаётся побайтово, и каждый байт приёмник подтверждает девятым битом (бит подтверждения - ACK). В спецификации двухпроводного интерфейса определены обычный режим (с тактовой частотой 100 кГц) и быстрый режим (с тактовой частотой 400 кГц). DS1307 работает только в обычном режиме (100 кГц).

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

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


* - бит чтения/записи или бит направления

Рис. 5. Передача данных по двухпроводной последовательной шине

В зависимости от состояния бита возможны два типа передачи данных:

1) Передача данных от ведущего передатчика ведомому приёмнику.

Первый байт, передаваемый ведущим, - это адрес ведомого. Далее следует некоторое количество байтов данных. Ведомый возвращает подтверждающий бит после каждого принятого байта. Данные передаются, начиная со старшего бита (most significant bit - MSB).

2) Данные передаются от ведомого передатчика ведущему приёмнику.

Первый байт (адрес ведомого) передаётся ведущим. Ведомый возвращает подтверждающий бит. За ним следует передаваемое ведомым некоторое количество байтов данных. Ведущий возвращает подтверждающий бит после всех принимаемых байтов кроме последнего байта. В конце последнего принятого байта возвращается "неподтверждение". Ведущее устройство генерирует все последовательные синхроимпульсы, а также условия START и STOP. Передача заканчивается условием STOP или повтором условия START. Поскольку повторение условия START также является и началом следующей последовательной передачи, шина не освобождается. Данные передаются, начиная со старшего бита.

DS1307 может работать в следующих двух режимах:

1) Режим ведомого приёмника (режим записи DS1307).

Последовательные данные принимаются по SDA и синхронизируются по SCL. После каждого принятого байта передаётся бит подтверждения. Условия START и STOP распознаются как начало и конец последовательной передачи. Распознавание адреса выполняется аппаратно после приёма адреса ведомого и бита направления (см. Рис. 6 ).

Байт адреса - это первый байт, принятый после генерации ведущим условия начала. Он содержит 7 битов адреса DS1307, который имеет значение 1101000 , и следующий за ним бит направления (), который для записи равен 0. После приёма и декодирования адресного байта DS1307 выдаёт на линию SDA подтверждение, после чего ведущий передаёт в устройство адрес регистра. Это установит регистровый указатель. Затем ведущий начинает передачу байтов данных, каждый из которых будет подтверждаться DS1307. Чтобы завершить запись данных, ведущий генерирует условие окончания.

Рис. 6. Запись данных - режим ведомого приёмника

2) Режим ведомого передатчика (режим чтения DS1307).

Первый байт принимается и обрабатывается так же, как и в режиме ведомого приёмника. Однако в этом режиме бит направления будет указывать, что направление передачи инвертировано. DS1307 передаёт последовательные данные по линии SDA пока на линию SCL поступают последовательные синхроимпульсы. Условия START и STOP распознаются в начале и в конце последовательной передачи (см. Рис. 7 ).

Байт адреса - первый байт, принимаемый после стартового условия, генерируется ведущим. Байт адреса состоит из 7-битного адреса DS1307, который равен 1101000 , и следующего за ним бита направления передачи (), который для чтения равен 1. После приёма и декодирования байта адреса, устройство выдаёт подтверждение на линию SDA. Затем DS1307 начинает передавать данные, начиная с указанного адреса, находящегося в регистровом указателе. Если перед началом чтения указатель регистра не записан, то первый читаемый адрес - это адрес, который был сохранён в нём последним. DS1307 должен принять "неподтверждение" для окончания чтения.

Рис. 7. Чтение данных - режим ведомого передатчика

Абсолютные максимальные значения*

Напряжение на любом выводе относительно земли: от -0.5 В до +7.0 В.

Температура хранения: от -55 °C до +125 °C.

Температура паяния: 260 °C для DIP при 10 секундном воздействии.

Для устройств поверхностного монтажа смотрите JPC/JEDEC стандарт J-STD-020A.

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

(Выше рабочего диапазона*)

*Если не оговорено иначе

Статические электрические характеристики

(Выше рабочего диапазона*)

Параметр Обозначение Значение Единицы
измерения
Примечание
Минимальное Типовое Максимальное
Ток утечки на входе (SCL) I LI 1 мкА
Ток утечки входа/выхода (SDA и SQW/OUT) I LO 1 мкА
Выход логического 0 (IOL = 5 мА) V OL 0.4 В
Ток активного питания I CCA 1.5 мА 7
Ток в режиме хранения I CCS 200 мкА 1
Ток батареи (OSC вкл.); SQW/OUT выкл. I BAT1 300 500 нА 2
Ток батареи (OSC вкл.); SQW/OUT вкл. (32 кГц) I BAT2 480 800 нА
Напряжение сбоя в цепи питания V PF 1.216 x V BAT 1.25 x V BAT 1.284 x V BAT В 8

*Если не оговорено иначе

Динамические электрические характеристики

(Выше рабочего диапазона*)

Параметр Обозначение Значение Единицы
измерения
Примечание
Минимальное Типовое Максимальное
Тактовая частота SCL f SCL 0 100 кГц
Время простоя шины между условиями STOP и START t BUF 4.7 мкс
Время удержания (повторения) условия START t HD:STA 4.0 мкс 3
Период низкого уровня синхроимпульса SCL t LOW 4.7 мкс
Период высокого уровня синхроимпульса SCL t HIGH 4.0 мкс
Время установки для повторного условия START t SU:STA 4.7 мкс
Время удержания данных t HD:DAT 0 мкс 4, 5
Время установки данных t SU:DAT 250 нс
Время подъёма для сигналов SDA и SCL t R 1000 нс
Время спада для сигналов SDA и SCL t F 300 нс
Время установки для условия STOP t SU:STO 4.7 мкс
C B 400 пФ 6
Ёмкостное сопротивление ввода/вывода (T A = 25 °C) C I/O 10 пФ
Ёмкостная нагрузка, определяемая кварцевым резонатором (T A = 25 °C) 12.5 пФ

*Если не оговорено иначе

Примечания:

1. I CCS указывается при V CC =5.0 В и SDA, SCL = 5.0 В.

2. V CC = 0 В, V BAT = 3 В.

3. После этого периода генерируется первый синхроимпульс.

4. Устройство внутренне должно обеспечивать время удержания по крайней мере 300 нс для сигнала SDA (учитывая параметр V IHMIN сигнала SCL), для того чтобы преодолеть неопределённую область заднего фронта SCL.

5. Максимальное значение t HD:DAT должно появляться только если устройство не растягивает период низкого уровня (t LOW) сигнала SCL.

6. C B – полное ёмкостное сопротивление линии шины в пФ.

7. I CCA – синхронизация SCL на максимальной частоте (100 кГц).

8. V PF измерено при V BAT = 3.0 В.


Рис. 8. Временная диаграмма

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

На рисунке ниже представлено расположение выводов, описание, и сам вид наших часов или как далее будем их называть RTC (Real-time clock) — часы реального времени или генератор импульсов времени. Данный “девайс” считает секунды, минуты, часы, день месяца, месяц, день недели и год вместе с високосными. Календарь действителен до 2100 года. Я думаю на наш век хватит:).

Как видно из описания имеется вход для аварийного питания от батареи, при отключенном внешнем питание. В этом режиме RTC поддерживает только свое основное назначение – отсчет времени, без внешних запросов. Напряжение питания батареи должно быть 2 – 3.5V. В техническом описание пишется что при заряде более 48 мА/ч, при температуре 25 град Цельсия, наша схема продержится около 10 лет. Более чем надо. На рисунке ниже представлена “таблеточка” CR2032 и крепление, которые будем использовать.

Теперь пройдемся по внешнему питанию. Рабочее напряжение часов 5В с небольшим диапазоном 4,5 -5,5В. Напряжение от батареи 3В(минимум 2, максимум 3,5В) Работа RTC делится на три режима по напряжению:

1. Vcc=5В – чтение, запись, отсчет;
2. Vcc= ниже 1,25*Vbat , но выше Vbat +0.2V — только отсчет батареи от внешнего питания.
3. Vcc ниже Vbat: RTC и ОЗУ переходит на питание от батареи. Потребление в активном состоянии 1,5 мА, от батареи 500-800нА.
Напряжение для передачи/приема информации:
Логический 0: -0.5В — +0.8В
Логическая 1: 2.2 В – Vcc+0.3В

Как и в прошлых постах попробуем запустить в Proteus. Отладим код. И перенесем все в железо. Ниже приведена схема подключения.

Где SQW/OUT – это вывод часов который можно запрограммировать на вывод частоты 1Гц, 4.096Гц, 8.192Гц и 32,768Гц. Т.е. можно использовать для внешнего прерывания контроллера с периодичностью в 1 с. Очень полезная функция. Но нам не пригодится. Кстати он тоже с открытым коллектором, поэтому необходим подтягивающий резистор. Номинал 4,7 кОм.

Выводы Х1 и Х2 – к ним подключаем кварцевый резонатор с частотой 32,768 кГц. Либо можно применить внешний тактовый генератор с той же частотой. Но при этом вывод X1 подключается к сигналу, а X2 остаётся неподключенным (висеть в воздухе.).

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

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

2. Ширину трассы также по возможности делать меньше, для уменьшения вероятности принятия помех с других источников.

3. Контур в виде защитного кольца необходимо поместить вокруг кристалла, что помогает изолировать кристалл от шума.

4. Проводники поместить в кольцо и и подключить к заземлению.

5. Припаиваем резонатор к земле. Если земля разведена верно и есть уверенность.

На рисунке ниже видно контур и место припая к земле.

Как подключать разобрались. Идем далее – разберемся как с ним работать. RTC является программируемым и имеет 8 байт специальных регистров для его конфигурации и энергонезависимую статическую память 56 байтов. Для обмена информации необходима 2-х проводная шина данных, т.е. последовательная шина данных- который мы рассмотрели в прошлой статье. Итак для работы пробежимся по даташиту. Что нам необходимо:

Таблица регистров. Рисунок ниже. Первые восемь регистров – для вывода и программирования наших часов. При обращении по адресу 00H к 7-му биту(CH) и установкой его в 0 –запускаем часы. Хочется отметить, что конфигурация регистров может быть любая, поэтому при первом запуске необходимо его настроить под свои требования. Остальные семь битов единицы и десятки секунд.


01H – Минуты.
02H – Часы, которые настраиваются:
— Бит 6 – при 1 вывод 12 часовой формат, 0 – 24.
— Бит 5 – при 1 (при 12 часовом формате) PM , 0-AM
— Бит 5 – (при 24 ч формате) это вывод второго десятка часов (20-23часа.)
— Бит4 – первый десяток часов, остальные биты это единицы часов.
03H – день недели;
04H – дата;
05H – месяц года
06H – год.

Ну и последний регистр 07H. Данный регистр является управляющим.Где OUT отвечает за управление выводом SQW/OUT. Ниже таблица включения вывода.

OUT
SQWE
SQW/OUT
1
0
1
0
0
0

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

Этот вывод нам не пригодится в проекте. Хотя для него я развел на плате дорожку. В качестве экспериментов может быть где то в будущем и применим, ведь здесь можно сделать прерывании в 1 с.

Теперь имея всю необходимую информацию, напишем функции для работы с часами. А также запустим проект в Proteus . Который будет иметь следующий вид:


Обратите внимание, что резонатор в Proteus, можно и не подключать к часам(обведенное красным).

На рисунке выведен терминал часов, который отображает время, которое в свою очередь привязано к системному времени. Терминал отладчика протокола I2C или TWI , на котором отображается время отправки и приема сигнала, где D0 – передаваемая команда, D1 - прием. Ниже я буду выводить скриншоты терминала с результатом работы программы.

Программа . Рассмотрев основные настройки часов напишем функцию инициализации.

/*Функция инициализации включает в себя установку скорости обмена данных по формуле(в предыдущей статье), установка пред делителя и включение модуля TWI*/
void init_DS1307 (void)
{
TWBR = 2; /*При частоте 1 МГц */
TWSR = (0 << TWPS1)|(0 << TWPS0); /*Пред делитель на 64*/
TWCR |= (1 << TWEN); /*Включение модуля TWI*/
}
void write_DS1307 (uint8_t reg, uint8_t time) /*передаем два параметра: адрес регистра, к которому будем обращаться и передаваемую информацию*/
{
/* Формируем состояние СТАРТ, выставляя разряды регистра управления*/
TWCR = (1<
/*Разрешить работу модуля TWEN; Сформировать состояние старт TWSTA; Сбросить флаг TWINT */
/*Ждем окончания формирования условия старт, т.е. пока не установится флаг, код статуса = 08*/
while (!(TWCR & (1<
/*Далее перелаем пакет адреса (адрес устройства). Содержимое пакета загружается в регистр TWDR*/
TWDR = 0xd0; /*0b1101000 + 0 – адрес + бит записи*/
/*Сбрасываем флаг для передачи информации*/
TWCR = (1<
/*Ждем установки флага*/
while (!(TWCR & (1<
/*передаем регистр к которому будем обращаться*/
TWDR = reg;
TWCR = (1<
while (!(TWCR & (1<
/*Передаем информацию для записи в байт регистра*/
TWDR = time;
TWCR = (1<
while (!(TWCR & (1<
/*формируем состояние СТОП*/
TWCR = (1<
}

В этой функции мы передали три байта, адрес устройства, адрес регистра и байт информации для записи в этот регистр и сформировали состояние СТОП.

Осталась последняя функция чтения. Ниже формат чтения.

В данной функции выполняется передача байта адреса устройства +бит записи, байт адреса регистра для установки на него указатель, выполнение условия ПОВСТАР, передача байта адреса устройства +бит чтения, чтение регистра, адрес которого мы передали ранее.

Если мы будем обращаться к часам в формате чтения, то при повторном обращении к часам указатель сдвигается на один байт вниз включая 56 байт ОЗУ, от 00H до 3FH. При достижении последнего адреса, указатель переходит на адрес 00.

/*Функция чтения данных из DS1307*/
uint8_t read_DS1307 (uint8_t reg) /*Передаем адрес регистра*/
{
uint8_t time;
/*формируем состояние СТАРТ*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = 0xd0; /*Передаем адрес + бит записи*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = reg; /*Адрес регистра*/
TWCR = (1<
while (!(TWCR & (1<
/*формируем состояние ПОВСТАР*/
TWCR = (1<
while (!(TWCR & (1<
TWDR = 0xd1; /*Передаем адрес + бит чтения*/
TWCR = (1<
while (!(TWCR & (1<
/*считываем данные*/
TWCR = (1<
while (!(TWCR & (1<
/*формируем состояние СТОП*/
TWCR = (1<
return time;
}

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

#include
#include
uint8_t time;
void init_DS1307 (void);
uint8_t read_DS1307 (uint8_t reg);
void write_DS1307 (uint8_t reg, uint8_t time);
int main (void)
{
DDRC = 0×00; /*Выставляем порт как вход*/
PORTC = 0xFF; /*Подтягиваем сопротивление*/
init_DS1307;
while (1)
{
_delay_ms (50);
read_DS1307 (0×04); /*Чтение регистра даты*/
}
}

Ниже результат выполнения программы чтение даты.

В окне отладчика I2C видно что сначала посылается адрес регистра в RTC (зеленый кружочек), в данном случае 04, который отвечает за дату месяца, и далее часы передают ответ 21 (красный кружочек).

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

while (1)
{
_delay_ms (500);
read_DS1307 (0×01); /*Считываем минуту*/
_delay_ms (500);
write_DS1307 (0×01, 15); /*Записываем необходимую минуту*/
_delay_ms (500);
read_DS1307 (0×01); /*Считываем минуту*/
}

На рисунке видно, что сначала идет обращение к регистру 01, считывается минута 23. Далее мы используем функцию записи, и вносим значение 15. При следующей функции чтения у нас на табло часов значение 15.


Ну и последний пример программы это вывод значений всех регистров

while (1)
{
delay_ms (500);
read_DS1307 (0×00);
_delay_ms (500);
read_DS1307 (0×01);
_delay_ms (500);
read_DS1307 (0×02);
_delay_ms (500);
read_DS1307 (0×03);
_delay_ms (500);
read_DS1307 (0×04);
_delay_ms (500);
read_DS1307 (0×05);
_delay_ms (500);
read_DS1307 (0×06);
_delay_ms (500);
}

На рисунке ниже видно, что вывелись данные 7-ми регистров.

Исходник с проектом прилагается:

(Скачали: 341 чел.)

На этом все. В подключим часы в железе, выведем время на индикатор и познакомимся с двоично-десятичным форматом для работы с часами. Всем пока.

Модуль часов реального времени 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. Откройте последовательный монитор и смотрите. Есть специальная библиотека времени . Она имеет много различных функций, которые могут быть полезны в зависимости от ситуации. Чтобы установить время, используя библиотеку нужно скачать . При использовании скетча можно синхронизировать часы реального времени с часами персонального компьютера.

Vbat - вход батареи для любого стандартного 3 Вольтового литиевого элемента или другого источника энергии. Для нормальной работы напряжение батареи должно поддерживаться между 2.5 и 3.5 В. Уровень, при котором запрещён доступ к часам реального времени и пользовательскому ОЗУ, установлен внутренней схемой равным 1.25 x Vbat. Литиевая батарея ёмкостью 35 mAh или больше достаточна для питания DS1307 в течение более чем 10 лет при отсутствии питания.
SCL (Последовательный Тактовый Вход) - SCL используется, чтобы синхронизировать передачу данных через последовательный интерфейс.
SDA (Вход/Выход Последовательных Данных) - SDA - вход / выход данных для 2-проводного последовательного интерфейса. Это выход с открытым стоком, который требует внешнего притягивающего резистора.
SQW/OUT (Меандр / Выходной Драйвер) - Когда бит SQWE установлен в 1, на выходе SQW/OUT вырабатываются импульсы в форме меандра одной из четырех частот: 1 Гц., 4 кГц., 8 кГц., 32 кГц. Вывод SQW/OUT - с открытым стоком, требует внешнего притягивающего резистора.
X1, X2 - выводы для подключения стандартного кристалла кварца 32.768 кГц. Внутренняя схема генератора рассчитана на работу с кристаллом, имеющим номинальную емкость (CL) 12.5 пФ.
GND - Земля.
VCC - питание 5 вольт.

DS1307 работает как ведомое устройство на последовательной шине. Для доступа к нему надо установить состояние START и передать код идентификации устройства, сопровождаемый адресом регистра. К последующим регистрам можно обращаться последовательно, пока не установлено состояние STOP . Когда VСС падает ниже 1.25 x Vbat, устройство прекращает связь и сбрасывает адресный счетчик. В это время оно не будет реагировать на входные сигналы, чтобы предотвратить запись ошибочной информации. Когда VСС падает ниже Vbat, устройство переключается в режим хранения с низким потреблением. При включении питания устройство переключает питание с батареи на VСС , когда напряжение питания превысит Vbat + 0.2V, и реагирует на входные сигналы, когда VСС станет более 1.25 x Vbat. Когда питание находится в пределах нормы, устройство полностью доступно, и данные могут быть записаны и считаны. Когда к устройству подключена трёхвольтовая батарея и VСС ниже 1.25 x Vbat, чтение и запись запрещены. Однако отсчёт времени при этом работает. Когда VСС падает ниже Vbat, питание ОЗУ и отсчёта времени переключается на внешнюю батарею 3 В.

Информацию о времени и дате получают, считывая соответствующие регистры. Регистры часов показаны в таблице ниже. Время и календарь устанавливаются или инициализируются путём записи байтов в соответствующие регистры. Содержание регистров времени и календаря хранится в двоично-десятичном (BCD) формате, поэтому перед выводом информации на LCD дисплей или семисегментный индикатор необходимо преобразовать двоично-десятичный код в двоичный или ANSII - код.

Бит 7 регистра 0 - это бит остановки хода часов (Clock Halt). Когда этот бит установлен в 1, генератор остановлен. Когда сброшен в ноль, генератор работает, а часы считают время.


DS1307 может работать в 12-часовом или 24-часовом режиме. Бит 6 регистра часов задаёт один из этих режимов. Когда он равен 1, установлен 12-часовой режим. В 12-часовом режиме высокий уровень бита 5 сообщает о послеполуденном времени. В 24-часовом режиме бит 5 - второй бит 10 часов (20-23 часа).

Регистр управления DS1307 предназначен для управления работой вывода SQW/OUT . Бит OUT - управление выходом. Этот бит управляет выходным уровнем на выводе SQW/OUT , когда генерация меандра запрещена. Если SQWE = 0, логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0 - если OUT = 0. SQWE - Разрешение меандра. Когда этот бит установлен в 1, разрешается генерация меандра. Частота меандра зависит от значений битов RS0 и RS1. Эти биты управляют частотой меандра, когда его генерация разрешена. В таблице ниже показаны частоты, которые могут быть заданы RS битами.

DS1307 поддерживает двунаправленные 2-проводную шину и протокол передачи данных. Устройство, которое посылает данные на шину, называется передатчиком, а устройство, получающее данные - приемником. Устройство, которое управляет передачей, называется ведущим. Устройства, которые управляются ведущим - ведомые. Шина должна управляться ведущим устройством, которое вырабатывает последовательные такты (SCL), управляет доступом к шине, и генерирует состояния СТАРТ и СТОП. DS1307 работает как ведомое на 2-х проводной шине.

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

1. Режим записи в DS1307 . Последовательные данные и такты получены через SDA и SCL. После передачи каждого байта передаётся подтверждающий бит ASK . Состояния START и STOP опознаются как начало и конец последовательной передачи. Распознавание адреса выполняется аппаратно после приема адреса ведомого и бита направления. Байт адреса содержит семибитный адрес DS1307, равный 1101000, сопровождаемым битом направления (R/W), который при записи равен 0. После получения и расшифровки байта адреса DS1307 выдаёт подтверждение ASK на линии SDA. После того, как DS1307 подтверждает адрес ведомого и бит записи, ведущий передает адрес регистра DS1307. Тем самым будет установлен указатель регистра в DS1307. Тогда ведущий начнет передавать байты данных в DS1307, который будет подтверждать каждый полученный байт. По окончании записи ведущий сформирует состояние STOP .

2. Режим чтения из DS1307 . Первый байт принимается и обрабатывается как в режиме ведомого приёмника. Однако в этом режиме бит направления укажет, что направление передачи изменено. Последовательные данные передаются по SDA от DS1307, в то время как последовательные такты - по SCL в DS1307. Состояния START и STOP опознаются как начало и конец последовательной передачи. Байт адреса - первый байт, полученный после того, как ведущим сформировано состояние START . Байт адреса содержит семибитный адрес DS1307, равный 1101000, сопровождаемым битом направления (R/W), который при чтении равен 1. После получения и расшифровки байта адреса DS1307 выдаёт подтверждение ASK на линии SDA. Тогда DS1307 начинает передавать данные, начинающиеся с адреса регистра, на которые указывает указатель регистра. Если указатель регистра не записан перед инициированием режима чтения, то первый адрес, который читается - это последний адрес, оставшийся в указателе регистра. DS1307 должен получить неподтверждение NOASK , чтобы закончить чтение.

Рассмотрим особенности работы с DS1307 на примере простых часов, которые будут показывать часы, минуты и секунды. Данные будут выводиться на LCD дисплей 16х2. Две кнопки "Часы+" и "Минуты+" позволят подвести нужное время. Микроконтроллер Atmega 8 тактируется от внутреннего генератора частотой 1 MHz, поэтому не забудьте поменять фьюзы. Ниже представлена схема подключения.


Управляющая программа включает в себя наборы функций работы с шиной TWI, часами DS1307, LCD дисплеем.

I2CInit - инициализация шины;
I2CStart - передача условия START;
I2CStop - передача условия STOP;
I2CWriteByte - запись данных;
I2CReadByte - чтение данных;
DS1307Read - функция чтения данных из DS1307;
DS1307Write - Функция записи данных в DS1307;
lcd_com - передача команды в LCD;
lcd_data - передача данных в LCD;
lcd_string - функция вывода строки в LCD;
lcd_num_to_str - функция вывода символа типа int;
lcd_init - инициализация LCD.

Ниже представлен код программы:

#include #include // Функция инициализация шины TWI void I2CInit(void) { // настройка TWI модуля TWBR = 2; TWSR = (1 << TWPS1)|(1 << TWPS0); // Предделитель на 64 TWCR |= (1 << TWEN); // Включение модуля TWI } void I2CStart(void) { // Передача условия СТАРТ TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTA); // Ожидание установки флага TWINT while(!(TWCR & (1 << TWINT))); } void I2CStop(void) { TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTO); // Передача условия СТОП while(TWCR & (1 << TWSTO)); // Ожидание завершения передачи условия СТОП } // Функция записи данных по шине uint8_t I2CWriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR = (1 << TWEN)|(1 << TWINT); // Сброс флага TWINT для начала передачи данных while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи // Проверка статуса if((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x28 || (TWSR & 0xF8) == 0x40) { // Если адрес DS1307, биты R/W и данные переданы // и получено подтверждение return 1; } else return 0; // ОШИБКА } // Функция чтения данных по шине uint8_t I2CReadByte(uint8_t *data,uint8_t ack) { if(ack) // Устанавливаем подтверждение { // Возвращаем подтверждение после приема TWCR |= (1 << TWEA); } else { // Возвращаем неподтверждение после приема // Ведомое устройство не получает больше данных // обычно используется для распознования последнего байта TWCR &= ~(1 << TWEA); } // Разрешение приема данных после сброса TWINT TWCR |= (1 << TWINT); while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT // Проверка статуса if((TWSR & 0xF8) == 0x58 || (TWSR & 0xF8) == 0x50) { // Прием данных и возвращение подтверждения // или // Прием данных и возвращение неподтверждения *data = TWDR; // Читаем данные return 1; } else return 0; // Ошибка } // Функция чтения данных из DS1307 uint8_t DS1307Read(uint8_t address,uint8_t *data) { uint8_t res; // Результат I2CStart(); // СТАРТ res = I2CWriteByte(0b11010000); // адрес DS1307 + бит W if(!res) return 0; // ОШИБКА // Передача адреса необходимого регистра res = I2CWriteByte(address); if(!res) return 0; // ОШИБКА I2CStart(); // Повторный СТАРТ res = I2CWriteByte(0b11010001); // адрес DS1307 + бит R if(!res) return 0; // ОШИБКА // Чтение данных с неподтверждением res = I2CReadByte(data,0); if(!res) return 0; // ОШИБКА I2CStop(); // СТОП return 1; } // Функция записи данных в DS1307 uint8_t DS1307Write(uint8_t address,uint8_t data) { uint8_t res; // Результат I2CStart(); // СТАРТ res = I2CWriteByte(0b11010000); // адрес DS1307 + бит W if(!res) return 0; // ОШИБКА // Передача адреса необходимого регистра res = I2CWriteByte(address); if(!res) return 0; // ОШИБКА res = I2CWriteByte(data); // Запись данных if(!res) return 0; // ОШИБКА I2CStop(); // СТОП return 1; } // Функции работы с LCD #define RS PD0 #define EN PD2 // Функция передачи команды void lcd_com(unsigned char p) { PORTD &= ~(1 << RS); // RS = 0 (запись команд) PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция передачи данных void lcd_data(unsigned char p) { PORTD |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция вывода строки на LCD void lcd_string(unsigned char command, char *string) { lcd_com(0x0C); lcd_com(command); while(*string != "\0") { lcd_data(*string); string++; } } // Функция вывода переменной void lcd_num_to_str(unsigned int value, unsigned char nDigit) { switch(nDigit) { case 4: lcd_data((value/1000)+"0"); case 3: lcd_data(((value/100)%10)+"0"); case 2: lcd_data(((value/10)%10)+"0"); case 1: lcd_data((value%10)+"0"); } } // Функция инициализации LCD void lcd_init(void) { PORTD = 0x00; DDRD = 0xFF; _delay_ms(50); // Ожидание готовности ЖК-модуля // Конфигурирование четырехразрядного режима PORTD |= (1 << PD5); PORTD &= ~(1 << PD4); // Активизация четырехразрядного режима PORTD |= (1 << EN); PORTD &= ~(1 << EN); _delay_ms(5); lcd_com(0x28); // шина 4 бит, LCD - 2 строки lcd_com(0x08); // полное выключение дисплея lcd_com(0x01); // очистка дисплея _delay_us(100); lcd_com(0x06); // сдвиг курсора вправо lcd_com(0x0C); // включение дисплея, курсор не видим } int main(void) { _delay_ms(100); DDRC = 0x00; PORTC = 0xFF; lcd_init(); // Инициализация LCD I2CInit(); // Инициализация шины I2C // Запускаем ход часов uint8_t temp; DS1307Read(0x00,&temp); temp &= ~(1 << 7); // обнуляем 7 бит DS1307Write(0x00,temp); while(1) { unsigned char hour, minute, second, temp; // Читаем данные и преобразуем из BCD в двоичную систему DS1307Read(0x00,&temp); // Чтение регистра секунд second = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); DS1307Read(0x01,&temp); // Чтение регистра минут minute = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); DS1307Read(0x02,&temp); // Чтение регистра часов hour = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); lcd_string(0x81, "«acГ Ѕa DS1307"); lcd_string(0xC4, " : : "); lcd_com(0xC4); lcd_num_to_str(hour, 2); // Выводим на экран часы lcd_com(0xC7); lcd_num_to_str(minute, 2); // Выводим на экран минуты lcd_com(0xCA); lcd_num_to_str(second, 2); // Выводим на экран секунды if((PINC & (1 << PC0))==0) // Если нажата кнопка { while((PINC & (1 << PC0))==0){} // Ждем отпускания кнопки hour++; // Увеличиваем часы на 1 if(hour > 23) hour = 0; // Преобразуем из двоичной системы в BCD и записываем в DS1307 uint8_t temp; temp = ((hour/10) << 4)|(hour%10); DS1307Write(0x02, temp); _delay_ms(100); } if((PINC & (1 << PC1))==0) // Если нажата кнопка { while((PINC & (1 << PC1))==0){} // Ждем отпускания кнопки minute++; // Увеличиваем минуты на 1 if(minute > 59) minute = 0; // Преобразуем из двоичной системы в BCD и записываем в DS1307 uint8_t temp; temp = ((minute/10) << 4)|(minute%10); DS1307Write(0x01, temp); _delay_ms(100); } } }

    Модуль рассматриваемый в статье содержит в себе сразу две микросхемы: DS1307 (часы реального временис I2C- интерфейсом) и AT24C32 (микросхема памяти EEPROM на 32K bit).

    В данной статье рассмотрим работу только микросхемы часов реального времени DS1307.

    Основные технические характеристики:

    Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 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); }


    Купить в России