Как связать микроконтроллер и компьютер по каналу rs-232

Программа обмена по RS-232 на языке C# в среде Microsoft Visual Studio

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

Мне приходилось программировать в Turbo Pascal, затем в Delphi и, наконец, в Borland C++ Builder 6.0. Все они были по-своему интересны и полезны. Однако сейчас становятся популярны новые среды программирования, и надо не отставать от других пользователей в их освоении. Как мне кажется, наиболее перспективной является среда Microsoft Visual Studio 2010 (сокращенно MSVS2010) и программирование на языке C# (си шарп). Некоторые скажут зачем, но как поговариваю: летчик должен уметь летать на всем что летает, и немного на том, что не летает, если он конечно профессионал.
Книг по среде Microsoft Visual Studio 2010 и языку C# достаточно, учебные и пробные версии ПО можно найти в интернете, так что можно смело начинать.

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

Содержание / Contents

  • 1 А что же внутри программы, каков исходный код?
  • 2 Файлы
  • 3 Немного о себе

То есть используя данную программу можно обмениваться через СОМ1 со скоростью 9600 бит/с, что вполне достаточно для многих приложений при работе с микроконтроллерами.

↑ А что же внутри программы, каков исходный код?

Рассмотрим некоторые особенности и функции кода в этом файле Form1.cs.
В самом начале файла, основные подключения через директивы using, без которых ничего работать не будет. Последние из них, что с комментариями, необходимы для работы с СОМ портом и таймером. По поводу таймера, СОМ порт может обходиться и без него, таймер добавлен для последующего улучшения пользовательского интерфейса.

Создание СОМ порта обеспечивают следующие строки в class Form1. Здесь же видно, что обмениваться данными будем через СОМ1, но легко можно задать и другие.

Кстати, если скорость и другие параметры не устраивают, то их меняем подобно следующему:

В основной функции public Form1() четыре строки. Первая формирует основную форму с кнопками и окошками, это стандартная строка, которая всегда создается автоматически. Следующие две строки создают обработчик прерываний для обменов по СОМ порту и отрывают сам СОМ порт. Четвертая строка выводит шаблон из шести байт в окно выдачи, к которому можно сделать привязку и, конечно, изменить.

В обработчике приема void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) имеется две строки, одна в самом начале, а другая в конце. Эти строки необходимы для синхронизаций, их обязательно надо применять. Управление передается обработчику, как только во входном буфере СОМ порта появляются принятые данные. Для считывания данных применяется следующие три строки. Здесь принятые коды считываются в байтовый буфер buffer.

Очередные следующие за ними три строки выводят данные в окно «Принятый код». Таким образом, в этом обработчике осуществляется прием по RS-232 и побайтный вывод принятого кода, а между байтами вставляются пробелы, что улучшает их обзор.

В обработчике выдачи private void button1_Click(object sender, EventArgs e), который запускается по кнопке «Выдать», осуществляются следующие действия. Проверяется, все ли символы в окне «Код выдачи» принадлежат 16-ричной системе счисления. Для этого используются первые двадцать строк кода, а при ошибке выводится сообщение через MessageBox.Show. Затем осуществляется собственно сама выдача, для этого применены следующие строки:

Где в последней строке, bytes – это сам подготовленный массив байт для выдачи, а bytes.Length – число выдаваемых в СОМ порт байт. Данный обработчик использует еще функцию private byte STB(char ch), служащую для преобразования знаковых символов в числа.

При нажатии кнопок «Очистить» работают обработчики private void button3_Click(object sender, EventArgs e) и private void button2_Click(object sender, EventArgs e), основная задача которых очистка окон приема и выдачи.
Вот такая небольшая программка.

↑ Файлы

В архиве проект на языке C# в среде Microsoft Visual Studio 2010 и готовый файл PR14_RS-232.exe
▼ PR14_RS-232.zip 52,1 Kb ⇣ 144

↑ Немного о себе

Я занимаюсь схемо-техникой с применением микроконтроллеров. Их было у меня достаточно много: это Intel 8080, 8051, 196, Atmel AT90, AVR, ATtiny и megaAVR, Silabs, а также NiosII. Их я программировал на ассемблере и С, и связывал с персональным компьютером по интерфейсу RS-232 на подобных программах, ну и с более сложным функционалом.

Камрад, рассмотри датагорские рекомендации

Полезные и проверенные железяки, можно брать

Куплено и опробовано читателями или в лаборатории редакции.

Как связать микроконтроллер и компьютер по каналу rs-232

Текущее время: Пт июл 30, 2021 01:23:01

Часовой пояс: UTC + 3 часа

Как организовать связь по RS232 между микроконтроллёром и ПК

Страница 1 из 1 [ Сообщений: 12 ]

здравствуйте! Итак для того чтобы передать любой массив данных необходимо создать протокол обмена.
Что это такое. Это взаимодействие двух приложений по определённым правилам. Первая программа это терминальное окно на компьютере. В которое пишут сообщения в виде пакета данных. Пример: #kmr01%. Это сообщение(пакет) состоит из 7 символов в ASCII. Суть заключается в следующем. Этот пакет имеет формат. Это первый символ ‘#’ и последний ‘%’.(Символы можно брать произвольные кроме тех, что внутри пакета). Итак внутри пакета находится тело сообщения. Его размер желательно брать не большим. В этом примере второй символ ‘k’ указывает, что это команда. Третий ‘m’- работа с памятью. И четвертый ‘r’ — чтение из памяти. А два последний символа ’01’ — это собственно адрес той ячейки памяти которую мы хотим прочитать. Так вот когда такое сообщение приходит в микроконтроллер. Оно (тело сообщения без символов ‘#’ и ‘%’) помещается в буфер приёма сообщения. После чего выставляется признак(флаг), что сообщение пришло. И другая подпрограмма начинает обрабатывать это сообщение.
Есть один момент при обработке тела сообщения это адрес ’01’ он передан в ASCII. Железяка ASCII не понимает. Нужен переводчик из ASCII в BIN(бинарный код).
Пример процедуры преобразования для PIC контроллёров.

= A?
subwf R5,f
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ — вычтем 30
subwf R7,f
goto $+3
movlw 0x37 ;ДА — вычтем 37
subwf R7,f
swapf R7 ;Переносим в старшую тетраду

movlw 0x41 ;Это >= A?
subwf R6,f
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ — вычтем 30
subwf R8,w
goto $+3
movlw 0x37 ;ДА — вычтем 37
subwf R8,w
iorwf R7,w ;Результат преобразования в аккумуляторе
return

пример кода для AVR микроконтроллёров.

=’A’?
brsh PC+3
subi temp0,0x30 ;НЕТ — вычтем 0x30
rjmp PC+2
subi temp0,0x37 ;ДА — вычтем 0x37
swap temp0

cpi temp1,’A’ ;Это >=’A’?
brsh PC+3
subi temp1,0x30 ;НЕТ — вычтем 0x30
rjmp PC+2
subi temp1,0x37 ;ДА — вычтем 0x37

or temp0,temp1 ;Результат в temp0
ret

Суть преобразования из ASCII и BIN такова. Допустим нам надо перевести ’01’ ASCII в ’01’ BIN. ’01’ в HEXe это ‘3031’. Это занимает два байта. А нам нужен один байт но с той же по смыслу информацией ’01’. Нам надо получить так, что в HEXe эта информация была представлена не как ‘3031’, а ’01’. Для этого необходимо вычесть из каждого байта 30 или 37 в зависимости от информации которую несёт один байт данных. А полученные результаты сгруппировать в один байт.

Дело в том что персональный компьютер не понимает другой формат данных. И для использования терминальных окон или других программ осуществляющих обмен данными по интерфейсам необходимо преобразование одного формата в другой. Тобиш из терминальной программы ми отправляем в формате ASCII. Но эти данные не понятны микроконтроллеру. Поэтому в микроконтроллере легче всего осуществить такое преобразование. А при отправка из микроконтроллера в компьютер необходимо обратное преобразование из бинарного в ASCI.

= A?
subwf R5,w
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ — прибавим 30
addwf R5,f
goto $+3
movlw 0x37 ;ДА — прибавим 37
addwf R5,f

movfw R6 ;Берём следующюю тетраду

movlw 0x0A ;Это >= A?
subwf R6,w
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ — прибавим 30
addwf R6,f
goto $+3
movlw 0x37 ;ДА — прибавим 37
addwf R6,f ;Результат преобразования в R5 и R6

;Подпрограмма преобразования BIN в ASCII для AVR микроконтроллеров
BIN_ASCII:
mov temp1,temp0 ;Дублируем байт
swap temp1
andi temp0,0x0F ;Выделяем младшие тетрады
andi temp1,0x0F
push temp1 ;Прячем в стек

cpi temp0,0x0A ;Это >=’A’?
brsh PC+4
ldi temp1,0x30
add temp0,temp1 ;НЕТ — прибавим 0x30
rjmp PC+3
ldi temp1,0x37
add temp0,temp1 ;ДА — прибавим 0x37
pop temp1 ;Востанавливаем из стека
push temp0 ;Прячем в стек

cpi temp1,0x0A ;Это >=’A’?
brsh PC+4
ldi temp0,0x30
add temp1,temp0 ;НЕТ — прибавим 0x30
rjmp PC+3
ldi temp0,0x37
add temp1,temp0 ;ДА — прибавим 0x37
pop temp0 ;Востанавливаем из стека
ret

AVR Урок 14. USART. Связь МК с ПК. Часть 1

Урок 14

USART. Связь МК с ПК

Сегодня мы начнём изучение программирования очень интересного интерфейса – это интерфейс USART.

USART (Universal Synchronous-Asynchronous Receiver-Transmitter (универсальный синхронно-асинхронный приемопередатчик)) – это такая последовательная шина, понодуплексовый обменный интерфейс, который необходим для «общения» между собой двух устройств. Как правило используется для обмена данными между устройствами на контроллерах и ПК. Но вполне подходит и для связи между двумя микроконтроллерами, а также для связи любых устройств, где данная шина поддерживается.

Также USART называют UART (Universal Asynchronous Receiver-Transmitter (универсальный асинхронный приемопередатчик)), как он до какой-то поры и назывался. Просто во второй аббривиатуре отсутствует синхронизация. До появления синхронного UARTа шел обмен только по двум проводам, а потом в данный интерфейс добавили ещё шину синхронизации. Но до сих пор большинство программистов её не исползуют, Данные и так нормально доходят. Достигается это равенством скоростей на приёмном и передающим устройстве а также некотроыми определёнными битами в протоколе.

Вот таким образом данный интерфейс организован в микроконтроллере Atmega8

Как мы видим из данной структурной схемы, в USART используются три основных выхода RxD, TxD и XCK.

RxD – это ножка для приема информации.

TxD – ножка для передачи информации.

XCK – ножка синхронизации.

Так как мы не будем использовать синхронный режим, то третью ножку мы не подключаем.

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

Также для использования интерфейса мы обязаны знать, какие собственно ножки контроллера Atmega8 отвечают за каждый выход USART. Таких ножек всего две (ножку синхронизации не используем)

Это ножки 2 и 3. Мы, конечно, можем использовать и другие ножки, но это уже будет программный USART, никак не связанный с тем, который мы рассматриваем. Аппаратный. как известно, всегда лучше по всем показателям.

Как же мы можем связать между собой по интерфейсу USART два устройства? Два устройства связываются посредством прямого подключения ножки TxD одного устройства к ножке RxD другого и, наоборот, Ножку RxD одного устройства мы подключаем к ножке TxD другого. То есть данные с выхода одного устройства попадают во вход другого и наоборот. Всё это можно наглядно представить в виде вот такой схемы

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

Данные прерывания происходят в случае когда закончен приём или передача данных, либо когда опустеет регистр данных.

Тепрь давайте рассмотрим, как именно передаются данные по шине USART. Обычно это называют протоколом интерфейса

В принципе, протокол USART не такой и сложный, но учитывая то, что мы с вами вообще пока не рассматривали ни один последовательный интерфейс, всё равно разобраться будет стоить некоторого напряжения по сравнению с параллельным, который мы рассматривали с вами в уроке 12, когда подключали модуль символьного дисплея.

Те биты, обозначения которых даны в фигурных скобках, могут не использоваться при определённых режимах.

В начале диаграммы мы видим, что когда шина не используется и данные по определённому проводу не передаются или не принимаются в зависимости от назначения контакта, то данный контакт находится в высоком состоянии. Как ещё принято говорить, что пассивное состояние на шине высокое. Дальше идёт обязательный стартовый бит. Как видим, он направлен вниз, то есть в это время контакт переходит из высокого состояния в низкое. Сколько времени длиться данный бит, подсчитать немудрено. Нужно 1 секунду разделить на скорость, установленную для передачи и приёма данных, которая измеряется в битах в секунду ну или, как ещё называют, в бодах.После того, как время стопового бита истечёт, конроллер будет считать следующие биты информационными. Их может быть от пяти до девяти в зависимости от режима. Вообще, чаще всего используется именно 8, так как удобнее всего данные передавать байтами. Ну здесь уже состояние ножки во время передачи определённого информационного бита будет диктоваться собственно самим информационным битом. То есть если надо передать единицу – то высокое, если ноль – низкое. Важно заметить также что передача информационных битов начинается с самого младшего, и затем более старшие.

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

Затем идут стоповые биты, гласящие о том, что передача посылки закончена. Данных битов может быть один или два также в зависимости от режима. Данные биты передаются с помощью организации высокого логического состояния на ножке. И затем процесс повторяется сначала, то есть передаём следующую посылку.

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

Так как мы синхронный режим не рассматриваем, нас интересуют две верхние строки. Вторая колонка – это расчет скорости в зависимости от частоты тактирования и значения регистра UBRR, а третья – то же самое уравнение, только преобразованное для вычисления необходимого значения UBRR в зависимости от частоты тактирования и нужной скорости шины. Соответственно, скорость шины USART должна быть универсальная и придерживаться определённых стандартов. Но так как в результате деления, мы не можем получить строго определённую скорость, мы же не можем заносить дробные значения в регистр, то существует определённый процент ошибок. Но, как правило, этих ошибок не происходит за счёт как раз стоповых и стартовых битов, в это время идёт поправка.

Теперь различие в таблице первой и второй строки. Существует ещё бит U2X в определённом регистре, который при нулевом значении никак не влияет на скорость обмена, а при значении 1 он скорость удваивает. За счёт этого в формуле в знаменателе будет уже не 16, а 8.

Несмотря на поправку за счет стоповых и стартовых битов, следует стараться выбирать величину значения регистра UBRR и бита U2X так, чтобы процент был меньшим. Поможет нав в этом ещё одна таблица из технической документации на контроллер (нажимайте на картинки для увеличения изображения)

Ну вот мы потихоньку немного разобрались с шиной USART, с её протоколами и немного уже коснулись её организации в контроллере и некоторых регистров, за эту шину отвечающих.

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

Программатор и переходник USB-TTL можно приобрести здесь:

Смотреть ВИДЕОУРОК (нажмите на картинку)

Задача

Связать микроконтроллер с компьютером. Микроконтроллер должен принимать по USART`у символ, отображать его на LCD и отвечать компьютеру “Ok”.

Аппаратная часть

Программная часть

Функция инициализации
Функция отправки символа
Функция чтения приемного буфера

И одна для обработки прерывания USART`а:

Обработчик прерывания по завершению приема

Функция инициализации

//инициализация usart`a
void USART_Init( void )
<
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
//разр. прерыв при приеме, разр приема, разр передачи.
UCSRB = (1 //обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1 //разр. прерывания при приеме, разр. приема, разр. передачи
UCSRB = (1 //обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1 //скорость обмена 9600 бод

UCSRA

Функция посылающая символ

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

Функция чтения приемного буфера

//чтение буфера
unsigned char USART_GetChar( void )
<
unsigned char tmp = usartRxBuf;
usartRxBuf = 0;
return tmp;
>

Копируем значение буфера в локальную переменную, очищаем его. Локальную переменную возвращаем.

Необходимый минимум готов. Оформляем его в виде программного модуля.

Основная программа

Основная программа будет выглядеть так. Надеюсь дополнительных комментариев она не требует.

//*****************************************
// Author(s). Pashgan http://ChipEnable.Ru
// Target(s). ATMega8535
// Compiler. IAR EWA 5.11A
// Description.: UART/USART. Получение первых результатов
//******************************************
#include
#include «lcd_lib.h»
#include «usart.h»

int main( void )
<
unsigned char sym;

USART_Init();
LCD_Init();
__enable_interrupt ();
LCD_SendString(«uart:»);

while (1) <
sym = USART_GetChar(); //читаем буфер
if (sym) < //если что-то приняли, то
LCD_Goto(6,0);
LCD_WriteData(sym); //отображаем на lcd принятый символ
USART_SendChar(‘O’); //отвечаем компу «Ok »
USART_SendChar(‘k’);
USART_SendChar(‘ ‘);
>
>
return 0;
>

Для проверки результатов работы микроконтроллера потребуется программа — терминал. Вы можете скачать ее в разделе полезный софт. Если лень собирать схему и возиться с реальным железом, можно проверить программу в Proteus`e.

Файлы

Related items

  • Библиотека для опроса кнопок
  • Работа с SD картой. Воспроизведение wav файла. Ч3
  • Работа с SD картой. Подключение к микроконтроллеру. Ч1
  • AVR315: Использование TWI модуля в качестве ведущего I2C устройства
  • ATtiny10. Самый маленький микроконтроллер AVR

Comments

Dim chr As String

Private Sub ATmega8_OnComm()
Select Case ATmega8.CommEvent
Case comEvReceive
chr = ATmega8.Input
‘Здесь уже кому что надо
End Select
End Sub

Подключать на прямую без МАХ232 но лучше FT232BM заменить на FT232RL. У RL обвязки никакой не надо там всего 2 конденсатора по питанию достаточно (а цена одинаковая).

К стати не соединяйте Экран USB разъемов с землей, FT232 к этому очень чувствительна и может начать сбоить(типа устройство не опознано) На ноутбуке этого не будет на на стационарном компе может получится.
Я очень долго с этим мучился.
К стати спасибо за доходчивое объяснения)))

присоединяюсь к вопросу- как проверить полученный символ? вот так-
if (data==’A’)
<
stat=1;
>
if (data==’B’)
<
stat=0;
>
while (stat)

Так же как и в примере
Code:
sym = USART_GetChar(); //читаем буфер
if (sym) < //если что-то приняли, то
LCD_Goto(6,0);
LCD_WriteData(sym); //отображаем на lcd принятый символ
USART_SendChar(‘O’); //отвечаем компу «Ok »
USART_SendChar(‘k’);
USART_SendChar(‘ ‘);
>

Если не получается, то может быть скорость неправильно настроена.

Code:
sym = USART_GetChar(); //читаем буфер
if (sym)< //если что-то приняли, то

Если не получается, то может быть скорость неправильно настроена.

Делаю вроде по аналогии, но без дисплея. На переходнике USB-UART светодиод моргает — символ отправлен. но Ок нет =( Земля и от LPT программатора и от переходника подключены, питание есть, но молчок

кристалл mega8515, скорость 9600, частота 8000000

Code:
UBRRH=0;
UBRRL=51; //скорость обмена 9600 бод
UCSRB=(1

поменял на:
1843200 hz, 115200 бод, плучилось 0

светодиоды на переходнике горят оба — символ отправлен и что-то принято, но в одном терминале (keterm) отобраюжаются буквы, в другом SimpleTerm — вопросы, в третьем Advanced Serial Port Monitor — те же буквы. В терминалах выбирал 115200 бод.

Например так:
Code:
#define RX_BUFFER_SIZE 100
volatile uint8_t RxBuffer[RX_BUFFER_SIZE];
volatile uint8_t RxNext, RxFirst;
ISR(USARTC0_RXC_vect)
<
uint8_t rx_next=RxNext;
RxBuffer[rx_next]=USARTC0.DATA;
if (++rx_next>=RX_BUFFER_SIZE)
rx_next=0;
RxNext=rx_next;
>

void UsartReceive()
<
uint8_t rx_first=RxFirst, rx_next=RxNext;
while (rx_first!=rx_next) <
uint8_t new_byte=RxBuffer[rx_first];
// обработка данных
//
if (++rx_first>=RX_BUFFER_SIZE)
rx_first=0;
>
RxFirst=rx_first;
>

Здравствуйте Pashgan, собрал Вашу схему на mega8515 немного поменял код — все отлично работает. Пошел дальше сделал программу на ПК которая отсылает побайтно содержимое бинарника и сразу столкнулся с проблемой: программа не принимает 0х00 и виснет, так как от контроллера нет ответа. Я попытался в файле usart.c в прерывании подписать еще одну переменную, которая принимает значение 1 при событии приема байта. Вообще корректно ли так делать или нет? С++ начал учить совсем недавно. Далее, попытался переделать функцию USART_GetChar на возвращение структуры состоящей из двух символов буфера и флага приема байта. Пытался компилировать в CVAVR но ни чего не получилось — вообще не пойму в чем проблема вот код
Code:
#include «usart.h»
//однобайтный буфер
volatile unsigned char usartRxBuf = 0;
unsigned char fl = 0;
struct my_strct ;
#define RXCIE 7
#define RXEN 4
#define TXEN 3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1

//инициализация usart`a
void USART_Init(void)
<
UBRRH = 0;
UBRRL = 71; //скорость обмена 9600 бод для 11,0592МГц в даташите
UCSRB = (1

Как связать микроконтроллер и компьютер по каналу rs-232

Мигание светодиодами это конечно здорово, но хочется двигаться дальше узнавая что-то новое. Сегодня мы будем подключать наш микроконтроллер к компьютеру и пробовать управлять нашим устройством. Делается это в основном помощью интерфейса передачи данных RS232.

Предыстория

RS232 был разработан сравнительно давно и предназначается для связи двух устройств между собой, одно из которых является терминалом, а другое коммуникационным устройством. В роли этих двух устройств могут выступать микроконтроллеры, компьютеры, модули, микросхемы памяти и т.д. и т.п. Но все же чаще всего в роли терминала выступает персональный компьютер. Устройства в RS232 соединяются друг с другом посредством кабеля с двумя видами разъемов типа D-sub: 9-ти или 25-ти контактный. В начале использовался только 25-ти контактный разьем, но из-за того что многие устройства не использовали половину контактов стандарт изменили и стало возможным применение 9-ти контактного разьема DE9.

Наименование контактов интерфейсного разьема DE9 (COM)

Определение несущей (Carrie Detect)

Для подключения внешних устройств вроде микроконтроллера используют трехпроводную связь RXD, TXD и GND. Для расширения функциональности иногда задействуют дополнительные линий RTS и CTS. Можно конечно заморочится и задействовать все контакты, но это является лишним и на практике такое подключение чаще всего используется при подключении модема к компьютеру.

Сейчас, в связи с активным продвижением интерфейса USB, RS232 отходит на второй план, только некоторые материнские платы продолжают комплектоваться COM-разьемом. Если на вашем компьютере сзади нет такого вот выхода:

то помимо модемного кабеля вам нужно будет купить переходник USB -> COM.

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

Итак приступим.

Создаем в MPLAB пустой проект как это мы делали в предыдущих статьях. Открываем даташит на главе Универсальный синхронно-асинхронный приемо передатчик (USART) и пытаемся понять что там написано.

Как вы уже знаете место между «void main(void)» и «while(1)» это область начальной настройки микроконтроллера, сюда мы и вписываем все необходимые значения регистров управления. В первую очередь настроим выводы порта C так как именно он участвует в работе модуля USART.

Насчет обнуления я уже говорил так что поднимать эту тему еще раз не имеет смысла, а вот значение первой строки я взял из текста в даташите. Если вы внимательно читали его, то увидели: «для корректной работы модуля USART необходимо выводы и порта С перевести в режим входа подав на соответсвующие биты логическую «1». Если этого не сделать то можно часами просиживать возле компьютера в поиске ответа — «почему же схема собранная как по написанному все равно не работает?».

Далее настраиваем регистры управления модуля USART.

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

И наконец к написанным ранее строкам настройки прерываний добавляем команду включения прерывания от модуля USART.

а в обработчик прерываний следующий блок:

Все данные, которые приходят на микроконтроллер, записываются в регистр RCREG. Регистр 8-ми битный, в нем помещается только один символ, поэтому новые символы, пришедшие в микроконтроллер затирают уже принятые. Так что оперировать регистром RCREG как переменной нет смысла, компилятор ошибок не покажет, а вот логика работы программы будет хромать и принимать мы будем совсем не то что должны. Лучше всего в обработчике прерывания содержимое приемника переприсвоить в любую другую переменную и уже с ней работать, ожидая новой посылки. В основном информационный обмен между устройствами не ограничивается только одним байтом (символом), поэтому разработчики идут на разного рода ухищрения — придумывают протоколы обмена, вводят символы конца и начала сообщения (блока) и т.д. На первое время мы ограничимся приемом только одного символа:

где Buffer это наша переменная содержащая очередной принятый байт (символ). Кстати, не забудьте ее объявить в начале программы:

Теперь загружаем PROTEUS и смотрим как все работает. Для схемы вам понадобятся:

  1. PIC16F877A (Category — Microprocessor ICS, Sub-category — PIC16 Family);
  2. Button (Category — Switches & Relays, Sub-category — Switches);
  3. Resistor 10k (Category — Resistors, Sub-category — 0.6W Metal Film (хотя на самом деле пофиг каким он будет));
  4. Capacitor 22p (Category — Capacitors, Sub-category — Ceramic Disc);
  5. Cristal 20MHz (Category — Miscellaneous, Sub-category — All) Частоту кварца, как вы помните, надо настраивать в свойствах самого кварца;
  6. Virtual Terminal;
  7. Terminal Mode — Power;
  8. Terminal Mode — Ground.

В конечном счете должно получиться следующее:

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

либо каким то образом его обрабатывать и пересылать обратно на терминал:

Моя цель просто показать что и куда записывать, как включать и т.д. написание сложных процедур и замысловатых функций оставляю вашей музе и фантазии. Во всяком случае пока.

Как связать микроконтроллер и компьютер по каналу rs-232

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

Проблема соединения микроконтроллера и компьютера в разные времена решалась по-разному. В достопамятные времена, когда царствовали компьютеры под названием PC XT одним из простых и эффективных способов подключить свое собственное устройство к такому компьютеру было самостоятельное изготовление нестандартного внутреннего модуля, который вставлялся в используемую тогда шину ISA внутри корпуса компьютера на материнскую плату. Шина ISA в те времена использовалась для подключения всех устройств расширения, таких как видеокарты, модули дополнительной памяти, контроллеры жестких дисков и т.п. Разъем для подключения к такой шине можно было при определенной сноровке, изготовить самостоятельно. Он представлял собой просто выступ печатной платы вашего вставного модуля с дорожками вместо контактов. Логика работы шины так же была не сложная и позволяла подключиться к ней, используя несложные схемы на цифровых элементах средней интеграции. Эти времена давно прошли. В настоящее время на смену шине ISA давно пришла новая шина, под названием PCI. В ней используются гораздо более мелкие контактные площадки и логика ее работы тоже гораздо сложнее. Теперь для подключения внешних устройств нам приходится использовать один из стандартных интерфейсов ввода вывода. Если отбросить такие сложные в реализации варианты, как подключение по ИК порту или по Bluetooth (БлюТуз), то остается только три варианта: подключение по LPT, подключение при помощи COM-порта и наконец, подключение по USB. Рассмотрим все эти варианты по порядку.

Подключение при помощи LPT порта

Это самый старый и самый простой с точки зрения программной и аппаратной реализации способ. Дело в том, что LPT порт компьютера устроен таким образом, что позволяет легко напрямую программным путем управлять всеми его выходами и читать информацию со всех его входов. Стандартный LPT порт имеет 8 линий шины данных, которые могут работать как входы и как выходы, четыре выхода управления, и пять входов для служебных сигналов. Если вы подключаете к порту свое собственное микропроцессорное устройство, то использовать линии порта по назначению вовсе не обязательно. Все его входы и все выходы, как основные, так и служебные, вы можете использовать по своему усмотрению. В результате вы получаете интерфейс, протокол работы которого который вы можете разрабатывать по своему усмотрению. Вы можете так же программным путем реализовать некоторые стандартные протоколы. Например, программатор PonyProg, описанный в книге [1] при работе с LPT портом программно реализует последовательный канал связи SPI. Это один из протоколов, при помощи которого можно «прошить» программу в микроконтроллер AVR.
Использование LPT для связи с компьютером имеет и свои недостатки:
Во-первых, современные операционные системы, в частности, последние версии Windows XP и тем более Vista защищают LPT порт от прямого доступа со стороны пользовательских программ. Поэтому написание программ, работающих с LPT крайне усложняется. Во-вторых, LPT порты просто выходят из употребления. Все современные принтеры уже сейчас подключаются только по USB. В ноутбуках уже стало стандартом отсутствие как LPT, так и COM портов. Скоро их перестанут устанавливать и в стационарных компьютерах.

Подключение при помощи COM порта

Это более новый, хотя тоже уже отмирающий способ. Так же, как LPT последовательные COM порты тоже уже применяются все реже и безусловно в скором времени они выдут из употребления. Работать с COM портом значительно сложнее, чем с LPT. Стандартный COM порт имеет гораздо меньше выводов. И прямое управление возможно лишь некоторыми из них. Использовать их не имеет смысла. Лучше тогда уж воспользоваться более богатым в этом смысле портом LPT. Передача информации в COM порте происходит всего по двум линиям. Это линия RxD (прием данных), и линия TxD (передача данных). Для передачи данных используется специальный протокол, который называется RS232. Большинство современных микроконтроллеров имеют встроенный интерфейс, совместимый с RS232. Это облегчает подключение. Однако есть одна трудность. Полноценный протокол RS232 предусматривает свой собственный стандарт уровней выходных и входных сигналов. Сигнал на выходе TxD COM-порта принимает два значения: логическая единица — плюс 12В, логический ноль — минус 12В. Такой размах принят для уменьшения влияния помех. Такой же сигнал нужно подавать и на вход RxD. Последовательный канал микроконтроллера поддерживает другие значения уровней сигнала. Там сигнал используются стандартные логические уровни. Логический ноль — 0В. Логическая единица — примерно +5В. Поэтому для связи COM порта и микроконтроллера необходимо согласовать уровни сигналов. Для этого обычно применяется специальная микросхема фирмы MAXIM. Это микросхема называется MAX232A. Это очень удобная в использовании микросхема. Она требует лишь одного напряжения питания: +5В. Внутри микросхема содержит два преобразователя, которые используются для получения необходимых для работы напряжений +12В и -12В.

Подключение при помощи USB порта

Несомненно, это самый перспективный способ подключения. В то же время и самый сложный с точки зрения программной реализации. USB порт был специально разработан, как универсальный последовательный порт для подключения всех видов внешних периферийных устройств. При помощи этого порта к компьютеру могут подключаться внешние накопители на жестких дисках и на Флэш-памяти, джойстики, мышки, звуковые системы, WEB-камеры, MP3 плееры и даже внешние TV-тюнеры. Действующий в настоящее время стандарт USB версии 2.0 поддерживает передачу данных со скоростью от 1.5 Мбит/сек до 480 Мбит/сек. Сложность реализации этого способа состоит в том, что протокол USB — это серьезный многоуровневый протокол передачи информации. Самый низкий уровень этого протокола определяет правила касающиеся формирования импульсов: длительность, размах, способ кодирования данных, методы синхронизации, методы проверки ошибок. На низком уровне так же определяется, как биты складываются в байты. Следующий, более высокий уровень касается передачи самих данных. Ведь передаются не просто байты. Из этих байтов складываются команды протокола USB. Протокол USB высокого уровня — это набор команд, позволяющих опрашивать подключенные к порту внешние устройства, запрашивать у этих устройств информацию об их типе, названии, изготовителе, поддерживаемых режимах работы. Если вы работали с USB, то наверно заметили, что при подключении к USB накопителя на жестком диске компьютер тот час же обнаружит его и в списке дисков появится еще один диск. При отключении накопителя от порта он тут же исчезнет из списка. При подключении звукового устройства, в списке звуковых устройств появится новое устройство. Так же происходит и при подключении фотоаппарата, сканера, джойстика и т.п. Все эти типы устройств порт USB распознает автоматически потому, что в списке стандартных команд USB протокола есть команды, позволяющие все это идентифицировать. Поэтому, устройство, подключаемое к компьютеру по USB порту должно уметь поддерживать весь этот протокол. Оно должно правильно отвечать на все запросы компьютера.
Но это не единственная проблема. Более серьезная проблема — слишком высокая скорость работы USB интерфейса. Это так же накладывает определенные ограничения и дополнительные требования. Для подключения микроконтроллера к компьютеру по каналу USB существует три способа. Рассмотрим их по порядку.

Использование микроконтроллера со встроенным аппаратным модулем USB.
Фирма Atmel производит несколько видов подобных микроконтроллеров. Например, AT90USB1287 или AT90USB647. Такой микроконтроллер содержит встроенный аппаратный USB интерфейс. Этот интерфейс берет на себя всю обработку USB протокола, поэтому основное ядро микроконтроллера не загружается этой задачей и может быть занято выполнением своей главной программы. Использование микросхемы со встроенным USB каналом — это самый грамотный подход с точки зрения качества и надежности работы всей системы. Недостаток — большая стоимость таких микроконтроллеров (примерно 25…30 у.е.). Не смотря на наличие аппаратного USB интерфейса, программа, зашитая в микроконтроллер, должна иметь соответствующую процедуру, для управления и настройки этого интерфейса. Создание такого интерфейса требует достаточно серьезных знаний протокола USB.

Использование дополнительной микросхемы — преобразователя USB — RS232.
Такая микросхема производится, например, фирмой Future Technology Devices International Limited (FTDI) и называется FT232RL. Микросхема содержит аппаратный USB интерфейс и интерфейс RS232. Основное назначение микросхемы — преобразование данных, поступающих по USB интерфейсу в формат RS232 и наоборот. Как уже говорилось выше, большинство современных микроконтроллеров имеют встроенный последовательный интерфейс, совместимый с RS232. Поэтому проблема подсоединения решается очень просто. Причем в данном случае даже не нужно заботиться о совместимости по уровню сигналов. В микросхеме FT232RL , так же, как и в микроконтроллере RS232 интерфейс работает с уровнями сигналов 0В … +5В.
Использование отдельной микросхемы, преобразователя USB-RS232 в настоящее время является самым распространенным решением рассматриваемой нами проблемы. Во-первых, это упрощает разработку программного обеспечения, так как работа с RS232 несравненно проще, чем работа с USB. Кроме того, такое решение оптимально по цене. Микросхема FT232RL стоит примерно 8 у.е.

Использование дополнительной микросхемы — преобразователя USB — FIFO
Эта микросхема является дальнейшим совершенствованием предыдущего способа. Примером может служить микросхема FT245R фирмы Future Technology Devices International Ltd. Микросхему удобно применять в том случае, когда микроконтроллер не имеет встроенного последовательного интерфейса, совместимого с RS232. Микросхема FT245R так же, как и в предыдущем случае, эмулирует виртуальный COM порт в компьютере. Однако данные, посланные компьютером в этот порт записываются внутри микросхемы в буфер, работающий по принципу очереди. Такой буфер в вычислительной технике называется буфер FIFO (сокращение от «First In, First Out»: первый вошел, первыйц вышел). Информация хранится в буфере до тех пор, пока не будет считана от туда микроконтроллером. Лоя передачи информации от микроконтроллера в компьютер микросхема FT232RL имеет второй FIFO буфер. Компьютер считывает из этого буфера через тот же самый виртуальный COM порт. Микроконтроллер обменивается информацией с обоими FIFO буферами микросхемы FT232RL посредством простой восьмиразрядной шины. Подробнее об этом способе подключения читайте в специальной статье на нашем сайте. Читать.

Аппаратная реализация USB порта
Это самый дешевый способ подключения микроконтроллера к компьютеру посредством USB. Он предполагает наличие лишь самого контроллера. В качестве линий USB интерфейса используются две любые линии одного из портов ввода-вывода. А весь USB протокол реализуется программным путем. При определенных ухищрениях и при условии использования самого медленного режима передачи информации это оказалось вполне возможным. Однако такой способ подключения имеет массу ограничений. Во-первых, из за того, что микроконтроллер работает на грани своей вычислительной мощности, приходится разделять его работу на цикл обмена информацией по USB и цикл выполнения основной задачи. Одновременно выполнять то и другое не получится. Во-вторых, нестыковка по уровням сигналов. Уровень сигнала логической единицы порта USB должен быть в пределах 3…3,6В. А уровень сигнала порта ввода-вывода микроконтроллера примерно равен его непряжению питания. То есть +5В. Поэтому приходится ухищряться. Например, уменьшать напряжение питания микроконтроллера до 3,5 вольт. А это влечет за собой другие неудобства, возникающие при подключении к микроконтроллеру других внешних элементов. Подробно о аппаратной реализации USB читайте в статье Игоря Чешко из Словакии.

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