код для общения ds1307
Урок 11. Работаем с DS1307 микросхемой часов реального времени
В этом уроке я расскажу про работу с микросхемой реального времени DS1307 в BASCOM-AVR. DS1307 ещё называют RTC (Real Time Clock). Данная микросхема представляет из себя часы реального времени и календарь. Связь с микросхемой осуществляется по интерфейсу I 2 C. Её преимущество в том, что она работает (считает время) при выключенном основном питании от резервного источника питания в 3 вольта (например, от батареики типа CR3022). Но в DS1307 есть один недостаток: в ней нет проверки на правильность введённых данных. Для работы с микросхемой потребуется минимальный обвес: кварц на 32768Hz, батарея на 3 вольта и два резистора на 4,7кОм. Схема подключения DS1307:
Работа с DS1307 в BASCOM-AVR
Для начала работы с микросхемой необходимо сконфигурировать порты, к которым подключена микросхема, для этого воспользуемся командой Config:
Config Sda = (Порт микроконтроллера к которому подключена нога SDA микросхемы DS1307)
Config Scl = (Порт микроконтроллера к которому подключена нога SCL микросхемы DS1307)
Например:
Config Sda = Portb.1
Config Scl = Portb.0
После конфигурации портов можно начать работать с микросхемой: считывать и записывать данные. Время и дату с микросхемы DS1307 можно считать так:
После чтения данных необходимо перевести их в десятичный формат, вот так:
(переменная секунд) = Makedec((переменная секунд))
(переменная минут) = Makedec((переменная минут))
(переменная часов) = Makedec((переменная часов))
(переменная дня недели) = Makedec((переменная дня недели))
(переменная даты) = Makedec((переменная даты))
(переменная месяца) = Makedec((переменная месяца))
(переменная года) = Makedec((переменная года))
Вот пример чтения времени и даты, а также перевод их в десятичный формат:
Данные считывать научились, теперь попробуем записывать данные в DS1307. Вот так:
(Переменная которую запишем) = Makebcd((Переменная которую запишем))
I2cstart
I2cwbyte &HD0
I2cwbyte (Ячейка в которую запишем данные)
I2cwbyte (Переменная которую запишем)
I2cstop
Обратите внимание, что команда Makebcd переводит переменную в двоично-десятичный формат. Номера и обозначения ячеек:
AVR Урок 17. Часы реального времени DS1307. Часть 1
Урок 17
Часы реального времени DS1307
Продолжаем занятия по программированию МК 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.
Содержание файла main.h у нас теперь вот такое
#define F_CPU 8000000UL
#include «RTC.h»
В главном файле MyClock1307.c создадим глобальные переменные для хранения показаний времени, даты и дня недели и после этого полное содержание после удаления всего лишнего в нём будет вот таким
От прошлого кода останется лишь инициализация I2C и USART.
Теперь нам надо как-то вообще запустить микросхему. Если микросхема новая, либо никогда не использовалась, либо кто-то специально для каких-то целей изменил значение бита CH, то она ещё не «ходит».
Ну, вообще, как только мы установим все значения в регистрах микросхемы, так она и запустится и наши часы пойдут.
Подключение или схема использована также вся из прошлого занятия, то есть время смотреть мы будем посредством шины USART в терминальной программе.
Поэтому, собственно, используя наши знания предыдущего занятия, напишем писать функцию установки времени.
Первым делом мы, само собой, передадим условие СТАРТ
I2C_StartCondition ();
Затем передаём адрес с битом записи 0
I2C_SendByte (0b11010000);
Перейдём на адрес 0, а значит к той части памяти, где расположен самый первый регистр
I2C_SendByte (0); //Переходим на 0x00
Прежде чем писать какие-то значения в регистры микросхемы, мы вспомним, что числа мы сначала должны преобразовать в двоично-десятичный формат, который будет удобен для регистров. Для этого мы зайдём в файл RTC.c и такую функцию и напишем. Она будет очень лёгкой и в объяснении не нуждается
unsigned char RTC_ConvertFromBinDec ( unsigned char c )
unsigned char ch = (( c /10) c %10);
return ch ;
Ну и также давайте напишем и функцию обратного типа, переводящую число из двоично-десятичного формата в десятичный. С помощью неё мы, наоборот, будем считанные показания времени преобразовывать в вид, удобный нашему восприятию (ЧПИ – человеко-понятный интерфейс)
unsigned char RTC_ConvertFromDec ( unsigned char c )
unsigned char ch = (( c >>4)*10+(0b00001111& c ));
return ch ;
Здесь также всё придельно ясно, мы сдвигаем вправо старшую тетраду байта, умножаем её на десять и прибавляем младшую тетраду (старшую отмаскировываем нулями)
Напишем прототипы данных функций в файле RTC.c
unsigned char RTC_ConvertFromDec ( unsigned char c ); //перевод двоично-десятичного числа в десятичное
unsigned char RTC_ConvertFromBinDec ( unsigned char c ); //перевод десятичного числа в двоично-десятичное
Соберём код, а прошивать контроллер пока не будем. Нам нужно ещё дописать код записи в регистры и написать в бесконечный цикл процедуру чтения времени и даты и отправку всего этого в USART, а затем уж прошьём полностью весь код, прописав правильные значения времени и даты в установку времени.
Программатор, модуль RTC DS1307 с микросхемой памяти и переходник USB-TTL можно приобрести здесь:
Смотреть ВИДЕОУРОК (нажмите на картинку)
Подключение DS1307 к микроконтроллерам AVR
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 В.
Для работы с DS1307 необходимо организовать функцию чтения из микросхемы и функцию записи.
1. Режим записи в DS1307. Последовательные данные и такты получены через SDA и SCL. После передачи каждого байта передаётся подтверждающий бит ASK. Состояния START и STOP опознаются как начало и конец последовательной передачи. Распознавание адреса выполняется аппаратно после приема адреса ведомого и бита направления. Байт адреса содержит семибитный адрес DS1307, равный 1101000, сопровождаемым битом направления (R/W), который при записи равен 0. После получения и расшифровки байта адреса DS1307 выдаёт подтверждение ASK на линии SDA. После того, как DS1307 подтверждает адрес ведомого и бит записи, ведущий передает адрес регистра DS1307. Тем самым будет установлен указатель регистра в DS1307. Тогда ведущий начнет передавать байты данных в DS1307, который будет подтверждать каждый полученный байт. По окончании записи ведущий сформирует состояние STOP.
Рассмотрим особенности работы с DS1307 на примере простых часов, которые будут показывать часы, минуты и секунды. Данные будут выводиться на LCD дисплей 16х2. Две кнопки «Часы+» и «Минуты+» позволят подвести нужное время. Микроконтроллер Atmega 8 тактируется от внутреннего генератора частотой 1 MHz, поэтому не забудьте поменять фьюзы. Ниже представлена схема подключения.
Управляющая программа включает в себя наборы функций работы с шиной TWI, часами DS1307, LCD дисплеем.
Ниже представлен код программы:
Установка fuse-битов микроконтроллера
DS1307
200 мА*ч) несколько лет. Также DS1307 может генерировать на одном из выводов меандр и в ее составе есть 56 байт оперативной памяти, которую можно использовать для хранения данных.
Минимальная схема подключения DS1307 включает в себя часовой кварц и один источник питания. Обмен данными с микросхемой осуществляется по I2C, причем DS1307 может работать на шине только как подчиненное устройство (слейвом).
С чего начать?
Подключение любой микросхемы начинается с изучения даташита. В случае DS1307 нам нужно выяснить: какую скорость обмена поддерживает микросхема, какой она имеет адрес, как выглядит карта памяти, есть ли у нее управляющие биты или регистры, как передать данные и как прочитать их. Ниже приведены скриншоты из даташита, в которых я нашел требуемую информацию.
Скорость обмена DS1307
Адрес, по которому DS1307 отзывается на I2C шине
Карта памяти DS1307
Карта памяти показывает, по каким адресам расположены регистры микросхемы и сколько их вообще.
Это так называемый двоично-десятичный формат представления чисел (BCD).При таком формате один байт может представить числа только от 0 до 99. Остальные регистры часов и календаря содержат данные в таком же формате.
По первому адресу расположен регистр минут. С ним все понятно.
Далее идут регистры календаря.
По седьмому адресу располагается регистр, управляющий выводом SQW. На него можно выводить внутренний тактовый сигнал разной частоты. Значения битов описаны в даташите. Нас они сейчас не интересуют.
Ну и адреса с 8 по 63-й отведены для оперативной памяти. Их можно использовать для хранения данных.
Как записать данные в DS1307
Для каждого режима в даташите есть описание и диаграмма обмена. Запись данных выполняется согласно следующей последовательности.
Как прочитать данные из DS1307
Поскольку чтение данных выполняется по адресу внутреннего счетчика, его значение нужно предварительно инициализировать. Это делается с помощью операции записи, которая обрывается после передачи адреса регистра.
Теперь можно перейти к коду. Нам понадобится минимум три функции:
— функция инициализации,
— функция записи данных,
— функция чтения данных.
Инициализация
Скорость задается с помощью макроса TWBR_VALUE. Здесь используется формула, разобранная в предыдущей части. При компиляции расчетное значение проверяется с помощью директив препроцессора, чтобы убедиться, что оно не выходит за диапазон.
Передача данных
Передача данных начинается с состояния СТАРТ. Чтобы сформировать его, нужно включить TWI модуль, установить бит TWSTA и сбросить флаг прерывания TWINT. Это выполняется в одну строчку, записью в управляющий регистр TWCR.
Каждая установка бита TWINT сопровождается определенным статусным кодом в регистре TWSR. По хорошему, мы должны проверять эти коды, чтобы контролировать успешность операций. Но поскольку код у нас торный (учебный), мы не будем этого делать.
Далее на шину нужно выдать адресный пакет. В регистр данных TWDR загружаем адрес, а бит квитирования устанавливаем нулевым. После загрузки адреса сбрасываем бит TWINT, инициируя дальнейшую работу TWI модуля, и дожидаемся, когда она завершится, опрашивая TWINT.
Посылаем на шину адрес, с которого будет производиться запись в DS1307. Для этого загружаем в регистр данных требуемое значение, сбрасываем бит TWINT и дожидаемся его установки.
Далее можно гнать остальные данные таким же методом, а когда надоест выдать на шину состояние СТОП.
Полный код функции записи будет выглядеть примерно так.
С помощью этой функции можно производить запись отдельных регистров и инициализировать внутренний регистр адреса DS1307 для последующей операции чтения данных. Пример использования функции есть в тестовых проектах.
Чтение данных из DS1307
Формируем состояние СТАРТ.
Получаем данные. Сбрасываем бит TWINT, инициирую работу TWI модуля. Бит TWEA должен быть установлен в 1, чтобы ведущее устройство сигнализировало ведомому о приеме очередного байта.
Когда бит TWINT снова установится в 1, в регистре данных будет байт принятый от ведомого.
Далее можно продолжать чтение или принять данные без подтверждения и выдать состояние СТОП.
Полный код функции чтения одного байта данный из DS1307 будет выглядеть примерно так.
Тестовый проект для DS1307
Как обычно тестовый проект, объединяющий все выше сказанное. Программа простая. Инициализируем периферию, загружаем в DS1307 начальное значение. Далее в цикле считываем временя и выводим на LCD. Для общения с DS1307 используются всего три функции.
Остальные проекты выложу позже.
В следующих частях будет разбор работы со статусными кодами, а далее работа с TWI модулем через прерывания.
Прикладное программирование с нуля.
AVR, STM, Android, IoT. Встраиваемые системы.
Шаг №29. Подключаем часы реального времени DS1307 к AVR
Обновлено 23.07.2018. Всем привет. Для работы с часами, в прошлой статье был рассмотрен интерфейс TWI, на который мы сегодня будем ссылаться. Ну что ж начнем. Данные часы являются TWI совместимыми, т.е. принцип обмена данными по шине будет таким же как мы и рассматривали.
Как видно из описания имеется вход для аварийного питания от батареи, при отключенном внешнем питание. В этом режиме RTC поддерживает только свое основное назначение – отсчет времени, без внешних запросов. Напряжение питания батареи должно быть 2 – 3.5V. В техническом описание пишется что при заряде более 48 мА/ч, при температуре 25 град Цельсия, наша схема продержится около 10 лет. Более чем надо. На рисунке ниже представлена “таблеточка” CR2032 и крепление, которые будем использовать.
1. Vcc=5В – чтение, запись, отсчет;
3. Vcc ниже Vbat: RTC и ОЗУ переходит на питание от батареи. Потребление в активном состоянии 1,5 мА, от батареи 500-800нА.
Напряжение для передачи/приема информации:
Логическая 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, с которыми мы познакомились в прошлой статье.
Немного остановимся на резонаторе (рисунок ниже). Который можно назвать сердцем часов, и от которого зависит точность хода. Качество самого резонатора, лежит на совести производителя, но со своей стороны, мы можем уменьшить погрешность, которую вносят внешние факторы, если будем придерживаться следующих рекомендаций по размещению резонатора:
1. Чем ближе резонатор к контактам Х1 Х2 тем меньше вероятность возникновения помех и уменьшение паразитной емкости.
2. Ширину трассы также по возможности делать меньше, для уменьшения вероятности принятия помех с других источников.
3. Контур в виде защитного кольца необходимо поместить вокруг кристалла, что помогает изолировать кристалл от шума.
4. Проводники поместить в кольцо и и подключить к заземлению.
5. Припаиваем резонатор к земле. Если земля разведена верно и есть уверенность.
На рисунке ниже видно контур и место припая к земле.
Как подключать разобрались. Идем далее – разберемся как с ним работать. RTC является программируемым и имеет 8 байт специальных регистров для его конфигурации и энергонезависимую статическую память 56 байтов. Для обмена информации необходима 2-х проводная шина данных, т.е. последовательная шина данных- интерфейс TWI, который мы рассмотрели в прошлой статье. Итак для работы пробежимся по даташиту. Что нам необходимо:
Таблица регистров. Рисунок ниже. Первые восемь регистров – для вывода и программирования наших часов. При обращении по адресу 00H к 7-му биту(CH) и установкой его в 0 –запускаем часы. Хочется отметить, что конфигурация регистров может быть любая, поэтому при первом запуске необходимо его настроить под свои требования. Остальные семь битов единицы и десятки секунд.