- Необхідні матеріали:
- Модуль RTC:
- Підключення DS3231 RTC до мікроконтролера PIC:
- Програмування PIC для модуля RTC:
- Коротке пояснення файлу заголовка PIC16F877a_DS3231.h:
- Моделювання:
- Відображення часу та дати на РК-дисплеї:
Майже всі вбудовані пристрої розроблені для взаємодії з реальним світом. Вони виступають мостом для спілкування між цифровим світом та реальним світом. Щоб зробити цей процес простішим та ефективнішим, інколи цифровому світу потрібно буде відстежувати час та дату реального світу. Таким чином цифровий світ буде знати, скільки часу / дня це в реальному світі, і навіть може розрізняти денний та нічний час. Він також може виступати джерелом часу для виконання певних завдань у визначений час або дату. Отже, тут ми взаємодіємо модуль RTC з мікроконтролером PIC і відображаємо час та дату на РК-дисплеї 16x2. Цей проект також може бути використаний як цифровий годинник.
Необхідні матеріали:
- Регульоване живлення 5 В
- PIC16F877A
- Кристалічний генератор 20 МГц
- Конденсатор 33pf - 2Ні
- Резистор 10K, 5.1K, 1K
- Модуль RTC DS3231
- POT -10k
- РК-модуль 16 * 2
- Підключення проводів
Модуль RTC:
Найпоширеніший спосіб для мікроконтролера відстежувати час або дату реальних світів - це використання мікросхеми RTC. Термін RTC означає Годинник реального часу; цей ІС відстежує реальний час та дату та передаватиме цю інформацію мікроконтролеру за запитом. Схема RTC, яку ми використовуємо тут, є найпопулярнішою та найточнішою DS3231. Цей ІС дрейфує лише на кілька секунд щороку, а отже, він дуже надійний. Для цього підручника ми використовуємо модуль RTC DS3231, який можна легко придбати в Інтернеті або в місцевому магазині техніки. Модуль постачається з монетною коміркою 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.7k використовується для підтримання шини у високому стані в режимі очікування.
РК-дисплей також підключений до контактів на порту D для відображення поточної дати та часу. Повна електрична схема була розроблена на Proteus і показана нижче. Ми будемо використовувати те ж саме для моделювання або програмування пізніше в цьому підручнику.
Дотримуйтесь принципової схеми та відповідно підключіть з'єднання, показаний вище блок I2C використовується для налагодження I2C, тому ми не будемо включати це в наші з'єднання. Також не показано, що модуль RTC повинен живитися від джерела живлення + 5 В за допомогою штифтів Vcc та Ground на модулі. Я використовував макет для встановлення з'єднання, і після встановлення необхідних з'єднань моє налаштування виглядало приблизно так нижче.
Якщо ви новачок у мікроконтролері 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 oscillator) #pragma config WDTE = OFF // Біт включення сторожового таймера (WDT вимкнено) #pragma config PWRTE = ON // Біт активації таймера включення (PWRT увімкнено) # pragma config BOREN = ON // Біт увімкнення скидання коригування (BOR увімкнено) #pragma config LVP = OFF // Біт ввімкнення послідовного програмування в ланцюзі низької напруги (одне живлення) (RB3 - цифровий ввід / вивід, HV увімкнено Для програмування потрібно використовувати MCLR) #pragma config CPD = OFF // Біт захисту коду пам'яті EEPROM (захист коду EEPROM даних вимкнений) #pragma config WRT = OFF // Flash Program Memory Ввімкнути біти (Захист від запису; вся пам'ять програми може бути надіслано до управління EECON) #pragma config CP = OFF // Біт захисту коду пам'яті Flash-програми (захист коду вимкнено) #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 ранку 6-5-2018, тому я встановив змінні, як показано нижче. Ви можете встановити правильний час та дату відповідно до вашої фактичної заявки
/ * Встановіть поточне значення дати та часу нижче * / int sec = 00; int min = 55; int година = 10; дата int = 06; int місяць = 05; int рік = 18; / * Встановлення часу та дати * /
Далі ми додаємо всі файли заголовків, про які ми вже обговорювали. Якщо ви завантажили та відкрили програму з ZIP-файлу, це не буде проблемою, інакше переконайтесь, що всі заголовкові файли додані до вихідного файлу або каталогу проекту.
#включати
Оскільки ми використовували PORT D як вихідні висновки для взаємодії РК-дисплея, ми повинні оголосити їх вихідними висновками в нашій програмі та ініціалізувати РК-дисплей, як показано нижче
TRISD = 0x00; // Зробити виводи порту D як вихідні для РК-інтерфейсу 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 ("-Cesture Digest"); __delay_ms (1500);
Усередині нашої нескінченної в той час як петлі ми повинні прочитати поточний час і дату, а потім відобразити значення в нашому ЖК - екрані. Для зчитування часу та дати з модуля RTC можна використовувати функцію Update_Current_Time_Date, як показано нижче. Ця функція зчитує значення з модуля RTC та оновить змінні сек, хв, годину, дату, місяць та рік поточними значеннями. Тоді ми можемо використовувати їх для своєї мети.
Update_Current_Date_Time (); // Зчитування поточної дати та часу з модуля RTC
Змінні мають цілочисельний тип даних, ми повинні перетворити їх в окремі символи, щоб ми могли відображати їх на РК-екрані. Отже, ми використовуємо оператор модуля, щоб отримати одноразову цифру, і ділимо змінну на 10, щоб отримати цифру десятків. Те саме робиться для всіх змінних.
// Розділіть на char для відображення на рідкокристалічному екрані char sec_0 = sec% 10; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char година_0 = година% 10; char година_1 = година / 10; char date_0 = дата% 10; char дата_1 = дата / 10; char місяць_0 = місяць% 10; char місяць_1 = місяць / 10; char рік_0 = рік% 10; char рік_1 = рік / 10;
Залишилося лише відобразити інформацію, яку ми отримали на РК-екрані. Це легко зробити за допомогою функцій РК, які ми вже обговорювали в нашому підручнику з РК. Отже, код для відображення часу наведено нижче, той самий метод також використовується для відображення дати. Після відображення даних надається затримка 500 мс, так що вона діє як інтервал оновлення.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("TIME:"); 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, і його слід перетворити в десяткове, щоб це мало для нас сенс. З огляду на це дозволяє створити всі функції, необхідні для використання модуля RTC.
Функції BCD_2_DEC та DEC_2_BCD:
Перші дві функції були б використані для перетворення даних BCD в десяткові, а десяткові - в BCD, оскільки модуль RTC розуміє лише BCD. Формули для перетворення BCD в десяткову і для BCD в десяткову є
Десяткове = (BCD >> 4) * 10 + (BCD & 0x0F) BCD = ((Десяткове / 10) << 4) + (Десяткове% 10)
Нам просто потрібно скористатися цими двома формулами для створення функції, яка приймає протилежну одиницю як параметр і перетворює її в необхідний формат і повертає, функція для того ж робиться нижче
int BCD_2_DEC (int to_convert) { return (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 (хв)); // оновлюємо хв I2C_Write (DEC_2_BCD (година)); // година оновлення I2C_Write (1); // ігноруємо оновлення дня I2C_Write (DEC_2_BCD (дата)); // дата оновлення I2C_Write (DEC_2_BCD (місяць)); // оновлення місяця I2C_Write (DEC_2_BCD (рік)); // рік оновлення I2C_End (); }
Функція Update_Current_Date_Time ():
Остання функція в бібліотеці - це функція, яка використовується для зчитування часу та дати з модуля RTC та передачі її мікроконтролеру PIC. Ця функція розділена на три сегменти, один для ініціювання процесу зчитування, другий для зчитування значень та збереження його до загальних змінних, таких як сек, хв, година, дата, місяць та рік. І третє - визнати, що читання пройшло успішно.
Зверніть увагу, що для кожної дії зв'язок I2C повинен починатися і закінчуватися.
Щоб прочитати значення з RTC, нам потрібно надіслати адресу D0, за якою слідує 0. Це змусить модуль RTC надіслати всі значення, які він має, у порядку, показаному в таблиці вище. Ми можемо просто прочитати їх, перетворити в десяткові і зберегти у змінних у тому самому порядку.
Нарешті, після закінчення зчитування модуль 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)); min = 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 тут.