Стандартный параллельный порт (Interfacing the Standard Parallel Port) icon

Стандартный параллельный порт (Interfacing the Standard Parallel Port)



НазваниеСтандартный параллельный порт (Interfacing the Standard Parallel Port)
Дата конвертации27.08.2012
Размер253.85 Kb.
ТипДокументы

Стандартный параллельный порт

(Interfacing the Standard Parallel Port)

(перевод файла parallel.htm от Creag Peacock с http://www.senet.com.au/~cpeacock/)


Переведено Д.С. Иоффе (dsioffe@yandex.ru, ICQ 313263348) с другом PROMTом (в девичестве Stylus) исключительно для расширения собственного понятия. Никакие претензии не принимаются. Советы принимаются с удовольствием.

Введение в параллельный порт


Параллельный порт наиболее часто используется для интерфейса с любительскими проектами. Этот порт обеспечивает до 9 битов для ввода данных или до 12 битов для вывода. Таким образом, для многих простых задач требуется минимальная внешняя схема. Порт состоит из 4 линий управления, 5 линий состояния и 8 линий данных. Он располагается обычно на задней стенке вашего компьютера как D-образная 25-контактная розетка. Там может также иметься D-образная 25-контактная вилка. Это будет последовательный порт RS-232 - полностью несовместимый порт.

Более новые параллельные порты выполнены в стандарте IEEE 1284, первая редакция которого вышла в 1994 году. Этот стандарт определяет 5 следующих режимов работы:

1. Режим совместимости.

2. Режим тетрады. (Протокол, описанный в этом документе)

3. Режим байтов. (Протокол, описанный в этом документе)

4. Режим EPP (Расширенный параллельный порт).

5. Режим ECP (Режим с расширенными возможностями).

Цель состояла в том, чтобы проектировать новые драйверы и устройства, которые были бы совместимы друг с другом, а также обратно совместимы со стандартным параллельным портом (SPP). Режимы совместимости, тетрады и байта требуют только стандартных аппаратных средств, доступных на старых платах контроллеров параллельного порта, в то время как режимы EPP и ECP требуют дополнительных аппаратных средств, которые могут работать на больших скоростях и в то же время быть обратно совместимыми со стандартным параллельным портом.

В режиме совместимости, или "Centronics", можно посылать данные только в прямом направлении с типичной скоростью 50 килобайтов в секунду, иногда более 150 килобайт в секунду. Для приёма данных Вы должны использовать режим тетрады или байта. В режиме тетрады можно вводить тетраду (4 бита) в обратном направлении. Например, из устройства в компьютер. В режиме байта используется свойство двунаправленности (реализованное только в некоторых платах) для ввода байта (8 битов) данных в обратном направлении.

Расширенные режимы параллельного порта используют дополнительные аппаратные средства для генерации и управления подтверждением связи. Для вывода байта на принтер (или что-нибудь аналогичное) в режиме совместимости программное обеспечение должно:

1. Записать байт в порт данных.

2. Проверить, не занят ли принтер.
Если принтер занят, он не будет принимать никаких данных, таким образом, любые записанные данные будут потеряны.

3. Установить на Strobe (вывод 1) низкий уровень. Это сообщает принтеру, что на линиях данных имеются правильные данные (выводы 2-9).

4. Вернуть на Strobe высокий уровень приблизительно через 5 микросекунд после установки низкого уровня (шаг 3).

Всё это ограничивает скорость работы порта. Порты EPP и ECP обходят это, выполняя аппаратно проверку занятости принтера, генерацию строба и / или подтверждение связи. Это означает, что нужна только одна инструкция ввода - вывода. Такие порты могут выводить около 1-2 мегабайтов в секунду. ECP порт также имеет преимущество использования каналов DMA и буфера FIFO. Таким образом, данные могут быть передаваться без использования инструкций ввода - вывода.
^

Аппаратные свойства


Ниже приведена таблица выводов D-образного 25-контактного разъёма и 34-контактного разъёма Centronics. Первый обычно используется для параллельного порта компьютера, в то время как разъём Centronics обычно применяется на принтерах. Стандарт IEEE 1284, однако, определяет 3 различных соединителя для использования с параллельным портом. Первый, 1284 Тип А - D-образный 25-контактный соединитель, установленный сзади у большинства компьютеров. Второй - 1284 Тип B, который является 36-выводным разъёмом Centronics, установленным на большинстве принтеров.

IEEE 1284 Тип C является 36-контактным соединителем, подобно Centronics, но меньшего размера. Этот соединитель имеет лучший замок, лучшие электрические свойства и легче собирается. Он также содержит еще два вывода для сигналов, которые могут использоваться, чтобы видеть, включено ли другое устройство. Соединители 1284 Тип C рекомендуются для новых проектов, так что мы можем ожидать появления этих новых соединителей в ближайшем будущем.


вывода (D- образный 25-контактный)

вывода (Centronics)

^ Сигнал SPP

Направление вход /выход

Регистр

Аппаратная инверсия

1

1

nStrobe

Вход /выход

Управления

Да

2

2

Данные 0

Выход

Данные




3

3

Данные 1

Выход

Данные




4

4

Данные 2

Выход

Данные




5

5

Данные 3

Выход

Данные




6

6

Данные 4

Выход

Данные




7

7

Данные 5

Выход

Данные




8

8

Данные 6

Выход

Данные




9

9

Данные 7

Выход

Данные




10

10

nAck

Вход

Состояние




11

11

Busy

Вход

Состояние

Да

12

12

Paper-Out / Paper-End

Вход

Состояние




13

13

Select

Вход

Состояние




14

14

nAuto-Linefeed

Вход /выход

Управление

Да

15

32

nError / nFault

Вход

Состояние




16

31

nInitialize

Вход /выход

Управление




17

36

nSelect-Printer / nSelect-In

Вход /выход

Управление

Да

18-25

19-30

Земля

Gnd







Таблица 1. Назначение выводов соединителей параллельного порта.


Вышеприведённая таблица использует "n" перед именем сигнала, когда активным является низкий уровень сигнала. Например, nError. Если на принтере произошла ошибка, тогда на этой линии низкий уровень. В нормальном состоянии, когда принтер работает правильно, на этой линии высокий уровень. "Аппаратная инверсия" означает, что сигнал инвертирован аппаратно в контроллере параллельного порта. Пример - линия Busy. Если на этот вывод подать +5v (логическая единица) и прочитать регистр состояния, в бите 7 последнего был бы 0.

Выходы параллельного порта обычно имеют логические уровни TTL. Уровни напряжений - это легко. А вот втекающие и вытекающие токи изменяются от порта к порту. Большинство параллельных портов, реализованных в БИС, могут принимать и отдавать около 12mA. Но вот только некоторые из вариантов, приводимых в справочных данных: втекает/вытекает 6mA, вытекает 12mA/втекает 20mA, втекает 16mA/вытекает 4mA, втекает / вытекает 12mA. Вы можете видеть, что они различаются весьма незначительно. Лучше всего использовать буфер, минимально нагружающий параллельный порт.

Centronics?


Centronics - это ранний стандарт для передачи данных от ведущего устройства к принтеру. Большинство принтеров использует этот протокол передачи. Подтверждение передачи обычно осуществляется путём программного управления стандартным параллельным портом. Ниже приводится упрощенная диаграмма протокола «Centronics».



Данные сначала подаются на выводы параллельного порта с номерами от 2 до 7. Затем ведущее устройство проверяет, занят ли принтер. На линии Busy должен быть низкий уровень. Тогда программа активизирует строб, ждет не менее 1uS, и затем снимает строб. Данные обычно считываются принтером / периферией по нарастающему фронту строба. Принтер сообщает, что он занят обработкой данных, через линию Busy. Как только принтер принял данные, он подтвердит байт отрицательным импульсом около 5uS на линии nAck.

Часто ведущее устройство игнорирует линию nAck для экономии времени. Позже, при рассмотрении порта ECP, Вы увидите быстрый режим Centronics, который позволяет аппаратным средствам делать для Вас все подтверждение связи. Всё, что программист должен делать - записать байт данных в порт ввода - вывода. Аппаратные средства проверят, занят ли принтер, произведут строб. Обратите внимание, что в этом режиме также обычно не проверяется nAck.
^

Адреса портов


Параллельный порт имеет три обычно используемых базовых адреса. Они показаны ниже в таблице 2. Базовый адрес 3BCh использовался для параллельных портов на ранних видеоплатах. Этот адрес исчез на некоторое время, когда параллельные порты были удалены из видеоплат. Теперь он вновь появился как вариант для параллельных портов, интегрированных на системных платах, где их конфигурация может быть изменена с использованием BIOS.

Для LPT1 обычно назначается базовый адрес 378h, в то время как для LPT2 - 278h. Однако, как объяснено позже, это не всегда так. 378h и 278h обычно всегда использовались для параллельных портов. Буква h означает, что число шестнадцатеричное. Эти адреса могут изменяться от машины к машине.


Адрес

Замечания

3BCh - 3BFh

Используется для параллельных портов, встроенных в видеоплаты. Не поддерживает адреса ECP

378h - 37Fh

Обычный адрес для LPT1

278h - 27Fh

Обычный адрес для LPT2

Таблица 2. Адреса портов

Когда компьютер включается впервые, BIOS (базовая система ввода-вывода) определяет число имеющихся у Вас портов и назначает им имена LPT1, LPT2 и LPT3. BIOS сначала проверяет адрес 3BCh. Если параллельный порт найден здесь, ему назначается имя LPT1, затем проверяется адрес 378h. Если контроллер параллельного порта найден там, ему назначается следующее свободное имя устройства. Это было бы LPT1, если плата не была найдена по 3BCh, или LPT2, если она была найдена в 3BCh. Последний опрашиваемый порт - 278h и для него следует та же самая процедура. Поэтому можно иметь LPT2 с адресом 378h, а не 278h, как ожидалось.

Может запутать то, что некоторые изготовители плат параллельного порта применяют джамперы, которые позволяют Вам устанавливать любой адрес вашего порта: LPT1, LPT2, LPT3. Тогда какой адрес будет у LPT1? На большинстве плат у LPT1 - 378h, и у LPT2 - 278h, но некоторые будут использовать 3BCh как LPT1, 378h как LPT1 и 278р как LPT2. Жизнь не так легка, как предполагалось.

Назначение имён устройств LPT1, LPT2 и LPT3 не должно волновать людей, желающих подключиться к своему PC. Чаще всего базовый адрес порта - LPT1. Однако, если Вы хотите найти адрес LPT1 или любого из устройств LPT, Вы можете использовать таблицу поиска, обеспечиваемую BIOS. Когда BIOS назначает адреса вашим устройствам, она сохраняет их в определенных местах в памяти, так что мы можем находить их.

^ Начальный адрес

Функция

0000:0408

Базовый адрес LPT1

0000:040A

Базовый адрес LPT2

0000:040C

Базовый адрес LPT3

0000:040E

Базовый адрес LPT4

Таблица 3. Адреса LPT в области данных BIOS

^ Замечание 1: адрес 0000:040E может использоваться как расширенная область данных BIOS в PS/2 и новых BIOS.

В приведённой выше таблице 3, показаны адреса, по которым мы можем находить адреса портов принтера в области данных BIOS. Каждый адрес будет занимать 2 байта. Следующая типовая программа на C показывает, как Вы можете читать эти данные, чтобы получить адреса ваших портов принтера.

#include

#include


void main(void)

{

unsigned int far *ptraddr; /* Pointer to location of Port Addresses */

unsigned int address; /* Address of Port */

int a;


ptraddr=(unsigned int far *)0x00000408;


for (a = 0; a < 3; a++)

{

address = *ptraddr;

if (address == 0)

printf("No port found for LPT%d \n",a+1);

else

printf("Address assigned to LPT%d is %Xh\n",a+1,address);

*ptraddr++;

}

}
^

Программные регистры стандартного параллельного порта (SPP)


Смещение

Имя

^ Чтение / запись

Бит №

Свойства

База + 0

Порт данных

Запись (замечание 1)

Биты 7-0

Данные 7-0

^ Замечание 1: если порт двунаправленный, то для регистра данных возможны операции и чтения, и записи.

Базовый адрес, обычно называемый портом данных или регистром данных, используется просто для вывода данных на линии данных параллельного порта (выводы 2-9). Этот регистр обычно доступен только для записи. Если вы попытаетесь читать из этого порта, вы получите последний посланный байт. Однако, если у вас двунаправленный порт, вы можете считывать данные из этого порта. Подробнее см. описание двунаправленного порта.

Смещение

Имя

^ Чтение / запись

Бит №

Свойства

База + 1

Порт состояния

Только чтение

Бит 7

Busy

Бит 6

Ack

Бит 5

Paper Out

Бит 4

Select

Бит 3

Error

Бит 2

IRQ (Not)

Бит 1

Reserved

Бит 0

Reserved

Таблица 5. Порт состояния

Порт состояния (базовый адрес + 1) доступен только для чтения. Любые данные, записанные в этот порт, будут игнорироваться. Порт состояния состоит из 5 входных линий (выводы 10,11,12,13 и 15), регистра состояния IRQ и двух зарезервированных битов. Пожалуйста, обратите внимание, что бит 7 (Busy) имеет активный низкий уровень. Например. Если бит 7 содержит логический 0, это означает, что на выводе 11 +5v. Аналогично для бита 2 (nIRQ): если этот бит показывает '1', значит, прерывание не произошло.


Смещение

Имя

^ Чтение / запись

Бит №

Свойства

База + 2

Порт управления

Чтение и запись

Бит 7

Не используется

Бит 6

Не используется

Бит 5

Разрешает двунапраленный порт

Бит 4

Разрешает IRQ через линию Ack

Бит 3

Select Printer

Бит 2

Initialize Printer (Reset)

Бит 1

Auto Linefeed

Бит 0

Strobe

Таблица 6. Порт управления

Порт управления (базовый адрес + 2) предназначен только для записи. Когда принтер подключён к параллельному порту, используются четыре линии управления. Это - Strobe, Auto Linefeed, Initialize и Select Printer, все инвертирующие, кроме Initialize.

Принтеру можно не посылать сигнал инициализации или Auto Linefeed. Однако эти четыре выхода могут также использоваться как входы. Если компьютер подал на вывод высокий уровень (например, +5v) а ваше устройство хотело подать туда низкий уровень, Вы вызовете конфликт на этом выводе. Поэтому к этим линиям подключены выходы с открытым коллектором (или открытым стоком для CMOS устройств). Это означает, что они имеют два состояния: низкий уровень (0v) и высокоимпедансное состояние (открытая схема).

Обычно плата принтера будет иметь внутренние притягивающие резисторы, но не всегда. Некоторые платы могут иметь только выходы с открытым коллектором, в то время как другие могут даже иметь нормальные двухтактные выходы. Чтобы ваше устройство правильно работало на многих параллельных портах (насколько это возможно), Вы также можете использовать внешний резистор. Если Вы уже имеете внутренний резистор, тогда он будет подключён параллельно с этим, или, если у вас двухтактные выходы, резистор будет работать как нагрузка.

Внешний резистор 4.7k может использоваться, чтобы подавать на вывод высокий уровень. Я не использовал бы меньший номинал, на случай наличия внутреннего притягивающего резистора. Когда выводы параллельного порта находятся в состоянии высокого импеданса, на них будет высокий уровень (+5v). При этом ваше внешнее устройство может подавать на вывод низкий уровень, и тогда из порта управления можно читать различные величины. Этим путем 4 вывода порта управления могут использоваться для двунаправленной передачи данных. Однако порт управления должен быть установлен в xxx0100, чтобы он мог читать данные без конфликтов при подаче логического 0.

Биты 4 и 5 - внутреннее средство управления. Бит 4 разрешает прерывания IRQ (См. "Использование IRQ параллельных портов"), а бит 5 разрешает работу двунаправленному порту, то есть Вы сможете вводить 8 битов через линии данных (DATA0-7). Этот режим возможен, только если ваша плата поддерживает его. Биты 6 и 7 зарезервированы. Любая запись в эти два бита будет игнорироваться.
^

Двунаправленный порт


Схема, приведённая ниже, показывает упрощенное представление регистра данных параллельного порта. Первоначально контроллеры параллельного порта делались на логике 74LS. Сейчас они размещаются в БИС, но принцип действия остаётся тот же самый.



Однонаправленные порты были изготовлены на 74LS374, у которого на разрешение выхода постоянно подан низкий уровень, поэтому порт данных всегда работает только на выход. Когда Вы читаете регистр данных параллельного порта, данные поступают от 74LS244, который также связан с выводами данных. Теперь, если Вы можете управлять ' 374, Вы можете получить двунаправленный порт (или только входной порт, если Вы отключите выходные защёлки).

Двунаправленный порт использует бит 5 регистра управления, связанный с разрешением выходов 374, что позволяет выключать выходные драйверы. Этим путем Вы можете читать данные, представленные на выводах данных параллельного порта без того, чтобы иметь конфликты шин и чрезмерные токи утечки.

Бит 5 порта управления разрешает или запрещает функцию двунаправленности параллельного порта. Это доступно только на истинно двунаправленных портах. Когда этот бит установлен в 1, выводы от 2 до 9 переходят в состояние высокого импеданса. При этом состоянии Вы можете подавать данные на эти линии и считывать их из порта данных (базовый адрес). Любые данные, записанные в порт данных, будут сохранены, но не будут доступны на выводах данных. Для выключения двунаправленного режима надо сбросить бит 5 порта управления в '0'.

Однако не все порты ведут себя таким образом. Некоторые порты могут требовать установки бита 6 порта управления для разрешения двунаправленного режима и установки бита 5 для его запрета. Различные изготовители реализуют свои двунаправленные порты различными способами. Если Вы хотите использовать ваш двунаправленный порт для ввода данных, сначала проверьте его логическим пробником или мультиметром, чтобы удостовериться, что он находится в двунаправленном режиме.
^

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


Если ваш параллельный порт не поддерживает двунаправленный режим, не отчаивайтесь. Вы можете вводить до 9 битов в любое время. Чтобы сделать это, Вы можете использовать 5 входных линий входа порта состояния и 4 входных линии (с открытым коллектором) порта управления.



Входы параллельного порта устроены так, чтобы облегчить нам жизнь. Busy занимает MSB (Бит 7) порта состояния, затем в порядке возрастания идут Ack, Paper Out и Select, составляя старшую тетраду порта управления. Надчёркивания показывают, какие входы аппаратно инвертируются, то есть +5v будет читаться из регистра как 0, в то время как GND будет читаться как 1. Порт состояния имеет только инвертируемые входы.

Порт управления используется для чтения младшей тетрады. Как уже говорилось, порт управления имеет выходы с открытым коллектором, то есть они имеют два возможных состояния: высокий импеданс и GND. Если мы соединяем наши выходы (в оригинале почему-то входы) непосредственно с портом (например, ADC0804 с двухтактными выходами), то произойдёт конфликт, если у нас на выходе высокий уровень, а порт пытается установить низкий. Поэтому мы используем инверторы с открытым коллектором.

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

Другая проблема, о которой надо знать - притягивающие резисторы на линиях порта управления. Средний номинал резистора - 4.7 кОм. Чтобы установить на линии низкий уровень, ваше устройство должно будет принять ток 1mA, чего некоторые маломощные устройства не могут. Теперь, что случится, если я предложу, чтобы некоторые порты имели притягивающие резисторы 1 кОм? Да, имеются такие карты. Ваше устройство теперь должно принять 5mA. Много причин использовать инверторы с открытым коллектором.

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

Вход D3 связан через инвертор с Select Printer, который подключён к биту 3 порта управления. D2, D1 и D0 связаны с Init, Auto linefeed и Strobe, составляя младшую тетраду. Теперь все, что мы должны сделать - собрать байт, используя программное обеспечение. Первое, что мы должны делать - записать xxxx0100 в порт управления. Этим мы установим на всех линиях порта управления высокий уровень, и входные данные смогут установить на них низкие уровни.

outportb(CONTROL, inportb(CONTROL) & 0xF0 | 0x04);

Теперь, когда это сделано, мы можем читать старшую тетраду. Она соответствует старшей тетраде порта состояния. Поскольку нас интересует только старшая тетрада, мы будем объединять результат по И с 0xF0, чтобы очистить младшую тетраду. Busy аппаратно инвертирован, но мы сейчас не будем обращать на это внимание. Как только байт будет собран, мы можем убить двух зайцев, переключая Busy и Init одновременно.

a = (inportb(STATUS) & 0xF0); /* Read MSnibble */

Теперь мы можем читать младшую тетраду. Случайно оказывается, что это младшая тетрада порта управления - как удобно! На сей раз нам не нужна старшая тетрада порта, таким образом, мы объединим результат по И с 0x0F, чтобы очистить её. Как только это сделано, пришло время объединять полученные два байта по ИЛИ. Теперь у нас один байт, однако, мы все же не закончили. Проинвертируем биты 2 и 7, выполнив Исключающее Или нашего байта с 0x84.

a = a |(inportb(CONTROL) & 0x0F); /* Read LSnibble */

a = a ^ 0x84; /* Toggle Bit 2 & 7 */

Обратите внимание: некоторые порты управления имеют выходы не с открытым коллектором, а двухтактные. Это также имеет место в портах EPP и ECP. Обычно, когда Вы переводите параллельный порт в режим ECP или EPP, выходы порта управления становятся только двухтактными. А что случится, если Вы соедините ваше устройство с параллельным портом в этом режиме? Поэтому для переносимости я рекомендую использовать следующую схему, читая за один раз только одну тетраду.
^

Режим тетрады


Режим тетрады - это предпочтительный путь чтения 8 битов данных без того, чтобы переключать порт на ввод и использовать линии данных. Режим тетрады использует мультиплексирование четырёх пар линий на 4 линии, читая сначала одну тетраду данных. Затем подключается и считывается другая тетрада. Программное обеспечение собирает эти две тетрады в байт. Единственное неудобство этой техники - то, что она медленная. Требуется несколько инструкций ввода - вывода для чтения одного байта и внешняя микросхема.



Микросхема 74LS157, четыре мультиплексора двух линий в одну, работает просто. Это четыре переключателя. Когда на входе A/B низкий уровень, выбраны входы А. Например, 1A проходит на 1Y, 2A проходит на 2Y и т.д. Когда на A/B высокий уровень, выбраны входы B. Выходы Y соединены с портом состояния параллельного порта так, что они представляют собой старшую тетраду регистра состояния. Это не необходимо, но облегчает программирование.

Чтобы использовать эту схему, сначала мы должны инициализировать мультиплексор, чтобы подключить входы А или B. Мы будем читать сначала младшую тетраду, таким образом, мы должны подать на A/B низкий уровень. Strobe аппаратно инвертируется, поэтому мы должны установить бит 0 порта управления, чтобы получить низкий уровень на выводе 1.

outportb(CONTROL, inportb(CONTROL) | 0x01); /* Select Low Nibble (A)*/

Когда выбрана младшая тетрада, мы можем её считать из порта состояния. Обратите внимание, что линия Busy инвертирована, однако мы не будем заниматься этим сейчас. Мы заинтересованы только старшей тетрадой, поэтому мы объединяем результат по И с 0xF0, очищая младшую тетраду.

a = (inportb(STATUS) & 0xF0); /* Read Low Nibble */

Теперь время сдвинуть только что считанную младшую тетраду в переменной a:

a = a >> 4; /* Shift Right 4 Bits */

Теперь мы на половине пути. Это время, чтобы получить старшую тетраду, поэтому мы должны переключить мультиплексор, чтобы выбрать входы B. Тогда мы сможем считать старшую тетраду и соединить эти две тетрады вместе, чтобы сделать байт:

outportb(CONTROL, inportb(CONTROL) & 0xFE); /* Select High Nibble (B)*/

a = a |(inportb(STATUS) & 0xF0); /* Read High Nibble */

byte = byte ^ 0x88;

В последней строке переключаются два инвертированных бита, считанные с линии Busy. Может оказаться необходимо добавить задержки, если возвращаются неправильные результаты.
^

Использование прерываний параллельного порта


Запрос прерывания параллельного порта не используется для печати под DOS или Windows. Ранние версии OS-2 использовали их, но больше этого не делают. Прерывания хороши при работе с устройствами, требующими частого обслуживания в заранее неизвестные моменты времени, типа датчиков тревоги и т.д. Это более эффективно, чем регулярный программный опрос портов для отслеживания изменений. Это ещё более важно, если Вы используете ваш компьютер для других задач, как в многозадачной операционной системе.

Параллельный порт обычно использует запрос прерывания IRQ5 или IRQ7, но может использовать и другие, если эти заняты. Прерывания в контроллере могут быть вообще запрещены, если он используется только для печати. Прерывания параллельный порта можно запрещать и разрешать, используя бит 4 регистра управления, Enable IRQ Via Ack Line. После разрешения прерывание произойдет по нарастающему фронту nACK. Однако, как всегда, некоторые контроллеры могут вызывать прерывания по спадающему фронту.

Далее приводится код программы "Проверка полярности прерывания", которая служит для двух целей. Она определяет полярность прерывания вашего параллельный порта и даёт Вам пример использования прерываний параллельного порт. Она проверяет, при каком перепаде на линии nACK произошло прерывание. Чтобы использовать программу, просто подключите одну из линий данных (выводы от 2 до 9) к линии Ack (вывод 10). Проще всего спаять DATA7 (вывод 9) с ACK (вывод 10) на вилке DB25.

(нечего тут переводить, см. оригинал)

Во время компиляции приведённый код может производить несколько предупреждений: условие всегда истинное, условие всегда ложное, недостижимый код и т.д. Это совершенно нормально. Здесь использованы некоторые условные структуры, зависящие от того, какое IRQ Вы используете, и, поскольку IRQ определено как константа, некоторые результаты никогда не будут изменяться. Это лучше было выполнить с помощью директив препроцессора, но я сделал так, чтобы Вы могли сокращать исходный код и вставлять его в ваши собственные программы, которые могут использовать аргументы командной строки, ввод пользователя и т.д вместо определенного IRQ.

Чтобы понимать, как работает этот пример, читатель должны иметь представление о прерываниях и сервисе обработки прерываний (ISR). Если этого нет, см. "Interfacing the PC: Using Interrupts" для быстрого ознакомления.

Первая часть основной программы вычисляет вектор прерывания, PIC Addr и Mask, чтобы использовать средства прерываний параллельного порта.

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

Режимы параллельного порта в BIOS


Сегодня большинство параллельных портов - многорежимные. Они обычно программно устанавливаются в один из режимов из BIOS. Типичные режимы:

- режим принтера (иногда называемый «По умолчанию» (Default) или «Нормальным» (Normal));

- стандартный и двунаправленный (SPP) режим;

- режим EPP1.7 and SPP

- режим EPP1.9 and SPP

- режим ECP

- режим ECP and EPP1.7

- режим ECP and EPP1.9

Режим принтера - это основной режим. Это стандартный параллельный порт, работающий только в прямом направлении. У него нет свойства двунаправленности, поэтому бит 5 порта управления не работает. Стандартный и двунаправленный (SPP) режим - это двунаправленный режим. Используя бит 5 порта управления, можно менять направление передачи данных через порт.

Режим EPP 1.7 и SPP - это комбинация режимов EPP 1.7 (расширенный параллельный порт) и SPP. В этом режиме работы Вы будете иметь доступ к регистрам SPP (данные, состояние и управление) и к регистрам EPP. В этом режиме Вы должны изменять направление работы порта, используя бит 5 регистра управления. EPP 1.7 - это более ранняя версия EPP. Эта версия может не иметь бита тайм-аута. Подробнее см. "Interfacing the Enhanced Parallel Port".

Режим EPP1.9 and SPP подобен предыдущему режиму, но использует версию EPP 1.9. Вы также будете иметь доступ к регистрам SPP, включая бит 5 порта управления. Однако у вас будет доступ к биту тайм-аута.

Режим ECP предоставляет вам «Порт с расширенными возможностями». Режим этого порта может быть установлен с использованием Регистра расширенного управления (ECR). Однако в этом режиме режим EPP из BIOS (100) будет недоступен. Мы здесь ещё обсудим регистр ECR, но для получения более подробной информации смотрите «Interfacing the Extended Capabilities Port».

Режимы ECP and EPP1.7 и ECP and EPP1.9, как и предыдущий режим, обеспечивают работу в режиме ECP. Однако теперь можно устанавливать режим EPP через регистр ECR. В первом режиме вы получите EPP 1.7, а во втором - EPP 1.9.

Вышеупомянутые режимы конфигурируются через BIOS. Вы можете конфигурировать их, используя ваше собственное программное обеспечение, но это не рекомендуется. Эти программные регистры, обычно расположенные по адресам 0x2FA, 0x3F0, 0x3F1 и т.д предназначены только для обращения через BIOS. Не имеется никакого стандарта для набора этих регистров конфигурации, таким образом, если бы Вы будете использовать эти регистры, ваше программное обеспечение не будет переносимо. С сегодняшними многозадачными операционными системами это тоже нецелесообразно.

Наилучшим выбором будет установка режима ECP + какой-либо EPP и использование регистра ECR для выбора режима Вашего параллельного порта. В режиме EPP 1.7 могут возникнуть проблемы из-за того, что стробы данных и адреса начинают цикл, не обращая внимания на состояние ожидания, но этот режим сейчас обычно не используется. Лучше устанавливайте параллельный порт в режим ECP and EPP 1.9.
^

Параллельный порт и регистр расширенного управления ECR


Как уже обсуждалось, лучше всего установить параллельный порт в режим ECP and EPP 1.9 и использовать регистр расширенного управления для выбора разных режимов работы. Регистр ECR стандартизирован в Extended Capabilities Port Protocol and ISA Interface Standard фирмы Microsoft, поэтому у нас не будет проблем с каждым производителем, использующим свой собственный набор регистров.

Когда установлен режим ECP, по адресу База + 400h доступен новый набор регистров. Эти регистры обсуждаются в «Interfacing the Extended Capabilities Port». Здесь мы интересуемся только регистром расширенного управления ECR, отображаемым на адрес База + 402h. Отметим, что регистры ECP недоступны для портов с базовым адресом 3BCh.

Бит

Назначение


7:5



Выбор текущего режима

000

Стандартный режим

001

Байтовый режим

010

Режим параллельного порта c FIFO

011

Режим ECP FIFO

100

Режим EPP

101

Зарезервирован

110

Режим теста FIFO

111

Режим конфигурации

4

Бит прерывания ECP

3

Бит разрешения DMA

2

Бит обслуживания ECP

1

FIFO полон

0

FIFO пуст

Таблица 7. Регистр расширенного управления.

В этой таблице показан регистр расширенного управления. Мы интересуемся только тремя старшими его битами, которые задают режим работы. Существуют 7 возможных режимов работы, но не все порты поддерживают все режимы. Например, режим EPP, не поддерживаемый некоторыми портами.
^

Режимы работы


Стандартный режим

Выбор этого режима приводит к тому, что порт ECP ведёт себя как стандартный параллельный порт, без функции двунаправленности.

Байтовый режим / режим PS/2

Ведёт себя как SPP в двунаправленном режиме. Бит 5 переключает порт в обратное направление.

Режим параллельного порта с FIFO

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

Режим ECP FIFO

Стандартный режим для использования в ECP. Этот режим использует уже описанное подтверждение связи ECP. - Когда режим ECP установлен в BIOS и в регистре ECR установлен режим ECP FIFO, регистры SPP могут исчезать.

Режим EPP / зарезервирован

Этот режим разрешает использование EPP, если он доступен. Если под BIOS установлен режим ECP, то наиболее вероятно, что этот режим не устанавливается. Однако, если в BIOS установлен режим ECP + EPP 1.x, то EPP 1.x будет доступен. Согласно Extended Capabilities Port Protocol and ISA Interface Standard от Microsoft этот режим определяется производителем.

Зарезервирован

В настоящее время зарезервирован. Согласно ^ Extended Capabilities Port Protocol and ISA Interface Standard от Microsoft этот режим определяется производителем.

Режим теста FIFO

В этом режиме любые данные, записанные в регистр теста FIFO, будут помещены в FIFO, и любые данные, считанные из регистра теста FIFO, будут читаться из буфера FIFO. Биты состояния FIFO "полон / пуст" отразят их истинную величину. Таким образом, в этом режиме среди прочего может быть определена глубина FIFO.

Конфигурационный режим

В этом режиме два регистра конфигурации, cnfgA и cnfgB, станут доступными по их адресам

Если Вы переключились в режим ECP через BIOS или джамперами на плате, полезно инициализировать Ваш порт ECP перед использованием, установив его в определённое состояние. Если вы используете SPP, то первым делом установите порт в этот режим. Не рассчитывайте, что порт уже установлен в стандартный (SPP) режим.

В некоторых режимах регистры SPP могут исчезать или работать неправильно. Если Вы используете SPP, то установите в ECR стандартный режим. Иначе Вы сделаете одну из часто встречающихся ошибок.








Похожие:

Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconСтандартный параллельный порт (Interfacing the Standard Parallel Port)
Переведено Д. С. Иоффе (dsioffe@yandex ru, Icq 313263348) с другом promtом (в девичестве Stylus) исключительно для расширения собственного...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconРасширенный параллельный порт (Interfacing the Enhanced Parallel Port)
Переведено Д. С. Иоффе (dsioffe@yandex ru, Icq 313263348) с другом promtом (в девичестве Stylus) исключительно для расширения собственного...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconРасширенный параллельный порт (Interfacing the Enhanced Parallel Port)
Переведено Д. С. Иоффе (dsioffe@yandex ru, Icq 313263348) с другом promtом (в девичестве Stylus) исключительно для расширения собственного...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconПараллельный порт с расширенными возможностями (Interfacing the Extended Capabilities Port)
Переведено Д. С. Иоффе (dsioffe@yandex ru, Icq 313263348) с другом promtом (в девичестве Stylus) исключительно для расширения собственного...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconПараллельный порт с расширенными возможностями (Interfacing the Extended Capabilities Port)
Переведено Д. С. Иоффе (dsioffe@yandex ru, Icq 313263348) с другом promtом (в девичестве Stylus) исключительно для расширения собственного...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconТема: представление нечисловой информации в компьютере Изображение размерами 60х80 передается со скоростью 1000 бит/с
Каждый символ вводится в компьютер нажатием клавиши на клавиатуре. Каждая клавиша имеет свой числовой код в соответствии с кодовой...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconКонспект урока по алгебре в 7 классе на тему: «Одночлен и его стандартный вид»
Говорится о том, что на этом уроке нужно повторить определение степени, свойства степеней с одинаковыми основаниями, и начнется изучение...
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconPort Popova

Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconДокументы
1. /r320/label/00021-5_FEA209544_21UEN_A.PDF
2. /r320/label/5_00021-5_FEA209544_21UEN_B.PDF
Стандартный параллельный порт (Interfacing the Standard Parallel Port) iconУчредители и спонсоры фестиваля
Ооо “ вск “, ООО “Ориста”, ООО “свт восточный ”, ООО стивидорная компания “Малый порт”, ООО “ккс ”, профком докеров рпд ОАО “Восточный...
Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©podelise.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы

Разработка сайта — Веб студия Адаманов