Параллельный интерфейс: LPT-порт (стр. 2 из 6)
Процедура вывода байта по интерфейсу Centronics через стандартный порт включает следующие шаги (в скобках приведено требуемое количество шинных операций процессора):
Вывод байта в регистр данных (1 цикл IOWR#).
Ввод из регистра состояния и проверка готовности устройства (бит SR.7 — сигнал BUSY).
По получении готовности выводом в регистр управления устанавливается строб данных, а следующим выводом строб снимается (2 цикла lOWRff).
Стандартный порт сильно асимметричен — при наличии 12 линий (и бит), нормально работающих на вывод, на ввод работает только 5 линий состояния.
Если необходима симметричная двунаправленная связь, на всех стандартных портах работоспособен режим полубайтного обмена — Nibble Mode.
В этом режиме, называемым также и Hewlett Packard Bitronics, одновременно передаются 4 бита данных, пятая линия используется для квитирования.
Функции BIOS для LPT-порта
BIOS обеспечивает поддержку LPT-порта, необходимую для организации вывода по интерфейсу Centronics.
В процессе начального тестирования POST BIOS проверяет наличие параллельных портов по адресам ЗВСЬ, 378h и 278h и помещает базовые адреса обнаруженных портов в ячейки BIOS DATA AREA 0:0408h, 040Ah, 040СП, 040ЕП. Эти ячейки хранят адреса портов с логическими именами LPT1-LPT4. В ячейки 0:0478, 0479, 047А, 047В заносятся константы, задающие выдержку тайм-аута для этих портов.
Поиск портов обычно ведется по базовому адресу. Если считанный байт совпал с записанным, считается, что найден LPT-порт, и его адрес помещают в ячейку BIOS DATA AREA. Адрес порта LPT4 BIOS самостоятельно установить не может, поскольку в списке стандартных адресов поиска имеются только три вышеуказанных.
Обнаруженные порты инициализируются — записью в регистр управления формируется и снимается сигнал Initff, после чего записывается значение 00h, соответствующее исходному состоянию сигналов интерфейса.
Программное прерывание BIOS I NT 17h обеспечивает следующие функции поддержки LPT-порта:
00h — вывод символа из регистра AL по протоколу Centronics. Данные помещаются в выходной регистр и после готовности принтера формируется строб.
01h — инициализаия интерфейса и принтера.
02h — опрос состояния принтера.
При вызове INT 17h номер функции задается в регистре АН, номер порта — в регистре DX (0 — LPT1, 1 — LPT2…). При возврате после любой функции регистр АН содержит код состояния — биты регистра состояния SR[7:3] (биты 6 и 3 инвертированы) и флаг тайм-аута в бите 0. Флаг тайм-аута устанавливается при неудачной попытке вывода символа.
Расширения параллельного порта
Недостатки стандартного порта частично устраняют новые типы портов, появившихся в компьютерах семейства PS/2.
Двунаправленный порт 1 (Typel parallel port) — интерфейс, введенный с PS/2. Такой порт кроме стандартного режима может работать в режиме ввода или двунаправленном. Протокол обмена формируется программно, а для указания направления передачи в регистр управления порта введен специальный бит: при CR.5=0 буфер данных работает на вывод, при CR.5=1 — на ввод.
Порт с прямым доступом к памяти (Type 3 DMA parallel port) применялся в PS/2 моделей 57, 90, 95. Этот тип был введен для повышения пропускной способности и разгрузки процессора при выводе на принтер. Программе, работающей с данным портом, требовалось только задать блок данных в памяти, подлежащих выводу, и вывод по протоколу Centronics производился без участия процессора.
Физический и электрический интерфейс
Стандарт IEEE 1284 определяет физические характеристики приемников и передатчиков сигналов.
К передатчикам предъявляются следующие требования:
Уровни сигналов без нагрузки не должны выходить за пределы -0,5… +5,5 В.
Уровни сигналов при токе нагрузки 14 мА должны быть не ниже +2,4 В для высокого уровня (voh) и не выше +0,4 В для низкого уровня (vol) на постоянном токе.
Выходной импеданс ro, измеренный на разъеме, должен составлять 50(±)5 Ом на уровне voh-vol. Для обеспечения заданного импеданса в некоторых случаях используют последовательные резисторы в выходных цепях передатчика. Согласование импеданса передатчика и кабеля снижает уровень импульсных помех.
Скорость нарастания (спада) импульса должна находиться в пределах 0,05-0,4 В/нс.
Требования к приемникам:
Допустимые пиковые значения сигналов -2,0…+7,0.
Пороги срабатывания должны быть не выше 2,0 В (vih) для высокого уровня и не ниже 0,8 В (vil) для низкого.
Приемник должен иметь гистерезис в пределах 0,2-1,2 В.
Входной ток микросхемы не должен превышать 20 мкА.
Входная емкость не должна превышать 50 пФ.
Стандарт IEEE 1284 определяет три типа используемых разъемов. Типы Л (DB-25) и В (Centronics-36) используются в традиционных кабелях подключения принтера, тип С — новый малогабаритный 36-контактный разъем.
Интерфейсные кабели, традиционно используемые для подключения принтеров, обычно имеют от 18 до 25 проводников, в зависимости от числа проводников цепи GND.
Стандарт IEEE 1284 регламентирует и свойства кабелей:
Все сигнальные линии должны быть перевитыми с отдельными обратными (общими) проводами.
Каждая пара должна иметь импеданс 62(±)6 Ом в частотном диапазоне 4-16 МГц.
Уровень перекрестных помех между парами не должен превышать 10%.
Кабель должен иметь экран (фольгу), покрывающий не менее 85% внешней поверхности. На концах кабеля экран должен быть окольцован и соединен с контактом разъема.
Кабели, удовлетворяющие этим требованиям, маркируются надписью IЕЕЕ Std 1284-1994 Compliant». Они могут иметь длину до 10 метров.
Режимы передачи данных
Стандарт IEEE 1284 определяет пять режимов обмена, один из которых полностью соответствует традиционному стандартному программно-управляемому выводу по протоколу Centronics.
Остальные режимы используются для расширения функциональных возможностей и повышения производительности интерфейса.
Стандарт определяет способ согласования режима, по которому программное обеспечение может определить режим, доступный и хосту (в нашем случае это PC), и периферийному устройству.
Режимы нестандартных портов, реализующих протокол обмена Centronics аппаратно («Fast Centronics, «Parallel Port FIFO Mode»), могут и не являться режимами IEE1284, несмотря на наличие в них черт ЕРР и ЕСР.
При описании режимов обмена фигурируют следующие понятия:
Хост — компьютер, обладающий параллельным портом.
ПУ — периферийное устройство, подключаемое к этому порту (им может оказаться и другой компьютер). обозначениях сигналов Ptr обозначает передающее периферийное устройство.
Прямой канал — канал вывода данных от хоста в ПУ.
Обратный канал канал ввода данных в хост из ПУ.
Полубайтный режим ввода — Nibble Mode
Режим полубайтного обмена является наиболее общим решением задачи двунаправленного обмена данными, поскольку может работать на всех стандартных (традиционных) портах. Все эти порты имеют 5 линий ввода состояния, используя которые периферийное устройство может посылать в PC байт тетрадами (nibble — полубайт, 4 бита) за два приема. Назначение сигналов порта приведено в табл 4.
Таблица 4.
Сигналы LPT-порта в полубайтном режиме ввода
Прием байта данных в полубайтном режиме состоит из следующих фаз:
1. Хост сигнализирует о готовности приема данных установкой низкого уровня на линии HostBusy.
2. ПУ в ответ помещает тетраду на входные линии состояния.
3. ПУ сигнализирует о действительности тетрады установкой низкого уровня на линии PtrClk.
4. Хост устанавливает высокий уровень на линии HostBusy, указывая на занятость приемом и обработкой тетрады.
5. ПУ отвечает установкой высокого уровня на линии PtrCLk.
6. Шаги 1-5 повторяются для второй тетрады.
Полубайтный режим работает на всех портах со скоростью обмена не выше 50 Кбайт/с . Его применяют в тех случаях, когда прием данных от устройства производится в небольших объемах (например, для связи с принтерами).
Двунаправленный байтный режим Byte Mode
Данный режим обеспечивает прием данных с использованием двунаправленного порта, у которого выходной буфер данных может отключаться установкой бита CR.5=1. Как и в стандартном и в полубайтном режиме, данный режим является программно-управляемым — все сигналы квитирования анализируются и устанавливаются программным драйвером. Назначение сигналов порта приведено в табл. 5.
Таблица 5.
Сигналы LPT-порта в байтном режиме ввода/вывода
Прием байта данных в байтном режиме состоит из следующих фаз:
Источник: http://MirZnanii.com/a/111464-2/parallelnyy-interfeys-lpt-port-2
Драйвер для работы с LPT портом (интегрированным или в виде платы PCI)
Лет 10-15 назад параллельный порт был довольно востребованным интерфейсом для связи между устройствами. Сегодня производители различных устройств отдают предпочтение последовательным интерфейсам. Тем не менее, и сегодня LPT порт всё ещё можно встретить.
А некоторые разработчики ещё пишут под него программы (или поддерживают написанные во времена расцвета параллельных интерфейсов). Но в компьютерах сейчас LPT порт – достаточно большая редкость. Существуют, конечно, платы расширения для компьютера, которые реализуют интерфейс LPT. Они в основном представляют собой платы на шине PCI.
К сожалению, далеко не весь софт, который был написан для интегрированных в материнскую плату LPT портов, будет работать с LPT-PCI-платами.
Предлагается решение этой проблемы: программный класс, написанный под .NET, и динамическую библиотеку, которая работает с LPT. Данная реализация проверена на 32- и 64-разрядных Windows XP, Windows 7, 8 и 10 как со встроенными LPT портами, так и реализованными в виде плат расширения на шине PCI или PCI-Express. Скачать драйвер для LPT порта можно по ссылке внизу после статьи.
В приложенном архиве находятся две папки – для 32-разрядной и для 64-разрядной версий Windows. В одной из папок лежит файл InstallDriver.exe. Сначала запустите этот файл, он установит динамические библиотеки в систему. После этого компьютер следует перезагрузить.
Чтобы использовать предлагаемый драйвер, файлы inpout32.dll и inpoutx64.dll должны располагаться в одной директории с исполняемым файлом вашей программы.
2Программный класс использования библиотек работы с LPT портом
Мной был написан класс для .NET, который использует динамические библиотеки inpout32.dll и inpoutx64.dll и позволяет считывать из параллельного порта и записывать в его регистры данные.
Упомянутые библиотеки написаны не мной. Я предлагаю удобный класс-оболочку, упрощающий работу с данными библиотеками. Кроме того, автор библиотек в файле readme.txt сообщает, что его драйвер не поддерживает PCI устройства.
Мне удалось его запустить для работы как с интегрированным параллельным портом, так и LPT портом, реализованном в виде платы расширения на шине PCI-Express.
Причём порт отлично работает и на современной Windows10 x64, и на более старых системах.
Вот код класса LPT на языке VB.NET:
Код класса LPT на языке C#:
3Применение класса .NET для работы с LPT портом
Если мы посмотрим на список экспортируемых функций библиотеки inpout32.dll с помощью замечательного инструмента DLL Export Viewer от NirSoft, то увидим следующую картину:
Список экспортируемых функций библиотеки inpout32.dll
Это список функций, которые мы можем использовать. Фактически все они используются в классе LPT, но реализация скрыта, и из публичных методов пользователю доступны только два метода и одно свойство (они рассматриваются чуть далее).
При инстанцировании класс сам определит, библиотеку какой разрядности ему использовать – inpout32.dll или inpoutx64.dll. Поэтому от пользователя не требуется никаких действий по инициализации или определения разрядности используемой dll.
Вы можете сразу записывать или читать из LPT порта.
Одно «Но»: если драйвер не установлен, обращение к любому из методов динамической библиотеки вызовет исключение, поэтому рекомендую использовать блоки Try…Catch для перехвата и обработки исключений.
Несколько примеров использования класса LPT.
Для определения, используется ли 64-разрядная версия драйвера (inpoutx64.dll при True) или 32-разрядная (inpout32.dll при False) (на самом деле, это знать не обязательно, класс использует именно ту библиотеку, которая нужна, но вдруг вам для чего-то понадобится это узнать из своей программы):
bool is64bitDriver = LPT.IsX64DriverUsed;
Для записи числа “123” в регистр контроля LPT порта вызовите из своего класса:
LPT.Write(currentPort, LPT.Register.CONTROL, 123);
Для чтения одного байта из регистра данных LPT порта и чтения регистра статуса:
byte b = LPT.Read(currentPort, LPT.Register.DATA); byte s = LPT.Read(currentPort, LPT.Register.STATUS);
Здесь currentPort – адрес LPT порта. Причём, если у вас интегрированный LPT порт, то его адрес будет, скорее всего, 378h. А если у вас LPT порт на плате расширения, то адрес будет другой, например, D100h или C100h.
Чтобы узнать адрес LPT порта, зайдите в диспетчер устройств Windows, найдите раздел Порты COM и LPT, выберите используемый параллельный порт, и в окне свойств (щёлкнув по нему правой кнопкой мыши) посмотрите, какие ресурсы использует выбранный порт.
Ресурсы, используемые LPT портом, в диспетчере устройств Windows
- Скачать драйвер для LPT порта (1560 Скачиваний)
Источник: https://soltau.ru/index.php/themes/dev/item/452-drajver-dlya-raboty-s-lpt-portom-integrirovannym-i-vide-platy-pci
Примеры схем для LPT порта
ПодробностиКатегория: Компьютер
В этой статье приводятся несколько примеров радиосхем управляемых при помощи LPT порта. Этого вполне хватит для изучения принципов работы LPT порта, а также для первых шагов в программировании LPT порта. Для начала рекомендуем спаять себе небольшую схемку:
выводы на схеме от 18 до 25 можно не замыкать между собой;
резисторы по 470 Ом можно подключить к любому из них.
Резисторы в схеме служат для ограничения потребляемого тока. Напряжение между сигнальным выводом LPT и общем проводом должен быть в не более 2,4V. Ток – около 2.6 mA. Т.е. очень мало, но на самом деле современные материнские платы расчитаны на большую нагрузку и очень часто имеют защиту от короткого замыкания.
В любом случае, с портом нужно обращаться очень аккуратно, т.к. без него материнская плата компьютера может вообще отказаться работать.
Вот самая простая схема подключения реле:
Думаю, что объяснять здесь ничего не нужно. Data – это один из выходов LPT порта, например, вывод 2 (Data-0).
Если на нем появится log1, транзистор откроется, сработает реле K1 и подключит какую-то более мощную нагрузку..
В этой схеме LPT порт напрямую подключен к транзистору и в случае его пробоя на выходе data может оказаться опасное для порта напряжение. Чтобы защитить порт нужно использовать гальваническую развязку.
Схема с применением оптопары.
В данной схеме порт отделен от высоковольтной части и ему почти ничего не угрожает. В этой схеме я ставил опто изолятор 4N25 – самый дешевый и маленький. Катушка на схеме – это реле на 12 вольт. Во время экспериментов я подключил к этой схеме реле РЭС22, а к нему настольную лампу. Для пробы написал программку, которая управляла лампой по часам…
Есть спец. микросхемы работы с LPT портом. Они обеспечивают гальваническую развязку, инвертируют выходной сигнал и тд. Мне известна пока только две 74HCT573 и 74ALS373
Это схема подключения 74ALS373. Как она работает я не знаю, я не использовал микросхемы вообще, обходился просто связкой оптопара+транзистор или оптопара+симистор.
Кстати, вот примерчик управления симистором:
Эту схемку я просто воткнул вместо выключателя от основного освещения в своей комнате. Очень пригодилось когда настраивал LPT-стробоскоп. Можно было не вставая с места выключить на время свет.
Ещё один пример практического использования LPT порта, наверно самый удачный.
Это стробоскоп управляемый через LPT интерфейс.
В предыдущей статье я обещал рассказать о чтении информации с LPT порта и привести несколько схем датчиков. Пока просто расскажу о программировании и о подключении кнопочек, а дальше по ситуации.
Схема подключения кнопок и переключателей оказалась такойже простой как и схема подключения светодиодов:
Для ввода информации я использовал 5 стандартных входов – выводы 10, 11, 12, 13 и 15. Первоначальное состояние выводов – log1, т.е. на них напряжение 5V. Мой тестер сказал, что там не 5, а 4.
7V, может тестер не точно показывает, может блок питания в компе слабоват, а может так и надо – не важно. Следовательно, замкнув вывод порта на землю (выводы 18-25), мы переведем его в состояние Log0. Замыкать вывод прямо на землю я не рискнул и соединил его с землей через резистор в 470 ом.
Можно обойтись и без резистора – всё отлично работает, но лучше не рисковать. Для дальнейших экспериментов я собрал себе панельку из 5 кнопочек по приведенной выше схеме и достал с архивного диска компилятор Turbo Pascal 7.1 (то же что и Pascal 7.0). Тем, кто не умеет работать с портами, советую прочитать предыдущую статью “Основы программирования LPT”, тк.
сейчас я уже не буду подробно описывать как и почему.Как я уже говорил, считать значение на выходах порта можно одной строчкой: data := port[$378], где $378 – базовый адрес порта. Это выходы, ими управлять мы уже умеем. А входы нахотятся по адресу “базовый+1”, те.
$379 пробуем считать:Var data:byte; {переменная DATA типа byte} data := Port[$379]; {читаем значение порта в data} writeln(data); {выводим значение на экран}
В результате на экране останется число 120 (у меня так :)). Нажимаем одну из кнопок, запускаем программу ещё раз – число изменилось. Чтобы не мучиться с запуском программы и её закрытием, а просто жать на кнопки и смотреть, я немного доработал программу:
while not keypressed do {пока не нажата кнопка на клавиатуре…} begin {повторяем код от сюда…..} data := port[$379]; {читаем значение порта в data} gotoxy(1,1); {ставим курсор в позицию 1,1 на экране} write(' '); {пишем пробелы чтобы замазать текст} gotoxy(1,1); {возвращаем курсор назад в позицию 1,1} write(data); {выводим значение на экран} delay(100); {задержка в 100мс.(не точно!)}
Для тех кто работает в Delphi, маленькая вставочка на ассемблере, тк. я не знаю как в дельфи правильно работать с портами:
Эта программа будет делать следущее: выведет значение порта на экран, подождет 100мс, вернет курсор в начало строки и заменит старое значение на новое и так до тех пор, пока не нажата кнопка на клавиатуре.
Теперь можно запустить программу, убрать клавиатуру с мышкой в сторону и наблюдать за изменениями. Вот теперь начинается головоломка…
Методом тыка я нашел, что каждой кнопке соответствует своё значение (свой бит), значения присвоены очень странно, может позже я разберусь почему, но пока просто выложу их:
вывод | значение |
10 | 64 |
11 | 128 |
12 | 32 |
13 | 16 |
15 | 8 |
Я не случайно выделил 11 вывод жирным, он отличается от других – он логически инвертирован, те. если все наши кнопки система считает отжатыми, то эту она считает замкнутой. А если её замкнуть, то система будет думать что кнопка отжата. Теперь как это всё влияет на общее число которое мы считали (120): Если нажать на одну из наших кнопочек, то от общего числа отнимется значение этой кнопочки (см. таблицу). Например, мы нажимаем кнопку подключеную к выводу 10 и число сразу уменьшается на 64 (см. прогу), отпустим и значение снова увеличится на 64. А теперь, нажмем кнопку на выводе 15 – значение уменьшилось на 8, отпустили и оно опять увеличилось. А что будет если нажать особенную 11 кнопку? Нажимаем – значение не уменьшилось, а возрасло, отпустили и оно опять уменьшилось. Вот чем эта кнопка отличается от остальных 4. А теперь по русски, как узнать программе что нажато? Я делал так: Запоминаю что сейчас в порте, при изменении значения сравниваю что было и что получилось, если отличается на 64, значит нажата 10кнопка, если отличается на 32, значит 12 кнопка и тд. Чтобы определить нажата или отпущена, нужно учитывать увеличилось число или уменьшилось. То есть, если число стало меньше на 32, то нажата кнопка 12, а если число увеличилось на 32, значит кнопку 12 отпустили. НО! тут нужно учитывать, что кнопка со значением 128 (11вывод) работает наоборот.
Вот то же самое, только на программерском:
var bylo,stalo : word; razn : integer ;-64 : writeln('нажата кнопка 10 !'); 64 : writeln('отпущена кнопка 10 !'); -32 : writeln('нажата кнопка 12 !'); 32 : writeln('отпущена кнопка 12 !'); 128 : writeln('нажата кнопка 11 !'); -128 : writeln('отпущена кнопка 11 !');
Надеюсь, что этого кода достаточно для начала, дальше уже можно самостоятельно разобраться или спросить помощи на форуме Теперь снова об электронике… В простейшем варианте можно использовать кнопочки или переключатели как в экспериментальной панельке, можно поставить геркон, тк.
это тоже кнопочка, только магнитная, можно контакты реле… Но тут нужно помнить про такую нехорошую вешь, как “дребезг” контактов – расшатаный или просто некачественный выключатель обязательно будет давать повторные срабатывания в программе.
Если точность не нужна, то можно просто увеличить задержку с 100 мс до, например, 1 секунды и тогда программа просто не обработает повторные нажатия. А если нужна точность, то нужно что-то придумывать.
Теоретически, связать порт можно с любым низковольтным устройством через транзистор, те.
замыкать контакты не кнопкой, а транзистором.
Например, у нас есть схема, в которой светодиод загорается когда кто-то проходит рядом с устройством, если светодиод подключен прямо к выводу микросхемы, просто подпиваем к ножке микросхемы вместо светодиода резистор, а резистор к базе транзистора эмиттер с коллектором которого подключены вместо выключателя к ножке. Ух, во сказал, аж сам не понял. Просто лень рисовать схему, а примерчик этот из моей практики…
Источник: zps-еlесtrоnics.cоm
Источник: http://radiofanatic.ru/kompyuter/503-primery-skhem-dlya-lpt-porta.html
VB FAQ: § 4.7. Работа с устройствами, подключенными к LPT-порту
Источник: http://vbfaq.a1nt.ru/c07.htm
Adblockdetector