- Вимоги:
- Програмування мікроконтролера PIC для зв'язку UART:
- Імітація нашої програми:
- Налаштування обладнання та тестування вихідних даних:
У цьому підручнику ми дізнаємося, як увімкнути UART-зв'язок з мікроконтролером PIC та як перенести дані на ваш комп’ютер та з нього. Наразі ми розглянули всі основні модулі, такі як ADC, таймери, ШІМ, а також навчилися взаємодіяти з РК-дисплеями та 7-сегментними дисплеями. Тепер ми оснастимо себе новим комунікаційним інструментом під назвою UART, який широко використовується в більшості проектів мікроконтролера. Перегляньте тут наші повні підручники з мікроконтролера PIC з використанням MPLAB та XC8.
Тут ми використовували мікроконтролер PIC16F877A, він має модуль під назвою “Адресований універсальний синхронний асинхронний приймач і передавач”, який коротко називається USART. USART - це двопровідна система зв'язку, в якій дані проходять послідовно. USART - це також дуплексний зв’язок, що означає, що ви можете одночасно надсилати та отримувати дані, які можна використовувати для зв’язку з периферійними пристроями, такими як термінали ЕЛТ та персональні комп’ютери.
УСАПП може бути налаштований в наступних режимах:
- Асинхронний (повнодуплексний)
- Синхронний - головний (напівдуплексний)
- Синхронний - підлеглий (напівдуплексний)
Є також два різні режими, а саме 8-бітний та 9-бітний режим, у цьому посібнику ми налаштуємо модуль USART на роботу в асинхронному режимі з 8-бітною системою зв'язку, оскільки це найбільш використовуваний тип зв'язку. Оскільки він асинхронний, йому не потрібно надсилати тактовий сигнал разом із сигналами даних. UART використовує дві лінії передачі даних (Tx) і отримання (Rx) даних. Також слід зробити загальним заземлення обох пристроїв. Цей тип спілкування не має спільних годин, тому спільна база дуже важлива для роботи системи.
Наприкінці цього посібника ви зможете встановити зв'язок (UART) між вашим комп'ютером та мікроконтролером PIC та перемкнути світлодіод на платі PIC з вашого ноутбука. Статус світлодіода надсилатиметься на ваш ноутбук з мікроконтролера PIC. Ми перевіримо вихідні дані за допомогою Hyper Terminal в комп'ютері. Детальне відео також подано в кінці цього підручника.
Вимоги:
Обладнання:
- PIC16F877A Перф. Дошка
- Модуль перетворювача RS232 в USB
- Комп’ютер
- Програміст PICkit 3
Програмне забезпечення:
- MPLABX
- HyperTerminal
Для перетворення послідовних даних у читабельну машину форму потрібен конвертер RS232 в USB. Є способи розробити власну схему замість того, щоб купувати власний модуль, але вони не є надійними, оскільки піддаються шуму. Той, який ми використовуємо, показаний нижче
Примітка: Для кожного перетворювача RS232 в USB потрібен спеціальний драйвер; більшість з них повинні встановлюватися автоматично, як тільки ви підключаєте пристрій. Але, якщо це не розслабиться !!! Скористайтеся розділом коментарів, і я вам допоможу.
Програмування мікроконтролера PIC для зв'язку UART:
Як і всі модулі (АЦП, таймер, ШІМ), нам також слід ініціалізувати наш модуль USART нашого мікроконтролера PIC16F877A та доручити йому працювати в 8-бітному режимі зв'язку UART. Давайте визначимо біти конфігурації та почнемо з функції ініціалізації UART.
Ініціалізація модуля UART мікроконтролера PIC:
Штифти Tx і Rx фізично присутні на штифтах RC6 і RC7. Згідно з таблицею даних, давайте оголосимо TX як вихід, а RX як вхід.
// **** Встановлення контактів вводу-виводу для UART **** // TRISC6 = 0; // Штекер TX встановлений як вихід TRISC7 = 1; // Вхідний набір штифтів RX // ________ Набір штифтів вводу-виводу __________ //
Тепер потрібно встановити швидкість передачі даних. Швидкість передачі даних - це швидкість передачі інформації в каналі зв'язку. Це може бути одне з багатьох значень за замовчуванням, але в цій програмі ми використовуємо 9600, оскільки це найбільш часто використовувана швидкість передачі даних.
/ ** Ініціалізуйте регістр SPBRG для необхідної швидкості передачі даних і встановіть BRGH для швидкої швидкості передачі даних ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // для високої швидкості передачі даних // _________ Налаштування кінця швидкості передачі даних _________ //
Значення швидкості передачі має бути встановлено за допомогою регістру SPBRG, значення залежить від значення частоти Зовнішнього кристала, формули для розрахунку швидкості передачі наведено нижче:
SPBRG = ((_XTAL_FREQ / 16) / швидкість передачі) - 1;
Біт BRGH повинен бути високим, щоб забезпечити високу швидкість передачі даних. Згідно з таблицею даних (стор. 13), завжди вигідно її увімкнути, оскільки це може усунути помилки під час спілкування.
Як вже було сказано раніше, ми будемо працювати в асинхронному режимі, отже, біт SYNC повинен бути зведений до нуля, а біт SPEM повинен бути високим, щоб увімкнути послідовні висновки (TRISC6 та TRICSC5)
// **** Увімкнути асинхронний послідовний порт ******* // SYNC = 0; // Асинхронний SPEN = 1; // Увімкнути шпильки послідовного порту // _____ Увімкнено асинхронний послідовний порт _______ //
У цьому підручнику ми будемо надсилати та отримувати дані між MCU та комп'ютером, отже, ми повинні ввімкнути біти TXEN та CREN.
// ** Дозволяємо підготуватися до передачі та прийому ** // TXEN = 1; // увімкнути передачу CREN = 1; // увімкнути прийом // __ Модуль UART готовий до передачі та прийому __ //
В бітах TX9 і RX9 повинні бути нульовим, так що ми працюємо в 8-бітному режимі. Якщо потрібно встановити високу надійність, тоді можна вибрати 9-бітний режим.
// ** Виберіть 8-бітний режим ** // TX9 = 0; // вибрано 8-бітний прийом RX9 = 0; // вибрано 8-бітний режим прийому // __ вибрано 8-бітний режим __ //
На цьому ми завершуємо налаштування ініціалізації. і готовий до експлуатації.
Передача даних за допомогою UART:
Для передачі даних через модуль UART можна використовувати наведену нижче функцію:
// ** Функція надсилання одного байта дати в UART ** // void UART_send_char (char bt) {while (! TXIF); // утримуємо програму до тих пір, поки буфер TX не звільниться TXREG = bt; // Завантажте буфер передавача з отриманим значенням} // _____________ Кінець функції ________________ //
Після ініціалізації модуля будь-яке значення, завантажене в регістр, TXREG буде передаватися через UART, але передача може перекриватися. Отже, ми завжди повинні перевіряти прапорець переривання передачі TXIF. Тільки якщо цей біт низький, ми можемо перейти до наступного біта для передачі, інакше нам слід почекати, поки цей прапор стане низьким.
Однак вищевказану функцію можна використовувати лише для надсилання лише одного байта даних, для надсилання повного рядка слід використовувати нижченаведену функцію
// ** Функція перетворення рядка в байт ** // void UART_send_string (char * st_pt) {while (* st_pt) // якщо є char UART_send_char (* st_pt ++); // обробити це як байтові дані} // ___________ Кінець функції ______________ //
Цю функцію може бути трохи складно зрозуміти, оскільки вона має покажчики, але, повірте мені, покажчики чудові, і вони полегшують програмування, і це один хороший приклад того самого.
Як ви можете помітити, ми знову викликали UART_send_char (), але тепер всередині циклу while. Ми розділили рядок на окремі символи, кожен раз, коли ця функція викликається, один символ буде надісланий до TXREG, і він буде переданий.
Отримання даних за допомогою UART:
Наступну функцію можна використовувати для отримання даних від модуля UART:
// ** Функція отримання одного байта дати з UART ** // char UART_get_char () {if (OERR) // перевірка на помилку {CREN = 0; // Якщо помилка -> Скинути CREN = 1; // Якщо помилка -> Скинути}} while (! RCIF); // утримуємо програму до тих пір, поки буфер RX не звільниться RCREG; // отримуємо значення та надсилаємо його головній функції} // _____________ Кінець функції ________________ //
Коли дані приймаються модулем UART, він бере їх і зберігає в реєстрі RCREG. Ми можемо просто перенести значення в будь-яку змінну і використовувати його. Але може бути помилка перекриття або користувач може надсилати дані безперервно, і ми ще не передали їх змінній.
У цьому випадку на допомогу приходить біт прапора отримання RCIF. Цей біт буде низьким, коли дані отримані і ще не оброблені. Отже, ми використовуємо його в циклі while, створюючи затримку, щоб утримати програму, поки ми не впораємося з цим значенням.
Перемикання світлодіода за допомогою модуля UART мікроконтролера PIC:
Тепер підійдемо до заключної частини Програми, функції void main (void) , де ми будемо перемикати світлодіод через комп’ютер, використовуючи UART-зв'язок між PIC та комп’ютером.
Коли ми надсилаємо символ “1” (з комп’ютера), світлодіод увімкнеться, а повідомлення про стан “ЧЕРВОНИЙ світлодіод -> УВІМК” повернеться назад (з PIC MCU) на комп’ютер.
Подібним чином ми відправляємо символ «0» (з комп’ютера) світлодіод буде ВИМКНЕНО, а повідомлення про стан «ЧЕРВОНИЙ світлодіод -> ВИМК» буде надіслано назад (з PIC MCU) на комп'ютер.
while (1) // Нескінченний цикл {get_value = UART_get_char (); if (get_value == '1') // Якщо користувач надсилає "1" {RB3 = 1; // Увімкнути світлодіод UART_send_string ("ЧЕРВОНИЙ LED -> УВІМКНЕНО"); // Надіслати повідомлення на комп’ютер UART_send_char (10); // Значення 10 ASCII використовується для повернення каретки (для друку в новому рядку)} if (get_value == '0') // Якщо користувач надіслав "0" {RB3 = 0; // Вимкнути світлодіод UART_send_string ("ЧЕРВОНИЙ -> ВИМКНЕНО"); // Надіслати повідомлення на комп’ютер UART_send_char (10); // Значення 10 ASCII використовується для повернення каретки (для друку в новому рядку)}}
Імітація нашої програми:
Як зазвичай, давайте змоделюємо нашу програму за допомогою proteus та з’ясуємо, чи працює вона належним чином.
На зображенні вище показано віртуальний термінал, в якому він відображає привітальне повідомлення та стан світлодіода. Можна помітити, що світлодіод червоного кольору підключений до виводу RB3. Детальну роботу моделювання можна знайти у відео у кінці.
Налаштування обладнання та тестування вихідних даних:
Підключення цієї схеми дуже просте, ми використовуємо нашу плату PIC Perf і просто підключаємо три дроти до перетворювача RS232 до USB і підключаємо модуль до нашого комп’ютера за допомогою кабелю даних USB, як показано нижче.
Далі ми встановлюємо програму Hyper Terminal (завантажте її звідси) і відкриваємо її. Це повинно показувати щось подібне
Тепер відкрийте на своєму комп'ютері Диспетчер пристроїв і перевірте, до якого порту Com підключений ваш модуль, а мій - до порту COM 17, як показано нижче
Примітка: Назва COM-порту для вашого модуля може змінюватися залежно від вашого постачальника, це не проблема.
Тепер поверніться до програми Hyper Terminal і перейдіть до пункту Налаштування -> Конфігурація порту або натисніть Alt + C, щоб отримати наступне спливаюче вікно та виберіть потрібний порт (COM17 у моєму випадку) у спливаючому вікні та натисніть на підключення.
Після встановлення зв’язку увімкніть плату для перфоманії PIC, і ви побачите щось подібне нижче
Залиште курсор у вікні команд і введіть 1, а потім натисніть клавішу Enter. Світлодіод увімкнеться, а стан відобразиться, як показано нижче.
Так само, тримайте курсор у вікні команд і введіть 0, а потім натисніть клавішу enter. Світлодіод вимкнеться, а стан відобразиться, як показано нижче.
Нижче наведено повний код та детальне відео, яке покаже, як світлодіод реагує в режимі реального часу на “1” та “0”.
Це все, хлопці, ми зв’язали PIC UART з нашим комп’ютером і передали дані для перемикання світлодіода за допомогою терміналу Hyper. Сподіваюся, ви зрозуміли, якщо ні, використовуйте розділ коментарів, щоб задати свій запит. У нашому наступному підручнику ми знову використовуватимемо UART, але зробимо його цікавішим за допомогою модуля Bluetooth і передаватиме дані по повітрю.
Також перевірте зв'язок UART між двома мікроконтролерами ATmega8 та зв'язок UART між ATmega8 та Arduino Uno.