Ds1307 подключение. Учебный курс AVR
В этом материале будет рассмотрен топорный вариант работы с TWI модулем на примере часов реального времени - микросхемы DS1307. Топорный, потому что обмен по I2C будет организован без прерываний и анализа статусных кодов, чтобы сильно не грузить начинающих.
DS1307
Микросхема DS1307 предназначена для счета времени - секунд, минут, часов, дней, месяцев и лет. То есть по сути, это часы с календарем.
Она тактируется от собственного кварцевого генератора с частотой 32768 Гц и может работать от двух источников питания - основного и резервного. Важная фишка этой микросхемы заключается в низком потреблении - меньше 500 nA в рабочем режиме. При таком потреблении DS1307 может проработать от трехвольтовой батарейки (типа CR2032 емкостью ~200 мА*ч) несколько лет. Также DS1307 может генерировать на одном из выводов меандр и в ее составе есть 56 байт оперативной памяти, которую можно использовать для хранения данных.
Минимальная схема подключения DS1307 включает в себя часовой кварц и один источник питания. Обмен данными с микросхемой осуществляется по I2C, причем DS1307 может работать на шине только как подчиненное устройство (слейвом).
С чего начать?
Подключение любой микросхемы начинается с изучения даташита. В случае DS1307 нам нужно выяснить: какую скорость обмена поддерживает микросхема, какой она имеет адрес, как выглядит карта памяти, есть ли у нее управляющие биты или регистры, как передать данные и как прочитать их. Ниже приведены скриншоты из даташита, в которых я нашел требуемую информацию.
Скорость обмена DS1307
Адрес, по которому DS1307 отзывается на I2C шине
Карта памяти DS1307
Карта памяти показывает, по каким адресам расположены регистры микросхемы и сколько их вообще.
По нулевому адресу располагается регистр секунд. Младшие 4 разряда регистра отведены для единиц, там может быть число от 0 до 9. Старшие - для десятков секунд.
Это так называемый двоично-десятичный формат представления чисел (BCD).При таком формате один байт может представить числа только от 0 до 99. Остальные регистры часов и календаря содержат данные в таком же формате.
7-й разряд регистра секунд - управляющий. 0 в этом разряде разрешает работу часов, 1 - запрещает. При подачи питания этот разряд устанавливается в 1.
По первому адресу расположен регистр минут. С ним все понятно.
По второму адресу располагается регистр часов. 6-й бит этого регистра задает формат представления времени. Если он установлен в 1 используется 12 часовой формат, если сброшен -24 часовой.
По седьмому адресу располагается регистр, управляющий выводом SQW. На него можно выводить внутренний тактовый сигнал разной частоты. Значения битов описаны в даташите. Нас они сейчас не интересуют.
Ну и адреса с 8 по 63-й отведены для оперативной памяти. Их можно использовать для хранения данных.
Как записать данные в DS1307
DS1307 может работать в двух режимах: как подчиненный приемник и как подчиненный передатчик. В первом режиме ведущее устройство передает DS1307 данные, а DS1307 принимает их. Во втором - ведущее устройство принимает от DS1307 данные, а та в свою очередь передает их. (Но обмен в обоих случаях начинает ведущий!)
Для каждого режима в даташите есть описание и диаграмма обмена. Запись данных выполняется согласно следующей последовательности.
2. Ведущий выдает на шину адрес DS1307 с нулевым битом квитирования (адресный пакет), что сигнализирует ведомому о последующей записи данных.
3. Если на шине присутствует микросхема DS1307, она отвечает ведущему - ACK.
4. После получения ответа ведущий передает DS1307 адрес регистра, с которого начнется запись данных. Это значение записывается во внутренний счетчик адреса DS1307.
5. DS1307 снова отвечает ведущему.
6. Получив ответ, ведущий передает ведомому байт данных, который предназначен для записи в регистр DS1307.
7. DS1307 отвечает ведущему.
8. Шаги 6, 7 повторяются несколько раз.
9. Ведущий формирует на шине состояние СТОП.
Адрес, по которому выполняется запись в DS1307, автоматически увеличивается на единицу. Дойдя до последнего адреса, счетчик обнуляется. Записывать можно любое число байт - хоть один, хоть все.
1. Ведущий формирует на шине состояние СТАРТ.
2. Ведущий выдает на шину адрес DS1307 с установленным битом квитирования, что сигнализирует ведомому о последующем чтении данных.
3. DS1307 отвечает ведущему.
4. DS1307 передает ведущему байт данных, на который указывает внутренний счетчик адреса.
5. Ведущий отвечает, что принял данные.
6 . Шаги 4, 5 повторяются несколько раз.
7. DS1307 передает ведущему байт данных.
7. Ведущий неформирует ответ DS1307.
8. Ведущий выдает на шину состояние СТОП.
Поскольку чтение данных выполняется по адресу внутреннего счетчика, его значение нужно предварительно инициализировать. Это делается с помощью операции записи, которая обрывается после передачи адреса регистра.
Код
Теперь можно перейти к коду. Нам понадобится минимум три функции:
Функция инициализации,
- функция записи данных,
- функция чтения данных.
Инициализация
#define F_I2C 50000UL
#define TWBR_VALUE (((F_CPU)/(F_I2C)-16)/2)
#if ((TWBR_VALUE > 255) || (TWBR_VALUE == 0))
#error "TWBR value is not correct"
#endif
void RTC_Init(void)
{
TWBR = TWBR_VALUE;
TWSR = 0;
}
Скорость задается с помощью макроса TWBR_VALUE. Здесь используется формула, разобранная в предыдущей части. При компиляции расчетное значение проверяется с помощью директив препроцессора, чтобы убедиться, что оно не выходит за диапазон.
Передача данных
Передача данных начинается с состояния СТАРТ. Чтобы сформировать его, нужно включить TWI модуль, установить бит TWSTA и сбросить флаг прерывания TWINT. Это выполняется в одну строчку, записью в управляющий регистр TWCR.
Когда микроконтроллер выдаст на шину состояние СТАРТ, установится бит TWINT и в статусном регистре TWSR изменится статусный код. Микроконтроллер должен дождаться установки бита TWINT, прежде чем перейдет к следующей операции. Ожидание в нашем случае выполняется циклическим опросом (тупо поллингом.. не путать с троллингом).
TWCR = (1<
Каждая установка бита TWINT сопровождается определенным статусным кодом в регистре TWSR. По хорошему, мы должны проверять эти коды, чтобы контролировать успешность операций. Но поскольку код у нас торный (учебный), мы не будем этого делать.
Далее на шину нужно выдать адресный пакет. В регистр данных TWDR загружаем адрес, а бит квитирования устанавливаем нулевым. После загрузки адреса сбрасываем бит TWINT, инициируя дальнейшую работу TWI модуля, и дожидаемся, когда она завершится, опрашивая TWINT.
/*выдаем на шину пакет SLA-W*/
TWDR = (DS1307_ADR<<1)|0;
TWCR = (1<
Посылаем на шину адрес, с которого будет производиться запись в DS1307. Для этого загружаем в регистр данных требуемое значение, сбрасываем бит TWINT и дожидаемся его установки.
TWDR = adr;
TWCR = (1<
/*формируем состояние СТОП*/
TWCR = (1<
Полный код функции записи будет выглядеть примерно так.
/*выдаемна шину пакет SLA-W*/ /*передаем адрес регистра ds1307*/ /*передаем данные или пропускаем*/ TWDR = data; /*формируем состояние СТОП*/ С помощью этой функции можно производить запись отдельных регистров и инициализировать внутренний регистр адреса DS1307 для последующей операции чтения данных. Пример использования функции есть в тестовых проектах. Чтение данных из DS1307
Формируем состояние СТАРТ. Посылаем на шину адресный пакет - адрес и установленный бит квитирования. Получаем данные. Сбрасываем бит TWINT, инициирую работу TWI модуля. Бит TWEA должен быть установлен в 1, чтобы ведущее устройство сигнализировало ведомому о приеме очередного байта. /*формируем состояние СТОП*/ Полный код функции чтения одного байта данный из DS1307 будет выглядеть примерно так. /*формируем состояние СТАРТ*/ /*выдаем на шину пакет SLA-R*/ /*считываем данные*/ /*формируем состояние СТОП*/ Return data; Как обычно тестовый проект, объединяющий все выше сказанное. Программа простая. Инициализируем периферию, загружаем в DS1307 начальное значение. Далее в цикле считываем временя и выводим на LCD. Для общения с DS1307 используются всего три функции. А вот как это выглядит в сборе. Испытания я проводил в связке ATmega32 + LCD 16x2 + DS1307.
Далее есть два варианта. Первый, можно сгенерить код прям генератором CVAVR.
Второй, самому все написать. Я предлагаю писать самому, но сначала давайте
пройдемся по функциям DS1307. Спасибо за статью, все понятно и без воды. Стараюсь) Алексей спасибо большое! Пожалуйста. А в проге flowcode реально это повторить? А что это за программа? Спасибо за подробное объяснение примеров. Не могли бы Вы дополнить пример ручной установки времени в RTC? Иногда корректировка времени все таки нужна. Для полноценной работы с часами реального времени DS1307 и DS3231 мной написаны функции которые входят в библиотеку . Рекомендую использовать для боле упрощенной генерации проекта под Atmel Studio. Так же можно посмотреть видео о использовании данной библиотеки. Rtc_set_date(13, 2, 14); Вот поэтому я забил на CVAVR с ее косяками (а они не только в часах), перешел на AtmelStudio и написал библиотеку под нее а-пя CVAVR. Теперь у меня все работает и не глючит.))) Всем советую заменять Ds1307 на 3231 т.к 32я намного точней, а 1307 только для таймеров подходит. Намного точней - это на сколько именно? ИМХО точность часов определяется на 99,9999999 % точностью кварцевого резонатора. Ну не совсем. Человек наверное просто имел в виду термокомпенсацию, так как частота кварца зависит еще и от температуры. Ситуация: Купил микруху DS1307. Спаял Вашу схему. Нужна единственная функция - выход секундных импульсов. Больше ничего не нужно. Что делать? Какой использовать программатор? [email protected] Программатор не нужен. Нужно написать программу под любой МК который передаст команду для задания частоты выходной ножки SQW/OUT. Далее пока есть напряжение на микросхеме, на выходе будет меандр в 1ГЦ. DS1307
- микросхема часов реального времени с интерфейсом I2C(TWI)
. Часы / календарь хранят следующую информацию: секунды, минуты, часы, день, дату, месяц и год. Конец месяца автоматически подстраивается для месяцев, в которых менее 31 дня, включая поправку для високосного года. Часы работают в 24-часовом или 12-часовом формате с индикатором AM/PM. DS1307 имеет встроенную схему контроля питания, которая обнаруживает пропадание питания и автоматически переключает схему на питание от батареи. Vbat
- вход батареи для любого стандартного 3 Вольтового литиевого элемента или другого источника энергии. Для нормальной работы напряжение батареи должно поддерживаться между 2.5 и 3.5 В. Уровень, при котором запрещён доступ к часам реального времени и пользовательскому ОЗУ, установлен внутренней схемой равным 1.25 x Vbat. Литиевая батарея ёмкостью 35 mAh или больше достаточна для питания DS1307 в течение более чем 10 лет при отсутствии питания. 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 - инициализация шины; Ниже представлен код программы:
#include Урок 17
Часть 1
Продолжаем занятия по программированию МК AVR
. И сегодня мы познакомимся с очень хорошей микросхемой DS1307
. Данная микросхема представляет собой часы реального времени
(real time clock
или RTC
). Также, благодаря тому, что общение микроконтроллера с данной микросхемой будет происходить с применением интерфейса I2C
, мы ещё лишний раз на деле закрепим тему программирования данной шины. Данная микросхема представлена компанией Dallas
, вот её распиновка и основные технические характеристики Здесь мы видим, что есть у нас ножки SDA и SCL, назначение которых мы очень прекрасно знаем из . Также есть ножки X1 и X2 для подключения кварцевого резонатора на 32768 Гц, ножки питания — VCC и GND, выход для импульсов продолжительностью 1 секунда либо другой частоты в зависимости от настроек определенных регистров, а также плюсовой контак для батарейки, которая подключается для поддержания хода часов в момент отключения основного питания. Отрицательный контакт данной батарейки мы подключаем к общему проводу питания. Также мы видим, что данная микросхема исполняется в планарных и DIP-корпусах. Питаться данная микросхема может как и от 3 вольт, так и от 5 вольт. Обращение к данной микросхеме по интерфейсу I2C происходит, в принципе, также. как и к микросхеме памяти, которую мы использовали на прошлом уроке. Конечно, будут свои нюансы, но об этом позже. Так как данная микросхема у меня установлена в том же модуле, в котором установлена и микросхема EEPROM, а шина обмена у нас одна, то "узнавать" микросхема DS1307 о том, что обращаются именно к ней, будет, конечно, по адресу, который у неё другой, нежели у микросхемы EEPROM. Вот диаграммы приёма и передачи данных микросхемы Адрес, по которому мы будем обращаться к данной микросхеме, выделен синим. В принципе. особой разницы с диаграммами микросхемы EEPROM мы на видим. Ещё отличие в обращении будет в том, что адресация памяти будет уже однобайтная, так как ячеек памяти или регистров
у данной микросхемы очень мало. Вот что из себя представляют данные регистры Назначение данных регистров: 00h
— секунды. Секунды хранятся в двоично-десятичном виде. То есть в младших 4 битах хранятся единицы секунд, а в более старших трёх — десятки. Также есть бит SH — это бит запуска микросхемы. 01h
— минуты. Хранятся аналогично. 02h
— более универсальный регистр. Здесь хранятся часы. В четырех младших битах — единицы чаов, в следующих более старших двух — десятки, в следующем 6 бите — флаг того, после полудня сейчас время или до полудня, в 7 бите — режим хранения — 12- часовой или 24-часовой. 03h
— день недели. Хранится в младших 3 битах, остальные биты не используются. 04h
— здесь хранится день месяца, также в двоично-десятичном формате. В четыреё малдших битах — единицы, в двух следующих постарше — десятки, остальные биты не используются. 05h
— номер месяца в году — хранится в двоично-десятичном формате точно также, как и часы. 06h
— номер года, причём не полный четырёхзначный, а только двузначный. В младших четырех битах — единицы, в старших — десятки. Вот этими семью регистрами мы и будем пользоваться. Последний регистр предназначен для конфигурирования частоты импульсов на импульсном выходе микросхемы, это делается в младших двух битах регистра. по умолчанию он будет 1 гц частотой, нам этого достаточно, чтобы помигать двоеточием, поэтому мы не будем пользоваться данными битами. Биты SOWE и OUT также применяются для настройки и включения формирователя даннх квадратных импульсов. Проект для работы с данной микросхемой был создан обычным образом с именем MyClock1307
, файлы, связанные с EEPROM оттуда убраны, а добавлены файлы RTC.c
и RTC.h
. #ifndef
MAIN_H_
#define
MAIN_H_
#define
F_CPU
8000000UL
#include
#include
#include
#include
#include
#include
"usart.h"
#include
"twi.h"
#include
"RTC.h"
#endif
/* MAIN_H_ */
В главном файле MyClock1307.c
создадим глобальные переменные для хранения показаний времени, даты и дня недели и после этого полное содержание после удаления всего лишнего в нём будет вот таким #include
"main.h"
unsigned
char
sec
,
min
,
hour
,
day
,
date
,
month
,
year
;
int
main
(
void
)
I2C_Init
();
USART_Init
(8);
While
(1)
От прошлого кода останется лишь инициализация I2C и USART. Теперь нам надо как-то вообще запустить микросхему. Если микросхема новая, либо никогда не использовалась, либо кто-то специально для каких-то целей изменил значение бита CH, то она ещё не "ходит". Ну, вообще, как только мы установим все значения в регистрах микросхемы, так она и запустится и наши часы пойдут. Подключение или схема использована также вся из прошлого занятия, то есть время смотреть мы будем посредством шины USART в терминальной программе. Поэтому, собственно, используя наши знания предыдущего занятия, напишем писать функцию установки времени. Первым делом мы, само собой, передадим условие СТАРТ //Устанавливаем время
I2C_StartCondition
();
Затем передаём адрес с битом записи 0 I2C_StartCondition
();
I2C_SendByte
(0b11010000);
Перейдём на адрес 0, а значит к той части памяти, где расположен самый первый регистр I2C_SendByte
(0b11010000);
I2C_SendByte
(0);
//Переходим на 0x00
Прежде чем писать какие-то значения в регистры микросхемы, мы вспомним, что числа мы сначала должны преобразовать в двоично-десятичный формат, который будет удобен для регистров. Для этого мы зайдём в файл RTC.c и такую функцию и напишем. Она будет очень лёгкой и в объяснении не нуждается unsigned
char
RTC_ConvertFromBinDec
(
unsigned
char
c
)
{
unsigned
char
ch
=
((
c
/10)<<4)|(
c
%10);
return
ch
;
}
Ну и также давайте напишем и функцию обратного типа, переводящую число из двоично-десятичного формата в десятичный. С помощью неё мы, наоборот, будем считанные показания времени преобразовывать в вид, удобный нашему восприятию (ЧПИ — человеко-понятный интерфейс) unsigned
char
RTC_ConvertFromDec
(
unsigned
char
c
)
{
unsigned
char
ch
=
((
c
>>4)*10+(0b00001111&
c
));
return
ch
;
}
Здесь также всё придельно ясно, мы сдвигаем вправо старшую тетраду байта, умножаем её на десять и прибавляем младшую тетраду (старшую отмаскировываем нулями) Напишем прототипы данных функций в файле RTC.c
#include
"main.h"
unsigned
char
RTC_ConvertFromDec
(
unsigned
char
c
);
//перевод двоично-десятичного числа в десятичное
unsigned
char
RTC_ConvertFromBinDec
(
unsigned
char
c
);
Программатор, модуль RTC DS1307 с микросхемой памяти и переходник USB-TTL можно приобрести здесь: Программатор (продавец надёжный) USBASP USBISP 2.0
Смотреть ВИДЕОУРОК (нажмите на картинку)
Post Views:
7 354
DS1307 это небольшой модуль, предназначенный для подсчета времени. Собранный на базе микросхемы DS1307ZN с реализацией питания от литиевой батарейки (LIR2032), что позволяет работать автономно в течение длительного времени. Также на модуле, установлена энергонезависимая память EEPROM объемом 32 Кбайт (AT24C32). Микросхема AT24C32 и DS1307ZN связаны обшей шиной интерфейсом I2C. Напряжение питания: 5В Использовании модуля DS1307 зачастую очень оправдано, например, когда данные считываются редко, интервалом более недели, использовать собственные ресурсы контроллера, неоправданно или невозможно. Обеспечивание бесперебойное питание, например платы Arduino, на длительный срок дорого, даже при использовании батареи. Обмен данными с другими устройствами осуществляется по интерфейсу I2C с выводов SCL и SDA. Конденсаторы С1 и С2 необходимы для снижения помех по линию питания. Чтобы обеспечить надлежащего уровня сигналов SCL и SDA установлены резисторы R2 и R3 (подтянуты к питанию). Для проверки работоспособности модуля, на вывод 7 микросхему DS1307Z, подается сигнал SQ, прямоугольной формы с частотой 1 Гц. Элементы R4, R5, R6, VD1 необходимы для подзарядку литиевой батарейки. Так же, на плате предусмотрено посадочное место (U1), для установки датчика температуры DS18B20 (при необходимости можно впаять его), считывать показания, можно с вывода DS, который подтянут к пиатнию, через резистор R1 сопротивлением 3.3 кОм. Принципиальную схему и назначение контактов можно посмотреть на рисунках ниже. На плате расположено две группы контактов, шагом 2.54 мм, для удобного подключения к макетной плате, буду использовать штырьевые разъемы, их необходимо впаять. Первая группа контактов:
Вторая группа контактов:
Подзарядка батареи
Необходимые детали:
Подключение: Установка времени DS1307
Скачать скетч Загружаем данную скетч в контроллер Arduino (время берется с ОС), открываем «Мониторинг порта» Программа
/*
Тестирование производилось на Arduino IDE 1.6.12
Дата тестирования 23.11.2016г.
*/
#include Скачать скетч Загружаем данную код в контроллер Arduino, открываем «Мониторинг порта»
void RTC_SetValue(uint8_t adr, uint8_t data)
{
/*формируем состояние СТАРТ*/
TWCR = (1<
TWDR = (DS1307_ADR<<1)|0;
TWCR = (1<
TWDR = adr;
TWCR = (1<
if (data != RTC_RESET_POINTER){
/*это чтобы привести данные к BCD формату*/
data = ((data/10)<<4) + data%10;
TWCR = (1<
TWCR = (1<
/*формируем состояние СТАРТ*/
TWCR = (1<
/*выдаемна шину пакет SLA-R*/
TWDR = (DS1307_ADR<<1)|1;
TWCR = (1<
Когда бит TWINT снова установится в 1, в регистре данных будет байт принятый от ведомого.
/*считываем данные с подтверждением*/
TWCR = (1<
/*считываем данные без подтверждения*/
TWCR = (1<
TWCR = (1<
uint8_t RTC_GetValue(void)
{
uint8_t data;
TWCR = (1<
TWDR = (DS1307_ADR<<1)|1;
TWCR = (1<
TWCR = (1<
TWCR = (1<
}Тестовый проект для DS1307
Сегодня я хочу Вам поведать о такой интересной микросхеме как DS1307. Это чудные
часики плюс календарь и самое замечательное что к этой микрухе есть библа в CVAVR.
Да и просто она мне под руку попалась и я решил ее помучить 8)
Первым делом нам понадобится схема ее подключения. Она довольно проста и была
взята из даташита. Но тут есть небольшое исключение. В даташите требуют подключить
резистор между ножкой питания и ножкой вывода прямоугольных импульсов. Так как я
делал отдельную плату, дабы иметь возможность на ней тестировать дальнейшие
проекты, приляпал еще светодиод. Очень удобно получилось. Видно например секундные
импульсы.
Собственно схема.
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
Роман 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
Алексей 05.04.16 08:52
Михаил 09.09.16 00:18
Алексей 09.09.16 12:16
Сергей 20.11.16 12:28
Алексей 20.11.16 15:33
Вениамин 10.12.16 23:33
На такую запись компилятор может ругаться "too few arguments" так как должно передаваться 4 аргумента, первый из которых - день недели. Поэтому передавать нужно 4 числа, и забирать - тоже 4. Насколько мне известно в некоторых версиях codevision прокатывает с тремя, но я лично порядком повозился, пока выяснил почему у меня время спокойно пишется и читается, а дата - нет.Алексей 11.12.16 00:00
АНОНИМ 02.03.17 00:39
АНТОНИМ 03.04.17 15:18
Алексей 03.04.17 16:09
ИгорьКазанце 31.07.19 16:54
Алексей 01.08.19 10:50
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 вольт.
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.Часы реального времени DS1307
Технические параметры
Рабочая температура: – 40℃ … + 85℃
Память: 56 байт (энергонезависимая)
Батарейка:
LIR2032 (автоматическое определение источника питания)
Интерфейса: I2C
Габариты: 28мм х 25мм х 8 ммОбщие сведения
Благодаря собственной памяти и автономностью, можно регистрировать события, (при автономном питании) например изменение температуры и так далее, данные сохраняются в памяти их можно считать из памяти модуля. Так что модуль DS1307 часто используют, когда контроллерам Arduino необходимо знать точное время, для запуска какого то события и так далее.
DS: вывод DS18B20 (1-wire)
VCC: «+» питание модуля
GND: «-» питание модуля
SQ: вход 1 МГц
DS: вывод DS18B20 (1-wire)
SCL: линия тактирования (Serial CLock)
SDA: линия данных (Serial Dфta)
VCC: «+» питание модуля
GND:«-» питание модуля
BAT:
Как описывал ваше модуль может заряжать батарею, реализовано это, с помощью компонентов R4, R5, R6 и диода D1. Но, данная схема имеет недостаток, через резистор R4 и R6 происходит разряд батареи (как подметил пользователь ALEXEY, совсем не большой). Так как модуль потребляем незначительный ток, можно удалить цепь питания, для этого убираем R4, R5, R6 и VD1, вместо R6 поставим перемычку (после удаления компонентов, можно использовать обычную батарейку CR2032).Подключение DS1307 к Arduino
Arduino UNO R3 x 1 шт.
Провод DuPont, 2,54 мм, 20 см x 1 шт.
Кабель USB 2.0 A-B x 1 шт.
Часы реального времени RTC DS1307 x 1 шт.
Для подключения часы реального времени DS1307, необходимо впаять впаять штыревые разъемы в первую группу контактов. Далее, подключаем провода SCL (DS1307) к выводу 4 (Arduino UNO) и SDA (DS1307) к выводу 5 (Arduino UNO), осталось подключить питания VCC к +5V и GND к GND. Кстати, в различных платах Arduino вывода интерфейса I2C отличаются, назначение каждого можно посмотреть ниже.
Первым делом, необходимо скачать и установить библиотеку «DS1307RTC» и «TimeLib» в среду разработки IDE Arduino, далее необходимо настроить время, открываем пример из библиотеки DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «SetTime» или копируем код снизу.
В библиотеке есть еще один пример, открыть его можно DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «ReadTest»