- Необходимые материалы:
- Модуль RTC:
- Подключение DS3231 RTC к микроконтроллеру PIC:
- Программирование PIC для модуля RTC:
- Краткое описание заголовочного файла PIC16F877a_DS3231.h:
- Моделирование:
- Отображение времени и даты на ЖК-дисплее:
Почти все встроенные устройства предназначены для взаимодействия с реальным миром. Они действуют как мост для связи между цифровым миром и реальным миром. Чтобы сделать этот процесс более простым и эффективным, в цифровом мире иногда необходимо отслеживать время и дату реального мира. Таким образом, цифровой мир будет знать, какое время / день сейчас в реальном мире, и даже сможет различать день и ночь. Он также может выступать в качестве источника времени для выполнения определенных задач в указанное время или дату. Итак, здесь мы соединяем модуль RTC с микроконтроллером PIC и отображаем время и дату на ЖК-дисплее 16x2. Этот проект также можно использовать в качестве цифровых часов.
Необходимые материалы:
- Регулируемое питание 5 В
- PIC16F877A
- Кристаллический осциллятор 20 МГц
- Конденсатор 33пФ - 2шт.
- Резистор 10 кОм, 5,1 кОм, 1 кОм
- Модуль DS3231 RTC
- POT -10k
- ЖК-модуль 16 * 2
- Соединительные провода
Модуль RTC:
Наиболее распространенный способ для микроконтроллера отслеживать текущее время или дату - использовать RTC IC. Термин RTC означает часы реального времени; Эта ИС отслеживает текущее время и дату и будет передавать эту информацию микроконтроллеру по запросу. ИС RTC, которую мы здесь используем, является самой популярной и точной DS3231. Эта ИС дрейфует всего на несколько секунд каждый год и, следовательно, очень надежна. В этом руководстве мы используем модуль DS3231 RTC, который можно легко приобрести в Интернете или в местном магазине оборудования. Модуль поставляется с монетным элементом на 3 В, который всегда питает модуль RTC, и, следовательно, после установки времени и даты он будет обновляться, пока монетный элемент жив.
Модуль DS3231 обменивается данными с помощью протокола I2C, поэтому, если вы не знаете, что это такое и как он используется с PIC, прочтите руководство I2C с PIC, прежде чем продолжить. Также в этом руководстве мы собираемся создать файл заголовка, который можно использовать для связи с нашим модулем RTC, а также протестировать его на оборудовании, отображая время и дату на ЖК-дисплее, поэтому также важно научиться взаимодействовать с ЖК-дисплеем. дисплей с микроконтроллером PIC. Заголовочный файл, созданный в этом руководстве для DS3231, впоследствии может быть использован / изменен в соответствии с вашими приложениями.
Ранее мы использовали DS3231 RTC с Arduino в следующих проектах:
- Автоматическая кормушка для домашних животных с использованием Arduino
- Регистратор данных Arduino
Подключение DS3231 RTC к микроконтроллеру PIC:
Принципиальная схема цифровых часов на базе микроконтроллера PIC приведена ниже. Как говорилось ранее, DS3231 работает с помощью связи I2C, поэтому у него будет вывод последовательных часов (SCL) и последовательных данных (SDA), которые должны быть подключены к выводам I2C на нашем PIC, который является выводом 18 (SCL). и вывод 23 (SDA). Подтягивающий резистор номиналом 4,7 кОм используется для поддержания высокого уровня шины во время простоя.
К контактам порта D также подключен ЖК-дисплей для отображения текущей даты и времени. Полная принципиальная схема была разработана на Proteus и показана ниже. Мы собираемся использовать то же самое для моделирования или программирования позже в этом руководстве.
Следуйте принципиальной схеме и выполните соединения соответственно. Показанный выше блок I2C используется для отладки I2C, поэтому мы не будем включать его в наши соединения. Также не показано, что модуль RTC должен получать питание +5 В через контакты Vcc и заземления на модуле. Я использовал свой макет для подключения, и после выполнения необходимых подключений моя настройка выглядела примерно так, как показано ниже.
Если вы новичок в использовании микроконтроллера PIC, начните с раздела «Начало работы с микроконтроллером PIC».
Программирование PIC для модуля RTC:
Полная программа для этого Цифровых часов может быть загружена из ZIP - файла здесь. Всего программа включает три файла заголовков. Это файл lcd.h для работы с ЖК-дисплеем, файл PIC16F877a_I2C.h для работы со связью I2C с PIC и, наконец, PIC16F877a_DS3231.h файл для работы с модулями RTC. Все три файла заголовков необходимы для этой программы и доступны в ZIP-файле выше. Ниже я объясню основную программу, которая использует все эти заголовочные файлы для считывания времени и даты из модуля RTC и отображения их на ЖК-экране. После этого я объясню, что на самом деле происходит внутри файла заголовка RTC. Как всегда, начните программу с установки битов конфигурации и установки тактовой частоты на 20 МГц, поскольку это то, что мы использовали в нашем оборудовании.
#pragma config FOSC = HS // Биты выбора осциллятора (генератор HS) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = ON // Бит включения таймера включения (PWRT включен) # pragma config BOREN = ON // Бит разрешения сброса пониженного напряжения (BOR включен) #pragma config LVP = OFF // Бит разрешения последовательного программирования низкого напряжения (однополярный) (RB3 - это цифровой ввод / вывод, высокое напряжение включено Для программирования необходимо использовать MCLR) #pragma config CPD = OFF // Бит защиты кода памяти EEPROM данных (защита кода EEPROM данных отключена) #pragma config WRT = OFF // Биты разрешения записи в память программы Flash (защита от записи отключена; вся программная память может быть записано в управление EECON) #pragma config CP = OFF // Бит защиты кода флэш-памяти программы (защита кода выключена) #define _XTAL_FREQ 20000000
Следующим шагом будет определение выводов ЖК-дисплея. Если вы посмотрите на оборудование, вы можете заметить, что мы подключили выводы ЖК-дисплея к ПОРТУ D от RD2 до RD7, поэтому мы определяем то же, что показано ниже.
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
По умолчанию, когда вы приобрели модуль RTC, в нем не будут установлены правильное время и дата, поэтому мы должны установить их через нашу программу. Итак, мы объявляем переменную для каждых данных и подаем в реальном времени и дате, как показано ниже. Во время загрузки программы мое время и дата были 10:55 5-6-2018, поэтому я установил переменные, как показано ниже. Вы можете установить правильное время и дату в соответствии с вашим фактическим приложением
/ * Устанавливаем текущее значение даты и времени ниже * / int sec = 00; int min = 55; int час = 10; int date = 06; int месяц = 05; int year = 18; / * Установка времени и даты * /
Затем мы добавляем все файлы заголовков, о которых мы говорили. Если вы загрузили и открыли программу из ZIP-файла, это не будет проблемой, иначе убедитесь, что все файлы заголовков добавлены в исходный файл или в каталог проекта.
#включают
Поскольку мы использовали ПОРТ D в качестве выходных контактов для взаимодействия с ЖК-дисплеем, мы должны объявить их как выходные контакты в нашей программе и инициализировать ЖК-дисплей, как показано ниже.
TRISD = 0x00; // Делаем выводы порта D выходом для интерфейса LCD Lcd_Start (); // Инициализируем ЖК-модуль
Модуль RTC общается с помощью протокола I2C, поэтому мы должны включить связь I2C с нашим микроконтроллером PIC. Большинство устройств, включая наши модули DS3231, имеют рабочую частоту I2C 100 кГц, поэтому мы запускаем связь I2C с частотой 100 кГц, как показано ниже.
I2C_Initialize (100); // Инициализируем I2C Master с частотой 100 кГц
Как только мы установили связь I2C с модулем RTC, первое, что мы делаем, это устанавливаем текущие время и дату, которые мы ввели в нашу программу. Это можно сделать, вызвав функцию set_Time_Date, как показано ниже. Как только время и дата установлены, модуль будет автоматически отслеживать их и увеличивать их, как в цифровых часах.
Set_Time_Date (); // устанавливаем время и дату в модуле RTC
Чтобы указать, что программа запущена, мы отобразим небольшое вступительное сообщение, которое будет оставаться на экране в течение 2 секунд. Это сообщение отобразит на экране RTC с PIC –Circuit Digest . Программа для того же показана ниже
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String («RTC с PIC»); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Дайджест схемы"); __delay_ms (1500);
Внутри нашей бесконечной в то время как петли мы должны прочитать текущее время и дату, а затем отобразить значения в нашем ЖК - экране. Чтобы считать время и дату из модуля RTC, можно использовать функцию Update_Current_Time_Date, как показано ниже. Эта функция считывает значение из модуля RTC и обновляет переменные сек, мин, час, дату, месяц и год текущими значениями. Тогда мы сможем использовать их для наших целей.
Update_Current_Date_Time (); // Считываем текущую дату и время из модуля RTC
Переменные имеют целочисленный тип данных, мы должны преобразовать их в отдельные символы, чтобы мы могли отображать их на ЖК-экране. Таким образом, мы используем оператор модуля, чтобы получить единовременную цифру и разделить переменную на 10, чтобы получить цифру десятков. То же самое сделано для всех переменных.
// Разделение на символы для отображения на ЖК-дисплее char sec_0 = sec% 10; char sec_1 = (сек / 10); char min_0 = min% 10; char min_1 = мин / 10; char hour_0 = час% 10; char hour_1 = час / 10; char date_0 = дата% 10; char date_1 = дата / 10; char month_0 = месяц% 10; char month_1 = месяц / 10; char year_0 = год% 10; char year_1 = год / 10;
Все, что осталось сделать, это отобразить полученную информацию на ЖК-экране. Это легко сделать с помощью функций ЖК-дисплея, которые мы ранее обсуждали в нашем руководстве по ЖК-дисплею. Итак, код для отображения времени приведен ниже, тот же метод используется и для отображения даты. После отображения данных дается задержка в 500 мс, поэтому они действуют как интервал обновления.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ВРЕМЯ:"); Lcd_Print_Char (час_1 + '0'); Lcd_Print_Char (час_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0');
Краткое описание заголовочного файла PIC16F877a_DS3231.h:
Объясненных до сих пор вещей достаточно для использования модуля DS3231 с PIC для ваших собственных проектов, но любопытные умы хотели бы знать, что на самом деле происходит внутри файла заголовка, и данные фактически получены от модуля RTC с помощью PIC, просто читать дальше.
Лучший способ решить эту проблему - полностью прочитать техническое описание DS3231. Вкратце, что необходимо, модуль действует как подчиненный для PIC, и адрес всех модулей DS3231 - D0. Итак, для записи данных в модуль мы должны передать адрес D0, а для чтения данных из RTC мы должны передать адрес D1. Если мы передадим адрес записи модулю RTC, мы подготовимся к получению данных от PIC, поэтому последующие данные, записанные PIC, будут получены и сохранены в модуле RTC. Аналогично, если мы отправим адрес для чтениятогда PIC должен быть готов к считыванию значений из RTC, поскольку модуль RTC начнет отправлять все данные, которые у него есть. Битовая последовательность для D0 и D1 показана ниже из таблицы. Обратите внимание, что адрес 0b11010000 означает D0 (запись), а 0b11010001 означает D01 (чтение).
Когда PIC отправляет адрес D0 или D1 для записи или чтения, следующие данные должны считываться или записываться в определенном порядке. Этот порядок показан в таблице ниже. Таким образом, первые данные будут в секундах (00h), затем следуют минуты (01h), затем часы (02h), затем день (03h) и до MSB температуры.
Модуль RTC не понимает десятичных значений, он передает данные только через значения BCD. Поэтому перед записью любых значений в модуль RTC их следует преобразовать в BCD, а также значения, полученные из модуля RTC, будут в формате BCD, и их следует преобразовать в Decimal, чтобы иметь смысл для нас. Имея это в виду, давайте создадим все функции, необходимые для использования модуля RTC.
Функции BCD_2_DEC и DEC_2_BCD:
Первые две функции будут использоваться для преобразования данных BCD в Decimal и данных Decimal в BCD, поскольку модуль RTC понимает только BCD. Формулы для преобразования BCD в десятичное и для BCD в десятичное:
Десятичный = (BCD >> 4) * 10 + (BCD & 0x0F) BCD = ((Decimal / 10) << 4) + (Decimal% 10)
Нам просто нужно использовать эти две формулы для создания функции, которая принимает противоположную единицу измерения в качестве параметра, преобразует ее в требуемый формат и возвращает его, функция для выполнения того же самого показана ниже.
int BCD_2_DEC (int to_convert) { возврат (to_convert >> 4) * 10 + (to_convert & 0x0F); } int DEC_2_BCD (int to_convert) { return ((to_convert / 10) << 4) + (to_convert% 10); }
Функция Set_Time_Date ():
Эта функция запишет значение времени и даты из PIC в модуль RTC. Значения реального времени и даты должны быть обновлены пользователем в переменных сек, мин, час, дата, месяц и год. Затем эти значения будут преобразованы в BCD и записаны в модуль RTC.
Как мы уже обсуждали, чтобы записать значение в модуль RTC, мы должны передать адрес D0 и записать бычий бит 0, чтобы начать процесс записи. Затем мы можем отправить данные в порядке, указанном в таблице выше.
void Set_Time_Date () { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_Write (DEC_2_BCD (сек)); // обновить сек I2C_Write (DEC_2_BCD (min)); // обновить мин. I2C_Write (DEC_2_BCD (час)); // обновить час I2C_Write (1); // игнорировать день обновления I2C_Write (DEC_2_BCD (date)); // дата обновления I2C_Write (DEC_2_BCD (месяц)); // обновляем месяц I2C_Write (DEC_2_BCD (год)); // обновляем год I2C_End (); }
Функция Update_Current_Date_Time ():
Последняя функция в библиотеке - это функция, используемая для чтения времени и даты из модуля RTC и передачи их в микроконтроллер PIC. Эта функция разделена на три сегмента: один для запуска процесса чтения, второй для чтения значений и сохранения их в глобальных переменных, таких как сек, мин, час, дата, месяц и год. И третий - признать, что чтение было успешным.
Обратите внимание, что для каждого действия связь I2C должна начинаться и заканчиваться.
Чтобы прочитать значения из RTC, мы должны отправить адрес D0, за которым следует 0. Это заставит модуль RTC отправлять все значения, которые он имеет, в порядке, указанном в таблице выше. Мы можем просто прочитать их, преобразовать в Decimal и сохранить в переменных в том же порядке.
Наконец, после завершения чтения модуль RTC отправит бит подтверждения, который также должен быть прочитан и подтвержден.
void Update_Current_Date_Time () { // НАЧАТЬ читать I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_End (); // ЧИТАТЬ I2C_Begin (); I2C_Write (0xD1); // Инициализируем чтение данных sec = BCD_2_DEC (I2C_Read (1)); мин = BCD_2_DEC (I2C_Read (1)); час = BCD_2_DEC (I2C_Read (1)); I2C_Read (1); дата = BCD_2_DEC (I2C_Read (1)); месяц = BCD_2_DEC (I2C_Read (1)); год = BCD_2_DEC (I2C_Read (1)); I2C_End (); // КОНЕЦ чтения I2C_Begin (); I2C_Write (0xD1); // Инициализируем чтение данных I2C_Read (1); I2C_End (); }
Моделирование:
Проект можно смоделировать с помощью программного обеспечения для моделирования Proteus. Выполните подключения, как показано на принципиальной схеме, и загрузите шестнадцатеричный файл в контроллер PIC. При моделировании вы увидите два всплывающих окна и дату и время, отображаемые на ЖК-дисплее, как показано ниже.
Маленький вверху показывает текущее время и дату внутри модуля RTC, а второе всплывающее окно - это отладчик I2C. Это отличный инструмент для проверки того, какие данные действительно передаются при ошибке I2C.
Отображение времени и даты на ЖК-дисплее:
Как только ваше оборудование будет готово и код будет загружен в виде ZIP-файла по указанной ссылке, откройте программу, используя MPLABX IDE. Сначала необходимо запустить среду IDE, использовать опцию «Открыть проект», перейти к содержимому ZIP-файла и открыть папку.X.
Просто проверьте, компилируется ли программа, и загрузите код в ваше оборудование с помощью PicKit3. Как только программа будет загружена, вы должны увидеть вводное сообщение, а затем должны отображаться время и дата, как показано ниже.
Если на ЖК-дисплее ничего нет, проверьте соединения и убедитесь, что уровень контрастности установлен правильно, изменяя потенциометр. Именно так вы можете отображать время и дату для всех ваших проектов микроконтроллеров PIC и использовать их как цифровые часы. Надеюсь, вы узнали что-то новое и получили удовольствие от изучения этого руководства. Если вы столкнулись с какой-либо проблемой, опубликуйте их в комментариях ниже или на форумах для получения технической помощи.
Загрузите полную программу PIC для этого проекта с файлами заголовков отсюда и просмотрите все наши руководства по PIC здесь.