Последовательная связь в микроконтроллере PIC: руководство для начинающих


В данной статье мы рассмотрим организацию последовательной связи (UART) между микроконтроллером PIC и персональным компьютером. Несмотря на то, что в современных персональных компьютерах последовательный (COM) порт уже в явном виде не используется, во встраиваемой электронике он продолжает широко применяться.

Внешний вид проекта для демонстрации последовательной связи в микроконтроллере PIC

В данном проекте мы рассмотрим последовательную связь в микроконтроллере PIC16F877A, который имеет модуль под названием USART (Addressable Universal Synchronous Asynchronous Receiver and Transmitter – универсальный синхронно-асинхронный приемопередатчик). USART представляет собой двухпроводную систему, в которой данные передаются последовательно. USART является полно дуплексным интерфейсом, что означает что данные в нем можно передавать и принимать одновременно.

USART может быть сконфигурирован для работы в следующих режимах:

  • асинхронный (полный дуплекс);
  • синхронный ведущий (Master) (полудуплекс);
  • синхронный ведомый (Slave) (полудуплекс).

Также в USART существует еще два различных режима, которые называются 8-битный и 9-битный. В данном проекте мы сконфигурируем работу USART в 8-битном асинхронном режиме, как наиболее часто применяемом в системах встраиваемой электроники. Поскольку режим асинхронный, то в нем нет необходимости передавать сигнал тактовой частоты.

UART (Universal Asynchronous Receiver/Transmitter – универсальный асинхронный приёмопередатчик) использует две линии – для передачи (Tx) и приема (Rx) данных. Данный тип связи не имеет общей линии синхронизации, поэтому наличие общего провода (земли) крайне необходимо для работы подобной системы.

Структурная схема организации последовательной связи между микроконтроллером PIC16F877A и компьютером в нашем проекте приведена на следующем рисунке.

Структурная схема организации последовательной связи между микроконтроллером PIC16F877A и компьютером в нашем проекте

С компьютера мы с помощью последовательной связи будем передавать сигналы, которые будут включать/выключать светодиод, подключенный к микроконтроллеру PIC. А с микроконтроллера PIC на компьютер по последовательной связи будет передаваться информация о состоянии светодиода. Тестирование проекта мы будем осуществлять с помощью программы Hyper Terminal, запущенной на компьютере. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

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

Аппаратное обеспечение

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Модуль конвертера RS232 в USB.
  3. Программатор PICkit 3 (купить на AliExpress).
  4. Держатель микросхем на 40 контактов (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсатор 33 пФ – 2 шт. (купить на AliExpress).
  7. Светодиод (купить на AliExpress).
  8. Компьютер.
  9. Перфорированная плата.

Программное обеспечение

  1. MPLABX.
  2. HyperTerminal.

Конвертер RS232 в USB необходим для преобразования последовательных данных, поступающих от микроконтроллера PIC, в форму, удобную для считывания компьютером. Данный конвертер можно как купить готовым, так и сделать самому. Внешний вид конвертера RS232 в USB представлен на следующем рисунке.

Внешний вид конвертера RS232 в USB

Примечание: каждый конвертер RS232 в USB требует установки специального драйвера. Для большинства подобных конвертеров подобный драйвер устанавливается автоматически как только вы подключите конвертер к компьютеру. Но не для всех, поэтому обратите на этот вопрос особое внимание.

Программирование микроконтроллера PIC для работы с UART

Для программирования работы микроконтроллера PIC с использованием последовательной связи необходимо инициализировать USART модель микроконтроллера. Мы будем настраивать его для работы в 8-битном режиме. После настройки битов конфигурации можно приступать к настройке модуля UART.

Инициализация модуля UART микроконтроллера PIC

Линии последовательной связи Tx и Rx микроконтроллера PIC расположены на его контактах RC6 и RC7. Запрограммируем контакт TX для работы в качестве цифрового выхода, а контакт RX – в качестве цифрового входа.

После этого необходимо установить бодовую скорость – это скорость, с которой данные передаются по последовательному каналу связи. В нашем проекте мы будем использовать скорость передачи данных равную 9600 бод.

Значение бодовой скорости устанавливается с помощью регистра SPBRG, также оно зависит от частоты используемого кварцевого генератора. Формула для вычисления бодовой скорости в микроконтроллере PIC выглядит следующим образом:

SPBRG = ( ( _XTAL_FREQ/16 ) / Baud_rate) – 1;

Бит BRGH необходимо устанавливать в high чтобы сделать доступными высокие значения бодовой скорости. В соответствии с даташитом на микроконтроллер PIC16F877A (страница 13) всегда желательно устанавливать данный бит, поскольку он также позволяет устранять ошибки во время передачи данных.

Как мы уже говорили ранее, мы будем работать в асинхронном режиме, поэтому бит SYNC необходимо установить в 0, а бит SPEM – в high чтобы сделать доступными контакты для последовательной связи (TRISC6 и TRICSC5).

В нашем проекте мы будем как передавать данные от микроконтроллера PIC к компьютеру, так и принимать их, поэтому нам необходимо установить оба бита TXEN и CREN.

Биты TX9 и RX9 необходимо установить в 0 чтобы работать в 8-битном режиме. Если возникнет острая необходимость в высокой стабильности связи, то тогда целесообразным выглядит использование 9-битного режима.

На этом настройка модуля UART у нас будет закончена и он будет готов к функционированию.

Передача данных с помощью UART

Для передачи данных с помощью модуля UART может быть использована следующая функция:

Когда модуль UART инициализирован для работы, то любое значение, которое будет загружено в регистр TXREG, будет передаваться через UART (последовательную связь), но передачи могут частично перекрываться. Чтобы этого не происходило мы должны всегда проверять флаг прерываний передачи TXIF (Transmission Interrupt flag). Только если этот флаг находится в состоянии low, мы можем начать передачу следующего бита, иначе мы должны подождать пока состояние этого флага не станет low.

Представленная выше функция может быть использована только для передачи одного байта данных, чтобы передать строку данных необходимо использовать следующую функцию:

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

Как вы можете видеть из кода представленной функции мы в ней функцию UART_send_char() вызываем многократно, внутри цикла. Фактически мы разделяем строку на отдельные символы, и каждый символ передаем отдельно, помещая его в регистр TXREG.

Прием данных с помощью UART

Следующая функция может быть использована для приема данных с помощью модуля UART.

Когда модуль UART принимает данные он сохраняет их в регистре RCREG, после чего мы их можем передать в любую переменную и затем использовать по своему усмотрению. Но возможны частичные перекрытия в приеме данных и из этого ошибки приема в случае когда данные передаются непрерывно и мы не успеваем переписать их в переменную. В этом случае нам на помощь приходит флаг приема RCIF. Данный бит будет в состоянии low всегда, когда данные уже приняты, но еще не обработаны. Поэтому мы в цикле, проверяя значение данного флага, сможем создать задержку, необходимую для завершения обработки принятых данных.

Включение/выключение светодиода в зависимости от принятых по UART данных

В финальной части нашей программы, в функции void main(void) мы будем включать/выключать светодиод в зависимости от команд, передаваемых компьютером нашему микроконтроллеру PIC с помощью последовательной связи.

Когда с компьютера мы будем передавать символ “1” светодиод будет включаться и от микроконтроллера PIC компьютеру в обратную сторону будет передаваться сообщение “RED LED -> ON”.

Аналогичным образом, когда с компьютера мы будем передавать символ “0” светодиод будет выключаться и от микроконтроллера PIC компьютеру в обратную сторону будет передаваться сообщение “RED LED -> OFF”.

Симуляция работы программы

Мы произвели тестирование работы программы в симуляторе proteus. Внешний вид схемы нашего проекта в симуляторе proteus показан на следующем рисунке.

Внешний вид схемы нашего проекта в симуляторе proteus

На представленном рисунке также показан виртуальный терминал, который показывает приветственное сообщение и состояние светодиода. Светодиод красного цвета подключен к контакту RB3. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

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

Для тестирования работы проекта мы подключили перфорированную плату с нашим микроконтроллером PIC тремя проводами к конвертеру RS232 в USB, а конвертер подключили к компьютеру с помощью USB кабеля как показано на следующих рисунках.

Внешний вид собранной конструкции нашего проекта (вид сверху)

Внешний вид собранной конструкции нашего проекта (вид сбоку)

После этого мы установили на компьютер программу Hyper Terminal и запустили ее на выполнение.

Внешний вид запущенной программы Hyper Terminal

После этого откройте диспетчер устройств на своем компьютере и проверьте к какому COM порту подключился ваш конвертер, в нашем случае это оказался COM port 17 как показано на следующем рисунке. У вас это может быть другой номер порта.

Просмотр в диспетчере устройств используемого COM порта

После этого вернитесь в программу Hyper Terminal и выберите в ней пункт меню Set Up -> Port Configuration (или нажмите Alt+C), в открывшемся всплывающем окне выберите необходимый COM порт (COM17 в нашем случае) и нажмите на кнопку connect.

Выбор необходимого COM порта в программе Hyper Terminal

После того как соединение с вашим микроконтроллером PIC будет установлено вы на экране компьютера должны увидеть примерно следующую картину.

Внешний вид окна программы Hyper Terminal после соединения с микроконтроллером PIC

Поместите курсор в окно команд (Command Window), введите цифру 1 и затем нажмите на enter. Светодиод включится и на экране появится сообщение о том, что он включен.

Включение светодиода с помощью программы Hyper Terminal

Аналогичным образом, поместите курсор в окно команд (Command Window), введите цифру 0 и затем нажмите на enter. Светодиод выключится и на экране появится сообщение о том, что он выключен.

Выключение светодиода с помощью программы Hyper Terminal

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

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

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

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

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