[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.

CarWarlock

Buenas.

El pin 11 del puerto paralelo es el BUSY,  trabaja con "inversión de hardware" o sea que si le pones 5V leeras un 0 en el pin y al revés si tienes 0V tendrás un 1.
Para empezar no se porque declaras un string para recibir el dato, creo que es un error hacer eso ya que luego no puedes enmascararlo bien.
yo lo haría así y partiendo de la libreria io.dll:

BytIn = PortIn(&H379)          'el valor lo almaceno en un byte
BytIn = BytIn And &H80        ' enmascaro el Busy

If BytIn = &H80 Then
    'Hay 0V en el pin
Else
    'Hay 5V en el pin
End If

Salu2


chinone

queria pedirte si me podias mandar el programa que tu diseñaste del puerto paralelo de entrada y salida hecho en visual basic, por que la verdad todavia no logro que funcione... mi correo es chinone_p@yahoo.es por favor que se me acaba el plazo de entrega

Ian~Shadow

Cita de: chinone en  4 Mayo 2005, 00:26 AM
queria pedirte si me podias mandar el programa que tu diceñaste del puerto paralelo de entrada y salida hecho en visual basic, por que la verdad todavia no logro que funcione... mi correo es chinone_p@yahoo.es por favor que se me acaba el plazo de entrega

Yo preferiria que lo puciera aqui. en codigo fuente aunque sea. O si tienes un link o download  ;)

CarWarlock

Buenas.

El ejemplo es muy sencillo activa unas salidas y lee el pin "SELECT IN", el programa se diseño para una aplicación ejemplo que tenía una protección Mochila.
Si alguien está interesado en los fuentes y sabe algún site donde dejarlos que me lo haga saber.



'Aquí está mi modulo de las declaraciones.

Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
Public Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer
Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean

'api de retardo
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)



'Mi formulario

Dim sOrt As Byte   'valor de la salida puerto paralelo
Dim sIn As Byte    'valor de la entrada puerto paralelo

Dim pOut As Integer 'direccion del puerto paralelo para Activacion
Dim pIn As Integer  'direccion del puerto paralelo para lectura


Private Sub Form_Load()

Dim icon_punter As String

If IsDriverInstalled = True Then

    icon_punter = App.Path & "\" & "Harrow.cur"      'icono personalizado para la pantalla
    Screen.MouseIcon = LoadPicture(icon_punter)
   
    pOut = &H378           'puerto LPT1 (salida datos)
    pIn = &H379            'puerto LPT1 (Status impresora)
   
    sOrt = 0               'desactivo todas las salidas
    PortOut pOut, sOrt     'lo saco por el puerto
   
    Call Lee_Pin_Select    'leo el estado del pin

Else

   MsgBox "El Driver no se encuentra cargado en memoria ", vbCritical + vbOKOnly, "Error"
   Unload Me

End If


End Sub


Private Sub lblEntradas_Click(Index As Integer)

Dim valor As Byte
    valor = 2 ^ Index

If shpEntradas(Index).BackColor = vbWhite Then

    sOrt = sOrt Or valor
    shpEntradas(Index).BackColor = RGB(255, 0, 255)

Else
    sOrt = sOrt - valor
    shpEntradas(Index).BackColor = vbWhite

End If

'Sacalo por el puerto
PortOut pOut, sOrt      'lo saco por el puerto

'un pequeño retardo para no leer el pin inmediatamente
Sleep (100)

Call Lee_Pin_Select

End Sub

Private Sub Lee_Pin_Select()

sIn = PortIn(pIn)       'obtengo el valor del puerto paralelo &H379(LPT1) Status
sIn = sIn And &H10      'mascara para obtener el estado del pin Select In

If sIn = &H10 Then
    lblPinSelect.Caption = "1"
Else
    lblPinSelect.Caption = "0"
End If

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Screen.MousePointer = 0

End Sub
Private Sub fmrEntradas_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Screen.MousePointer = 0

End Sub

Private Sub lblEntradas_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

Screen.MousePointer = 99

End Sub




CarWarlock

Buenas.

A quien esté interesado en los fuentes del ejemplo anterior aquí los podreis descargar.


http://rapidshare.de/files/1643248/puertoparaleloll.rar.html


Salu2.

Syphroot

 ;D Buenas, veo que hay mucha gente queriendo programar para hacer aplicaciones con el puerto paralelo y que estan teniendo problemas y muchas dudas en la realizacion de sus proyectos.

Estos problemas se deben a que todavia no estan familiarizados con los sistemas digitales, algo basico como el manejo de CEROS y UNOS es lo que causa problemas. Tambien piensen en la manera en que trabaja una PC, alguien preguntaba por ahi como podia mandar X voltios hacia el paralelo, NO SE PUEDE, son unicamente 2 niveles de voltaje ( +5 V y 0V, no hay mas).

Entonces como recomendacion les propongo antes de postear dudas, busquenlas en el gran GOOGLE, investiguen, sean logicos, traten de hacer las cosas sencillas, a lo que me refiero es que en varios post se menciona:

" Con este numero pones el pin X de LPT a nivel alto "

Es mejor manejar estos numeros decimales en base hexadecimal, veamos como:

Tenemos (en el DataPort) 8 pines que van de D0 hasta D7, osea UN BYTE.  Un byte puede tener valores desde 0 hasta 255 en DECIMAL,  00 hasta FF en hexadecimal. Hagamos una peque+a tabla de valores (los que vamos a usar, o si ya manejas el Hexa a la perfeccion hazlo mentalmente):


D7  D6  D5  D4  D3  D2  D1  D0    |   Codigo Hexadecimal   


   0    0    0    0    0    0    0    0      |    00h

   0    0    0    0    0    0    0    1      |    01h

    .
    .
    .

   0    0    0    1    0    1    0    1      |    15h


Me explico: Con esta "tabla" puedes ver que pines activas y cuales no de manera mas sencilla, una vez que tienes tus datos en bits pasalos a hexadecimal.

Para pasar de Binario a Hexadecimal es muy facil, veamos la siguiente tabla:

BINARIO    DECIMAL        HEXADECIMAL

0000          0                   00h
0001          1                   01h
0010          2                   02h
0011          3                   03h
0100          4                   04h
0101          5                   05h
0110          6                   06h
0111          7                   07h
1000          8                   08h                     
1001          9                   09h
1010          10                  0Ah
1011          11                  0Bh
1100          12                  0Ch
1101          13                  0Dh
1110          14                  0Eh
1111          15                  0F

Ahora tomamos nuestro numero binario de un byte, pongamos por ejemplo este:

Binario:   1001 0101        (vean como los separo en nibles)

NOTA: 1 nible es un conjunto de 4 bits

Despues vemos nuestra tabla hexadecimal y sustituimos cada nible por su respectivo hexadecimal, asi:

1001  -> 9
0101  -> 5

Nuestro HEXA para el binario 10010101 es un 95h

Otro:

1010 1100     ->  ACh

VEN que FACIL!!!!!!!

Y pues este metodo pueden aplicarlo con la cantidad de bits que sean, solo la unica regla es que deben separarse en grupos de 4 bits de derecha a izquierda, asi que cuando se nos ponga enfrente un binario asi:

1000101110101101010111

es mas facil sacar su hexadecimal, es mas, hagamoslo:

(lo separo):

10 0010 1110 1011 0101 0111

(Observen que a la izquierda nos quedaron dos bits, solo se le ponene ceros a la  derecha para completar el nible)

Y nos queda como:

22EB57h

Que Facil salio!!!!

Y a la hora de expresarlo ya sea en VB o C seria:

En VB, poner los caracteres ' &H ' y en seguida nuestro numero HEXA, asi:

     &H95
     &HAC
     etc

En C se ponene los caracteres ' 0x ' y a continuacion nuestro numero HEXA,asi:

     0x95
     0xAC
     etc

Todo esto fue para ""despertar"" un poco y para trabajar como debe ser en los Sistemas Digitales como las PC, con puros numeros Hexadecimales, que es mas sencillo que manejar Decimales.

Por ultimo, me despido y espero les sirva esta observacion

Saludos ;D


carlosmtnez

Toy en desarrollo de un proyecto de abrir una cerradura por el puerto paralelo a demas de estar gestionada por una base de datos y tal...  pero mi problema está en que cuando doy voltaje a la cerradura, ese pin se queda "encendido permanentemente" y si le doy a "apagar todos" me activa un relé temporizador que esta conectado al STROBE, cosa que no me interesa. Mi deseo es saber que codigo es el que tng que poner para "apagar" el estado del pin.

Utilizo como bien habeis explicado lo siguiente:
Private Sub Command2_Click()
Out &H378, 2
End Sub

Pero ahora quiero apagarlo y no se como.

Gracias de antemano y enhorabuena por el foro, está genial.   ;D

alecoyote

 ??? Hola soy Alejandro Abrego de Bolivia toy preparando un proyecto en el cual utilizo el puerto paralelo para habilitar un chip 7447 de 7 segmentos, entendi muy bien eso de como sacar datos por el puerto (Out &H378, 2), lo que necesito es saber como puedo habilitar dos chips 7447 para que se prendan los leds deacuerdo a los numeros que se envien por el puerto (ojo) solo utilizo dos digitos para los numeros que se envian, no se si me dejo entender, ojala que si.
Otra cosa quisiera saber como puedo activar un solo pin de DataPort, en si lo quiero hacer es:

Mandar un  98 o cualquier numero al panel que activan los chips 7447 y para eso quiero separar el 9 del 8 y convertirlos a binario es decir 1001  y   1000,  y sacar por por los pines individualmente asi:
D0= 5 V    1 LOGICO
D1= 0 v    0 LOGICO
D2= 0 v    0 LOGICO
D3= 5 v    1 LOGICO
D4= 5 v    1 LOGICO
D5= 0 v    0 LOGICO
D6= 0 v    0 LOGICO
D7= 0 v    0 LOGICO

no se si hay una forma mas sencilla de hacer todo esto pero si me pueden ayudar se los agradecere mucho




Si quieres puedes

guibatorg

#48
hola amigos, alguien sabe de algun programa que haga girar engranajes, estoy recien metiendome en el tema y quiero fabricar un puente elevadiso. la maqueta la tengo lista. me dijeron que necesitaba una interfaz y bueno los accesorios electronicos tambien. si alguien  me ayudara le estaria agradecido. ;)

....Gusto....

haces q el lpt le mande electricidad a un motor q este conectado al puente:

motor--------------------------motor




                   /  \
motor......../     \...........motor

lo unico calcula x cuantos milisegundos o el puente quedara asi:


......\ \/////\\ :P.......


saludos ;D
.:.~GuStO~.:.