DS3231 arduino подключение. Синхронизируем время на модуле DS3231 с компьютером Описание регистров DS3231

Интернет 31.03.2024
Интернет

Отличительные особенности:

  • Точность ±2 ppm в диапазоне температур от 0°C до +40°C
  • Точность ±3.5 ppm в диапазоне температур от-40°C до +85°C
  • Вход для подключения автономного источника питания, позволяющего обеспечить непрерывную работу
  • Рабочий температурный диапазон коммерческий: от 0°C до +70°C индустриальный: -от 40°C до +85°C
  • Низкое потребление
  • Часы реального времени, отсчитывающие секунды, минуты, часы, дни недели, дни месяца, месяц и год с коррекцией високосного года вплоть до 2100
  • Два ежедневных будильника
  • Выход прямоугольного сигнала с программируемой частотой
  • Быстродействующие (400 кГц) I 2 C интерфейс
  • 3.3 В питание
  • Цифровой температурный датчик с точностью измерения ±3°C
  • Регистр, содержащий данные о необходимой подстройке
  • Вход/выход сброса nonRST

Применение:

  • Серверы
  • Электронные электросчетчики
  • Телематическая аппаратура
  • GPS системы

Типовая схема включения DS3231:

Общее описание:

DS3231 - высокоточные часы реального времени (RTC) со встроенными I 2 C интерфейсом, термокомпенсированным кварцевым генератором (TCXO) и кварцевым резонатором. Прибор имеет вход для подключения резервного автономного источника питания, позволяющего осуществлять хронометрирование и измерение температуры даже при отключенном основном напряжении питания. Встроенный кварцевый резонатор повышает срок службы прибора и уменьшает необходимое количество внешних элементов. DS3231 доступен в модификациях с коммерчески и индустриальным рабочим температурным диапазоном и упакован в 300 mil 16 контактный SO корпус.

RTC обеспечивает отсчет секунд, минут, часов, дней недели, дней месяца и года. Дата конца месяца определяется автоматически с учетом високосного года. Часы реального времени работают в 24 или 12- часовом формате с индикацией текущей половины суток (AM/PM). Прибор имеет два ежедневных будильника и выход прямоугольного сигнала с программируемой частотой. Обмен данными с прибором ведется через встроенный последовательный I 2 C совместимый интерфейс.

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

Технические характеристики устройства

Базовая информация

Большая часть микросхем, аналогичных одной из самых доступных типов модульного устройства часов реального времени DS1307, применяется схема простого кварцевого генератора. DS3231 arduino подключение , которого не представляет никакой сложности. Данная схема выполнена на двух транзисторах с рабочей частотой 32 кГц. Однако и в этих приборах имеется свое несовершенство, так при различных температурных составляющих изменяется диапазон частот у кварца. А это в свою очередь создает неточность при обработке и подсчете времени.

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

Само устройство собрано на основе чипа DS3231N. Чтобы подтянуть линии 32K, SQW, SCL и SDA была применена сборка из резисторов RP1 с номиналом 4.7 кОм. Но здесь нужно учитывать одну зависимость. При использовании некоего количества приборов с шиной обеспечивающей передачу информации через интерфейс I2C, тогда нужно убрать резисторы на остальных модулях. Другая резисторная сборка, также служащая для поддержания стабильного уровня нуля на линиях A0, A1 и A2 и для изменения памяти адреса у микросхемы AT24C32N.

Подзарядка аккумулятора

Для обеспечения подзарядки аккумулятора служит цепочка, собранная на сопротивлении R5 и выпрямительном диоде D1. Вообще то эту цепь можно убрать, поскольку дисковые литиевые элементы SR2032 могут служить много лет. Светодиод визуальной индикации, включенный через сопротивление R1 показывает, что модуль включен и готов к работе. Так как DS3231 arduino подключение выполнено по интерфейсной шине I2C, то для удобства использования электрические шины поданы на два коннектора J1 и J2. Для чего служат другие контакты — показано в таблице ниже.

Функции J1

Функции J2

Что касается электронного компонента памяти AT24C32N, то он упрятан в корпус SOIC8, работает по сдвоенному интерфейсному проводнику I2C. Фиксированный адрес чипа AT24C32N — 0x57, но в случае нужды его несложно изменить, установив перемычки A0, A1 и A2. Поскольку в приборе AT24C32N реализовано три входных адреса A0, A1 и A2, способные быть в двух положениях: LOG-1 или LOG-0. Микросхема способна работать на восемь адресов, начиная от 0x50 и заканчивая 0x57.

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

Компоненты для подключения:

Принцип подключения:

В этой иллюстрации покажу как делать DS3231 arduino подключение используя только приборы DS3231 и Arduino UNO R3, необходимая информация будет поступать на все данные будут передаваться в «Port Monitor». Сложного в схеме ничего нет, для подключения нужно две пары проводов. Первым делом подключается интерфейсный проводник I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), теперь подается напряжение питание GND к GND и VCC к 5V. Возможно подать и 3.3v, на этом подключение завершилось.

Для нормальной работы устройства DS3231 требуется библиотека, которая отсутствует в программе разработки Arduino, поэтому ее нужно скачать здесь и встроить в программу разработки. Скачать: DS1307RTC и TimeLib

Настройка и установка времени DS3231

Прежде, чем включать устройство нужно запустить процесс программирования времени, для этого необходимо взять из библиотеки DS1307RTC в качестве примера файл. Делается это так: -> «Файл» -> «Примеры» -> «DS1307RTC» -> «SetTime», либо можно взять готовый код расположенный ниже.

Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 16.01.2017г. */ #include // Подключаем библиотеку Wire #include // Подключаем библиотеку TimeLib #include // Подключаем библиотеку DS1307RTC const char *monthName = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; } } Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS3231 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { Serial.println("DS3231 Communication Error:-{"); Serial.println("Please check your circuitry"); } else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } bool getDate(const char *str) { char Month; int Day, Year; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; for (monthIndex = 0; monthIndex = 12) return false; tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; }

DS3231 arduino подключение — теперь этот код нужно загрузить в контроллер Arduino, значение времени нужно взять с операционной системы, открываем «Мониторинг порта».

Программа разработки

В данной библиотеке имеется еще дополнительный файл для примера, открывается он также просто: DS1307RTC «Файл» -> «Примеры» -> «DS3231» -> «DS3231_Serial_Hard»

/* Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 16.01.2017г. */ #include // Подключаем библиотеку Wire #include // Подключаем библиотеку TimeLib #include // Подключаем библиотеку DS1307RTC void setup() { Serial.begin(9600); // Устанавливаем скорость передачи данных while (!Serial) ; // Ожидаем подключение последовательного порта. Нужно только для Leonardo delay(200); // Ждем 200 мкс Serial.println("DS3231RTC Read Test"); // Выводим данные на последовательный порт Serial.println("-------------------"); // Выводим данные на последовательный порт } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(":"); print2digits(tm.Minute); Serial.write(":"); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write("/"); Serial.print(tm.Month); Serial.write("/"); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS3231 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS3231 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write("0"); } Serial.print(number); }

Микросхема DS3231 представляет собой высокоточные часы реального времени RTC, которая обладает встроенным кварцевым генератором с температурной компенсацией, благодаря чему уход времени составляет всего ±2 минуты за год. Дополнительно реализована функция будильника, также имеется выход прерываний. Часы можно приобрести в виде готового модуля под Arduino с элементами обвязки и отсеком для батареи.

Я заказывал модуль здесь . Схема представлена на картинке ниже:


Микросхема использует широко распространенный . Поддерживается стандартная (100 кГц) и высокая (400 кГц) скорость передачи данных. Адрес микросхемы (7 бит) на шине I2C равен 1101000. Дополнительно на модуле установлена память I2C (24C32), на схеме не изображена.

Режимы электропитания

Напряжение питания микросхемы может находиться в пределах 2,3…5,5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

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

В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 – 01 – 00/00/00 (день/месяц/год/ – день недели – час/минуты/секунды).

Ток потребления при питании от батареи напряжением 3,63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5,5В, и высокой скорости передачи данных I2C.

Функция внешнего сброса

Линия RST может использоваться для внешнего сброса, а также обладает функцией оповещения о низком уровне напряжения. Линия подтянута к высокому логическому уровню через внутренний резистор, внешняя подтяжка не требуется. Для использования функции внешнего сброса, между линией RST и общим проводом можно подключить кнопку, в микросхеме реализована защита от дребезга контактов. Функция оповещения активируется при снижении напряжения питания Vcc ниже порогового значения Vpf, при этом на линии RST устанавливается низкий логический уровень.

Описание регистров DS3231

Ниже в таблице представлен перечень регистров часов реального времени:

Адрес D7 D6 D5 D4 D3 D2 D1 D0 Функция Пределы
0x00 0 10 секунд Секунды Секунды 00-59
0x01 0 10 минут Минуты Минуты 00-59
0x02 0 12/24 AM/PM 10 часов Час Часы 1-12 + AM/PM или 00-23
10 часов
0x03 0 0 0 0 0 День День недели 1-7
0x04 0 0 10 число Число Дата 01-31
0x05 Century 0 0 10 месяц Месяц Месяцы/век 01-12 + Век
0x06 10 лет Год Годы 00-99
0x07 A1M1 10 секунд Секунды Секунды, 1-й будильник 00-59
0x08 A1M2 10 минут Минуты Минуты, 1-й будильник 00-59
0x09 A1M3 12/24 AM/PM 10 часов Час Часы, 1-й будильник 1-12 + AM/PM или 00-23
10 часов
0x0A A1M4 DY/DT 10 число День День недели, 1-й будильник 1-7
Число Дата, 1-й будильник 01-31
0x0B A2M2 10 минут Минуты Минуты, 2-й будильник 00-59
0x0C A2M3 12/24 AM/PM 10 часов Час Часы, 2-й будильник 1-12 + AM/PM или 00-23
10 часов
0x0D A2M4 DY/DT 10 число День День недели, 2-й будильник 1-7
Число Дата, 2-й будильник 01-31
0x0E EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE Регистр настроек (Control)
0x0F OSF 0 0 0 EN32kHz BSY A2F A1F Регистр статуса (Status)
0x10 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр подстройки частоты (Aging Offset)
0x11 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр температуры, старший байт
0x12 DATA DATA 0 0 0 0 0 0 Регистр температуры, младший байт

Информация о времени хранится в двоично-десятичном формате, то есть каждый разряд десятичного числа (от 0 до 9) представляется группой из 4-х бит. В случае одного байта, младший полубайт отсчитывает единицы, старший десятки и т. д. Счет времени осуществляется в регистрах с адресами 0x00-0x06, для отсчета часов можно выбрать режим 12-ти или 24-х часов. Установка 6-го бита регистра часов (адрес 0x02), задает 12-ти часовой режим, в котором 5-й бит указывает на время суток, значению 1 соответствует время после полудня (PM), значению 0 до полудня (AM). Нулевое значение 6-го бита соответствует 24-х часовому режиму, здесь 5-й бит участвует в счете часов (значения 20-23).

Регистр дня недели инкрементируется в полночь, счет идет от 1 до 7, регистр месяцев (адрес 0x05) содержит бит века Century (7-й бит), который переключается при переполнении регистра счета лет (адрес 0x06), от 99 к 00.

В микросхеме DS3231 реализовано два будильника, 1-й будильник настраивается с помощью регистров с адресами 0x07-0x0A, 2-й будильник регистрами 0x0B-0x0D. Битами A1Mx и A2Mx можно настроить различные режимы для будильников, установка бита исключает соответствующий регистр из операции сравнения. Ниже в таблицах приведены комбинации битов для разных режимов будильника:

Комбинации битов не указанные в таблицах, приводят к некорректному функционированию будильников. Если бит DY/DT сброшен, то для будильника отслеживается совпадение даты (день месяца), при установке бита DY/DT, проверяется совпадение дня недели.

Большинство функций настраиваются в регистре Control. Бит EOSC управляет запуском тактового генератора, сброс бита запускает генератор. Установка бита останавливает генератор, только для режима питания от батареи (Vbat). При питании от внешнего источника (Vcc), генератор всегда запущен независимо от состояния бита EOSC. После включения, значение бита по умолчанию равно 0.

Установка бита BBSQW разрешает функционирование выхода INT/SQW (3-й вывод) в режиме питания от батареи, при отсутствии внешнего питания. При нулевом значении бита, выход INT/SQW переходит в 3-е состояние (деактивируется), если напряжение внешнего источника Vcc падает ниже порогового значения Vpf. После подачи питания, значение бита по умолчанию равно 0.

Бит CONV отвечает за принудительное измерение температуры, установка бита запускает процесс преобразования, во время которого также выполняется корректировка частоты тактового генератора, результат измерения находится в регистрах с адресами 0x11, 0x12. Запуск возможен только в случае окончания предыдущего преобразования, перед запуском необходимо проверить флаг занятости BSY. Принудительное преобразование температуры не влияет на внутренний 64-х секундный цикл корректировки частоты. Установка бита CONV не влияет на флаг BSY в течение 2 мс. Биты CONV и BSY сбрасываются автоматически после завершения преобразования.

Биты RS2, RS1 устанавливают частоту прямоугольных импульсов (меандр) на выходе INT/SQW. По умолчанию, при включении биты устанавливаются в 1. Ниже в таблице представлены возможные комбинации битов:

Бит INTCN управляет выходом INT/SQW. Если бит сброшен, на выходе появляются прямоугольные импульсы (меандр), частота которых задается битами RS2, RS1. При установке бита INTCN, выход используется для генерации прерываний по сигналу будильника. По умолчанию, значение бита равно 1. Тип выхода INT/SQW – открытый сток, соответственно необходима подтяжка через резистор к высокому логическому уровню, активный уровень – низкий.

Установка битов A1IE, A2IE разрешает прерывания по сигналу 1-го и 2-го будильника соответственно. Сброс битов, запрещает прерывания. По умолчанию значение равно 0.

Регистр Status содержит флаги событий, и управляет выходом 32 kHz. Флаг OSF отражает состояние тактового генератора, значение 1, означает, что генератор остановлен, это событие может произойти в следующих случаях:

  • В первое время после подачи питания
  • Напряжение батареи или внешнего источника недостаточно для работы тактового генератора
  • Генератор выключен установкой бита EOSC в режиме питания от батареи
  • Внешние факторы, влияющие на кварцевый генератор (шум, утечка и т.д.)

После установки значение бита не меняется, необходимо сбросить бит вручную.

Установка бита EN32kHz разрешает генерирование прямоугольных импульсов (меандр) на выходе 32kHz (1-й вывод), частота импульсов фиксирована и равна 32,768 кГц. Сброс бита отключает данную функцию и переводит выход в 3-е состояние (с высоким входным сопротивлением). По умолчанию значение бита равно 1, после подачи питания на выходе появляются импульсы. Тип выхода 32kHz открытый сток, поэтому требуется подтяжка к высокому логическому уровню.

Флаг занятости BSY устанавливается во время процесса преобразования температуры и корректировки частоты тактового генератора. Флаг сбрасывается после завершения преобразования.

Флаги будильников A1F, A2F устанавливаются при совпадении значений регистров счета времени и регистров будильника. Если разрешены прерывания по сигналу будильников A1IE, A2IE, а также назначен выход прерывания (установлен бит INTCN), то на выходе INT/SQW появляется сигнал прерывания (переход от высокого к низкому логическому уровню). Флаги необходимо сбросить вручную, записав значение 0.

Регистр Aging Offset предназначен для подстройки частоты тактового генератора. Значение регистра добавляется к частоте генератора во время выполнения внутренней процедуры корректировки, если зафиксировано изменение температуры, а также при запуске преобразования температуры битом CONV. Величина смещения знаковая, то есть положительные значения (1-127) уменьшают частоту, отрицательные (128-255) увеличивают. Для одинакового смещения, изменение частоты будет различным в зависимости от температуры. При температуре +25°C, изменение частоты составит 0,1 ppm/LSB.

Текущее значение температуры хранится в регистрах с адресами 0x11 и 0x12, старший и младший байт соответственно, значение температуры в регистрах периодически обновляется. Установлено левое выравнивание, разрешение составляет 10 бит или 0,25°C/LSB, то есть в старшем байте находится целая часть температуры, а 6, 7-й биты в младшем регистры составляют дробную часть. В старшем байте 7-й бит указывает знак температуры, например, значению 00011011 01 соответствует температура +27,25 °C, значению 11111110 10 температура -2,5 °C.

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

Подключение DS3231 к микроконтроллеру

Я подключил часы к микроконтроллеру PIC16F628A, для отображения времени использовал . Схема подключения представлена ниже:


После подачи питания на индикаторах высвечиваются знаки тире (– – – – – –), далее выполняется инициализация часов, значение времени появляется на индикаторах с задержкой в 1 секунду, которая требуется для запуска тактового генератора часов. На индикаторы выводится значение часов, минут и секунд, разделенных десятичной точкой, формат времени 24-х часовой. Кнопкой SB1 “Индикация” можно сменить формат отображения, где на индикаторы будет выводиться температура, а также значение часов и минут, разделенных десятичной точкой, которая мигает с частотой 2 Гц. Температура отображается без дробной части, в программе считывается только старший байт хранения температуры по адресу 0x11.

Значение времени считывается из часов по прерыванию на линии SQW/INT, которая управляется сигналом 1-го будильника, в процессе инициализации часов будильник настраивается на ежесекундный сигнал. Светодиод HL1 служит в качестве индикатора и вспыхивает по сигналу прерывания каждую секунду. Светодиод HL2 загорается в случае ошибки передачи данных по интерфейсу I2C.

Дополнительно добавил в программу возможность настройки часов кнопками SB2 “Настройка”, SB3 “Установка”. Вход в режим настройки производится нажатием кнопки SB2, на индикаторах высвечивается 00 часов, и знаки тире вместо минут и секунд (00 – – – –). Кнопкой SB3 задается значение часов (инкремент при каждом нажатии), далее нажатием кнопки SB2 осуществляется переход на редактирование минут, вместо тире высветится 00 минут. Кнопкой SB3 также задается необходимое значение и так далее. После редактирования секунд и нажатия кнопки SB2, время в часах перезаписывается, на индикаторах отображается обновленное время.

Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include LIST p=16F628A __CONFIG H"3F10" ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге Sec equ 0020h ;вспомогательные регистры счета Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c temp equ 0026h ;регистр температуры perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр. result equ 0028h ;вспомогательный регистр двоично-десятичного преобр. dat_ind equ 0029h ;регистр данных для передачи по протоколу spi adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi second equ 002Bh ;регистр хранения секунд для установки времени minut equ 002Ch ;регистр хранения минут для установки времени hour equ 002Dh ;регистр хранения часов для установки времени adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;регистр флагов #DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231 #DEFINE sda PORTB,1 ;линия SDA для подключения DS3231 #DEFINE scl PORTB,2 ;линия SCL для подключения DS3231 #DEFINE sda_io TRISB,1 ;направление линии SDA #DEFINE scl_io TRISB,2 ;направление линии SCL #DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219 #DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219 #DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219 #DEFINE led PORTB,4 ;светодиод ошибки i2c #DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц #DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации #DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени #DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b"00000000" ;установка значений выходных защелок порта A movwf PORTA ; movlw b"01000000" ;установка значений выходных защелок порта B movwf PORTB ; movlw b"00000111" ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b"00000111" ;настройка линий ввода\вывода порта B movwf TRISB ;RB0-RB2 - на вход, остальные на выход movlw b"11111111" ;настройка линий ввода\вывода порта A movwf TRISA ;все линии на вход bcf STATUS,RP0 ;выбрать 0-й банк clrf flag ;сброс регистра флагов call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219) call viv_not ;вывод на индикаторы символов тире " ------ " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b"11010000" ;адрес устройства (DS3231) movwf slave_adr ;Запись 4-х байт в регистры приема/передачи по i2c ;здесь выполняется настройка 1-го будильника, сигнал каждую секунду movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"10000000" ;данные для регистра секунд 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра минут 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра часов 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника movwf INDF ; movlw .4 ;передача 4-х байта по i2c movwf tmp_i2c ; movlw 0x07 ;установка адреса регистра секунд 1-го будильника movwf adr_i2c ; call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0E ;установка адреса регистра Control movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000101" ;запуск тактового генератора, запрет функционирования вывода INT/SQW для movwf INDF ;режима питания от батареи, частота импульсов на выходе INT/SQW 1Гц, ;выход INT/SQW задействован для генерации прерываний по будильнику, ;разрешение прерываний по 1-му будильнику call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_2 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0F ;установка адреса регистра Status movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000000" ;сброс бита OSF, запрет генерирования импульсов на выходе EN32kHz, movwf INDF ;сброс флагов прерываний будильников A2F, A1F call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_1 btfsc int ;опрос линии прерывания будильника goto met_3 ; bsf led_sec ;включение светодиода индикации хода часов goto met_4 ; met_3 bcf led_sec ;выключение светодиода индикации хода часов btfsc nast ;опрос кнопки настройки часов goto met_5 ; call nast_time ;вызов подпрограммы установки времени goto met_2 ; met_5 btfsc regim ;опрос кнопки режима индикации goto met_1 ; met_6 call paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;изменение значения флага режима индикации goto met_7 ; bcf flag,2 ;сброс флага индикации, режим отображения часов goto met_1 ; met_7 bsf flag,2 ;установка флага индикации, режим отображения температуры и часов goto met_1 ; met_4 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x11 ;установка адреса старшего регистра температуры movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C movf INDF,W ;копирование значения температуры в регистр temp movwf temp rd_time movlw .3 ;передача 3-х байт по i2c movwf tmp_i2c ; movlw 0x00 ;установка адреса регистра секунд movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C btfsc flag,2 ;опрос флага режима индикации goto met_8 ; call vivod ;вызов подпрограммы вывода значения часов на цифровое табло goto met_2 ; met_8 call vivod_temp ;вызов подпрограммы вывода температуры и часов на цифровое табло goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#include

CONFIG H"3F10" ;Конфигурация микроконтроллера

errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге

Sec equ 0020h ;вспомогательные регистры счета

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит

perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c

temp equ 0026h ;регистр температуры

perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр.

result equ 0028h ;вспомогательный регистр двоично-десятичного преобр.

dat_ind equ 0029h ;регистр данных для передачи по протоколу spi

adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi

second equ 002Bh ;регистр хранения секунд для установки времени

minut equ 002Ch ;регистр хранения минут для установки времени

hour equ 002Dh ;регистр хранения часов для установки времени

adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh ;регистр флагов

#DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231

#DEFINE sda PORTB,1 ;линия SDA для подключения DS3231

#DEFINE scl PORTB,2 ;линия SCL для подключения DS3231

#DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219

#DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219

#DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219

#DEFINE led PORTB,4 ;светодиод ошибки i2c

#DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц

#DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации

#DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени

#DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start movlw b"00000000" ;установка значений выходных защелок порта A

movlw b"01000000" ;установка значений выходных защелок порта B

movlw b"00000111" ;выключение компараторов

bsf STATUS,RP0 ;выбрать 1-й банк

movlw b"00000111" ;настройка линий ввода\вывода порта B

movwf TRISB ;RB0-RB2 - на вход, остальные на выход

movlw b"11111111" ;настройка линий ввода\вывода порта A

movwf TRISA ;все линии на вход

bcf STATUS,RP0 ;выбрать 0-й банк

clrf flag ;сброс регистра флагов

call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219)

call viv_not ;вывод на индикаторы символов тире " ------ "

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000" ;адрес устройства (DS3231)

;Запись 4-х байт в регистры приема/передачи по i2c

movlw data_i2c ;установка первого регистра приема/передачи по i2c

movlw b"10000000" ;данные для регистра секунд 1-го будильника

movlw b"10000000" ;данные для регистра минут 1-го будильника

movlw b"10000000" ;данные для регистра часов 1-го будильника

movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника

movlw .4 ;передача 4-х байта по i2c

movlw 0x07 ;установка адреса регистра секунд 1-го будильника

Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

Технические параметры

Напряжение питания: 3.3В и 5В
Чип памяти: AT24C32 (32 Кб)
Точность: ± 0.432 сек в день
Частота кварца:32.768 кГц
Поддерживаемый протокол: I2C
Габариты: 38мм x 22мм x 15мм

Общие сведения

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.


Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.Назначение J1
32K: выход, частота 32 кГц
SQW: выход
SDA: линия данных (Serial Dфta)
VCC: «+» питание модуля
GND: «-» питание модуля Назначение J2
SCL: линия тактирования (Serial CLock)
SDA: линия данных (Serial Data)
VCC: «+» питание модуля
GND: «-» питание модуля


Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.

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

Необходимые детали:
Arduino UNO R3 x 1 шт.
Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
Кабель USB 2.0 A-B x 1 шт.

Подключение:
В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» -> «Примеры» -> «DS3231» -> «Arduino» -> «DS3231_Serial_Easy», или скопируйте код снизу

/* Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 31.08.2018г. */ #include // Подключаем библиотеку Wire DS3231 rtc(SDA, SCL); // Инициализация DS3231 void setup() { Serial.begin(115200); // Установка последовательного соединения rtc.begin(); // Инициализировать rtc // Установка времени rtc.setDOW(FRIDAY); // Установить день-недели rtc.setTime(16, 29, 0); // Установить время 16:29:00 (формат 24 часа) rtc.setDate(31, 8, 2018); // Установить дату 31 августа 2018 года } void loop() { Serial.print(rtc.getDOWStr()); // Отправляем день-неделя Serial.print(" "); Serial.print(rtc.getDateStr()); // Отправляем дату Serial.print(" -- "); Serial.println(rtc.getTimeStr()); // Отправляем время delay (1000); // Задержка в одну секунду }

Тестирование производилось на Arduino IDE 1.8.0

Дата тестирования 31.08.2018г.

#include // Подключаем библиотеку Wire

DS3231 rtc (SDA , SCL ) ; // Инициализация DS3231

void setup ()

Serial . begin (115200 ) ; // Установка последовательного соединения

rtc . begin () ; // Инициализировать rtc

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

rtc . setDOW (FRIDAY ) ; // Установить день-недели

rtc . setTime (16 , 29 , 0 ) ; // Установить время 16:29:00 (формат 24 часа)

void loop ()

Serial . print (rtc . getDOWStr () ) ; // Отправляем день-неделя

Serial . print (" " ) ;

Serial . print (rtc . getDateStr () ) ; // Отправляем дату

Serial . print (" -- " ) ;

Serial . println (rtc . getTimeStr () ) ; // Отправляем время

delay (1000 ) ; // Задержка в одну секунду

Загружаем скетч в контроллер Arduino и открываем «Мониторинг порта»

Многие устройства требуют постоянного учёта хронометрических данных (дата, время), эту функцию выполняют специальные электронные схемы, которые называются часами реального времени. Часы реального времени, в нынешнее время, реализованы в виде отдельной микросхемы, к которой нужно добавить кварцевый резонатор и автономный источник питания. В некоторых микросхемах, кварцевый резонатор встроен внутри. Одни из таких часов на микросхеме DS3231SN я купил для своих проектов . В примере буду подключать часы реального времени к китайскому аналогу Arduino UNO.

Представляют из себя законченный модуль ZS-042, который можно подключать к различным устройствам, не только к платформе Arduino.


Модуль построен на микросхеме DS3231SN , которая по сути и является часами реального времени. В отличии от старой модели часов, например на микросхеме DS1307, эти часы содержат внутренний кварцевый резонатор, благодаря чему часы имеют точный ход.

Реализовать часы на Arduino можно и без DS3231SN , но тогда при пропадании питания, значения таймера сбрасываются. Эти же часы имеют резервное питание, поэтому при пропадании питания, они продолжают дальше работать.

Часы умеют производить подсчёт часов, минут, секунд, дат, месяцев, лет (високосные года учитываются до 2100 года). Работают в 12 или 24 часовом режиме, содержат два будильника, а так же имеют внутренний термометр, с диапазоном от -40 ° C до + 85 ° C. Для подключения к различным устройствам, часы подключаются по I2C интерфейсу.


Расположение и назначение пинов на модуле ZS-042:

SQW - Программируемый выход Square-Wave сигнала.

SCL Через этот пин по интерфейсу I2C происходит обмен данными с часами.

SDA Через этот пин передаются данные с часов.

VCC Питание часов реального времени, нужно 5 вольт. Если на этот пин не поступает напряжение, часы переходят в спящий режим.

GND - Земля.

Для подключения к Arduino UNO, пин SDA часов подключаем к пину A4, а пин SCL к A5. Для питания используются пины GND(-) и VCC(+5v).

Пины SDA и SCL на разных платах Arduino:

SDA SCL
UNO A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Установим батарейку CR2032 в часы, такие элементы используются для питания BIOS в компьютерах.

При подключении USB кабеля к Arduino, на часах должен загореться светодиод «POWER » (красный светодиод).

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

Скачать библиотеку Time и DS1307RTC .

Последняя библиотека была написана для часов на микросхеме DS1307, но её протоколы взаимодействия совместимы с DS3231, поэтому библиотека подойдёт к нашим часам.

Библиотеки нужно скачать, распаковать и поместить в папку « libraries ». При запуске Arduino IDE, они с примерами должны появится в «Образцах ».

Устанавливаем Дату и время.

Для этого скопируем данный код в Arduino IDE.

Для корректной настройки нужно изменить данные в строке

setTime(13,35,0,22,12,2016);



В скобках через запятую устанавливаем правильные: часы, минуты, секунды, число, месяц, год. У меня в примере установлено 13 часов 35 минут 0 секунд, 22 декабря 2016 год. Вгружаем скетч в Arduino.

Теперь для того что бы прочитат ь показания из часов, можно воспользоваться примером: «Файл » - «Образцы » - «DS1307RTC » - «ReadTest » и за грузить его в Arduino.

В открывшемся окне будет отображаться текущие дата и время. Если отключить питание модуля часов от Arduino, Arduino не сможет отслеживать значения и в мониторе через какое то время появится надпись "...read error! " (выделил красным). После возобновления питания, показания даты и времени будут отсчитываться далее. Показания даты и времени не сбросились, поскольку часы питались от своей батарейки CR2032.

Рекомендуем почитать

Наверх