Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Упражнения. Стандартные средства программирования последовательного порта




Стандартные средства программирования последовательного порта

Операционная система MS-DOS не содержит серьезной поддержки асинхронного адаптера. Функции прерывания INT 21h с номерами 3 и 4 предназначены для чтения и записи байтов через адаптер. Обе функции работают с COM1 и COM2. Функция 3 получает в регистр AL символ, принятый от адаптера, а функция 4 передает в адаптер символ, записанный в регистр DL.

Основной недостаток функций MS-DOS заключается в отсутствии их функциональной полноты. Например, используя только эти функции, нельзя проанализировать ошибочные ситуации и изменить режим работы адаптера.

Функции BIOS, определенные за прерыванием 14h, более разнообразны. Параметры вызова основных функций приведены в табл. 123. Байты состояния линии и модема, возвращаемые обработчиком INT 14h, полностью соответствуют регистру состояния линии и регистру состояния модема адаптера порта.

 

 

Табл. 123. Основные функции INT 14h.

Функция Регистры при вызове Регистры при возврате
Инициализация порта AH = 00h AL = параметры инициализации порта DX = номер порта (0-3) AH = состояние линии AL = состояние модема
Передать символ AH = 01h AL = код символа DX = номер порта (0-3) AH – бит 7 сброшен, если успешное выполнение и установлен в случае ошибки. Биты 6-0 – состояние порта
Принять символ AH = 02h DX = номер порта (0-3) AH = состояние линии AL = принятый символ, если бит 7 сброшен
Состояние порта AH = 03h DX = номер порта (0-3) AH = состояние линии AL = состояние модема

 

 

Параметры инициализации порта приведены в табл. 124-127. Как видно, функциям BIOS также присущи недостатки: нельзя установить скорость передачи более 9600 бод, нет возможности узнать текущий режим работы адаптера, отсутствует поддержка модема. Поэтому для программирования асинхронного адаптера рекомендуется использовать порты ввода-вывода и работать на низком уровне.

 

 

Табл. 124. Формат байта инициализации порта.

Биты                
Значение Скорость передачи Контроль четности Число стоп-битов Размер слова

 

 

Табл. 125. Размер слова.
Слово (бит) Код
   
   
   
   

 

Табл. 126. Коды четности.
Тип четности Код
Нет  
Нечетность  
Нет  
Четность  

 

Табл. 127. Коды скорости.
Скорость (бод) Код
   
   
   
   
   
   
   
   

 

Пример 1. Используя ассемблер, определить базовый адрес порта COM1 и инициализировать его следующими параметрами: скорость обмена 9600 Кбод, 1 стоповый бит, четный тип четности, размер информационного слова 8 бит.

 

Решение. Для инициализации COM-порта должны быть использованы регистр делителя скорости обмена, регистр контроля линии и регистр разрешения прерывания. Реализация алгоритма инициализации может быть следующим.

 

MOV AX, 40h

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

MOV DX, ES:[00]; читаем базовый адрес порта COM1

ADD DX, 3; адрес регистра управления

MOV AL, 80h; установка бита DLAB для доступа регистру делителя

OUT DX, AL

DEC DX

DEC DX; адрес старшего байта делителя скорости

MOV AL, 12h

OUT DX, AL

DEC DX; адрес младшего байта делителя скорости

MOV AL, 0Ch; установка младшего байта делителя

OUT DX, AL

ADD DX, 3; адрес регистра управления

MOV AL, 00011011b; DLAB=0, четность, 1 стоп-бит, 8 бит/слово

OUT DX, AL

DEC DX

DEC DX; адрес регистра разрешения прерываний

MOV AL, 00h; прерывания запрещены

OUT DX, AL

 

Пример 2. На языке ассемблера разработать подпрограммы передачи и приема данных через порт COM1. Коммуникационный порт считать уже инициализированным, а базовый адрес порта хранящимся в переменной COM1.

Решение. При передаче данных программа полностью контролирует состав данных и скорость, с которой они должны передаваться. Когда байт данных помещается в регистр хранения передат­чика, оттуда он автоматически выводится в последовательный канал через регистр сдвига передатчика. Бит 5 регистра статуса линии показывает, свободен ли регистр хранения передатчика для приема данных.

Регистр статуса постоянно проверяется до тех пор, пока бит 5 не станет равным 1. После этого в регистр хранения передатчика может быть передан очередной байт данных. В процессе передачи бит 5 равен 0, и когда он опять станет равным 1, в регистр хранения передатчика может быть передан следующий символ.

 

; чтение байта с ожиданием без использования прерываний

MOV DX, COM1; помещаем базовый адрес порта в регистр DX

ADD DX, 5; адрес регистра состояния

wait:; метка ожидания окончания приема

IN AL, DX; чтение байта состояния

TEST AL, 01h; бит 1 = «1» (принят байт)

JZ wait; нет - ждем

SUB DX, 5; адрес регистра приемника

IN AL, DX; чтение принятого байта в регистр DX

 

При получении данных необходимо постоянно контролировать регистр статуса линии. Бит 0 регистра будет равен нулю, пока не будет получен символ в регистр данных приемника. Когда бит 0 станет равным 1, необходимо считать его из регистра с тем чтобы он не был переписан следующим полученным символом. После того как символ считан, бит 0 опять становится равным 0 и остается таковым, пока не будет получен новый символ.

 

; передача байта из AH без контроля готовности приемника

MOV DX, COM1; помещаем базовый адрес порта COM1 в регистр DX

ADD DX, 5; адрес регистра состояния

wait:; метка ожидания окончания передачи

IN AL, DX; чтение байта состояния

TEST AL, 40h; бит 6 = «1» (готовность к передаче очередного байта)

JZ wait; нет - ждем

SUB DX, 5; адрес регистра передатчика

MOV AL, AH; помещаем передаваемый байт в регистр AL

OUT DX, AL; передача данных

 

Пример 3. Используя ассемблер, разработать структуру коммуникационной программы, использующей прерывание по приему и передачи данных через порт COM1. Базовый адрес порта считать заданным в переменной COM1.

 

Решение. Коммуникационная программа может быть резидентной, обрабатывающей запросы на прием и передачу данных. Первое действие будет заключаться в установлении нового вектора прерывания для порта COM1 и разрешении прерывания приема и передачи.

 

; установка нового вектора прерывания

MOV DX, OFFSET IOINT

MOV AX, SEG IOINT

MOV DS, AX; пара DS:DX указывает на обработчик прерываний

MOV AL, 0Ch; номер вектора прерывания для порта COM1

MOV AH, 25h; функция изменения вектора

INT 21h; изменение вектора прерывания

 

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

MOV DX, COM1; помещаем адрес порта COM1 в регистр DX

INC DX; адрес регистра разрешения прерываний

MOV AL, 11b; разрешаем прерывания приема и передачи

OUT DX, AL

 

Второе действие состоит в реализации подпрограммы обработки прерывания. Для порта COM1 номер прерывания равен 0Bh. Алгоритм обработчика этого прерывания показан на рис. 50. При наступлении прерывания читается регистр идентификации IIR и по его разрядам IID0 и IID1 определяется тип прерывания. Если прерывание вызвано поступлением данных, происходит переход на подпрограмму принятия данных, в противном случае – на подпрограмму передачи.

Затем проверяется разряд INP на наличие отложенных прерываний. Если они существуют, вновь следует определить тип прерывания. В отсутствии новых прерываний выполняется разрешение прерываний с более низким уровнем и завершается обработка прерывания 0Bh.

Ниже представлена дословная реализация описанного алгоритма.

 

; процедура обработки прерывания

IOINT PROC FAR

MOV DX, COM1; помещаем адрес порта COM1 в регистр DX

INC DX; указываем на регистр идентификации прерывания

INC DX

IN AL, DX; читаем значение регистра идентификации прерывания

nextint:

TEST AL, 10b; тип прерывания «получены данные»

JNZ sendata; переход на передачу символа, если флаг нуля установлен

getdata:; метка начала приема данных

...; реализация алгоритма приема данных

JMP SHORT newio; переход на проверку наличия нового прерывания

sendata:; метка начала передачи данных

...; реализация алгоритма передачи данных

; перед выходом проверка на наличие нового прерывания

newio:; метка начала проверки поступления нового прерывания

MOV DX, COM1; помещаем адрес порта COM1 в регистр DX

INC DX; указываем на регистр идентификации прерывания

INC DX

IN AL, DX; читаем значение регистра идентификации прерывания

TEST AL, 1; проверка бита 1

JNZ nextint; переход по метке nextint, если флаг нуля установлен

MOV AL, 20h; иначе передаем код завершения аппаратного прерывания

OUT 20h, AL

IRET; возврат из процедуры обработки прерывания

IOINT ENDP; завершение процедуры обработки прерывания

 

 

 


Рис. 50. Алгоритм обработки прерывания 0Bh.

 

 

Пример 4. Используя встроенный в среду Borland® Delphi ассемблер разработать подпрограмму эмуляции последовательного порта при помощи параллельного. Подпрограмма должна выполнять передачу байтовых данных. Активным уровнем считать лог. 0. Временные параметры считать задаваемыми через глобальные переменные.

 

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

Алгоритм последовательной передачи с использованием параллельного порта показан на рис. 51. Данные передаются по линии D0, а синхросигнал – по линии D1. Разряды байта передаются последовательно, начиная с самого старшего. Операции маскирования задают последовательное изменение разряда D1 в порядке 1-0-1 и совместно с очередным разрядом передаваемого байта данных выводятся в порт. Временные задержки определяют скорость передачи данных и задаются глобально через параметр DLY. Базовый адрес порта хранится в переменной LPT.

 

 

 
 

 


Рис. 51. Алгоритм последовательной передачи байта данных через параллельный порт.

 

 

Пример процедуры синхронной передачи байта приведен ниже.

 

procedure SendByte(b: Byte);

begin

asm

{ Передаваемый байт }

MOV BL, b

{ Инверсия разрядов байта }

NOT BL

{ В DX базовый адрес порта LPT }

MOV DX, LPT

{ Счетчик для передачи 8 бит из BL }

MOV CX, 8

{ Сдвиг влево; в флаге CF старший бит }

@@L1:SHL BL, 1

MOV AL, 1

JC @@L2

{ Если передаваемый бит = 0, то AL=0 иначе AL=1 }

MOV AL, 0

{ D0=передаваемый бит, D1=CLK=1 }

@@L2:OR AL, 2

OUT DX, AL

{ D0=передаваемый бит, D1=CLK=0 }

AND AL, 0FDh

OUT DX, AL

{ Временная задержка }

PUSH CX

MOV CX, DLY

@@L3:LOOP @@L3

POP CX

{ D0=передаваемый бит, D1=CLK=1 }

OR AL, 2

OUT DX, al

{ Временная задержка }

PUSH CX

MOV CX, DLY

@@L4:LOOP @@L4

POP CX

{ Повторять 8 раз }

LOOP @L1

end;

end;

Контрольные вопросы

1. В чем заключается идея асинхронной передачи данных?

2. Опишите структуру информационного кадра.

3. Какие существуют разновидности УАПП? Перечислите их функции.

4. Перечислите и опишите структуру регистров УАПП.

5. Каковы возможности BIOS и MS-DOS для передачи данных в последовательной форме?

 

Литература

  1. Пильщиков В.Н. Программирование на языке ассемблера IBM PC. – М.: Диалог-МИФИ, 1996.
  2. Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. – М.: Радио и связь 1989.
  3. Абель П. Язык Ассемблера для IBM PC и программирование. Перевод с англ. Сальникова Ю.В. – М.: Высшая школа 1992.
  4. Браун Р., Кайл Дж. Справочник по прерываниям IBM PC. Том 1,2. – М.: Мир 1994.
  5. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: Финансы и статистика 1992.
  6. Путилин А.Б., Юрагов Е.А. Компонентное моделирование и программирование на языке UML. Практическое руководство по проектированию информационных систем. – М. НТ Пресс 2005.
  7. Томпкинс У., Уэбстер Д. Сопряжение датчиков и устройств ввода данных с компьютерами IBM PC. – М.: Мир 1992.
  8. Хаммел Р.Л. Последовательная передача данных. – М.: Мир, СК ПРЕСС 1996.

 




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 1292; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.083 сек.