Сопряжение с последовательным асинхронным интерфейсом

Схема организации интерфейса RS-232C приведена на рис.5.20.

Контроллер последовательного асинхронного обмена (UART) входит в состав микроконтроллера MCS-51. Он имеет два вывода для организации последовательного обмена – TxD (передаваемые данные) и RxD (принимаемые данные). Контроллер осуществляет преобразование поступающих данных в последовательном коде в параллельный код и обратное преобразование при передаче. Для обеспечения необходимых электрических уровней интерфейса RS232 (-3В…-12В для логической единицы и +3В…+12В для логического нуля) необходим преобразователь уровня (микросхема ADM202), в состав которого входят умножитель напряжения (с использованием внешних конденсаторов) и инвертор напряжения, что позволяет получить необходимые уровни при питании только от +5В.

Рис.5.20. Организация интерфейса RS232C для MCS-51

Процессор обменивается информацией с UART через регистры данных по приему и передаче, имеющих одно имя SBUF. Регистры управления режимом работы последовательного порта (SMOD, SCON, TMOD) задают скорость и формат обмена по порту.

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

Рис.5.21. Часть диаграммы задач работы с последовательным портом

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

Часть диаграммы задач со схемой взаимодействия при обмене информацией через UART приведена на рис.5.22.

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



Взаимодействие обработчика и функций чтения/записи осуществляется только через буфер. Обработчик взаимодействует с последовательным каналом напрямую. Если прерывание вызвано приходом байта по последовательному каналу, то обработчик записывает байт в буфер чтения RFIFO. Если прерывание вызвано окончанием передачи, то обработчик проверяет состояние буфера записи WFIFO, и, если он не пуст, считывает и пересылает следующий байт.

Рис.5.22. Диаграмма задач со схемой их взаимодействия

Функция чтения байта ReadUART() проверяет состояние буфера RFIFO, и если он не пуст, считывает из него байт. Функция WriteUART() записывает байт в буфер записи последовательного канала WFIFO. Если до записи буфер был пуст, необходимо аппаратно вызвать обработчик прерывания, чтобы инициировать передачу данных.

Граф состояний задачи обработчика прерыванийот UART представлен на рис.5.23.

На рисунке введены следующие обозначения:

Q1 – состояние инициализации контроллера UART;

Q2 – состояние ожидания прерывания по приему или передаче;

Q3 – состояние приема байта от UART и запись в приемный буфер;

Q4 – состояние пересылки байта в UART из передающего буфера;

RI, TI – входные сигналы – флаги прерывания, соответственно приемника и передатчика UART.

Описание графа состояний для задачи драйвера обмена по UART.

В состоянии Q2 драйвер ожидает установление флага RI или TI. При установке флага RI осуществляется переход в состояние Q3, а при установке флага TI – в состояние Q4.

В состоянии Q3 производится считывание принятого байта из приемного регистра SBUF и пересылка его в буфер, доступный по чтению для задачи обработки информации. После этого осуществляется возврат в состояние Q2.

Рис.5.23. Граф состояний для задачи обработчика прерываний от UART



В состоянии Q4 производится пересылка байта в передающий регистр SBUF из буфера, доступного по записи для задачи обработки информации. После этого осуществляется возврат в состояние Q2.

При использовании прерывания состояние Q2 будет представлять собой лишь проверку причины прерывания для осуществления перехода к следующему состоянию. Переход из состояний Q3 и Q4 будет представлять собой выход из прерывания.

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

/* модуль приема/передачи байт по последовательному порту*/

#include

#define SysFreq 11059200 /* частота генератора контроллера*/

#define F9600bod 256-SysFreq/12/16/2/9600 /* константа, загружаемая в таймер и

определяющая скорость передачи

по последовательному порту - 9600 бит/с */

extern char Rx232Flag; /* признак наличия данных в приемном буфере*/

void (*Tx232Func)(void), (*Rx232Func)(void);/* описаниеуказателей на функции */

char Rx232Byte; /* приемный канал: байт данных */

char Tx232Byte, RS232TxFlag; /* передающий канал: байт данных и признак*/

/* состояние Q1 –процедура инициализации */

void RS232Init(void (*Rx)(void), void (*Tx)(void)) ))/* в функцию, в качестве

параметров, передаются указатели на функции Rx и Tx */

{

Tx232Func = Tx; Rx232Func = Rx;/*привязка указателей к функциям пользователя*/

Rx232Flag = Tx232Flag = 0; /*обнуление признаков*/

TMOD = 0x20; /* Timer 1 – режим mode 2 */

TR1 = 1; /* Разрешение работы таймера 1 */

SCON = 0x60; /* формат посылки UART – 8-bit */

TH1 = TL1 = F9600bod; /* 9600 бит/с на частоте 11.059 MHz */

REN = 1; /* Разрешение приема по UART */

ES = 1; /* Разрешение прерывания от UART */

}

/* Процедура приема/передачи байта – вектор прерывания UART */

interrupt [0x23] void SCON_int(void)

{

/* состояние Q2 */

if (RI) /* если установлен флаг прерывания по приему байта, */

{

/* состояние Q3 */

Rx232Byte = SBUF; /*то прочитать принятый байт */

(*Rx232Func)();/* вызов функции обработки принятого байта */

RI=0; /* Сбросить флаг прерывания приемника */

}

if (TI) /* если установлен флаг прерывания по передаче байта, то передать байт */

{

/* состояние Q4 */

TI=0; /* Сбросить флаг прерывания передатчика*/

(*Tx232Func)(); /* вызов функции передачи байта */

}

}

/* процедура чтения принятого байта */

void RS232Read(char *c) /* Чтение принятого байта RS232 */

{

c = Rx232Byte; /*запись принятого байта в *c */

}

/* процедура записи байта в передающий регистр UART */

void RS232Write(char c) /*выдача байта в передатчик*/

{

while (!TI); /* Ожидание конца передачи */

SBUF = c; /* выдача байта на передачу*/

}

Флаги RI и TI могут быть сброшены только программным путем, обычно в пределах подпрограммы прерывания, где необходимо также определить, какому из флагов - RI или TI - соответствует прерывание. Для управления работой системы прерывания микроконтроллер имеет биты разрешения индивидуального прерывания (для UART это бит ES) и бит ЕА – общего разрешения прерывания. Вектор прерывания (адрес подпрограммы) последовательного порта равен 0023h.

Процедура инициализации

void RS232Init(void (*Rx)(void), void (*Tx)(void)) ))

задает скорость обмена по последовательному порту и устанавливает соответствие между указателями и конкретными функциями пользователя- *Rx, *Tx.

Процедура приема/передачи байта организованна в виде функции обработки прерывания. При приеме байта вызывается функция пользователя через указатель на нее (*Rx232Func)(). При передаче байта вызывается функция пользователя через указатель на нее (*Тx232Func)().

Процедура чтения байта

RS232Read(char *c),

возвращает его через указатель *с.

Процедура выдачи байта

RS232Write (char c),

принимает его через параметр с.

Задача обмена информацией по последовательному порту (путем вызова функции *KEYFunc)() ) должна содержать следующие процедуры:

- вызов процедуры инициализации с указателем на функции записи в приемный буфер и чтения из передающего буфера –


1749801152860046.html
1749844186503962.html
    PR.RU™