КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
CENTRONICS И ЕГО ПРОГРАММИРОВАНИЕ
Исторически параллельный интерфейс был введен в персональный компьютер (ПК) для подключения принтера (отсюда и аббревиатура LPT – Line Printer –построчный принтер). Однако впоследствии параллельный интерфейс стал использоваться для подключения других периферийных устройств (ПУ). Базовая разновидность порта позволяет передавать данные только в одном направлении (от ПК к ПУ), однако позднее был разработан ряд стандартов двунаправленной передачи данных. Адаптер параллельного интерфейса представляет собой набор регистров, расположенных в адресном пространстве устройств ввода/вывода. Количество регистров зависит от типа порта, однако три из них стандартны и присутствуют всегда. Это регистр данных, регистр состояния и регистр управления. Адреса регистров отсчитываются от базового, стандартные значения которого 3BCh, 378h, 278h. Порт может использовать аппаратное прерывание (IRQ7 или IRQ9). Многие современные системы позволяют изменять режим работы порта, его адрес и IRQ из настроек базовой системы ввода-вывода (Base Input Output System – BIOS) Setup. LPT порт имеет внешнюю 8-битную шину данных, 5-битную шину сигналов состояния и 4-х битную шину управляющих сигналов. Очевидно, что порт асимметричен - 12 линий работают на вывод и только 5 на ввод. При начальной загрузке BIOS пытается обнаружить параллельный порт, причем делает это примитивным и не всегда корректным образом - по возможным базовым адресам портов передается тестовый байт, состоящий из чередующегося набора нулей и единиц (55h или AAh), затем производится чтение по тому же адресу, и если прочитанный байт совпал с записанным, то считается, что по данному адресу найден LPT порт. Определить адрес порта LPT4 BIOS не может. Для работы с ПУ в BIOS предусмотрено прерывание INT 17h, предоставляющее возможность передавать данные (побайтно), инициализировать ПУ и получать информацию о его состоянии. Понятие Centronicsотносится к набору сигналов, протоколу обмена и 36-контактному разъему, устанавливаемому в принтерах. Большинство современных принтеров совместимы с интерфейсом Centronics. Назначение сигналов и контакты разъема ПУ, на который они выведены приведены в таблице 1. Таблица 1. Сигналы интерфейса Centronics
Примечание: столбец "T" – активный уровень сигнала: "1" – высокий активный уровень, "0" – низкий активный уровень. Столбец "Напр." – направление передачи по отношению к принтеру: I – Input (вход), O – Output (выход).
Сигнал Auto LF практически не применяется, но его неправильное значение приводит к тому, что принтер либо делает пропуски строк, либо печатает строки поверх друг друга, либо дублирует строки при печати в два прохода. Отечественным аналогом интерфейса Centronics является ИРПР-М. Кроме него существует интерфейс ИРПР (устаревший), который отличается протоколом обмена, отсутствием сигнала "Error" и инверсией линий данных. Кроме того, ко всем входным линиям ИРПР подключены пары согласующих резисторов: 220 Ом к +5 В и 330 Ом к общему проводу. Это перегружает большинство интерфейсных адаптеров современных ПК.
Рис. 1. Протокол обмена данными по интерфейсу Centronics
Протокол обмена данными по интерфейсу Centronics приведен на рис. 1. Передача начинается с проверки источником сигнала Error. Если он установлен, то обмен не производится. Затем проверяется состояние сигнала Busy. Если он равен "0", то источник приступает к передаче байта данных. Для передачи байта источник выставляет на линии D0-D7 байт данных и выдает сигнал Strobe#. Приемник по сигналу Strobe# (здесь и далее по тексту значок "#" после названия сигнала является признаком того, что сигнал имеет низкий активный уровень) читает данные с шины данных и выставляет сигнал Busy на время его обработки. По окончании обработки приемник выдает сигнал ACK# и снимает сигнал Busy. Если в течение длительного времени (6 – 12 сек) источник не получает ACK#, то он принимает решение о ошибке "тайм-аут" (time-out) устройства. Если после приема байта приемник по какой - либо причине не готов принимать данные, то он не снимает сигнал Busy. При программной реализации обмена по указанному протоколу желательно ограничить время ожидания снятия Busy (обычно 30 – 45 сек), иначе возможно зависание программы. Стандартный параллельный порт называется SPP (Standard Parallel Port). SPP порт является однонаправленным, на его базе программно реализуется протокол обмена Centronics. Порт обеспечивает возможность генерации IRQ по импульсу ACK# на входе. Сигналы порта выводятся на стандартный разъем DB-25S (розетка), который размещен непосредственно на плате адаптера или соединяется с ним плоским шлейфом (в случае, если адаптер интегрирован с материнской платой). Названия сигналов соответствуют названиям сигналов интерфейса Centronics (таблица 2), а изображение разъема интерфейсного адаптера со стороны компьютера приведено на рис. 2.
Таблица 2. Разъем и шлейф стандартного LPT порта
Примечание. I/O – направление передачи: I – вход; O – выход; O(I) – выход, состояние которого может быть считано при определенных условиях, O/I – выходные линии, состояние которых читается при чтении из соответствующих регистров порта. * - Вход ACK# соединен с питанием +5 В через резистор 10 кОм. Это сделано для исключения ложных прерываний, т.к. прерывание генерируется по отрицательному перепаду сигнала на входе ACK#.
Рис. 2. Разъем интерфейсного адаптера Cetronics DB-25S В качестве недостатков стандартного LPT порта (SPP) следует отметить невысокую скорость передачи данных (100 – 150 кБ/сек), загрузку процессора при передаче данных, невозможность двунаправленного побайтного обмена. Существует "радиолюбительская" методика двунаправленного обмена, которая состоит в том, что для ввода данных на линии D0-D7 выставляют "1", а в качестве передатчика используют микросхемы с открытым коллектором, которые при открытом транзисторе могут "подсаживать" напряжение логической единицы до уровня порядка 1.5 – 1.7 В. Ток ограничен на уровне 30 мА. Как очевидно из уровней сигналов, они не соответствуют уровням ТТЛ, поэтому многие порты не работают в таком режиме или работают нестабильно. Кроме того, такой способ может быть опасен для адаптера порта, который будет работать с предельными для него токами. Стандарт IEEE 1284, принятый в 1994 году, определяет термины SPP, ЕРР и ЕСР. Стандарт определяет 5 режимов обмена данными, метод согласования режима, физический и электрический интерфейсы. Согласно IEEE 1284, возможны следующие режимы обмена данными через параллельный порт: – Compatibility Mode – однонаправленный (вывод) по протоколу Centronics. Этот режим соответствует стандартному (традиционному) порту SPP; – Nibble Mode – ввод байта в два цикла (по 4 бита), используя для ввода линии состояния. Этот режим обмена может использоваться на любых адаптерах; – Byte Mode – ввод байта целиком, используя для приема линии данных. Этот режим работает только на портах, допускающих чтение выходных данных (Bi-Directional или PS/2 Type 1); – ЕРР (Enhanced Parallel Port) Mode – двунаправленный обмен данными, при котором управляющие сигналы интерфейса генерируются аппаратно во время цикла обращения к порту (чтения или записи в порт). Эффективен при работе с устройствами внешней памяти, адаптерами локальных сетей; – ЕСР (Extended Capability Port) Mode – двунаправленный обмен с возможностью аппаратного сжатия данных по методу RLE (Run Length Encoding), использования FIFO-буферов и DMA. Управляющие сигналы интерфейса генерируются аппаратно. Эффективен для принтеров и сканеров. В современных машинах с LPT-портом на системной плате режим порта – SPP, ЕРР, ЕСР или их комбинация задается в BIOS Setup. Режим Compatibility Mode полностью соответствует SPP и часто установлен по умолчанию. Все остальные режимы расширяют функциональные возможности интерфейса и повышают его производительность. Кроме того, стандарт регламентирует способ согласования режима, доступного как ПК, так и периферийному устройству. Физический и электрический интерфейс.Стандарт IEEE 1284 определяет физические характеристики приемников и передатчиков сигналов. IEEE 1284 предусматривает два уровня интерфейсной совместимости: первый уровень - для устройств, не требующих высоких скоростей обмена, но использующих возможность смены направления передачи данных; второй уровень - устройства, работающие в расширенных режимах, с высокими скоростями и длинными кабелями. Требования к передатчикам приведены в таблице 3, для приемников – в таблице 4.
Таблица 3. Требования стандарта IEEE 1284 к передатчикам
Таблица 4. Требования стандарта IEEE 1284 к приемникам
Примечание: Входные линии соединяются с шиной питания резистором 1.2 кОм. Стандарт IEEE 1284 определяет три типа используемых разъемов: А (DB-25S), B (Centronics-36), C (новый малогабаритный 36-контактный разъем). Интерфейсные кабели могут иметь от 18 до 25 проводников (в зависимости от числа проводников GND). Не предъявляется жестких требований к экранировке и прочим параметрам, однако, такие кабели могут работать только на низких скоростях при длине не более 2 метров. Стандарт IEEE 1284 для улучшенных кабелей определяет следующие параметры: – Все сигнальные проводники должны быть перевиты с отдельными обратными (общими) проводами; – Каждая пара должна иметь импеданс 62±6 Ом в диапазоне частот 4–16 МГц; – Уровень перекрестных помех не должен превышать 10%; – Кабель должен иметь экран, покрывающий не менее 85 процентов внешней поверхности. На концах кабеля экран должен быть окольцован и соединен с контактом разъема GND. Кабели, удовлетворяющие этим требованиям, маркируются как "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 портов
Стандартный порт имеет три 8-битных регистра, расположенных по соседним адресам, начиная с базового (Base) адреса. Перечень данных регистров приведен в- табл. 6.
Таблица 6. Регистры стандартного LPT порта
Примечание. W-R – доступные операции (W – запись, R – чтение, W/R – запись/чтение). Регистр данных (DR).Записанные в этот регистр данные выводятся на выходные линии интерфейса D0-D7. Результат чтения этого регистра зависит от схемотехники адаптера и соответствуют либо записанным ранее данным, либо сигналам на линиях D0-D7, что не всегда одно и тоже. При стандартном включении справедлив первый вариант - читаемые данные равны ранее записанным. Регистр состояния (SR). Представляет собой 5-ти битный порт ввода, на который заведены сигналы состояния от внешнего устройства. Допускает только чтение. Назначение битов данного регистра приведены в табл. 7.
Регистр управления (CR).Регистр управления представляет собой 4-х битный порт вывода, допускающий чтение и запись. Биты 0, 1, 3 инвертируются, т.е. "1" в данных битах регистра управления соответствует "0" на соответствующих линиях порта. Назначение битов регистра управления приведены в табл. 8. Бит 5 используется только двунаправленными портами. Программирование интерфейса Для разработки прикладных программ необходимо выбрать язык программирования. Если требуется несложная, быстрая и компактная программа, которая не содержит сложных вычислительных операций, то для ее написания лучше выбирать язык низкого уровня (язык ассемблера). Язык ассемблера относится к группе машинно-ориентированных языков, т.е. каждому семейству микропроцессоров соответствует свой язык. Таблица 8. Биты регистра управления CR
Язык высокого уровня следует выбирать, если необходимо производить сложные вычисления, или в случае, если высокое быстродействие программы не требуется. Объектные коды, полученные в результате трансляции программ, написанных на языке высокого уровня, обычно занимают в памяти ЭВМ намного больше места и исполняются медленнее в сравнении с программами на ассемблере. Часто применяется подход, когда критичные к быстродействию части программы пишутся на ассемблере, а вычислительные процедуры – на языке высокого уровня, например, на Паскале или Си. Рассмотрим работу с регистрами интерфейса CENTRONICS на языке PASCAL или ассемблере:
Х - число типа "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-порта является весьма простой задачей, что позволяет в значительной степени облегчить работу разработчика программного обеспечения устройств с обсуждаемым интерфейсом.
|