Смекни!
smekni.com

Основы автоматизации эксперимента Герман (стр. 15 из 16)

Кабели, удовлетворяющие этим требованиям, маркируются как "IEEE Std 1284 - 1994 Compliant". Они могут иметь длину до 10 метров.

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

Контроллер порта расположен в адресном пространстве устройств ввода-вывода и обращение к нему производится посредством команд IN и OUT ассемблера. Или при помощи специальных команд компиляторов программ, написанных на языках высокого уровня. Информацию о портах LPT1 – LPT3 можно получить, прочитав переменные BIOS, приведенные в табл. 5.

BIOS ищет порты по адресам Base: 3BCh, 378h, 278h. Порт LPT4 BIOS найти не может:

– 378h - параллельный адаптер LPT1;

– 278h - параллельный адаптер LPT2;

– 3BCh - параллельный адаптер LPT3;


Таблица 5. Переменные BIOS для LPT портов

Имя порта

Адрес в BIOS

Тип переменной

Описание

LPT1

0040:0008h

Word

Базовый адрес порта LPT1. Если переменная равна 0, то порт LPT1 не найден

0040:0078h

Byte

Константа, задающая тайм-аут

LPT2

0040:000Ah

Word

Базовый адрес порта LPT2. Если переменная равна 0, то порт LPT2 не найден

0040:0079h

Byte

Константа, задающая тайм-аут

LPT3

0040:000Ch

Word

Базовый адрес порта LPT3. Если переменная равна 0, то порт LPT3 не найден

0040:007Ah

Byte

Константа, задающая тайм-аут

LPT4

0040:000Eh

Word

Базовый адрес порта LPT4. Если переменная равна 0, то порт LPT4 не найден

0040:007Bh

Byte

Константа, задающая тайм-аут

Стандартный порт имеет три 8-битных регистра, расположенных по соседним адресам, начиная с базового (Base) адреса. Перечень данных регистров приведен в- табл. 6.

Таблица 6. Регистры стандартного LPT порта

Адрес

Название

W-R

Base+0

Data Register – регистр данных (DR)

W/R

Base+1

Status register – регистр состояния (SR)

R

Base+2

Control Register – регистр управления (CR)

W/R

Примечание. W-R – доступные операции (W – запись, R – чтение, W/R – запись/чтение).

Регистр данных (DR). Записанные в этот регистр данные выводятся на выходные линии интерфейса D0-D7. Результат чтения этого регистра зависит от схемотехники адаптера и соответствуют либо записанным ранее данным, либо сигналам на линиях D0-D7, что не всегда одно и тоже. При стандартном включении справедлив первый вариант - читаемые данные равны ранее записанным.

Регистр состояния (SR). Представляет собой 5-ти битный порт ввода, на который заведены сигналы состояния от внешнего устройства. Допускает только чтение. Назначение битов данного регистра приведены в табл. 7.


Таблица 7. Биты регистра состояния SR

Бит

Вес

Название

Назначение

7

128

BUSY

Инверсное отображение состояния линии Busy (11). При низком уровне на линии 11 (Busy) – бит равен "1" – ПУ готово к приему очередного байта

6

64

ACK

Отображение состояния линии ACK# (10). "0" – подтверждение приема, "1" – обычное состояние

5

32

PE

Отображение состояния линии Paper End (12). "0" – норма, "1" – в ПУ нет бумаги

4

16

SLCT OUT

Отображение состояния линии Select (13). "0" - ПУ не выбрано, "1" - ПУ выбрано

3

8

Error

(инверсн.)

Отображение состояния линии Error (15). "0" – ошибка ПУ, "1" – обычное состояние

2

4

PIRQ

Флаг прерывания по ACK# (только PS/2). Обнуляется, если ACK# вызвал аппаратное прерывание. "1" – после сброса или после чтения регистра состояния

1-0

4-1

--

Не используются (резерв)

Регистр управления (CR). Регистр управления представляет собой 4-х битный порт вывода, допускающий чтение и запись. Биты 0, 1, 3 инвертируются, т.е. "1" в данных битах регистра управления соответствует "0" на соответствующих линиях порта. Назначение битов регистра управления приведены в табл. 8. Бит 5 используется только двунаправленными портами.

Программирование интерфейса Для разработки прикладных программ необходимо выбрать язык программирования. Если требуется несложная, быстрая и компактная программа, которая не содержит сложных вычислительных операций, то для ее написания лучше выбирать язык низкого уровня (язык ассемблера). Язык ассемблера относится к группе машинно-ориентированных языков, т.е. каждому семейству микропроцессоров соответствует свой язык.


Таблица 8. Биты регистра управления CR

Бит

Вес

Название

Назначение

7

128

-

Резерв

6

64

-

Резерв

5

32

Direction

Бит управления направлением порта. "1" – режим ввода, "0" – режим вывода

4

16

AckIntEn

Бит управления генерацией прерывания по ACK# . "1" – разрешить прерывание по спаду ACK# (10)

3

8

SLCT IN

Управление линией SLCT IN# (17). "1" – работа принтера разрешена.

2

4

INIT

Управление линией INIT# (16). "1" – обычное состояние, "0" – аппаратный сброс ПУ

1

2

Auto LF

Управление линией Auto LF# (14). "1" – включить режим "Auto LF", "0" – обычное сост.

0

1

Strobe

Управление линией Strobe# (1). "1" –
стробирование данных, "0" – обычное сост.

Язык высокого уровня следует выбирать, если необходимо производить сложные вычисления, или в случае, если высокое быстродействие программы не требуется. Объектные коды, полученные в результате трансляции программ, написанных на языке высокого уровня, обычно занимают в памяти ЭВМ намного больше места и исполняются медленнее в сравнении с программами на ассемблере. Часто применяется подход, когда критичные к быстродействию части программы пишутся на ассемблере, а вычислительные процедуры – на языке высокого уровня, например, на Паскале или Си.

Рассмотрим работу с регистрами интерфейса CENTRONICS на языке PASCAL или ассемблере:

Паскаль:

Ассемблер 8086:

Port[$378]:=x

mov al,x
mov dx,378h
out dx,al

Х - число типа "byte" (0..255). Например, при посылке 170 (dec) = 10101010 (bin) на линии d0–d7 единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначение выводов начинается с d0). Число 170 останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметьте, что адрес порта в команде задан в шестнадцатиричном (hex) виде, а посылка - в десятичном (dec). Если вместо Паскаль-команды

Port[$378]:=170;

Вы примените

d:=Port[$378];

где d – переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством.

Пример чтения статус-регистра на языке Pascal:

d:=Port[$379];

В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126 (dec). В двоичном (bin) виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и почти равны 1, 1 и 0. Третий бит – 1, значит на ERROR высокий уровень. Та же ситуация на SELECT, Paper End, ACK и BUSY (не забывайте, что сигнал BUSY является инвертированным).

Приведем пример фрагмента программы, которая считывает байт с линий данных D0-D7:

Port[$37A]:=32; {32 "включает" единицу в пятом}

d:=Port[$378] ; {бите, переводя порт в режим ввода}

Как видно из приведенных примеров, программирование LPT-порта является весьма простой задачей, что позволяет в значительной степени облегчить работу разработчика программного обеспечения устройств с обсуждаемым интерфейсом.