Проектирование устройств сопряжения (1083567), страница 23
Текст из файла (страница 23)
Наиболее просто проблема разрешается в том случае, если в качестве центрального процессора удаленного контроллера применена однокристальная микроЭВМ, уже содержащая Универсальный асинхронный последовательный приемопередатчик (УАПП). В качестве примера такой микроЭВМ можно упомянуть микросхему КР1816ВЕ31. Более того, возможно, что выбор подобной микроЭВМ как раз и обусловлен наличием в ней встроенного последовательного порта. Ясно, что построение преобразователя кода в данном случае сводится к задействованию встроенного ресурса в соответствии со спецификациями на примененную микросхему.
Если же центральный процессор контроллера не обладает встроенным УАПП или его использование по каким-либо причинам невозможно, а также в случае, когда требуется несколько каналов последовательного ввода-вывода, преобразователи кодов выполняются на основе специализированных внешних интегральных схем.
Одной из них является ныне безнадежно устаревшая микросхема программируемого универсального синхронно-асинхронного приемопередатчика 18251 (КР580ВВ51). Она содержит шинный интерфейс и собственно преобразователь кода. Микросхема требует двух внешних задающих генераторов частоты (один из которых задает скорость передачи, а другой формирует внутренние тактирующие импульсы), что является ее очевидным недостатком. Эта микросхема подробно описана во множестве книг, посвященных построению микропроцессорных структур, но сейчас уже практически нигде не используется.
Дальнейшим развитием идей, реализованных при проектировании указанного УАПП, являются микросхема i8250 (ее аналог — микросхема КР1847ВВ2 Минского объединения "Интеграл") и совпадающие с нею по цоколевке и назначению основных регистров ИМС TL16C450 и TL16C550 фирмы Texas Instruments (последняя содержит стеки FIFO размером по 16 байт для передающей и приемной частей).
На рис. 4.10 приведены назначение выводов ИМС i8250 для корпуса DIP-40 и одна из возможных типовых схем включения. Подробное описание внутренней структуры этой микросхемы и порядка обмена с ней можно найти во многих книгах или в интерактивном справочнике TechHelp! (с которым жизнь разработчика приложений для IBM-совместимых персональных компьютеров становится чуть-чуть проще). Краткое описание форматов обмена с данной микросхемой, входящей в состав компьютера, приведено в приложении.
Еще одним, хотя и довольно экзотическим, способом построения преобразователя кода можно воспользоваться, если нежелательно применение дополнительных микросхем, а вычислительные возможности центрального процессора задействованы не полностью (правда, еще потребуются как минимум два разряда параллельного интерфейса по одному на ввод и на вывод информации).
Рис. 4.10. Назначение выводов и одна из типовых схем включения микросхемы 18250.
Способ заключается в чисто программном преобразовании кодов при считывании (либо при выводе) информации через какой-нибудь из свободных разрядов параллельного интерфейса используемой микроЭВМ.
Ниже приведен фрагмент программы для однокристальной микроЭВМ КР1816ВЕ31, осуществляющий ввод одного бита входной последовательности. Предполагается, что регистр DPTR содержит адрес параллельного порта ввода информации, сигнал R х ТТЛ соответствует разряду D0. Отсчет берется трижды, чтобы уменьшить возможное влияние помех (рис. 4.11).
Рис. 4.11. Программный опрос входного сигнала RS-232C.
INBIT:
CLR R0 ;очистка регистра результата
MOV R1,#3 ;инициализация счетчика отсчетов
BITLP:
MOVX A,@DPTR ;ввод состояния сигналов RRC
;выделение D0 (флаг CARRY - D0)
JC ZERO ;анализ состояния сигнала
ONE:
INC R0 ;единичное состояние
SJMP WAIT
ZERO:
DEC R0 ;нулевое состояние
WAIT:
LCALL WDTIME ;пауза до следующего отсчета
DJNZ R1,BITLP ;подсчет количества отсчетов
RET
Решение о состоянии информационного сигнала RxD принимается на основе анализа знака содержимого регистра R0.
Аналогичным образом составляются подпрограммы ожидания стартового и стоповых битов, прием бита четности и т. п.
4.4. Проектирование устройств сопряжения для RS-232C
Рассмотрим кратко два примера реальных УС для связи через RS-232C.
Первое устройство предназначено для управления удаленным от компьютера объектом. Как уже отмечалось, в данном случае УС должно содержать в себе однокристальную микроЭВМ, которая и будет осуществлять как управление объектом (внешним устройством), так и обменом по линии связи RS-232C. Наиболее удобно при этом использовать микросхемы однокристальных микроЭВМ, имеющих вход и выход последовательного канала, например КР1830ВЕ31 Структурная схема УС на основе этой микросхемы (рис. 4.12) помимо стандартных элементов типовой схемы се включения (ОЗУ для хранения данных, ППЗУ для хранения микропрограмм, регистров для демультиплексирования адреса и данных, а также микросхемы параллельного порта для связи с внешними устройствами) содержит только уже рассмотренные ранее (рис. 4.2 и 4.3) узлы приемника RS-232С и передатчика RS-232C, осуществляющие требуемое преобразование уровней. Схема управления производит разделение адресного пространства микроЭВМ и выработку управляющих стробов обмена. Схема выработки сигнала сброса на рисунке не показана.
Рис. 4.12. Структурная схема УС на базе однокристальной микроЭВМ КР1830ВЕ31.
Мы не будем подробно останавливаться на структуре и особенностях работы КРШОВЕ31 и других однокристальных микроЭВМ. Информация об этом имеется в многочисленных справочниках. Отметим только, что, изменяя программное обеспечение, зашитое в ППЗУ, можно обеспечить выполнение самых различных алгоритмов управления широким спектром внешних устройств. Что касается аппаратуры, то здесь обычно используется стандартная схема включения, и разработчик УС должен только аккуратно ее повторить. Поэтому говорить об особенностях проектирования отдельных узлов УС данного типа не приходится.
Отметим, что универсальность схемы включения существенно облегчает труд разработчика, но нисколько не снижает важности процесса отладки УС. Отладка подобных универсальных контроллеров на основе однокристальных микроЭВМ имеет свои особенности, некоторые из них будут рассмотрены несколько позже, и существенно отличается от отладки УС на жесткой логике. В частности, здесь наиболее существенной частью процесса отладки становится составление нужной программы для зашивки в ППЗУ.
Вторая схема УС, которую мы рассмотрим, выполняет несколько иную функцию. Дело в том, что имеющихся обычно в составе компьютера двух последовательных портов (СОМ1 и COM2) в ряде случаев может оказаться недостаточно. Простейший пример — необходимость организации связи данного компьютера с несколькими другими компьютерами или с несколькими терминалами. Конечно, в такой ситуации можно приобрести и подключить нужное количество стандартных плат расширения, имеющих два последовательных порта и один параллельный, но подобное решение часто оказывается далеко не оптимальным, так как требует наличия свободных разъемов ISA и приводит к большой аппаратурной избыточности.
Предлагаемое УС (рис. 4.13) обеспечивает обмен компьютера с восемью портами интерфейса RS-232C и занимает всего одну стандартную плату расширения ISA. Для преобразования уровней в схеме УС использованы микросхемы передатчиков IFC1488 (рис. 4.4) и микросхемы приемников IFC1489 (рис. 4.5). В качестве преобразователей кодов применены микросхемы i8250 (схема включения приведена на рис. 4.10).
Рис. 4.13. 8-канальное УС для связи по интерфейсу RS-232C, ориентированное на сопряжение с ISA.
Выбор одного из восьми приемопередатчиков производится по сигналам Выбор 1 ... Выбор 8. Адресация внутренних регистров приемопередатчиков осуществляется трехразрядной адресной шиной. Данные передаются по 8-разрядной шине. Таким образом, в адресном пространстве устройств ввода/ вывода персонального компьютера данное УС занимает 64 адреса (8 окон по 8 адресов). Выходные сигналы прерываний всех приемопередатчиков подаются на интерфейсную часть УС и формируют единственный сигнал IRQ. Определение источника прерывания производится с помощью программного опроса сигналов INT1 ... INT8.
4.5. Разработка программного обеспечения для RS-232C
В качестве примера программирования последовательного порта приведем подпрограммы его инициализации и приема-передачи данных. Для начала определим некоторые постоянные, которые мы будем использовать в дальнейшем. Файл описаний (назовем его SERIAL.H) может выглядеть следующим образом:
//Определение адресов регистров порта
int BASE; //Базовый (первый)
// адрес блока
// регистров порта
#define OUT_REG BASE //Регистр передачи данных
#define IN_REG BASE //Регистр приема данных
#define LOW_DIV BASE //Младший байт делителя
#define HIGH_DIV BASE+1 //Старший байт делителя
#define INT_REG BASE+1 //Маска разрешенных прерываний
#define INT_ID_REG BASE+2 //Причина прерывания
#define CONTROL BASE+3 //Управляющее слово УАПП
#define MODEM BASE+4 //Регистр управления состоянием
//статических сигналов
#define STATUS BASE+5 //Состояние УАПП
#define M_STATUS BASE+6 //Состояние статических сигналов
//Определение основных констант
//Делители для различных скоростей передачи данных
//Скорость передачи — число после символов "В_":
#define B_110 1040
#define B_150 768
#define B_300 384
#define B_600 192
#define B_1200 96
#define B_2400 48
#define B_4800 24
#define B_9600 12
#define B_19200 6
#define B_38400 3
#define B_57600 2
#define B_115200 1
//Маски разрешенных прерываний:
#define DATA_REC 0x01 //Данные приняты
#define EMPTY_BUF 0x02 //Буфер передачи пуст
#define ERROR 0x04 //Ошибка при приеме данных
#define MODEM_INT 0x08 //Изменилось состояние
//статических сигналов
//Управляющие константы:
#define DIVISOR 0x80 //Бит управления
// доступом к регистрам
// записи делителя
#define BIT_5 0x00 //Длина посылки 5 бит
#define BIT_6 0x01 //Длина посылки 6 бит
#define BIT_7 0x02 //Длина посылки 7 бит
#define BIT_8 0x03 //Длина посылки 8 бит
#define STOP_1 0x00 //1 столовый бит
#define STOP_2 0x04 //2 стоповых бита
#define NOPARITY 0x00 //Нет контроля четности
#define EVEN 0x18 //Контроль четности
#define ODD 0x08 //Контроль нечетности
#define FIXPARITY 0x20 //Фиксация бита четности
#define DTR 0x01 //Управление линией DTR
#define RTS 0x02 //Управление линией RTS
#define OUT1 0x04 //Управление линией OUT1
#define OUT2 0x08 //Управление линией OUT2
#define LOOPBACK 0x10 //Управление внутренним тестом
//Маски готовности:
#define DATAJN 0x01 //Данные приняты
#define OVERRUN 0x02 //Переполнение
#define PARITY_ERR 0x04 //Ошибка четности
#define FRAME_ERR 0x08 //Ошибка формата посылки
#define DATA_OUT 0x20 //Готов к передаче
// Маски состояния статических сигналов:
#define CTS 0x10 //Состояние линии CTS
#define DSR 0x20 //Состояние линии DSR
#define R1 0x40 //Состояние линии RI
#define DCD 0x80 //Состояние линии DCD
//Определение функций:
void init_ser(void);
int out_sym(int symbol);
int in_sym(int *symbol, timeout, *error_code);
//Конец файла SERIAL.H
Функция инициализации последовательного порта init_ser() в данном примере не требует параметров, поскольку (так чаще всего и бывает) заранее известен режим работы микросхемы.
Функция передачи байта out_sym() в случае успешного завершения возвращает 0, в противном случае — 1.
Функция приема байта in_sym() в случае успешного приема возвращает 0, в случае же неуспеха — код ошибки равный 1, — если в течение ожидаемого времени данные не были приняты, 2 если байт данных был принят с ошибкой (байт состояния в этом случае присваивается переменной error_code).
Инициализируем последовательный порт для работы со скоростью 9600 бит/с, по опросу (все прерывания запрещены), статические сигналы управления не используются (применена трехпроводная линия связи), длина посылки 8 бит, стоповых битов 2, контроля четности нет. Следует обратить внимание на то, чтобы переменной BASE было присвоено верное значение ДО вызова любой из описанных выше функций.
void init_ser (void)
{
//Подготовка к записи делителя скорости передачи: