§ 49. Спряжение PIC16F877 с ПК через COM порт (Часть 1)
|
Иванов Дмитрий, Апрель 2007
|
Статья обновлена 26 Мая 2014
|
|
В этой и следующей статье мы рассмотрим как можно подключить микроконтроллер к компьютеру через COM порт и с помощью программы для ПК обмениваться информацией с МК
|
Принцип функционирования будет следующим: с помощью программы на ПК отсылаем число в диапозоне 0-255. PIC16F877 принимает это число через COM к которому он подключен и отображает его на светодиодах через свой порт B. Для того чтобы показать как можно передать данные из МК в ПК сделаем следующее. Если в МК поступает какое-то определенное число, например 100, то МК отсылает обратно содержимое его порта D. Т.е. можно будет снаружи МК установить на выводах порта D 0 или 1 и это состояние мы получим в ПК. Я думаю вполне интересная задача. Давайте к ней приступим. В первой части займемся программой для МК и всем железом".
Рассмотрим код для МК (готовый проект можно найти в файлах к этой статье). В начале работы программы идет целая куча настроек регистров, и не мудрено - последовательный порт - это не простая штука. Первым делом мы загружаем в регистр SPBRG число 31. Что значит? Это значит, что мы настраиваем USART МК для работы с кварцем на 20 МГц и при скорости обмена в 9600 бит/сек. Подробнее советую посмотреть не раз упонимавшийся в этом разделе файл описания МК PIC16F877. TXEN=1 - разрешаем передачу данных через последовательный порт. CREN=1 - разрешаем прием данных через последовательный порт. SPEN=1 - включаем модуль USART МК. SYNC=0 - переводим USART в асинхронный режим (информационный обмен идет по двум линиям без использования дополнительных синхронизирующих линий). Далее идет упоминание о неком RCIF. Это спец. бит, который МК устанавливает сам в еденицу, если на вход его последовательного порта пришел символ. Мы его в начале программы сбрасываем программно, чтоб не возникло недоразумений при начале работы. Далее настраиваем порт B на выход, а порт D - на вход и записываем в них в начеле работы программы 0. Потом стартуем бесконечный цикл. Внутри его делаем следующее: если RCIF равен 1 (т.е. на входе USART есть доступная информация). Записываем в порт B байт данных, который после приема его МК помещаемся в регистре RCREG. Далее проверяем, а не зарание ли оговоренное число к нам пришло. Если это так (100) то мы помещаем в регистр TXREG содержимое порта D. TXREG это регистр USART, по поступлении в него данных происходит передача этого байта из МК "наружу". Потом сбрасываем бит RCIF, чтобы быть готовым к приему следующего символа.
#include <pic.h>
__CONFIG(0x03F72);
void main(void)
{
SPBRG=31;
TXEN=1;
CREN=1;
SPEN=1;
SYNC=0;
RCIF=0;
TRISB=0;
PORTB=0;
TRISD=1;
PORTD=0;
while(1==1)
{
if(RCIF)
{
PORTB=RCREG;
if(PORTB==100)
{
TXREG=PORTD;
}
RCIF=0;
}
}
}
Теперь займемся "железом". Чтоб подключить МК к COM порту ПК потребуется дополнительная "обвеска" в виде преобразоваетля сигналов протокола RS232 в уровни TTL и обратно. Этот преобразователь выполнен на основе микросхемы MAX232. COM порт ПК соединен с МК нульмодемным кабелем, т.е. у него линии Tx / Rx перекрещенны.

А вот и практическая реализация этой схемы. Обратите внимание на длинный оранжевый провод с правой стороны схемы. Это я второй бит порта D устанавливаю в 1 снаружи (просто +5 В подаю на него). Теперь если прочесть содержимое порта в МК то получим число 00000100 в двоичной системе (если провод убрать то будет 0). Именно такое значение МК отправит в ПК через порт если к нему на вход поступит число 100 из программы на ПК.

В следующей статье мы займемся программой для ПК.
© Иванов Дмитрий
Апрель 2007
http://www.kernelchip.ru