Программирование LPT

Принтеры, сканеры, копиры
Ответить
comexe
Юзер
Юзер
Сообщения: 9
Зарегистрирован: 19 окт 2010, 17:27

Программирование LPT

Сообщение comexe » 20 окт 2010, 13:19

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

Электротехническая часть.

В середине 80-х годов ХХ века весьма расширилась разработка периферийных устройств компьютеров. Здесь даже не важно каково было предназначение тех ЭВМ, важно то, что необходимо было создание универсального интерфейса, с помощью которого обеспечивалась бы надежная и скоростная (для тех лет) связь с периферией. Одним из первых был создан простой параллельный интерфейс Centronics.

Одно из первых применений этого интерфейса был вывод цифровых данных на графопостроитель. Позже это предназначение настолько "въелось" в архитектуру интерфейса, что его стали называть проще: "Line PrinTer — построчный принтер".

Традиционный, он же стандартный, LPT-порт (так называемый SPP-пopт) ориентирован на вывод данных, хотя с некоторыми ограничениями позволяет и вводить данные. Существуют различные модификации LPT-порта - двунаправленный, ЕРР, ЕСР и другие, расширяющие его функциональные возможности, повышающие производительность и снижающие нагрузку на процессор. Поначалу они являлись фирменными решениями отдельных производителей, позднее был принят стандарт IEEE 1284.
С внешней стороны порт имеет 8-битную шину данных, 5-битную шину сигналов состояния и 4-битную шину управляющих сигналов, выведенные на разъем-розетку DB-25S. В LPT-порте используются логические уровни ТТЛ, что ограничивает допустимую длину кабеля из-за невысокой помехозащищенности ТТЛ-интерфейса. Гальваническая развязка отсутствует - схемная земля подключаемого устройства соединяется со схемной землей компьютера.
Изображение

Традиционный, он же стандартный, LPT-порт называется стандартным параллельным портом (Standard Parallel Port, SPP), или SPP-портом, и является однонаправленным портом, через который программно реализуется протокол обмена Centronics. Название и назначение сигналов разъема порта (табл. 1.1) соответствуют интерфейсу Centronics.

Изображение
1 I/O задает направление передачи (вход-выход) сигнала порта. O/I обозначает выходные линии, состояние которых считывается при чтении из портов вывода; 6(1) - выходные линии, состояние которых может быть считано только при особых условиях (см. ниже).
2 Символом "\" отмечены инвертированные сигналы (1 в регистре соответствует низкому уровню линии).
3 Вход Ack# соединен резистором (10 кОм) с питанием +5 В.


Ниже описано назначение бит регистра состояния (в скобках даны номера контактов разъема порта).
¦ SR.7 - Busy - инверсное отображение состояния линии Busy (11): при низком уровне на линии устанавливается единичное значения бита - разрешение на вывод очередного байта.
¦ SR. 6 - Ack (Acknowledge) - отображение состояния линии Ack# (10).
¦ SR. 5 - РЕ (Paper End) - отображение состояния линии Paper End (12). Единичное значение соответствует высокому уровню линии - сигналу о конце бумаги в принтере.
¦ SR. 4 - Select - отображение состояния линии Select (13). Единичное значение соответствует высокому уровню линии - сигналу о включении принтера.
¦ SR. 3 - Error - отображение состояния линии Error* (15). Нулевое значение соответствует низкому уровню линии - сигналу о любой ошибке принтера.
¦ SR.2 - PIRQ - флаг прерывания по сигналу Ack# (только для порта PS/2). Бит обнуляется, если сигнал Ack# вызвал аппаратное прерывание. Единичное значение устанавливается по аппаратному сбросу и после чтения регистра состояния.
¦ SR[1:0] - зарезервированы.
Control Register (СR) - регистр управления, адрес=ВАSЕ+2, допускает запись и чтение. Регистр связан с 4-битным портом вывода управляющих сигналов (биты 0-3) для которых возможно и чтение; выходной буфер обычно имеет тип "открытый коллектор". Это позволяет корректно использовать линии данного регистра как входные при программировании их в высокий уровень. Биты 0,1,3 инвертируются.
Ниже описано назначение бит регистра управления.
¦ CR [7:6] - зарезервированы.
¦ CR.5 - Direction - бит управления направлением передачи (только для портов PS/2, см. ниже). Запись единицы переводит порт данных в режим ввода. При чтении состояние бита не определено.
¦ CR. 4 - AcklNTEN (Ack Interrupt Enable) - единичное значение разрешает прерывание по спаду сигнала на линии Ack# - сигнал запроса следующего байта.

¦ CR.3 - Select In - единичное значение бита соответствует низкому уровню на выходе Select ln# (17) - сигналу, разрешающему работу принтера по интерфейсу Centronics.
¦ CR.2 - Init- нулевое значение бита соответствует низкому уровню на выходе Init# (16) - сигнал аппаратного сброса принтера.
¦ CR. 1 - Auto LF - единичное значение бита соответствует низкому уровню на выходе Auto LF# (14) - сигналу на автоматический перевод строки (LF - Line Feed) по приему байта возврата каретки (CR). Иногда сигнал и бит называют AutoFD или AutoFDXT.
¦ CR.0 - Strobe - единичное значение бита соответствует низкому уровню на выходе Strobe* (1) - сигналу стробирования выходных данных.
Запрос аппаратного прерывания (обычно IRQ7 или IRQ5) вырабатывается по отрицательному перепаду сигнала на выводе 10 разъема интерфейса (Ack#) при установке CR. 4=1. Во избежание ложных прерываний контакт 10 соединен резистором с шиной +5 В. Прерывание вырабатывается, когда принтер подтверждает прием предыдущего байта. Как уже было сказано, BIOS это прерывание не использует и не обслуживает.
Перечислим шаги процедуры вывода байта по интерфейсу Centronics с указанием требуемого количества шинных операций процессора.
1. Вывод байта в регистр данных (1 цикл IOWR#).
2. Ввод из регистра состояния и проверка готовности устройства (бит SR. 7 сигнал Busy). Этот шаг зацикливается до получения готовности или до срабатывания программного тайм-аута (минимум 1 цикл IORD#).
3. По получению готовности выводом в регистр управления устанавливается строб данных, а следующим выводом строб снимается. Обычно, чтобы переключить только один бит (строб), регистр управления предварительно считывается, что к двум циклам IOWR# добавляет еще один цикл IORD#.
Видно, что для вывода одного байта требуется 4-5 операций ввода-вывода с регистрами порта (в лучшем случае, когда готовность обнаружена по первому чтению регистра состояния). Отсюда вытекает главный недостаток вывода через стандартный порт - невысокая скорость обмена при значительной загрузке процессора. Порт удается разогнать до скоростей 100-150 Кбайт/с при полной загрузке процессора, что недостаточно для печати на лазерном принтере. Другой недостаток функциональный - сложность использования в качестве порта ввода.
Стандартный порт асимметричен - при наличии 12 линий (и бит), нормально работающих на вывод, на ввод работает только 5 линий состояния. Если необходима симметричная двунаправленная связь, на всех стандартных портах работоспособен режим полубайтного обмена - Nibble Mode. В этом режиме, называемом также Hewlett Packard Bi-tronics, одновременно принимаются 4 бита данных, пятая линия используется для квитирования. Таким образом, каждый байт передается за два цикла, а каждый цикл требует по крайней мере 5 операций ввода-вывода.

Схемотехника выходных буферов данных LPT-портов отличается большим разнообразием. На многих старых моделях адаптеров SPP-порт данных можно использовать и для организации ввода. Если в порт данных записать байт с единицами во всех разрядах, а на выходные линии интерфейса через микросхемы с выходом типа "открытый коллектор" подать какой-либо код (или соединить ключами какие-то линии со схемной землей), то этот код может быть считан из того же регистра данных. Однако выходным цепям передатчика информации придется "бороться" с выходным током логической единицы выходных буферов адаптера. Схемотехника ТТЛ такие решения не запрещает, но если внешнее устройство выполнено на микросхемах КМОП, их мощности может не хватить для "победы" в этом шинном конфликте. Однако современные адаптеры часто имеют в выходной цепи согласующий резистор с сопротивлением до 50 Ом. Выходной ток короткого замыкания выхода на землю обычно не превышает 30 мА. Простой расчет показывает, что даже в случае короткого замыкания контакта разъема на землю при выводе "единицы" на этом резисторе падает напряжение 1,5 В, что входной схемой приемника будет воспринято как "единица". Поэтому нельзя полагать, что такой способ ввода будет работать на всех компьютерах. На некоторых старых адаптерах портов выходной буфер отключается перемычкой на плате. Тогда порт превращается в обыкновенный порт ввода.

В общем говоря, LPT существует три разновидности: SPP, EPP и ECP.

SPP - самая первая историческая разновидность, соответствующая стандарту Centronics. SPP расшифровывается как Standard Parallel Port - стандартный параллельный порт. О нём подробно было рассказано в теоретической части. Но честно говоря, толку от SPP для наших исследований маловато будет, поскольку, он не обеспечивает полностью наши нужды. Вот его недостатки:

1.Моральная старость;

2.Невозможность двунаправленного байтного обмена с периферией;

3.Низкая скорость передачи данных.



EPP и ECP - вот что нам нужно. Это два конкурирующих формата, распространённых в настоящее время. И здесь просто распечаткой документа область применения не ограничивается.

EPP - Enhanced Parallel Port - Усовершенствованный параллельный порт, предоставляющий возможность двунаправленного обмена с внешними устройствами. В режиме EPP возможен скоростной ввод/вывод данных на: принтеры высокого разрешения, плоттеры и т.п.; со: сканеров, старых камер, устройств контроля и мониторинга различных физических параметров.

Приём данных LPT портом осуществить труднее, нежели передачу.

Программная часть:

Программирование LPT-штука не очень сложная. Вам потребуется установить Microsoft Visual Basic 6.0 и библиотеку inpout32.dll, которую можно скачать на http://www.logix4u.net. inpout32.dll-библиотека, позволяющая любой программе получить доступ к параллельному порту компьютера. Она содержит 2 алиаса: inp32 - ввод данных в порт и out32 - вывод из порта. Эту библиотеку помещают в %win%/system32/. Модуль Module1.bas описывает все необходимые процедуры и функции доступа через inpout32.dll к LPT.
Описание синтаксиса модуля Module1.bas:

Код: Выделить всё

'описание точек входа (алиасов) в библиотеку "inpout32.dll"

Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

'описание функции чтения данных из порта
Function BitRead%(Variable%, BitNumber%)
Dim BitValue%
BitValue = 2 ^ BitNumber
BitRead = (Variable And BitValue) \ BitValue
End Function

'описание процедуры сброса выбранного бита в состояние "по умолчанию"
Sub BitReset(Variable%, BitNumber%)
Dim BitValue, CurrentValue%
BitValue = 2 ^ BitNumber
Variable = Variable And (&HFFFF - BitValue)
End Sub

'описание процедуры перевода выбранного бита в состояние, противоположное состоянию "по умолчанию" 
Sub BitSet(Variable%, BitNumber%)
Dim BitValue, CurrentValue%
BitValue = 2 ^ BitNumber
Variable = Variable Or BitValue
End Sub

'описание процедуры переключения выбранного бита между состояниями 0 и 1
Sub BitToggle(Variable%, BitNumber%)
Dim BitValue, CurrentValue%
BitValue = 2 ^ BitNumber
CurrentValue = Variable And BitValue
Select Case CurrentValue
Case 0
Variable = Variable Or BitValue
Case Else
Variable = Variable And (&HFFFF - BitValue)
End Select
End Sub

'описание функции чтения регистра Control(&H37A)
Function ControlPortRead%(BaseAddress%)
ControlPortRead = (Inp(&H37A) Xor &HB)
End Function

'описание функции записи регистра Control(&H37A)
Sub ControlPortWrite(BaseAddress%, ByteToWrite%)
Out &H37A, ByteToWrite Xor &HB
End Sub

'описание функции чтения регистра Data
Function DataPortRead%(BaseAddress%)
DataPortRead = Inp(&H378)
End Function

'описание функции записи регистра Data
Sub DataPortWrite(BaseAddress%, ByteToWrite%)
Out &H378, ByteToWrite
End Sub

'описание функции чтения регистра Status
Function StatusPortRead%(BaseAddress%)
StatusPortRead = (Inp(&H379) Xor &H80)
End Function
Изображение
comexe
Юзер
Юзер
Сообщения: 9
Зарегистрирован: 19 окт 2010, 17:27

Re: Программирование LPT

Сообщение comexe » 20 окт 2010, 13:24

Программу-пробник и много чего другого по железу можно взять тут: http://esignals.narod.ru/FunnyLPT.zip
Это мой сайт, там много полезной информации, с той поры, пока я еще был студентом.
Изображение
Аватара пользователя
Raven
Бородатый сис
Бородатый сис
Сообщения: 2800
Зарегистрирован: 03 мар 2010, 15:12
ОС: RHEL 8
Откуда: Из серверной

Re: Программирование LPT

Сообщение Raven » 20 окт 2010, 14:57

comexe
*THUMBS UP* *WELCOME*
Я не злопамятный, я просто часто ковыряю логи
comexe
Юзер
Юзер
Сообщения: 9
Зарегистрирован: 19 окт 2010, 17:27

Re: Программирование LPT

Сообщение comexe » 20 окт 2010, 16:11

Raven
Спасибо! СтОящий форум!!! Очень много насущных тем "по существу". Постараюсь привнести сабжы по программированию железок. *SMOKE*
Изображение
comexe
Юзер
Юзер
Сообщения: 9
Зарегистрирован: 19 окт 2010, 17:27

Аппаратное обеспечение под lpt порт

Сообщение comexe » 20 окт 2010, 16:27

На Control- линии имеется разряд С5, управляемый программно. При его состоянии "0" разряды DATA-регистра можно менять произвольно. Но стоит установить С5 в "1", как DATA устанавливается в жесткую единицу, и хоть на что нажимай (кроме С5) они будут в единице. Для чего такое устройство?

Как известно, LPT имеет три модификации согласно стандарту IEEE 1284:
SPP - Standard Parallel Port;
EPP - Enhanced Parallel Port;
ECP - Extended Capabilities Port;

Применяя одну из двух последних модификаций можно добиться двунаправленного режима обмена используя DATA - регистр и переключая С5. Установить ту или иную модификацию можно в BIOS setup персонального компьютера.

Проведем следующий простейший опыт:
Запустим Funny LPT(см ссылку на зип-архив выше)
Изменим разряд С5 с 0 на 1;
Увидим, что D0-D7 установлены в 1 и их состояния поменять нельзя.
Подключив Разъем, соединим на пару секунд любой из выводов 18-25(земля) с любым из 2-9(DATA).
Установив галочку в свойстве "Снимать с интервалом" пронаблюдаем за переходом в 0 состояний регистра DATA.
Для интереса проведем эту процедуру с регистром STATUS.
Увидим, что результат аналогичен.

Вывод: подсаживая единицу до нуля, можно вводить данные в компьютер через регистр DATA

Применим схему на транзисторе с открытым коллектором. (элемент "не" на основе npn-перехода)
Изображение

Вывод +5В подсоединим на регистр DATA (там в состоянии 1 как раз 5В). Выход эмитера подсоединим на массу, на Uвх подключаем любой элемент питания плюсом на базу, минусом на эмиттер. Такая схема удобна тем, что отсутствует источник питания, но минус (причем весьма существенный) это низкая помехозащищенность, постоянные шумовые всплески присутствуют в 30% случаев.
Более удачной считается схема с тремя состояниями на выходе, обладающая большей помехозащищенностью и быстродействием. Собирается она на основе буферов.

Изображение

В данной схеме применена микросхема КР1554АП5 или 74HCT244 (западная маркировка). Микросхема КР1554АП5 состоит из двух четырехразрядных однонаправленных буферов с тремя состояниями на выходе. С3 предназначена для установления буфера в третье состояние (квитирование). Третье состояние (между 0 и 1) в ТТЛ-логике соответствует напряжению 0,8 - 1,9В и предназначено для "отключения" данного сегмента от шины данных, адреса и т.д. Минус в том, что требуется дополнительный источник питания микросхемы.
Последний раз редактировалось comexe 22 окт 2010, 07:32, всего редактировалось 1 раз.
Изображение
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

Re: Программирование LPT

Сообщение Gen1us2k » 22 окт 2010, 03:58

comexe
системщик? (смысле системный программист)
ЗЫ велкам )
Изображение
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Ответить

Вернуться в «Периферийное оборудование»