[Electronica y programación] manejo del puerto paralelo...

Iniciado por BADBYTE-K, 27 Noviembre 2004, 11:11 AM

0 Miembros y 1 Visitante están viendo este tema.

BADBYTE-K

porke no lo posteas en programacion?
-ya lo he puesto hace dias, ya va por la page 3 kreo... pero para los que no visitan todos los foros aqui les va...




pues si, esto esta destinado para los novatos en el mundo de la programacion, a novatos que les guste la electronica, y que deseen combinar la  potencia de las computadoras con la electronica o a quienes simplemente les interese manipular o detectar variables fisicas desde la pc...
leelo todo, no es largo lo que pasa es que lo hice en el kwrite de linux (como el bloc de notas de winbugs) por eso me quedo asi =P todo desordenao...

pensamiento....
seria interesante tener por ejemplo, un software que te permita controlar las luces de la casa entera,
o un software que te avise que puerta de la casa ha sido abierta, o un software que ayude a tu mamá a
regar las platas automaticamente o desde la pc. se acabarian los tipicos regaños de tu mamá... "te la
pasas todo el dia en la computadora y no haces nada en la casa".... ya no te dirian eso, por que desde
la computadora, abririas puertas, encenderias luces, regarias las plantas, etc...

pero sin irnos tan lejos para empezar y no complicarnos tanto con electronica, podemos hacer tambien
cosas basicas, aunque la verdad la aplicacion que le des a la programacion, es cuestion de los limites
de tu imaginacion 8)

como esto es para novatos, antes que nada hay que conocer cual es el puerto paralelo... (cabe decir
que usare imagenes linkeadas, luego las cambio por unas que tengo... :P)



si no la vez aki esta http://www.ctp.ru/images/LPT.jpg

es un conector del tipo hembra, que consta de 25 terminales (pines, huecos, como los llames...)
se conoce tecnicamente como DB25...

estos 25 pines estan divididos en tres "bytes" llamados dataport, statusport y controlport, todos
orientados al manejo de una impresora conectada ahi, gestionan desde el control del papel, hasta
si la impresora esta ocupada, etc...
vamos a robarnos esas propiedades y a usarlos para nuestros fines  :D


aqui tenemos en detalle los pines del puerto paralelo



si no lo vez http://www.rafal.waw.pl/wynalazki/porty/lpt.gif

podemos ordenar cada uno de los bytes

Dataport

pin 2 - D0
pin 3 - D1
pin 4 - D2
pin 5 - D3
pin 6 - D4
pin 7 - D5
pin 8 - D6
pin 9 - D7



Statusport

pin 10 - ACK
pin 11 - BUSY
pin 12 - PAPER END
pin 13 - SELECT IN

pin 15  - ERROR


ControlPort

pin 1 - STROBE
pin 14 - AUTO FEED
pin 16 - INIT
pin 17 - SELECT


la parte de GND, son los tierra
del 18 al 25

para saber cual pin es cual, acercate a tu puerto paralelo y te daras cuenta que a la par de cada terminal
tiene su numero, cuidado con conectar al revez la cosas xD

en resumen podemos decir esto:

el Dataport se usa como salida
el Statusport se usa como entrada
el controlport se usa de las dos formas anteriores

es decir que para encender leds, mandar voltaje al puerto usaremos el Dataport, para recibir niveles
de voltaje usaremos el Statusport (un ejemplo del uso del statusport es para cuando en un sistema de
riego que al terminar de regar, este haga un cambio de voltaje en algun dispositivo (como un rele)
se detecta el cambio de cero a 5 voltios y se puede hacer "la magia" de la deteccion de acciones fisicas
desde la computadora, en este caso desde visual basic) para empezar es mas que suficiente trabajar con
estos dos bytes.

Ahora que ya hablamos un poquito de el puerto, hablemos de la programacion necesaria para trabajar con
este puerto...

hay que saber que para trabajar con este puerto debes tener en tu pc, una dll que gestiona toda esta
programacion, una puede ser la io.dll y otra puede ser la inpout32.dll en este caso usaremos la inpout32.dll
(en realidad no cambia mucho la programacion entre las dos, pero de que palabritas cambian, cambian :P
ojo con eso...)

nos bajamos la inpout32.dll

http://www.google.com.sv/search?hl=es&q=inpout32.dll&btnG=B%C3%BAsqueda+en+Google&lr=

antes de continuar se nos hara necesario sabernos la posicion de memoria del puerto paralelo en nuestro pc
o la direccion en memoria, que viene a ser lo mismo...
generalmente la direccion en memoria del puerto paralelo se ve asi:

378------dataport
379------statusport
37A------controlport

si no estas seguro puedes hacer varias cosas para saber la direccion, una es durante el power on self test
de la bios irte con pause hasta que veas algo como el intervalo de salida/entrada del puerto paralelo
, en XP puedes irte a propiedades de mi pc> ficha hardware > administrador de dispositivos >
puertos COM y LPT > da click en el + y luego posicionate en el LPT > click derecho > propiedades > dale a
la ficha recursos > y ahi tendras el intervalo entrada/salida del puerto...


ocuparemos primero la direccion 378 para poder enviar voltaje al puerto paralelo

ok, creamos un nuevo proyecto, lo ideal a la hora de programar con esta dll es crearte un modulo nuevo

menu proyecto > agregar modulo
luego nos saldra una ventana que nos preguntara si es uno existente o uno nuevo, escogemos uno nuevo...

en el modulo vamos a declarar esto:

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)

todos entendemos lo que hace este codigo, no sera necesario dar detalles... cabe destacar que la dll debe
estar en el directorio del sistema c:/windows/system32 creo que ese es :P, si no corrobora en tu pc

ok, ahora que tenemos las instrucciones
empezamos con un ejemplo sencillo

agrega a tu formulario lo siguiente:

un nuevo textbox
un nuevo boton

la instruccion (con la inpout32.dll) para poder enviar datos al puerto paralelo es la mas logica que pueda
existir, es Out xD

su sintaxis es asi:

out(puerto, dato)

por ejemplo:

Out &H378, 255

hay que tener en cuenta tambien el tipo de dato que le enviaremos al puerto:

0
2
4
8
16
32
64
...
255

eso seria para enviar voltaje uno por uno a cada pin del dataport o pines de datos que es lo mismo
para poner en cero voltios a todos los pines de datos se usa el 0 ( out &H378, 0)
para poner un 1 logico(5 voltios) en el pin D1 se usa 2 (out &H378, 2) y asi sucesivamente....
hasta que para poner todos los pines de datos se utiliza el 255 (out &H378, 255)

esto seria un programita elemental con un boton para cada dato:

Private Sub Command1_Click()
Out &H378, 1
End Sub

Private Sub Command2_Click()
Out &H378, 2
End Sub

Private Sub Command3_Click()
Out &H378, 4
End Sub

Private Sub Command4_Click()
Out &H378, 8
End Sub

Private Sub Command5_Click()
Out &H378, 16
End Sub

Private Sub Command6_Click()
Out &H378, 32
End Sub

Private Sub Command7_Click()
Out &H378, 64
End Sub

Private Sub Command8_Click()
Out &H378, 128
End Sub

Private Sub Command10_Click()
Out &H378, 255
End Sub

Private Sub Command9_Click()
Out &H378, 0
End Sub


si quisieras enviar un 1 logico a varios pines de datos, unicamente debes sumar los datos:

por ejemplo, para mandar datos a la vez a D1 y a D2 se usaria 2 + 4 , es decir quedaria asi la order:

out &H378, 6

y asi sucesivamente...

si queremos detectar o captar desde el puerto paralelo, entonces hacemos algo asi...

usamos la instruccion inp

aki tienen el ejemplo que yo usaba para practicar que me da flojera modificar =P, pero
lo hacia junto a juegos de imagenes para simular...



Private Sub Timer2_Timer()
If Image4(1).Visible = True Then
Image4(2).Visible = True
Image4(1).Visible = False
Text2.Text = Str(Inp(Val(&H379))) '  aqu puedes notar como el textbox cogia el valor
Text2.Refresh
If Text2.Text = 207 Then
''MsgBox "entrada 15 detectada"
Shape1.FillColor = &HFF&
End If
If Text2.Text = 71 Then
MsgBox "entrada 11 detectada"
End If
If Text2.Text = 79 Then
MsgBox "entradas 11 y  15 detectada"
End If
Exit Sub
End If
If Image4(2).Visible = True Then
Image4(3).Visible = True
Image4(2).Visible = False
Text2.Text = Str(Inp(Val(&H379)))
Text2.Refresh
If Text2.Text = 207 Then
''MsgBox "entrada 15 detectada"
Shape1.FillColor = &HFF&
End If
If Text2.Text = 71 Then
MsgBox "entrada 11 detectada"
End If
If Text2.Text = 79 Then
MsgBox "entradas 11 y  15 detectada"
End If
Exit Sub
End If
If Image4(3).Visible = True Then
Image4(1).Visible = True
Image4(3).Visible = False
Text2.Text = Str(Inp(Val(&H379)))
Text2.Refresh
If Text2.Text = 207 Then
''MsgBox "entrada 15 detectada"
Shape1.FillColor = &HFF&
End If
If Text2.Text = 71 Then
MsgBox "entrada 11 detectada"
End If
If Text2.Text = 79 Then
MsgBox "entradas 11 y  15 detectada"
End If
Exit Sub
End If
End Sub


ok ahora que lo vieron y se dieron cuenta que es algo amateur xD, les explico...
el problema que se me daba a la hora de practicar la deteccion de "eventos" en un
circuito electronico, era que no encontraba el evento en visualbasic adecuado para
colocar el codigo que se encargaria de gestionarme todo lo que sucederia segun el estado
del statusport..

entonces se me ocurrio hacer un "simulador de activacion" es decir como un monitoreo
a la activacion...

por ejemplo se "encendien" foquitos(imagenes) en el formulario algo asi:

0=apagado
1= encendido

100
010
001
100
010
001
100
010
001

y aprovechando la secuencia de cambio automatico por medio del timer pude encontrar
el evento que me diera la deteccion automatica de la presencia de personas en una zona
por medio de sensores conectados por medio de una interfase al puerto paralelo (al
statusport)

If Image4(1).Visible = True Then
Image4(2).Visible = True
Image4(1).Visible = False

cuando la imagen 4(1) fuera visible, la imagen 4(2) se encendia y al instante se
apagaba la imagen4(1) y asi sucesivamente...


para la deteccion de codigos del status me apoye de un textbox
Text2.Text = Str(Inp(Val(&H379)))

ese me cogia el valor en el statusport que varia segun el estado de sus terminales
te genera una combinacion, la cual tienes que manipular segun te convenga y segun la
conexion que hayas hecho...

If Text2.Text = 207 Then
''MsgBox "entrada 15 detectada"
End If

si el codigo era 207 el msgbox lo dice todo...

se puede dar el mismo caso que al enviar datos al puerto, que mandes a dos pines ala vez
en ese caso:

If Text2.Text = 79 Then
MsgBox "entradas 11 y  15 detectada"
End If

todo es cuestion de probar uno a uno las combinacion posibles que te va a generar
lo de usar un textbox es nada mas para la hora de practicar, hacer pruebas y copiar
los codigos que te genera el statusport.. y si a la hora de hacer tu propia aplicacion
te da flojera modificarlo como es mi caso generalmente xD entonces nada mas lo pones
invisible y todo igual =)

text2.visible = false '=P

con respecto al aspecto de la seguridad y del cuido del puerto paralelo hay interfases
especiales que se encargan de echarte una mano y de cuidar a la vez el puerto paralelo
que puedes dañar si no tienes cuidado =P

http://www.google.com.sv/search?hl=es&q=interfase+puerto+paralelo&btnG=B%C3%BAsqueda&lr=

pues, en lo que generalmente se basa una interfase para el puerto paralelo en en la
amplificacion de salida que lastimosamente la salida directa de corriente del puerto
paralelo es muy pobre, y se hace necerio agregar una interfase estabilizadora con
buffers o con
transistores, y con otro monton de cosas que puedes usar...

hay muchas paginas que manejan como algo totalmente serio el uso de interfases de pro-
tecccion, porque puedes quemar el puerto paralelo, pero si no vas a manejar cosas
como motores, u otras cosas que exigen mas, y solo quieres practicar con leds por
ejemplo, no es necesaro armar o comprar ua interfase ya que funciona perfectamente
aunque siempre hay que tener el debido cuidado de no conectar mal algo...

espero les ayude a los novatos para que empiecen a trabajar con esto tan interesante
que es la manipulacion y deteccion de variables fisicas desde la pc =)

saludox
[/color]

Bastian

Hola! ;D

Estoy currandome un poco el puerto paralelo para hacerme unas cosillas (buscando informacion sobre esto encontre esta pagina y tu post, pero creo que seré asiduo). Y creo que podriamos intercambiar informacion.

De VB no se mucho, pero en C he escrito un par o tres lineas de codigo asi que nos entenderemos.

Queria hacerte una matizacion......
Citaren resumen podemos decir esto:

el Dataport se usa como salida
el Statusport se usa como entrada
el controlport se usa de las dos formas anteriores

El Dataport, se puede usar como entrada y como salida (por lo menos en W98/ME).

Para poder leer el dataport, hay que activar el bit 5 del Controlport (C5=1, escribiendo por ejemplo outportb(0x37a,0x20);).
Este bit no tiene pin correspondiente en el conector, pero si existe en el registro Controlport = 0x37a y se encarga de comunicaciones bidireccionales. Tengo un programita en C (bajo dos)que lo hace perfectamente, si quieres el codigo lo publico.

En w2000/xp, de momento no lo he conseguido (tiene los puertos cerrados), pero estoy trabajando en ello (programo en C++ Builder). De momento, me he bajado la DLL, y voy a probar.

Por cierto, segun la configuracion del puerto paralelo en la BIOS (modos SPP, EPP, ECP) se crean mas registros ademas de los que mencionas. Por ejemplo en el modo EPP hay registros del LPT en las direcciones 378,379,37a,37b,37c,37d,37e,37f,778,779,77a. Estoy investigando que se oculta en estos registro, cuando lo sepa lo sabras

Salu2!
Un gobierno no debe movilizar un ejército por ira, y los jefes militares no deben provocar la guerra por cólera.
Sun Tzu:"El arte de la guerra"

Escrito hace 3000 años y algunos aun no lo saben!

Por cierto ...... escribir bien no cuesta una P*** M*****

BADBYTE-K


CitarEl Dataport, se puede usar como entrada y como salida (por lo menos en W98/ME).
si, hace poko un amigo hizo un soft que kontrola un sistema de riego y el censo de la humedad de la tierra lo hizo por medio del dataport, aunke personalmente no lo comprobe, pero lo uniko que me afirmo fue que uso otra dll y pues que dañaron un puerto mientras hacian las pruebas, es la razon por la que no me he lanzado a probarlo  ;D, aunke no estaria mal...

saludox[/color]

Bastian

Hola!

No sabras que otra DLL?

Me interesa todo lo que sepas del tema.GRACIAS. ;)
Salu2!
Un gobierno no debe movilizar un ejército por ira, y los jefes militares no deben provocar la guerra por cólera.
Sun Tzu:"El arte de la guerra"

Escrito hace 3000 años y algunos aun no lo saben!

Por cierto ...... escribir bien no cuesta una P*** M*****

Shadow

Demasiado interesante, estos tipos de proyectos los empece a hacer bajo VB, pero usando el Ps2, del mouse o del teclado... asignando cada contacto... a alguna puerta por si se habre... o a sensores de una balanza, cositas asi, pero veo que es mucho mejor por el paralelo, y no parece muy dificil
Por USB es aconsejable hacer este tipo de experimentos, o se va demasiado dificil la cosa.


Salu2
Sh@doW

BADBYTE-K

para el caso de visual basic las mas comunes son la io.dll y la inpout32.dll  aunke segun dicen que la io.dll es la ideal para windows XP y la inpout no, pese a eso yo personalmente he trabajado con la inpout bajo windows xp y todo bien unicamente que en el dataport tenia la anormalidad de que los niveles de voltaje a veces variaban repentinamente, aunke ni idea si era a causa de eso... ademas he visto por ahi un control llamado LPT.ocx otro es la inpout16.dll he probado el LPT.ocx y te da una facilidad tremenda a la hora de la programacion porke trabaja con instrucciones tipo port.salida= 1 port.salida=2 basandose en el numero de pin

CitarPor USB es aconsejable hacer este tipo de experimentos, o se va demasiado dificil la cosa.

me propuse trabajar con el USB pero honestamente me encontre limitado por la poka informacion que hay y la dificultad de la que hablan en otros foros, en mi caso unicamente he manejado un sistema de camaras por usb usando un .ocx (shareware) llamado imagingcontrol (a kien le interese buscar por imagingsource icimagingcontrol, imagingcontrol) es de una empresa experta en camaras y esos rollos, lo utilizamos para el manejo de un sistema de vigilancia inteligente... las limitantes del control es que unicamente lo puedes usar dos meses, aunke en la web de la empresa se encuentra mucha info y codigo y ejemplos de programacion.


saludox[/color]

BADBYTE-K


free_kevin

si yo lo pense varias veces y hasta se me ocuriio quetambien use un sistema de alarma inteligente que tambien puedas mandar comandos con un celular por medio de tonos dtmf
al puerto como un codigo de acceso o accion
que cree "movimiento" en la casa cuendo esta sola y con grabaciones como que hay alguien dentro
encienda el equipo de musica ,la tele,luces,que llame a la policia cuando suene laa alarma con una grabacion tuya
diciendo tu direccion y llamandote a vos a tu celular
usando un voice modem o simplemente la placa de audio
y algunas sirenas de automovil
el soft es facil ,el tema como vos dijiste BADBYTE es la
imaginacion...............



BADBYTE-K


BADBYTE-K