Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по управлению LPT портом.....   Найти похожие ветки 

 
Senti   (2003-09-12 13:51) [0]

Задача такая, программно подавать напряжение на ножки 2-7.
Т.е. на одну ножку подать.. на другую убрать...
У меня есть 4 светодиода они подключены к соответствующим ножкам LPT порта.
Нужно сделать так чтобы например на на ножки 2-4 подавалось макс напряжение +5, на остальные мин.

Как это можно програмно сделать ?
Существует расчет вроде....

Кто может помогите :)

Я программирование под порты никогда не занимался....


 
pasha_676   (2003-09-12 14:27) [1]

Ассемблер - самое простое решение, но под WinNT и дальнейшей линейкой скорее всего работать не будет.
Более универсальное решение лежит в область C и DDK.


 
N169   (2003-09-12 14:40) [2]

asm imho не нужен.
Ножки 2..7 это линии данных.
Тогда
hlpt:=CreateFile(PChar("LPT1"),....); ........
потом
WriteFile(hlpt,@bt,SizeOf(bt),cb,nil);
где bt - выводимый байт. Младшие его 4 бита и будут определять, какие лампочки горят, какие нет.
Типа того.


 
pasha_676   (2003-09-12 14:47) [3]

N169

Очень интересно. Это реально работает? А порт при этом в каком положении надо поставить (SPP, EPP, ECP)?


 
N169   (2003-09-12 14:54) [4]

Вот проверим заодно, работает или нет


 
pasha_676   (2003-09-12 15:54) [5]

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

Но если это вдруг работает - это очень интересно.


 
Urvin   (2003-09-12 16:16) [6]

Шли на мыло cking@au.ru запрос на "универсальные драйвера" - послать на любой порт любое число. Есть и пример. Пришлю обратно


 
Senti   (2003-09-12 23:14) [7]

Я читал доку, что можно подавать напряжение непосредсвенно на нужные ножки. НАпример на 2,3 подать макс +5 вольт, на остальные минимальное:
Вот привожу саму доку:

"inpout32.bas"Inp and Out Deklarationen
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)

Управление портом:
Адрес порта LTP1 - h378.

Здесь задействованы:

Выход 1 = 1
Выход 2 = 2
Выход 3 = 4
Выход 4 = 8

Так что если показатель равен 0, это значит, что ни на какой из этих выходов не подаётся полное напряжение 5V. Чтобы задействовать несколько выходов одновременно, нужно просто сложить все показатели. Примеры:

Показатель = 1 | Выход 1 = макс., Выходы 2-8 = мин.
Показтель = 3 | Выход 1+2 = макс., 1 + 2 = 3, Выходы 3-8 = мин.
Показатель = 65 | Выход 1+7 = макс., 1 + 64 = 65, Выходы 2,3,4,5,6,8 = мин.

И теперь, чтобы включить/выключить Выход 1 в нашем примере, используется следующий код:

"Включать:
Out &H378, 1
"Выключать:
Out &H378, 0



Но т.к. я не разбираюсь в этом, мне трудно понять, может кто расшифрует?


 
Seregy   (2003-09-13 02:56) [8]

Народ, не парьтесь с Delphi. Проще всего портом управлять, используя команды asm"а. Вообще порт нормально управляется только под WIN9X. В WIN2K и выше ( а возможно, и в старых NT системах ) СТАНДАРТНЫМИ СРЕДСТВАМИ ПОРТОМ УПРАВЛЯТЬ НЕЛЬЗЯ. Это я прочувствовал на себе, когда писал программу для приставки к компу.
Я бы посоветовал вам всем почитать книжки по электронике.
С точки зрения компьютера как электронного устройства lpt порт, грубо говоря, представляет собой микросхему с выходами(входами) по ТТЛ уровням, т.е. с ног порта можно снять либо 0, либо 5 Вольт. Выводам 2..9 соответствует байт 378H. Восемь ног ( со 2-ой по 9-ую)-это не что иное как "образ" числа в двоичной форме( нога 2 соответствует нулевому биту, нога 3- первому и так далее). Следовательно, чтобы подать сигнал или запитать ( в случае со светодиодами ) ногу 4 ( 2-ой бит в "образе" ) в байт 378H нужно записать число 2 ( 00000010 в двоичной форме ). В случае необходимости бит можно "погасить" логическим умножением.


 
Senti   (2003-09-13 22:44) [9]

а можно поподробней :) например чтобы включить ногу 4 я пишу 00000010, а чтобы выключить какое ?....
Извините за мою безграмотность


 
Senti   (2003-09-13 22:51) [10]

Да и в какой форме отправлять данные Byte, Word, Dword ?


 
NightAngel   (2003-09-14 01:51) [11]

> Senti (13.09.03 22:44) [9]
> а можно поподробней


LPT - Это стандартный разъем DB-25 на 25 выводов.
Распайка порта:
№ контакта назначение Направление Адрес порта Бит
1 Strobe out(in) 37Ah 0
2 Data 0 Out 378h 0
3 Data 1 Out 378h 1
4 Data 2 Out 378h 2
5 Data 3 Out 378h 3
6 Data 4 Out 378h 4
7 Data 5 Out 378h 5
8 Data 6 Out 378h 6
9 Data 7 Out 378h 7
10 Ack In 379h 6
11 Busy In 379h 7
12 Paper Out In 379h 5
13 Select In 379h 4
14 Autofeed out(in) 37Ah 1
15 Error In 379h 3
16 INIT out(in) 37Ah 2
17 Select IN out(in) 37Ah 3
18-25 Общий - - -
Рассмотрим подробнее:
Контакт №1: Строб - нужен для проверки подключения принтера.
Контакты № 2-9, 14, 16-17 – вывод информации (на каждый вывод по биту).
Контакты № 10-13,15 – ввод информации.
Контакты №18-25 – минус или «земля». Практически всегда соединен с корпусом компьютера. Это основные контакты. При посылке какой-либо информации в порт, на линиях d0-d7 появится набор сигналов, т.е. распределение напряжений низкого уровня и высокого уровня, соответствующих логическому нулю или единице.
Лог. 1 = 3,5 В
Лог. 0 = 0В
Напряжение останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа), или не выключите компьютер. Определить, что было послано в порт, можно с помощью классической схемы на светодиодах, к сожалению, схему я здесь привести не могу. Здесь нужно учесть один довольно важный момент: следует ограничивать токи если Вы хотите использовать элементы с малым сопротивлением, потому как сила тока не должна превышать 2мА, а напряжение между сигнальным выводом и землей не более 2,6 В. Хотя на опыте мне не удалось спалить ни один порт, не вешая на контакты резисторы, но и рисковать с этим всё равно не стоит...
Ввод в порт данных происходит следующим образом: следует замкнуть нужный(-ые) вход(-ы) с «землей», тогда по соединению потечёт ток и бит, соответствующий данному каналу, установится в единицу (или в ноль, если вход инвертированный). Вот и всё! Это теория. Теперь практика:
Вот простой пример на Паскале:
Uses Dos,CRT;
Var
data:byte;
Begin
Readln(data); {читаем переменную}
Port[$378]:=data; {посылаем значение переменной в LPT-порт}
End.
Какое число необходимо ввести :
Десят. Двоичн. Шестнадцат.
первый выход 1 1 1
второй выход 2 10 2
третий выход 4 100 4
четвёртый выход 8 1000 8
пятый выход 16 10000 10
шестой выход 32 100000 20
седьмой выход 64 1000000 40
восьмой выход 128 10000000 80
0 (0h) - "гасит" все выходы 255 (ffh) - включает все
Если нужно подать сигнал на несколько выходов, то нужно сложить числа, соответствующие этим выходам. Пример (на светодиодах): у нас горит 2-й и 7-й, нам нужно зажечь 5-й, не выключая 2 и 7. Считаем - у второго код 2, у седьмого - 64 => сейчас на порт послано число 64+2 = 66. Теперь зажигаем 5-й - 66+16(код пятерки) = 82. Посылаем в порт 82 и у нас будут гореть светодиоды 2,5,7. Но вдруг нам понадобилось погасить 7-й. Всё просто - отнимаем от текущего значения (82) число, соотв. этому 7-му выводу - 82-64 = 18
Посылка данных идёт по определённому адресу памяти, который выделяется для каждого порта отдельно.
LPT1 LPT2 LPT3
Вывод 378h 278h 3BCh
Ввод 379h 279h 3BDh
Статус 37Ah 27Ah 3BEh
На ассемблере нужный участок кода может выглядеть так (для вывода):
mov dx, 378h ;посылка байта в порт LPT1
mov al, 15h ;значение байта 15h
out dx, al ;собственно посылка
Или так (для ввода):
mov dx, 379h ; адрес вывода
in al, dx ; прием байта в регистр al
Если мы не знаем, что на данный момент находится на выводах порта, но нам нужно изменить один бит, то можно воспользоваться операциями логического сложения и умножения по маске. Например:
mov dx, 378h ; адрес порта
in al, dx ; приём из порта
or al, 00001000b ; установить 4-й бит в единицу
and al, 10111111b ; погасить 7-й бит
xor al, 00000001b ; инвертировать 1-й бит
out dx, al ; вывод в порт
Т.е., если у нас было на выходе порта 11101011, то после этой операции установится 10101010. Ну вот вроде и всё.
Удачи!


 
Mr.Ice   (2003-09-14 21:01) [12]

а можно еще примерчик?


 
Senti   (2003-09-14 23:07) [13]

просто здорово :)
СПАСИБО ТЕБЕ ОГРОМНОЕ !!!!!!!!!!!!!!!!!!!!!!!!!


 
Senti   (2003-09-15 00:42) [14]

странно но попробова записать 0, значение которое отключает все ножки... у меня ничего не вышло....
я использую компонент LPTPOrt запись идет нормально, читаю с порта значение 0 обратно выдает, т.е. запись прошла удачно.
Но диод горит почти во всех выходах.
Пробовал качать другие программы для записи, ситация идентичная запись проходит, возвращает записанное значение 0, но диод горит.
Записываю 0 (вид Byte).
В чем может быть дело ?


 
Senti   (2003-09-15 01:01) [15]

все разобрался... у меня просто не правильно на схеме нарисована распайка LPT порта....
Попробовал по другому все работает на УРА !!!!!
ЕЩЕ РАЗ СПАСИБО ВСЕЕЕЕЕЕЕЕММММММММММММ !!!!!!!!!


 
Евген   (2003-09-15 13:32) [16]

Дак может кодом поделишся?


 
KSergey   (2003-09-15 15:33) [17]

[8] Seregy (13.09.03 02:56)
Вообще порт нормально управляется только под WIN9X. В WIN2K и выше ( а возможно, и в старых NT системах ) СТАНДАРТНЫМИ СРЕДСТВАМИ ПОРТОМ УПРАВЛЯТЬ НЕЛЬЗЯ.


Т.е. виндовс при печати на принтер, например, по вашему использует нестандартные средства?! Очень интересно...


 
LeNa19   (2003-09-16 00:00) [18]

To KSergey
не буть драйвера и принтер ни чего не напечатает


 
Senti   (2003-09-18 00:28) [19]

В общем смотрите результат работы программы:
http://www.skysoft.ru/light.avi (размер 2.1 мег)

Кому интересно посмотрите :)

Я использовал простой компонент работы с паралельными портами. (ZlportIO).
Работает на всех версия виндовс. Занимает очень мало места. Т.к. компонент самый начальный, но мне больше и не надо было
(вот страница с ним http://www.specosoft.com).

Огромное еще раз спасибо NightAngel. Без него я бы не разобрался.


 
Tomkat   (2003-10-31 09:54) [20]

Вот если еще кому интересно ...
http://www.fortunecity.com/skyscraper/susumi/609/lpt_prog.htm


 
Alik   (2003-10-31 18:03) [21]

Вот такая-же проблема, но только с Com портом. Везде искал, но умеют работать только на запись или чтение! Может кто-нибудь знает, как работать аналогичным образом, но толкьо с Com портом???



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.01 c
3-37560
pavel_guzhanov
2003-12-15 14:47
2004.01.13
как можно изменить запись в БД через SQL запрос


14-37928
Agent[007]
2003-12-20 16:55
2004.01.13
СРОЧНО! У МЕНЯ 22 ДЕКАБРЯ ЭКЗАМЕН ПО ГЕОМЕТРИИ!


1-37782
SoS
2003-12-27 18:46
2004.01.13
Операции с *.res файлами


14-37930
Ig
2003-12-20 13:29
2004.01.13
Где можно найти компоненты SUIPack?


1-37650
NneRreaLl
2003-12-26 19:40
2004.01.13
Народ -- как можно обработать каждую строку в ComboBox ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский