Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3066

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Такие микросхемы называют универсальным асинхронным приемни-

ком-передатчиком (universal asynchronous receiver transmitter или

UART). IBM PC использует UART 8250 фирмы Intel.

Операционная система поддерживает 2 порта коммуникации, поэто-

му в машине имеются 2 микросхемы. Их базовые адреса хранятся в

ячейке 0040:0000 для COM1 и 0040:0002 для COM2. (Базовый адрес

это 2-хбайтовый адрес порта, который является младшим из группы

адресов портов, дающих доступ к UART.) На всех машинах кроме PCjr

COM1 имеет базовый адрес 3F8H, а COM2 - 2F8H; PCjr имеет свой

внутренний модем по адресу 3F8H, а COM1 - по адресу 3F8H. Для

удобства, мы в дальнейшем будем всегда нумеровать регистры 3FxH,

но все сказанное в равной степени применимо и к регистрам 2FxH.

Микросхема 8250 имеет 10 программируемых однобайтных регист-

ров, с помощью которых управляется и контролируется порт коммуни-



кации. Большинство из них занимаются инициализацией порта, про-

цессом, который может быть очень сложным. Доступ к этим 10 ре-

гистрам осуществляется через семь адресов портов с номерами 3F8H

- 3FEH (или 2F8H - 2FEH). В пяти случаях регистр, к которому

получаем доступ через данный порт, зависит от того, как установ-

лен бит 7 в регистре контроля линии, который является единствен-

ным регистром с адресом порта 3FBH. Вот эти регистры:


3F8H (OUT, бит 7 = 0 в 3FBH) Регистр хранения передатчика

3F8H (IN, бит 7 = 0 в 3FBH) Регистр данных приемника

3F8H (OUT, бит 7 = 1 в 3FBH) Делитель скорости обмена (младший)

3F9H (IN, бит 7 = 1 в 3FBH) Делитель скорости обмена (старший)

3F9H (OUT, бит 7 = 0 в 3FBH) Регистр разрешения прерывания

3FAH (IN) Регистр идентификации прерывания

3FBH (OUT) Регистр управления линии

3FCH (OUT) Регистр управления модемом

3FDH (IN) Регистр статуса линии

3FEH (IN) Регистр статуса модема


Из десяти регистров только шесть необходимы для простой после-

довательной связи. Регистр хранения передатчика содержит байт

данных, которые будут посланы [7.1.6], а регистр данных приемника

- последний полученный байт данных [7.1.7]. Регистры управления и

статуса линии инициализируют и управляют линией связи, используя

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

обмена [7.1.2]. Из оставшихся четырех регистров регистры управле-

ния и статуса модема используются только для связи через модем

[7.1.5], а два регистра, связанных с прерываниями используются

только в процедурах, управляемых прерываниями [7.1.8].

Прерывания используются при связи в целях эффективности. Обыч-

ная коммуникационная процедура непрерывно проверяет регистр ста-

туса линии, ожидая вводимого символа или указаниия, что все гото-

во для передачи следующего байта данных. Поскольку процессор

намного быстрее, чем обычные скорости с которыми передаются пос-

ледовательные данные, то этот метод напрасно расходует процессор-

ное время, которое может использоваться для обработки поступающих


или передаваемых данных. По этой причине микросхема 8250 может

быть установлена в режим, вызывающий прерывание при появлении

символа, возникновении ошибки и т.п. Это прерывание моментально

вызовет процедуру Вашей программы, которая, скажем, будет переда-

вать следующий символ из коммуникационного буфера.



7.1.2 Инициализация последовательного порта.




При инициализации порта коммуникации ("открытии") устанавли-

ваются все его параметры. Эти параметры длину слова, число

стоп-битов, установку четности и скорость обмена. Длина слова это

число битов, которое образует основную единицу данных. Если мы

работаем с привычными порциями по 8 битов, то 7 битов достаточны

для стандартных файлов ASCII (в которых все символы имеют коды,

не превышающие ASCII 128), в то время как для передачи численных

данных достаточно порций по 4 бита.



Высокий уровень.


Бейсик открывает коммуникационный канал как файл, и как тако-

вому ему должен быть присвоен идентификационный номер:


OPEN "COM1: .........." AS #1


В кавычках должна быть помещена вся информация, необходимая для

инициализации порта коммуникации, при этом каждый элемент отде-

ляется от предыдущего запятой. Инициализационные данные всегда

вводятся в следующем порядке:


Скорость обмена дается как целое число: 75, 100, 150, 300, 600,

1200, 1800, 2400, 4800 или 9600 бод. По умолча-

нию берется скорость обмена 300 бод.

Четность вводится как односимвольный код: O для нечетной

E - для четной и N - при отсутствии контроля по

четности. Могут быть также S - когда бит чет-

ности всегда равен 0 и M - когда бит четности

всегда равен 1. Если используются 8 бит данных,

то надо указывать N; при использовании четырех

бит не надо использовать N. По умолчанию - E.

Биты данных дается как целое число 4, 5, 6, 7 или 8. По

умолчанию берется 7.

Стоп-биты дается как целое число 1 или 2, причем 2 -

значение по умолчанию для 75 и 110 бод, а 1 -

для остальных. Когда число битов данных равно 4

или 5, то 2 обозначает 1 1/2 стоп-бита. Такое

значение возможно при коммуникации, так как в

этом случае бит является единицей времени и

поэтому делим.


Оператор OPEN "COM1:" AS #1 открывает COM1 для связи со скоростью

300 бод с четной четностью, используя 7 битов данных и 1

стоп-бит. OPEN "COM1:1200,O,8,1" устанавливает скорость 1200 бод,

нечетную четность, 8 бит на символ и 1 стоп-бит. Отметим, что Вы

можете завершить оператор OPEN выражением LEN = число, где число

устанавливает максимальный размер блока, с которым операторы GET

и PUT могут обрабатывать данные (по умолчанию 128 байтов). Имеет-

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

включены в эту спецификацию. (В [7.1.5] объясняется специальная

терминология, используемая при этом):



RS Подавляет сигнал "Запрос на посылку" (Request to send).

Если эта команда опущена, то OPEN "COM" включает RTS.


CS Вызывает проверку линии "Очистка посылки" (Clear to

send). За этой командой может следовать значение (от 0

до 65535), дающее число миллисекунд которые будет ожи-

даться сигнал перед тем как будет выдана ошибка таймау-

та, например, CS500. Значение по умолчанию 1000, если

указан параметр RS, в этом случае 0.

DS Вызывает проверку линии "Готовность набора данных"

(Data set ready). Допускается необязательный параметр,

как и для CS. Значение по умолчанию 1000.



CD Вызывает проверку линии "Определение носителя" (Carrier

detect). Допускается необязательный временной параметр,

как и для CS. Значение по умолчанию 0.

LF Вызывает автоматическую подачу кода перевода строки

(ASCII 10) после каждого символа возврата каретки (AS-

CII 13). Используется для последовательного вывода на

принтер.

PE Разрешает проверку четности, вызывая ошибку таймаута

устройства при возникновении ошибки четности.


Эти специальные команды могут помещаться в любом месте опера-

тора OPEN "COM" и в любом порядке. Отметим, что обычно сигналы

CTS и DSR должны быть установлены, чтобы оператор OPEN выполнил-

ся, а иначе будет выдана ошибка таймаута устройства. В заключение

приводим оператор OPEN "COM", содержащий все параметры, кроме RS

и LF:


OPEN "COM1:1200,O,7,1,CS2000,DS2000,CD,PE" AS #1 LEN = 256


Средний уровень.


Функция 0 прерывания 14H BIOS инициализирует порт коммуника-

ции. В DX должен даваться номер коммуникационного канала (COM1 =

0, COM2 = 1). В AL должен содержаться байт инициализационных

данных, значение битов которого следующее:


биты 1-0 длина слова. 10 = 7 битов, 11 = 8 битов.

2 число стоп-битов. 0 = 1, 1 = 2.

4-3 четность. 00 или 10 = нет, 01 = нечет., 11 = чет.

7-5 скорость обмена. 000 = 110 бод

001 = 150 бод

010 = 300 бод

011 = 600 бод

100 = 1200 бод

101 = 2400 бод

110 = 4800 бод

111 = 9600 бод


В данном примере порт инициализируется со словом в 8 битов,

одним стоп-битом и четной четностью. Скорость обмена 1200 бод.


;---присваиваем значения параметров переменным

MOV WORDLENGTH,00000011B ;длина слова 8 битов

MOV STOPBITS,00000000B ;1 стоп-бит

MOV PARITY,00011000B ;четная четность

MOV BAUDRATE,10000000B ;скорость 1200 бод


;---инициализируем COM1

MOV AL,0 ;чистим AL

OR AL,WORDLENGTH ;устанавливаем нужные биты

OR AL,STOPBITS ;

OR AL,PARITY ;

OR AL,BAUDRATE ;



MOV AH,0 ;функция инициализации порта

MOV DX,0 ;выбираем COM1

INT 14H ;инициализируем порт


Низкий уровень.


Независимо от того, занимаемся ли мы вводом или выводом, как

минимум 4 регистра микросхемы 8250 должны быть инициализированы

для операций обмена. Это регистры делителя скорости обмена, ре-

гистр контроля линии и регистр разрешения прерывания.



Инициализация скорости обмена.


Делитель скорости обмена это число, на которое надо разделить

частоту системных часов (1190000 герц), чтобы получить желаемую

скорость обмена. Например, для скорости обмена 1200 бод делитель

скорости обмена должен быть равен 96, поскольку 1190000/96 приб-

лиженно равно 1200. Чем больше делитель, тем меньше скорость

обмена. Скорости обмена 300 и меньше требуют двухбайтного числа

для делителя. Старший байт посылается в 3F9H (или 2F9H), а млад-

ший в 3F8H (2F8H). В обоих случаях бит 7 регистра управления

линии должен быть установлен в 1 перед засылкой значений; в про-

тивном случае по этим двум адресам значения будут адресованы в

другие регистры (см. [7.1.0]). Вот некоторые значения, требуемые

для обычных скоростей обмена:


Скорость обмена 3F9H 3F8H


110 04H 17H

300 01H 80H

600 00H C0H

1200 00H 60H

1800 00H 40H

2400 00H 30H

3600 00H 20H

4800 00H 18H

9600 00H 0CH


Всегда устанавливайте регистры скорости обмена первыми, так

как они единственные, которые требуют, чтобы был установлен бит 7

в регистре контроля линии. После этого надо изменить содержимое

регистра контроля линии, сбрасывая 7-й бит, чтобы все остальные

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

линии является регистром только для записи, то нет способа вер-

нуть бит 7 обратно в 1 без одновременной установки всех остальных

битов этого регистра. Отметим, что PCjr использует другие делите-

ли, описание которых Вы можете найти в техническом руководстве.


Инициализация регистра контроля линии.


Значение битов регистра контроля линии, адрес порта которого

равен 3FBH (или 2FBH), следующее:


биты 1-0 Длина символа. 00 = 5 битов, 01 = 6 битов

10 = 7 битов, 11 = 8 битов



2 Число стоп-битов. 0 = 1, 1 = 1.5, если длина

пяти, иначе 2.

3 Четность. 1 = генерируется бит четности, 0 = нет.

4 Тип четности. 0 = нечетная, 1 = четная

5 Фиксация четности. Заставляет бит четности всегда

быть 0 или 1. 0 = отменена

1 = всегда 1, если бит 3 = 1 & бит 4 = 0

или 1 = всегда 0, если бит 3 = 1 & бит 4 = 1

или 1 = нет четности, если бит 3 = 0

6 Установка перерыва. Вызывает вывод строки нулей

в качестве сигнала отдаленной станции.

0 = запрещено, 1 = перерыв

7 Меняет адреса портов других регистров


Обычно биты 5-7 сброшены в 0. Остальные описывают значения, опре-

деляемые протоколом обмена.


Регистр разрешения прерывания.


Даже если Вы не используете прерывания, все равно Вы должны

произвести запись в регистр разрешения прерывания, чтобы быть

уверенным, что прерывания запрещены. Просто поместите в этот

регистр 0. Регистр идентификации прерывания можно игнорировать.


Инициализация остальных регистров связана с модемами. Ясно,

что модемы нужны только для связи с удаленными устройствами, а не

для управления близлежащими устройствами, такими как последова-

тельный принтер. В [7.1.5] объяснено как инициализировать регистр

контроля модема.

В данном примере из области данных BIOS берется базовый адрес

COM1, после чего различные регистры инициализируются для скорости

обмена 1200 бод, семибитных данных, четной четности и одного

стоп-бита.


;---получаем базовый адрес COM1

MOV AX,40H ;ES указывает на область данных BIOS

MOV ES,AX ;

MOV DX,ES:[0] ;получаем базовый адрес COM1

;---инициализируеи регистры делителя скорости обмена на 1200 бод

ADD DX,3 ;указываем на регистр контроля линии

MOV AL,10000000B ;устанавливаем бит 7

OUT DX,AL ;посылаем байт

DEC DX ;указываем на старший байт делителя

DEC DX ;скорости обмена

MOV AL,0 ;старший байт для 1200 бод

OUT DX,AL ;посылаем старший байт для 1200 бод

DEC DX ;указываем на младший байт делителя

MOV AL,60H ;младший байт делителя для 1200 бод

OUT DX,AL ;посылаем младший байт

;---инициализируем регистр контроля линии

MOV AL,0 ;обнуляем AL

OR AL,10B ;длина данных 7 битов

OR AL,000B ;1 стоп-бит

OR AL,1000B ;генерируется бит четности

OR AL,10000B ;четная четность



ADD DX,3 ;указывает на регистр контроля линии

OUT DX,AL ;посылаем инициализационное значение


;---инициализируем регистр разрешения прерывания

DEC DX ;указываем на регистр разрешения

DEC DX ;прерывания

MOV AL,0 ;запрещаем прерывания

OUT DX,AL ;посылаем байт



7.1.3 Установка текущего коммуникационного порта.




Имеются два способа, которыми программа может определить,

какой из коммуникационных портов должен использоваться. Один из

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

Второй способ состоит в написании программы для обмена через порт

COM1, но изменении коммуникационного адаптера, доступ к которому

идет через COM1.

Область данных BIOS содержит место для четырех 2-хбайтных

переменных, которые содержат базовые адреса коммуникационных

каналов (MS DOS поддерживает только первые два из них). Базовый

адрес порта это младший из группы адресов портов, через которые

можно получить доступ к данному коммуникационному каналу. Базовый

адрес для COM1 хранится в ячейке 0040:0000, а для COM2 - в ячейке

0040:0002. Для смены коммуникационных портов надо просто поменять

эти два значения. Повторная смена значений приведет к первона-

чальному назначению портов.


Высокий уровень.


В Бейсике оператор OPEN "COM" может использоваться в виде OPEN

C$+"1200,N,8" AS #2, где C$ может быть либо "COM1:", либо

"COM2:". В качестве альтернативы можно использовать PEEK и POKE

для обмена базовых адресов:


100 DEF SEG = &H40 'указываем на область данных BIOS

110 X = PEEK(0): Y = PEEK(1) 'запоминаем первые 2 байта