Глава 7. Ввод/вывод.

Раздел 1. Доступ к последовательному порту.

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

При инициализации порта коммуникации ("открытии") устанавливаются все его параметры. Эти параметры длину слова, число стоп-битов, установку четности и скорость обмена. Длина слова это число битов, которое образует основную единицу данных. Если мы работаем с привычными порциями по 8 битов, то 7 битов достаточны для стандартных файлов ASCII (в которых все символы имеют коды, не превышающие ASCII 128), в то время как для передачи численных данных достаточно порций по 4 бита.

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

Функция 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 ;инициализируем порт

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

Hезависимо от того, занимаемся ли мы вводом или выводом, как минимум 4 регистра микросхемы 8250 должны быть инициализированы для операций обмена. Это регистры делителя скорости обмена, регистр контроля линии и регистр разрешения прерывания. Инициализация скорости обмена.

Делитель скорости обмена это число, на которое надо разделить частоту системных часов (1190000 герц), чтобы получить желаемую скорость обмена. Hапример, для скорости обмена 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.1 Программирование микросхемы UART 8250.
Содержание
7.1.3 Установка текущего коммуникационного порта.-~>

Сайт управляется системой uCoz