Russian Arabic English French German Hungarian Japanese Romanian Turkish Ukrainian

Примеры схем для 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 пробуем считать:

Uses Dos;
Var   data:byte; {переменная DATA типа byte}  
 Begin   
data := Port[$379]; {читаем значение порта в data}   
writeln(data);      {выводим значение на экран}
End.

В результате на экране останется число 120 (у меня так :)). Нажимаем одну из кнопок, запускаем программу ещё раз - число изменилось. Чтобы не мучиться с запуском программы и её закрытием, а просто жать на кнопки и смотреть, я немного доработал программу:

Uses dos, crt;
var data : byte;
BEGIN  
clrscr;  
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мс.(не точно!)}  
end;                    
{.....до сюда}END.

Для тех кто работает в Delphi, маленькая вставочка на ассемблере, тк. я не знаю как в дельфи правильно работать с портами:

asm  MOV DX,379h; 
 IN AL,DX  
MOV data,ALend;

Эта программа будет делать следущее: выведет значение порта на экран, подождет 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вывод) работает наоборот.
Вот то же самое, только на программерском:

Uses Dos;
uses dos, crt;
var bylo,stalo : word;    razn : integer ;
BEGIN  
clrscr;  
bylo := port[$379];  
while not keypressed do 
 begin    
stalo := port[$379];    
razn := stalo - bylo;    
case  razn of        
-64 : writeln('нажата кнопка 10 !');         
64 : writeln('отпущена кнопка 10 !');        
-32 : writeln('нажата кнопка 12 !');         
32 : writeln('отпущена кнопка 12 !');        
 128 : writeln('нажата кнопка 11 !');       
 -128 : writeln('отпущена кнопка 11 !');    
end;   
 bylo := stalo;  
end;
END.

Надеюсь, что этого кода достаточно для начала, дальше уже можно самостоятельно разобраться или спросить помощи на форуме

Теперь снова об электронике...
В простейшем варианте можно использовать кнопочки или переключатели как в экспериментальной панельке, можно поставить геркон, тк. это тоже кнопочка, только магнитная, можно контакты реле... Но тут нужно помнить про такую нехорошую вешь, как "дребезг" контактов - расшатаный или просто некачественный выключатель обязательно будет давать повторные срабатывания в программе. Если точность не нужна, то можно просто увеличить задержку с 100 мс до, например, 1 секунды и тогда программа просто не обработает повторные нажатия. А если нужна точность, то нужно что-то придумывать.
Теоретически, связать порт можно с любым низковольтным устройством через транзистор, те. замыкать контакты не кнопкой, а транзистором. Например, у нас есть схема, в которой светодиод загорается когда кто-то проходит рядом с устройством, если светодиод подключен прямо к выводу микросхемы, просто подпиваем к ножке микросхемы вместо светодиода резистор, а резистор к базе транзистора эмиттер с коллектором которого подключены вместо выключателя к ножке. Ух, во сказал, аж сам не понял. Просто лень рисовать схему, а примерчик этот из моей практики...

Источник: zps-еlесtrоnics.cоm

Комментарии   

+1 # Управление ПК через LPTАндрей 17.12.2015 04:12
Здравствуйте! Как реализовать подключение инкрементного энкодера и кнопок к порту LPT, для управления громкостью ПК и действиями? Вот здесь: --------------- ------------- есть подключение энкодера, теперь подскажите, к нему добавить кнопки!
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Защитный код
Обновить

Рейтинг@Mail.ru Яндекс.Метрика