В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
Приложение В. Проверочные задания, основные сведения и примеры программ
Тестирование последовательного порта
3.1. Формулировка задания
Исследовать
режим тестирования последовательного порта (СОМ). Необходимо написать программу
на ассемблере, выполняющую инициализацию универсального асинхронного приемопередатчика
(УАПП), на базе которого реализуется последовательный порт с интерфейсом
RS-232, передачу данных в УАПП и прием этих же данных из УАПП.
Режим
тестирования задается замыканием выхода передатчика УАПП на вход его приемника
путем установки бита D4 регистра управления модемом, имеющего адрес 3FCh.
Инициализация УАПП заключается в программировании скорости передачи данных и
протокола обмена. Выполнив ввод содержимого порта 3FBh (регистра управления
линией), программа может получить текущий режим УАПП. Для установки нового
режима (числа бит данных, количества стоповых бит, типа принтера) необходимо
изменить нужные поля и записать новый байт режима в порт 3FBh.
Если надо
задавать новое значение скорости обмена данными, то перед записью байта режима
следует установить его бит D7 в единичное состояние. Затем двумя
последовательными командами вывода выполняется загрузка делителя частоты
тактового генератора. При этом младший байт делителя скорости записывается в
порт 3F8h, а старший байт - в порт 3F9h. Перед началом работы необходимо в
регистр управления прерываниями (порт 3F9h) записать нули, если программа не использует
прерывания. Перед выводом данных в регистр передатчика необходимо убедиться,
что этот регистр пуст, т.е. передача предыдущих данных завершена. Признаком
пустоты регистра передатчика является установленный бит 5 (TxRDY=1) регистра
состояния линии (порт 3FDh). Данные из регистра передатчика автоматически в
стартстопном формате поступают в регистр приемника и бит 0 (RxRDY) порта 3FDh
устанавливается в единичное состояние, с помощью которого программа определяет,
что регистр приемника полон.
Исходные
данные, передаваемые через последовательный порт, могут быть введены с клавиатуры
с помощью программных прерываний DOS или BIOS, заданы в программе или хранятся
в виде текстового файла на диске. Вывод данных на экран из регистра приемника
осуществляется путем использования программных прерываний.
3.2. Основные сведения
Асинхронная последовательная передача состоит в том, что
допускаются любые промежутки времени между передаваемыми символами и
используется специальный формат представления каждого символа кодовой посылки.
Этот формат содержит: стартовый бит, необходимый для
самосинхронизации в приемнике последовательной кодовой посылки; 5 - 8
информационных битов; необязательный бит паритета (чет или нечет) и 1, 1.5, 2
стоповых бита, служащих для разделения кодовых посылок друг от друга.
Асинхронная передача допускает некоторую рассинхронизацию
(рассогласование) частот передатчика и приемника в пределах длительности бита,
что является крайне не допустимым при синхронной передаче. Последовательная
кодовая посылка по линии интерфейса RS-232 передается биполярными сигналами. Логическая
единица представляется сигналами низкого уровня (-3...-12В), а логический ноль
- сигналом высокого уровня (+3...+12 В).
Если нет передачи данных, то на линии установлен сигнал
высокого уровня, т.е. линия отмечена (marking). Линия считается пустой
(spasing) при наличии на ней низкого уровня.
При инициализации (открытии) порта коммуникации устанавливаются
все его параметры. Эти параметры включают в себя длину слова, число стоп-битов,
установку четности и скорости обмена. Длина слова - это число битов, которое
образует основную единицу данных. Хотя привычно работать с порциями по 8 битов,
но для стандартных файлов ASCII (в которых все символы имеют коды, не
превышающие ASCII 128) достаточно 7 битов, а для передачи численных данных -
всего 4 бита.
В соств ПК могут входить до четырех последовательных портов COM1-COM4, имеющих интерфейс
RS-232.
Этим портам выделены следующие адреса:
COM1: 3F8h-3FFh
COM3: 338h-33Fh
COM2: 2F8h-2FFh COM4:
238h-23Fh
COM1 вызывает прерывание IRQ4 (Int 0Ch), а COM2 - прерывание IRQ3 (Int 0Bh). COM3 и COM4 не имеют стандартных векторов прерываний.
Каждый последовательный порт содержит УАПП (Универсальный асинхронный приемопередатчик),
используемый в ПК (модеме) для передачи и приема последовательных кодовых
посылок стартстопового формата. В ПК применяются в качестве УАПП различные
микросхемы, например 8250, NS16450. Для приема данных, поступающих со скоростью
38400 бит/с, в ПК устанавливают УАПП с буфером данных, например, NS16550А.
Последовательный порт, реализуемый на базе УАПП,
содержит 25- или 9-штырьковый разъем на задней стенке корпуса
ПК. Этот разъем может использоваться для
подключения мыши, графопостроителя или организации связи между ПК. Контакты RS-232
имеют следующие наименования, приведенные в табл.1.
Таблица 1
Название сигнала
|
Номер
цепи
|
Номер
контакта
|
Назначение
|
Направление
|
|
CCITT
|
9-шт
|
25-шт
|
|
|
DCD
|
109
|
1
|
8
|
Связь модемов установлена
|
в ПК
|
RxD
|
104
|
2
|
3
|
Принимаемые данные
|
в ПК
|
TxD
|
103
|
3
|
2
|
Передаваемые данные
|
из ПК
|
DTR
|
108
|
4
|
20
|
Готовность ПК к работе
|
из ПК
|
SG
|
102
|
5
|
7
|
Сигнальная земля
|
-
|
DSR
|
107
|
6
|
6
|
Готовность модема к работе
|
в ПК
|
RTS
|
105
|
7
|
4
|
Запрос на передачу
|
из ПК
|
CTS
|
106
|
8
|
5
|
Готовность модема к передаче
|
в ПК
|
RI
|
125
|
9
|
22
|
Индикатор вызова
|
в ПК
|
FG
|
101
|
-
|
1
|
Защитная земля
|
-
|
В УАПП можно задать следующие параметры обмена: количество битов данных и стоп-битов,
вид четности и скорость обмена в бодах
(бит/с).
Ниже описаны порты ввода-вывода для СОМ1 (табл. 2), имеющего базовый адрес
3F8h. Порты 3F8h и ЗF9h
имеют разное назначение в зависимости от бита 7 порта ЗF8h (бита DLAB - Divisor
Latch Access Bit).
Таблица 2
Порт
|
Операция
|
Назначение порта
|
3F8h
|
Запись
|
Регистр передатчика (предназначен для вывода байта
данных)
|
|
Чтение
|
Регистр приемника (хранит вводимый байт данных)
|
|
Запись
|
Если DLAB=1, то сюда засылается младший байт
скорости обмена (см. порт 3F8h)
|
3F9h
|
Запись
|
Если DLAB=1, то сюда засылается старший байт
скорости обмена (см. порт 3F8h). Скорость задается значением делителя, равным
115200/V, где V- скорость в бодах. Например, для скорости 9600 бод делитель равен
115200/9600 = 12 = 0Ch, поэтому нужно вывести 0Ch в порт 3F8h и 0 в порт
3F9h.
|
Значения байтов, инициализирующих скорости обмена данными,
представлены в табл. 3.
Таблица 3
Скорость обмена
|
Порт 3F9h
|
Порт 3F8h
|
110
|
04h
|
17h
|
300
|
01h
|
80h
|
600
|
00h
|
С0h
|
1200
|
00h
|
60h
|
1800
|
00h
|
40h
|
2400
|
00h
|
30h
|
3600
|
00h
|
20h
|
4800
|
00h
|
18h
|
9600
|
00h
|
0Ch
|
Регистр управления прерываниями (порт 3F9h) доступен по
записи и имеет следующий формат:
Регистр идентификации прерывания (порт 3FAh) доступен по
чтению и имеет следующий формат:
Регистр состояния модема (порт 3FEh) доступен по чтению,
(биты 0-3) содержат следующий формат:
Регистр управления линией (порт 3FBh) доступен по записи,
значения битов которого могут быть следующие:
Регистр управления модемом (порт 3FCh) работает в режиме
записи, распределение битов которого следующее:
Регистр состояния линии (порт 3FDh) доступен по чтению и
имеет следующий формат:
Для подготовки УАПП к работе необходимо выполнить следующие
действия:
- установить бит DLAB порта 3F8h и загрузить делитель,
задающий скорость обмена, в порты 3F8h и 3F9h;
- инициализировать регистр управления линией (порт 3FBh), при
этом сбросить бит DLAB;
- инициализировать регистр управления модемом (порт 3FCh);
- инициализировать регистр управления прерываниями (порт
3F9h).
В рассматриваемом контрольном задании вначале программа
должна осуществить инициализацию (настройку) УАПП в соответствии с вариантом
задания. Для реализации этой цели в регистре управления линией (3FBh) задается
длина данных (5-8), число стоповых бит (1; 1.5;2), тип паритета (чет или нечет)
и доступ к другим регистрам (бит D7-DLAB). В регистре управления модемом (3FCh)
устанавливается бит D4 в единичное состояние, что позволяет в УАПП замкнуть
выход передатчика (TxD) на вход его приемника (RxD). Скорость передачи данных
программируется путем занесения младшего байта и старшего байта делителя в
следующие порты: ЗF8h (DLAB=1) и ЗF9h (DLAB=1). Кроме того, запрещается прерывание по приему и
передаче символа, т. е. выполняется сброс регистра управления прерываниями
(3F9h, DLAB = 0).
После этого программа реализует передачу данных, вводимых,
например, с помощью клавиатуры путем использования соответствующего
программного прерывания DOS или BIOS. Введенный символ загружается в регистр
передатчика УАПП (порт 3F8h), если бит D5 (готовность передатчика) регистра
состояния линии (3FDh) равен 1, т. е. регистр передатчика пуст. Затем
автоматически выполняется передача последовательной кодовой посылки с выхода
передатчика УАПП на вход его приемника. Программа в цикле опрашивает бит D0
(готовности приемника) регистра состояния линии (3FDh). Если этот бит D0 равен
1, то это указывает на то, что регистр приемника полон и можно выводить символ
на экран дисплея, используя соответствующее программное прерывание DOS или
BIOS.
Более сложный вариант контрольного задания должен учитывать
создание интерфейса пользователя: выбор скорости передачи данных из заданного
набора, длину данных, число стоповых битов и т. д.
3.3. Пример выполнения варианта задания
Скорость
передачи данных – 600 бит/с.
Число битов
данных – 8.
Бит паритета отсутствует.
Количество
стоповых бит – 1.
Данные
вводятся с помощью клавиатуры путем использования программного прерывания
int16h и выводятся на экран с помощью программного прерывания int10h. Выход из программы по ESC.
Code Segment
assume cs:code,ds:code
org 100h
Start: call cirscr
lea dx,
greet
call print
call
initcom1
call initrg
call work
jmp exit
;-------------------- Инициализация
COM1 -----------------------
Initcom1 Proc
mov ax, 40h ;ES указывает на область
данных BIOS
mov es, ax
mov dx, es:[0] ;получаем базовый адрес СОМ 1
add dx, 3 ;регистр
контроля линии
mov al, 10000000b ;устанавливаем
бит 7
out dx, al
dec dx ;старший
байт делителя
dec dx ;скорости
обмена
mov al, 0 ;старший
байт для 600 бод
out dx, al
dec dx
mov al, 0C0h ;младший
байт для 600 бод
out dx, al
ret
Initcom1 Endp
;------------ Инициализация регистра контроля линии ------------
Initrg Proc
add dx, 3 ;указываем
на регистр контроля линии
mov al, 00000000b ;чистим al
or al, 00000011b ;длина символа -
8 бит
or al, 00000000b ;1 стоп-бит
or al, 00000000b ;не
генерировать бит четности
out dx, al
inc dx ;регистр управления модема
mov al, 10h ;замыкание выхода на вход
out dx, al
sub dx, 3 ;регистр
разрешения прерываний
mov al, 0 ;прерывания запрещены
out dx, al
ret
Initrg Endp
;---------------- Проверка готовности СОМ1 ---------------------
Check Proc
Try: mov dx, es:[0]
add dx, 5
in al, dx
test al,
1Eh
jz m0
lea dx,
error
call print
jmp exit
m0: test al, 01h
jnz m4
test al,
20h
jz try
ret
Check Endp
;---------------------- Работа с портом-------------------------
Work Proc
m4: mov ah, 0 ;ввод символа
int 16h
push ax
push ax
mov dx, es:[0] ;извлечение
адреса СОМ1
add dx, 5 ;регистр
статуса линии
mov cx, 10
m1: in al, dx
test al, 20h ;готов к
приему данных?
jz m2
loop m1
m2: sub dx, 5 ;регистр хранения данных
pop ax ;занести
передаваемый байт
out dx, al
add dx, 5 ;регистр
статуса линии
m3: in al, dx ;данные приняты ?
test al,1
jz m3
sub dx, 5 ;регистр
хранения данных
in al, dx ;прочитать
принятые данные
mov ah, 0Eh ;вывести символ
на экран
int 10h
pop ax
cmp al, 1Bh ;проверить на
нажатие ESC
jne m4
ret
Work Endp
Print Proc
mov ah, 9
int 21h
ret
Print Endp
;---------------------- Очистка экрана
-------------------------
Cirscr Proc
mov ax,
619h
mov bh, 07
mov cx, 0
mov dx,
184fh
int 10h
ret
Cirscr Endp
;--------------------------- Выход
-----------------------------
Exit: lea dx, finish
call print
mov ax, 4c00h
int 21h
;-------------------------- Данные
-----------------------------
Greet db ' Практическое задание ', 0Dh, 0Ah
db '"Тестирование
последовательного порта"', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db ' работу
выполнили: ', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db
' ', 0Dh, 0Ah
db ' Для выхода нажмите
ESC ', 0Dh, 0Ah, '$'
Error db ' Ошибка порта СОМ 1 ',7, 0Dh, 0Ah, '$'
Finish db 0Dh, 0Ah, 7,’$’
Code Ends
End Start
3.4. Требования к оформлению задания
Отчет по контрольному заданию должен содержать:
- вариант
задания;
- блок-схему
программы;
- программу
на ассемблере с комментариями;
- дискету
с программой для демонстрации ее работы.
3.5. Варианты задания
На рис. 1 показан морфологический граф, определяющий варианты
заданий.
Рис. 1. Морфологический граф вариантов заданий
Первый
уровень (уровень скорости обмена 9600-110 бит/с) определяет скорость обмена (байты
делителя скорости), а второй уровень - число битов данных в последовательной
кодовой посылке (5-8).
Третий
уровень соответствует типу контроля, применяемого в УАПП. Вершина 31 определяет
контроль четности, вершина 32 - нечетности и вершина 33 - отсутствие бита
паритета. Четвертый уровень задает число стоповых битов (1, 1.5, 2). Пятый
уровень указывает на источник данных, которые могут быть введены с клавиатуры,
храниться на диске или представлены в программе. Каждый вариант задания
определяется маршрутом морфологического графа, проходящим через вершину каждого
уровня. Например, 11, 24, 31, 43, 51. В общем случае морфологический граф
содержит 972 варианта заданий.
Похожие материалы:
Тесемщик
Террористический акт - ст.205 УК РФ
Территория и акватория порта
Тестовод
Тесчик спецсортиментов (Часть №2 выпуска №37 ЕТКС)
Техник
|