Цифровые часы на микроконтроллере PIC и RTC модуле DS3231


Определение точного значения времени играет важную роль в жизни современного человечества, поэтому в современном мире получили широкое распространение часы различных форматов и назначения – начиная от простых настольных будильников и заканчивая "умными" смарт-часами. В данной статье мы рассмотрим подключение модуля часов реального времени (RTC) DS3231 к микроконтроллеру PIC. Определяемое с помощью модуля DS3231 время мы будем выводить на экран ЖК дисплея 16х2. Таким образом, наш проект может использоваться в роли цифровых часов на основе микроконтроллера PIC.

Внешний вид цифровых часов на микроконтроллере PIC и RTC модуле DS3231

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

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Модуль часов реального времени DS3231 (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. Кварцевый генератор 20 МГц (купить на AliExpress).
  5. Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
  6. Резистор 1 кОм, 5,1 кОм и 10 кОм (купить на AliExpress).
  7. Потенциометр 10 кОм (купить на AliExpress).
  8. ЖК дисплей 16х2 (купить на AliExpress).
  9. Стабилизированное напряжение питания 5V.
  10. Макетная плата.
  11. Соединительные провода.

Модуль часов реального времени DS3231

Модуль часов реального времени (Real Time Clock, RTC) позволяет хранить информацию о реальном времени и дате и делиться этой информацией с другими устройствами. Одним из самых популярных подобных модулей является DS3231. Дрейф времени в данном модуле составляет всего несколько секунд за год, поэтому его показания времени можно считать достаточно надежными. Модуль запитывается от батарейки-таблетки 3V и хранит показания времени до тех пор пока батарейка не разрядится. Внешний вид модуля DS3231 показан на следующем рисунке.

Внешний вид модуля DS3231

С другими устройствами модуль DS3231 взаимодействует по протоколу I2C, использование данного протокола в микроконтроллерах PIC мы рассматривали в этой статье. Также мы создадим библиотеку для работы с модулем DS3231 и будем подключать ее заголовочный файл ниже в программе. Саму библиотеку можно скачать ниже в статье. Поскольку для вывода информации в нашем проекте используется ЖК дисплей рекомендуем ознакомиться с его подключением к микроконтроллеру PIC.

Схема проекта

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

Схема подключения модуля часов реального времени DS3231 к микроконтроллеру PICМодуль DS3231 работает по интерфейсу I2C, поэтому его линии SCL и SDA подключены к контактам 18 (SCL) и 23 (SDA) микроконтроллера PIC. Подтягивающие резисторы 4,7 кОм используются для поддержания шины в состоянии high в то время когда она не занята (по ней не передается никакая информация). ЖК дисплей подключен к Port D микроконтроллера в 4-битном режиме.

Модуль I2C, показанный на схеме, используется только для отладки взаимодействия по интерфейсу I2C, его не следует учитывать в общей схеме соединений. RTC модуль DS3231 запитывается от +5V через свои контакты Vcc и Ground.

Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.

Внешний вид собранной на макетной плате конструкции проекта

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Также полный код программы и необходимыми библиотеками к ней в виде ZIP файла можно скачать по этой ссылке.

В программе мы используем три библиотеки, заголовочные файлы которых мы подключаем в начале программы: lcd.h для работы с ЖК дисплеем, PIC16F877a_I2C.h для работы с интерфейсом I2C и PIC16F877a_DS3231.h для взаимодействия с модулем реального времени.

Первым делом в программе настроим биты конфигурации микроконтроллера и установим для него частоту работы 20 MHz.

Далее укажем контакты микроконтроллера, к которым подключен ЖК дисплей.

При покупке модуля часов реального времени в нем, скорее всего, не будут установлены правильные дата и время, поэтому нам будет необходимо установить их в программе. Поэтому объявим в программе соответствующие переменные для их установки. Мы на момент запуска программы использовали время 10:55 и дату 6-5-2018. Вам необходимо изменить эти переменные под то время и дату, когда вы будете загружать программу в микроконтроллер.

Затем мы подключим все необходимые заголовочные файлы в программе.

ЖК дисплей подключен у нас к PORT D, поэтому контакты данного порта сконфигурируем для работы на вывод данных. Затем инициализируем ЖК дисплей.

Затем инициализируем связь по протоколу I2C поскольку наш RTC модуль работает по данному протоколу. Модуль DS3231 использует частоту шины интерфейса I2C равную 100 кГц (как и большинство других устройств, работающих по данному протоколу), поэтому мы инициализируем интерфейс I2C с частотой 100 кГц.

Далее нам необходимо установить в модуле DS3231 текущие время и дату – мы это сделаем с помощью вызова функции Set_Time_Date(). Как только время и дата будут установлены модуль будет непрерывно поддерживать их в актуальном состоянии.

Вначале работы программы мы покажем на экране ЖК дисплея 16х2 приветственное сообщение на 2 секунды.

Далее внутри бесконечного цикла мы будем считывать с RTC модуля дату и время с помощью функции Update_Current_Date_Time() и затем отображать их на экране ЖК дисплея.

Поскольку значения даты и времени представлены у нас переменными целого типа, то для отображения их на ЖК дисплея необходимо разделить их на отдельные символы.

Далее отображаем эту информацию на экране ЖК дисплея, используя для этого функции из подключенной нами библиотеки для работы с ЖК дисплеем.

Краткое объяснение заголовочного файла PIC16F877a_DS3231.h

Для того, чтобы максимально полно разобраться с тем, как работает модуль DS3231, целесообразно изучить даташит на него. Если говорить кратко, то в нашем проекте модуль DS3231 работает в качестве ведомого (slave) по отношению к микроконтроллеру PIC в протоколе I2C и адрес модуля равен D0. То есть, чтобы записать данные в модуль мы должны передать адрес D0, а чтобы считать данные с модуля – мы должны передать адрес D1. Если мы передаем адрес записи модулю DS3231, то он подготавливается к приему данных от микроконтроллера PIC, поэтому в дальнейшем данные, которые мы будем передавать с микроконтроллера, будут приниматься и сохраняться в модуле реального времени. Аналогичным образом, если мы передаем модулю адрес для считывания, то микроконтроллер PIC должен быть готов к считыванию данных от RTC модуля. Последовательности битов для адресов D0 и D1 приведены в даташите на модуль DS3231: последовательность 0b11010000 означает адрес D0 (запись), а последовательность 0b11010001 – адрес D1 (чтение).

Форматы данных для управления модулем DS3231

Когда микроконтроллер PIC передает адрес D0 или D1 (запись или чтение), по последующие данные должны считываться или записываться в определенном формате (порядке). Эта последовательность приведена на рисунке ниже. То есть первыми данными должны быть секунды (00h), затем минуты (01h) , затем часы (02h) и затем день (03h) и так далее вплоть до значений температуры.

Последовательность адресов для модуля DS3231

Модуль часов реального времени не работает с десятичными значениями, он понимает только двоично-[кодированный] десятичный код (binary-coded decimal, BCD). Поэтому прежде чем передавать какие либо данные в модуль часов реального времени их необходимо преобразовать в двоично-десятичный код, а когда мы принимаем данные от модуля их необходимо преобразовать из формата BCD в десятичный формат. Поэтому мы запрограммировали специальные функции для этих преобразований.

Функции BCD_2_DEC и DEC_2_BCD

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

Поэтому код функций BCD_2_DEC и DEC_2_BCD будет выглядеть следующим образом:

Функция Set_Time_Date()

Эта функция будет записывать данные времени и даты из микроконтроллера PIC в модуль часов реального времени. Эти данные будут задаваться с помощью соответствующих переменных sec, min, hour, date, month и year. Эти данные будут конвертироваться в формат BCD и записываться в модуль RTC.

Как мы уже обсуждали ранее, чтобы передать значение модулю RTC мы должны передать ему адрес D0 и чтобы инициировать процесс записи мы должны передать бит 0. После этого мы можем передавать данные в последовательности, приведенной в таблице на рисунке выше.

Функция Update_Current_Date_Time()

Данная функция используется для считывания данных времени и даты с модуля часов реального времени и передачи их в микроконтроллер PIC. Данная функция разделена на три фрагмента, в первом из которых инициируется процесс считывания, во втором происходит считывание данных и сохранение их в глобальные переменные sec, min, hour, date, month и year, а в третьем – передается подтверждение о том, что считывание данных было успешным.

При этом следует отметить то, что каждое действие в протоколе I2C должно начинаться и заканчиваться.

Чтобы считать данные с модуля часов реального времени мы должны передать ему адрес D0, а за ним – бит 0. После этого модуль RTC будет передавать данные в последовательности, приведенной на рисунке выше. Мы будем считывать эти данные, преобразовывать их в десятичный формат и сохранять их в соответствующие переменные в том же самом порядке.

И, наконец, после того как процесс считывания данных будет завершен, модуль RTC будет передавать бит подтверждения (acknowledgment bit), который также будет считываться и подтверждаться.

Моделирование работы проекта

Работу проекта мы смоделировали в симуляторе Proteus. Нарисуйте в нем схему, приведенную на рисунке, и загрузите в микроконтроллер PIC hex файл программы. Когда вы запустите в Proteus процесс симуляции вы увидите два всплывающих окна и выводимые на экран ЖК дисплея данные времени и даты как показано на следующем рисунке.

Моделирование работы проекта в симуляторе ProteusВ первом всплывающем окне будут выводиться данные времени и даты, а второе всплывающее окно представляет собой I2C debugger (отладчик) – отличный инструмент для мониторинга данных, передаваемых по шине I2C.

Тестирование работы проекта

После того как аппаратная часть проекта будет готова и вы скачали ZIP файл со всеми необходимыми файлами проекта, откройте программу проекта с помощью MPLABX IDE. Вам необходимо сначала запустить IDE, затем использовать опцию открытия проекта (open project), после чего открыть содержимое ZIP файла и в нем открыть каталог .X.

Проверьте успешно ли компилируется программа и затем загрузите ее в микроконтроллер с помощью программатора PicKit3. После того как программа успешно загрузится в микроконтроллер вы увидите соответствующее сообщение об этом и после этого на экране ЖК дисплея начнут показываться данные времени и даты.

Внешний вид цифровых часов на микроконтроллере PIC и RTC модуле DS3231

Если ничего не происходит, проверьте соединения в схеме, а также отрегулируйте уровень контрастности экрана ЖК дисплея с помощью потенциометра. Фактически, этот проект вы можете использовать в качестве цифровых часов на основе микроконтроллера PIC.

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы

Все файлы проекта можно скачать по этой ссылке.

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
1 316 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *