- Требования:
- Программирование микроконтроллера PIC для связи UART:
- Моделируя нашу программу:
- Настройка оборудования и тестирование вывода:
В этом руководстве мы узнаем, как включить связь UART с микроконтроллером PIC и как передавать данные на ваш компьютер и с него. До сих пор мы рассмотрели все основные модули, такие как АЦП, таймеры, ШИМ, а также узнали, как взаимодействовать с ЖК-дисплеями и 7-сегментными дисплеями. Теперь мы оснастим себя новым коммуникационным инструментом под названием UART, который широко используется в большинстве проектов микроконтроллеров. Ознакомьтесь с нашими полными руководствами по микроконтроллерам PIC с использованием MPLAB и XC8.
Здесь мы использовали микроконтроллер PIC16F877A, у него есть модуль под названием «Адресный универсальный синхронный асинхронный приемник и передатчик», вскоре известный как USART. USART - это двухпроводная система связи, в которой данные передаются последовательно. USART также является полнодуплексной связью, что означает, что вы можете одновременно отправлять и получать данные, которые могут использоваться для связи с периферийными устройствами, такими как терминалы CRT и персональные компьютеры.
УСАПП может быть сконфигурирован в следующих режимах:
- Асинхронный (полнодуплексный)
- Синхронный - Мастер (полудуплекс)
- Синхронный - ведомый (полудуплекс)
Также есть два разных режима, а именно 8-битный и 9-битный режим. В этом руководстве мы настроим модуль USART для работы в асинхронном режиме с 8-битной системой связи, поскольку это наиболее используемый тип связи. Поскольку он асинхронный, ему не нужно отправлять тактовый сигнал вместе с сигналами данных. UART использует две линии данных для отправки (Tx) и приема (Rx) данных. Заземление обоих устройств также должно быть общим. Этот тип связи не использует общие часы, поэтому для работы системы очень важно иметь общее заземление.
В конце этого руководства вы сможете установить связь (UART) между вашим компьютером и микроконтроллером PIC и переключить светодиод на плате PIC с вашего ноутбука. Состояние светодиода будет отправлено на ваш портативный компьютер с PIC MCU. Мы протестируем вывод с помощью Hyper Terminal на компьютере. Подробное видео также дано в конце этого руководства.
Требования:
Оборудование:
- PIC16F877A Perf Board
- Модуль преобразователя RS232 в USB
- Компьютер
- Программист PICkit 3
Программного обеспечения:
- MPLABX
- Гипертерминал
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) / Baud_rate) - 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); // удерживаем программу до освобождения буфера приема return RCREG; // получаем значение и отправляем его в основную функцию} // _____________ Конец функции ________________ //
Когда данные принимаются модулем UART, он принимает их и сохраняет в регистре RCREG. Мы можем просто передать значение любой переменной и использовать его. Но может быть ошибка перекрытия или пользователь может постоянно отправлять данные, а мы еще не передали их в переменную.
В этом случае на помощь приходит бит RCIF флага приема. Этот бит переходит в низкий уровень всякий раз, когда данные получены и еще не обработаны. Следовательно, мы используем его в цикле while, создавая задержку для удержания программы до тех пор, пока мы не обработаем это значение.
Переключение светодиода с помощью модуля UART микроконтроллера PIC:
Теперь давайте перейдем к последней части программы, функции void main (void) , где мы будем переключать светодиод через компьютер, используя связь UART между PIC и компьютером.
Когда мы отправляем символ «1» (с компьютера), светодиод включается, и сообщение о состоянии «RED LED -> ON» будет отправлено обратно (от PIC MCU) на компьютер.
Точно так же мы отправляем символ «0» (с компьютера), светодиод будет выключен, а сообщение о состоянии «RED LED -> OFF» будет отправлено обратно (от PIC MCU) на компьютер.
while (1) // Бесконечный цикл {get_value = UART_get_char (); if (get_value == '1') // Если пользователь отправляет «1» {RB3 = 1; // Включаем светодиод UART_send_string («КРАСНЫЙ светодиод -> ВКЛ»); // Отправляем уведомление на компьютер UART_send_char (10); // значение ASCII 10 используется для возврата каретки (для печати в новой строке)} if (get_value == '0') // Если пользователь отправляет «0» {RB3 = 0; // Выключаем светодиод UART_send_string ("RED -> OFF"); // Отправляем уведомление на компьютер UART_send_char (10); // значение ASCII 10 используется для возврата каретки (для печати с новой строки)}}
Моделируя нашу программу:
Как обычно, давайте смоделируем нашу программу с помощью 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.