Autor Tema: [PP] Funcionamiento del puerto paralelo y codigo de ejemplo para manejarlo  (Leído 8084 veces)

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

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Para empezar, un simple post donde explico como funciona basicamente el puerto paralelo.

Quoteo de Wikipedia:
Citar
Un puerto paralelo es una interfaz entre una computadora y un periférico cuya principal característica es que los bits de datos viajan juntos, enviando un paquete de byte a la vez (8 bits). Es decir, se implementa un cable o una vía física para cada bit de datos formando un bus. Mediante el puerto paralelo podemos controlar también periféricos como focos, motores entre otros dispositivos, adecuados para automatización.

El cable paralelo es el conector físico entre el puerto paralelo y el dispositivo periférico. En un puerto paralelo habrá una serie de bits de control en vías aparte que irán en ambos sentidos por caminos distintos.

Entonces, vos tenes la posibilidad de enviar 8 bits de un solo saque (en realidad podes enviar 8 bits + 4 bits negados) y de recibir 4 bits tambien de un solo saque (+ 1 bit negado).

En los sistemas operativos MS-DOS, desde cualquier entorno de programacion, era muy simple manejar estos puertos. En los sistemas 95-98-Me (No NT) todavia era posible acceder a la memoria del puerto paralelo sin mayores dificultades. Hoy en dia, los sistemas basados en NT, requieren un Driver ejecutandose en modo kernel o servicio para poder acceder al hardware del puerto paralelo. Se puede acceder con su nombre LPTX (donde X representa a un numero) o bien con su direccion en memoria: LPT1: 0x378, LPT2: 0x277. En Linux basicamente es lo mismo, solo que no se requieren Drivers; y para acceder se necesita saber el nombre de dispositivo, ya que en linux son /dev/lpX (donde X representa un numero).

El hardware en si, es un conector DB-25 hembra (de parte de la PC) y normalmente se conecta a un cable que en un extremo tiene un conector DB-25 macho y en el otro un conector macho Centronics.

Aca tenes una imagen con el Pinout del conector macho:



Su salidas tienen estados logicos de 0-1 con voltajes maximos de 5v; es decir, un modelo TTL. Lo mismo con las entradas, es necesario proveerle 5v para que cambien su estado logico.

Se puede llegar a transmitir bidireccionalmente 1 MB/s segun lo indica el estandar IEEE 1284.

En fin, vamos a ver un codigo muy simple en VB para manejar los 8 bits principales de salida y leer los 4 bits de entrada.

Podemos usar 2 librerias DLL para este proposito, la mas simple es IO.DLL, pero tiene un defecto, en modo 64 bits no funciona. Para eso, podemos usar la DLL inpout32.dll, que aunque diga 32, funciona en 64 bits.

Antes que nada, necesitamos la DLL IO.DLL, que la podemos conseguir aca.
Las declaraciones en VB:
Código: [Seleccionar]
Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
'PortOut - Outputs a byte to the specified port.
Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
'PortWordOut - Outputs a word (16-bits) to the specified port.
Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
'PortDWordOut - Outputs a double word (32-bits) to the specified port.
Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
'PortIn - Reads a byte from the specified port.
Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
'PortDWordIn - Reads a double word (32-bits) from the specified port.
Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
'SetPortBit - Sets the bit of the specified port.
Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
'ClrPortBit - Clears the bit of the specified port.
Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
'NotPortBit - Nots (inverts) the bit of the specified port.
Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
'GetPortBit - Returns the state of the specified bit.
Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
'RightPortShift - Shifts the specified port to the right. The LSB is
'                 returned, and the value passed becomes the MSB.
Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
'LeftPortShift - Shifts the specified port to the left. The MSB is
'                returned, and the value passed becomes the LSB.
Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean
'IsDriverInstalled - Returns non-zero if io.dll is installed and
'                    functioning. The primary purpose of this function
'                    is to ensure that the kernel mode driver for
'                    NT/2000/XP has been installed and is accessible.



Si queres usar la otra opcion, la podes descargar de aca

Las declaraciones para la dll inpout32.dll:
Código: [Seleccionar]
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)



Para ir redondeando vamos a hacer una prueba muy muy simple, con un tester y un codigo en VB.

Ponemos el tester en modo Voltaje rango 0V-20V. Con una punta (la negra) tocamos cualquier pin que diga GND. Con la otra punta, conectamos el pin 2, que vendria a ser el BIT0 o DATA0.

Mientras mantenemos el tester ahi, ejecutamos el programita siguiente:
(nota: debemos tener la DLL IO.DLL en el App.Path o en system32)
Código: [Seleccionar]
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)

Sub Main ()
    SetPortBit &H378, 0
    MsgBox "Presiona Aceptar para cambiar el estado de nuevo a 0"
    ClrPortBit &H378, 0
End Sub

Entonces con este ejemplo, vamos a ver en el tester que cambio el voltaje de 0v a 5v (a veces 2.5v, mas que nada en notebooks). Cuando aceptemos el MsgBox, el voltaje caera de nuevo a 0v.

Por el momento eso es todo, mas luego posteo una clase que diseñe con la DLL IO.DLL, donde el cambio de alguna entrada detona un evento y algunas cosas mas.


Saludos!
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:[PP] Funcionamiento del puerto paralelo y codigo de ejemplo para manejarlo
« Respuesta #1 en: Noviembre 05, 2009, 11:39:25 pm »
Buena onda!!! esta interesante =D segui con esto no seas paja.

Cuando haces el tuto de PLC?

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:[PP] Funcionamiento del puerto paralelo y codigo de ejemplo para manejarlo
« Respuesta #2 en: Noviembre 06, 2009, 12:22:05 am »
Buena onda!!! esta interesante =D segui con esto no seas paja.

Cuando haces el tuto de PLC?

JAJAJ no se me habia ocurrido. Podria hacer uno. Pero no tengo PLCs. Aunque bueno, viste Wikipedia ayuda...

Despues posteo una nigereada que hice en base a esto, un lector de EPROMs de la serie M27CXXX (XXX corresponde a la cantidad de bits); ya que afane 2 de estos hijos de puta de una 386. Uno es de 512 que era la BIOS de la PC, y la otra de 256 que era la BIOS de la placa de video.

saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:[PP] Funcionamiento del puerto paralelo y codigo de ejemplo para manejarlo
« Respuesta #3 en: Noviembre 06, 2009, 09:52:40 am »
Está interesante el post coco. Yo tengo varios proyectos con Electronica y creo que me tocará joderte un poco por acá che... Jejeje.

Saludos.
Miguel Núñez.