# Usar el puerto paralelo para leer 16 entradas multiplexadas



## resua (May 15, 2009)

He construido una tarjeta que se conecta al PC a través del puerto paralelo (empleando 1 -74hct574, 2- 74ls151p y 1 74ls04) que puede detectar cuando se pone a masa cualquiera de las 16 entradas y que intento utilizar en un proyecto casero con VB y la dl inpout32.dll.

Tengo un trozo de código hecho con Qbasic (que adjunto) pero no tengo ni idea de como actualizarlo a VB6 (que tampoco domino demasiado). También tengo un proyecto en VB6 pero solo lee las 5 entradas (que adjunto comprimido).

Lo que desearía es poder leer continuamente las 16 entradas y que se representanse en verde o rojo si están o no conectadas a masa.

Agradezco cualquier ayuda, aunque ya sé que pido demasiado.


----------



## toniro (Dic 17, 2009)

me puesdes mandar tu diagrama de conexiones, yo te puedo ayudar con el software pero necesito saber como usas el multiplaxor

saludos


----------



## resua (Feb 22, 2010)

toniro dijo:


> me puesdes mandar tu diagrama de conexiones, yo te puedo ayudar con el software pero necesito saber como usas el multiplaxor
> 
> saludos


Hola toniro:
Perdona que no haya contestado antes pero es que tuve (y tengo problemas en el trabajo).
Te enviaré lo mas rapido que pueda los esquemas de conexiones y alguna cosa más relacionado con las tarjetas.
Un saludo


----------



## resua (Feb 22, 2010)

Hola:

En este archivo hay información sobre las tarjetas, el circuito impreso y como funcionan.


----------



## calcasla (Mar 24, 2011)

Hola, me gustaría saber si pudiste solucionar el inconveniente con el software en Visual Basic para leer las 16 entradas, yo dispongo de un proyecto de software en donde leo las entradas principales con IO.DLL, pero quizás pueda servir compartir información. Lo bueno de la IO.DLL es que es compatible incluso en Windows 7, no sé si la Inpout32.DLL lo hace.

Saludos, espero tu respuesta.


----------



## Unikfriend (Mar 24, 2011)

Hi calcasla,
que version de VB estas utilizando?


----------



## calcasla (Mar 24, 2011)

Unikfriend dijo:


> Hi calcasla,
> que version de VB estas utilizando?



Visual Basic 6.0 SP6


----------



## Unikfriend (Mar 24, 2011)

Hi calcasla,
Ok, yo tambien hice algunas rutinas para monitorear el puerto paralelo con VB6,
ahora prefiero usar el VC++ para estos casos.
en que etapa estas de tu proyecto?


----------



## resua (Mar 25, 2011)

Lo tengo aparcado porque no sabía seguir.
No sé porque motivo pero los programillas con IO.dll no funcionaban, en cambio si se utilizaba la Inpout32 no tenía problemas.
En cuanto al programa, no estaría mal pode utilizar C++, tengo un amigo que me podría hechar una mano.


----------



## Unikfriend (Mar 25, 2011)

Hi resua,
puedes bajar el Visual C Express de la pagina de microsoft,
la razon principal por que lo prefiero, es porque si programas en C el codigo
es transportable a los microcontroladores.


----------



## calcasla (Mar 25, 2011)

Unikfriend dijo:


> Hi calcasla,
> Ok, yo tambien hice algunas rutinas para monitorear el puerto paralelo con VB6,
> ahora prefiero usar el VC++ para estos casos.
> en que etapa estas de tu proyecto?



Estoy en la etapa de prueba del programa, bueno eso ya está testeado, ahora intento realizar expansiones y mejoras del puerto. ¿En qué consiste ese lenguaje VC++?.



resua dijo:


> Lo tengo aparcado porque no sabía seguir.
> No sé porque motivo pero los programillas con IO.dll no funcionaban, en cambio si se utilizaba la Inpout32 no tenía problemas.
> En cuanto al programa, no estaría mal pode utilizar C++, tengo un amigo que me podría hechar una mano.



¡Hola!, que extraño, a mi no me da problemas la IO.DLL, creo que quizás depende de la versión, ya que hay varias disponibles. ¿Habrán estado correctamente las librerías?



Unikfriend dijo:


> Hi resua,
> puedes bajar el Visual C Express de la pagina de microsoft,
> la razon principal por que lo prefiero, es porque si programas en C el codigo
> es transportable a los microcontroladores.



Cuando dices transportable a los microcontroladores, ¿a qué te refieres específicamente?, ¿el C se puede transportar a .HEX o nada que ver?


----------



## Unikfriend (Mar 25, 2011)

Hi calcasla,
me refiero a que lenguajes basados en ANSI C,
puedes copiar las funciones de un compilador a otro y
debe de funcionar si esta bien estructurado.


----------



## Black Tiger1954 (Mar 25, 2011)

Resua, si querés te subo un programa elemental para que veas como se puede manejar el IO.DLL desde VB5 o VB6.


----------



## calcasla (Mar 25, 2011)

Unikfriend dijo:


> Hi calcasla,
> me refiero a que lenguajes basados en ANSI C,
> puedes copiar las funciones de un compilador a otro y
> debe de funcionar si esta bien estructurado.



Ok, entiendo. Veo que eso ahorra tiempo.




Black Tiger1954 dijo:


> Resua, si querés te subo un programa elemental para que veas como se puede manejar el IO.DLL desde VB5 o VB6.



Hola Black Tiger, ¿por casualidad conoces alguna manera de controlar un adaptador USB-Paralelo con IO.DLL o algún otro método?, por lo que me informé una vez (aunque la información era muy general y no explicaba con tanto detalle), es que al utilizarse el USB-Paralelo hay que utilizar de alguna manera el printer.sys o algo similar, no recuerdo bien su nombre, me parece que esta controla la "compatibilidad con impresoras" que da opción con estos adaptadores, y de esta manera poder operar por USB y luego con la interfaz de paralelo. ¿Alguna información o debate al respecto?.

Gracias


----------



## Black Tiger1954 (Mar 26, 2011)

Si el driver del adaptador es transparente, debería crear un puerto paralelo virtual, y supongo que se debería poder manejar con el IO.DLL o uno de ese tipo, pero habría que probarlo. Para eso solo hay que ver en el administrador de dispositivos que dirección tiene asignada, y probar


----------



## calcasla (Abr 3, 2011)

Black Tiger1954 dijo:


> Si el driver del adaptador es transparente, debería crear un puerto paralelo virtual, y supongo que se debería poder manejar con el IO.DLL o uno de ese tipo, pero habría que probarlo. Para eso solo hay que ver en el administrador de dispositivos que dirección tiene asignada, y probar



Lo malo es que no sale ninguna dirección del adaptador USB-Paralelo.



resua dijo:


> Lo tengo aparcado porque no sabía seguir.
> No sé porque motivo pero los programillas con IO.dll no funcionaban, en cambio si se utilizaba la Inpout32 no tenía problemas.
> En cuanto al programa, no estaría mal pode utilizar C++, tengo un amigo que me podría hechar una mano.



Sabes, estoy muy interesado en aplicar ese sistema, me gustaría ayudarte, pero hay algunas cosas que no entiendo en la descripción de tarjetas. Una de esas cosas es la tabla de verdad del 74LS151, lo otro es sobre la fuente de alimentación, ¿la tarjeta de alimentación la realizas para alimentar los integrados verdad?. Bueno en general creo que es eso.

Lo que me llama la atención es sobre cómo poder programar el multiplexor para que sepa en qué momento leer una determinada entrada, me parece que eso se hace con las líneas A, B y C de los multiplexores, y esos pulsos los envías por el puerto paralelo hacia afuera a través de D0, D1, D2, D3, D4 y D5 para que lleguen a las respectivas líneas A, B y C.

Bueno, gracias por escucharme y espero estemos en contacto .


----------



## Black Tiger1954 (Abr 3, 2011)

> Lo malo es que no sale ninguna dirección del adaptador USB-Paralelo.


No me refiero al adaptador si no al puerto paralelo que tiene que generar el driver.


----------



## calcasla (Abr 3, 2011)

Black Tiger1954 dijo:


> No me refiero al adaptador si no al puerto paralelo que tiene que generar el driver.



No sale puerto paralelo, sale "Compatibilidad con Impresoras USB" en la categoría Controladoras de Bus Serie Universal.



			
				calcasla dijo:
			
		

> No sale puerto paralelo, sale "Compatibilidad con Impresoras USB" en la categoría Controladoras de Bus Serie Universal.



Y acabo de ver el puerto, es el Port_#0003.Hub_#0004.


----------



## Black Tiger1954 (Abr 3, 2011)

Entonces es un adaptador de los que solo sirven para impresoras.
Yo pensé que era algo como esto:
http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund um den PC/USB2LPT/index.html.en


----------



## calcasla (Abr 3, 2011)

Black Tiger1954 dijo:


> Entonces es un adaptador de los que solo sirven para impresoras.
> Yo pensé que era algo como esto:
> http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund um den PC/USB2LPT/index.html.en



Lamentable, parece que no será tan sencillo.


----------



## Unikfriend (Abr 4, 2011)

Hi Calcasla,
Es indispensable utilizar el VB6?
intente utilizar VC, el puerto es transparentes accesando como LPT1.



```
void receive_string_LPT(unsigned char *a)
{
DWORD bytesRead;
UCHAR rxData = 1;
unsigned char c;
c=0; //inicializa variable
do{
ReadFile(hParallel, &rxData, sizeof(rxData), &bytesRead, NULL); //lee dato del puerto
*(a+c) = rxData; //agrega dato a la cadena
c++; //incrementa el contador de c
}while(rxData != 0x0A && rxData != 0x0); //mientras no sea un Return o nulo
}
void send_byte_LPT(unsigned char Data)
{
DWORD bytesSent;
UCHAR txData;
txData = Data; //asigna valor a trasmitir
WriteFile(hParallel, &txData, sizeof(txData), &bytesSent, NULL); //envia byte por puerto
}
unsigned char init_LPT(void)
{
COMMTIMEOUTS parallelTimeouts; //estatus de puerto
LPCWSTR gszPort;
gszPort = LPT;
SetLastError(0); //cancela ultimo error
hParallel = CreateFile( gszPort, //crea connection a comm
GENERIC_READ | GENERIC_WRITE, 
0, 
0, 
OPEN_EXISTING,
0, //FILE_FLAG_OVERLAPPED,
0);
if(hParallel == INVALID_HANDLE_VALUE)return(0); //envia error
parallelTimeouts.ReadIntervalTimeout = MAXDWORD;
parallelTimeouts.ReadTotalTimeoutMultiplier = 0;
parallelTimeouts.ReadTotalTimeoutConstant = 0;
parallelTimeouts.WriteTotalTimeoutMultiplier = 0;
parallelTimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hParallel, &parallelTimeouts);
return(1); //envia OK
}
```


----------



## calcasla (Abr 5, 2011)

Unikfriend dijo:


> Hi Calcasla,
> Es indispensable utilizar el VB6?
> intente utilizar VC, el puerto es transparentes accesando como LPT1.
> 
> ...



Muchas gracias, pero a lo que me refería era poder hacerlo con un adaptador USB - Paralelo.


----------



## Unikfriend (Abr 5, 2011)

Hi Calcasla, 
lo que entiendi es que quieres utilizar el adaptador 
USB-Paralelo para controlar 16 puertos I/O.
Cual sería la frecuencia del ciclo de lectura-escritura?


----------



## calcasla (Abr 5, 2011)

Unikfriend dijo:


> Hi Calcasla,
> lo que entiendi es que quieres utilizar el adaptador
> USB-Paralelo para controlar 16 puertos I/O.
> Cual sería la frecuencia del ciclo de lectura-escritura?


¡Hola!
Antes que todo muchas gracias por la ayuda. En realidad no deseo leer 16 entradas por USB - Paralelo, sólo deseo usar el USB - Paralelo para manejar las salidas por defecto y las entradas por defecto que posee, el problema es que no se puede acceder a él a través de la IO.DLL, y ahí radica el inconveniente. Cualquier ayuda es bienvenida.

Gracias


----------



## Unikfriend (Abr 6, 2011)

Hi, 

El adaptador USB-paralelo no venia con su propias DLL?


----------



## calcasla (Abr 6, 2011)

Unikfriend dijo:


> Hi,
> 
> El adaptador USB-paralelo no venia con su propias DLL?



No. Ese es el problema.


----------



## Black Tiger1954 (Abr 7, 2011)

A mi criterio, se puede hacer siempre y cuando, consigas un adaptador como el que puse en una respuesta anterior que genera un puerto virtual paralelo. Si no, no creo que funcione.


----------



## Unikfriend (Abr 7, 2011)

Ok,pues si es un driver generico debera ser mas facil de implementar.
al conectar el adaptador, en el administradores de dispositivos debe aparecer
un puerto LPT1, si entras a ver sus propiedades debe indicar que controlador
utiliza en detalles del controlador, algo asi:
C:\WINDOWS\System32\DRIVERS\usbport.sys


----------



## Black Tiger1954 (Abr 7, 2011)

> al conectar el adaptador, en el administradores de dispositivos debe aparecer
> un puerto LPT1


No sé si leíste todo el hilo Unikfriend, pero justamente por el tipo de adaptador, no aparece el LPT1 
Son adaptadores que solo permiten impresión y no generan realmente un puerto virtual.


----------



## Unikfriend (Abr 7, 2011)

hi BlackTiger,
si lo lei completo, a lo mejor entendi mal jiji
lo que entendi es que no aparece la direccion fisica 
y por eso no puede usar el IO.dll. Pero al conectar 
el USB debe aparecer algun dispositivo
y debe indicar un controlador asociado. 
 
Pero definitivamente yo haria lo que tu sugieres,
si un componente causa tantos problemas no me casara
con el... hay que cambiarlo por otro jiji


----------



## calcasla (May 13, 2011)

Unikfriend dijo:


> hi BlackTiger,
> si lo lei completo, a lo mejor entendi mal jiji
> lo que entendi es que no aparece la direccion fisica
> y por eso no puede usar el IO.dll. Pero al conectar
> ...



Saludos a todos. Espero hayan estado bien todo este tiempo. Saben, yo acostumbro a trabajar con IO.dll, pero ahora estoy usando la inpout32.dll, he tenido problemas para leer los pines del DB25 de entrada (pin 10, 12, 13 y 15). Con la IO.dll puedo tener en un label la información, cuando se coloca un entrada a GND, esta queda en 0.

Este es un fragmento de como se lee con IO.dll:

    Estado(0) = Lectura And &H8             '= 00001000 en Binario
    Estado(1) = Lectura And &H10            '= 00010000 en Binario
    Estado(2) = Lectura And &H20            '= 00100000 en Binario
    Estado(3) = Lectura And &H40            '= 01000000 en Binario

¿Alguien sabe cómo leerlos con la inpout32.dll?, yo sé que sería con la función Inp, pero no sé cómo traspasar eso a 4 labels que me muestren los estados en 0 ó 1 como la hago con IO.dll.

Les aprovecho de dejar un programa bien sencillo de inpout32.dll que funciona incluso en Windows 7, ahí se puede leer, pero no entiendo bien la manera, agradecería vuestra ayuda y espero les sirva el software, es de mucha utilidad.
Muchas gracias, saludos.


----------



## AlvaroCastellar (May 18, 2011)

hola tengo un algoritmo de logica difusa en lenguage C con 2 entradas y una salida
lo que deseo hacer ahora es recibir ests dos entradas por el puerto serial, procesarlas y entregar la salida por el mismo puerto serial. uso visual studio 2008 express edition, y tengo windows 7 enterprise. alguien podria decirme como altero mi codigo en C para que haga esta recepcion y transmision???


----------



## Unikfriend (May 18, 2011)

Hi Alvaro!

Que parte es la que se te dificultad?
porque no pones el codigo para verlo.


----------



## AlvaroCastellar (May 18, 2011)

hola, gracias por tu atencion. en realidad soy nuevo programando y hay muchas cosas que aun no entiendo, este algoritmo lo cree, leyendo y haciendo. soy mas matematico que nada, por eso todos los conceptos de transmision de datos me son muy ajenos. estoy en realidad en ceros con este tema, lo que quiero es leer del puerto serial in1 e in2, y dar el valor crisp porel mismo puerto:


----------



## Unikfriend (May 18, 2011)

Hi Alvaro,
y quien te entrega los valores in1 e in2?
tiene algun formato en especial?

Solamente ocupas tres funciones



> void[/SIZE] receive_string_COM([/SIZE]unsigned[/SIZE] [/SIZE]char[/SIZE] *a)
> {
> DWORD bytesRead;
> UCHAR rata = 1;
> ...


----------



## AlvaroCastellar (May 18, 2011)

in1 e in2 son tipo float
la idea es tomarlos de dos sensores
hacer la comunicacion serial mediante un PIC y controlar una planta de mezclado

estoy trabajando en pasarlo a CUDA-C para que trabaje en paralelo sobre eso he encontrado bastante material, pero no he entendido nada de la comunicacion serial en lenguaje C. la verdad soy un poco cerrado para este tema jajaja

por cierto muchisimas gracias por tu atencion unikfriend
estoy corriendo un poco con esto porque es parte de mi proyecto de grado


----------



## AlvaroCastellar (May 19, 2011)

unikfriend una pregunta, para ese algoritmo que me diste que librerias debo agregar?? algun encabezado en especial?? es que hay algunos comandos que no me reconoce por ejemplo tu colocas unsignedchar pegado y yo lo tuve que separar para que me compilara pero por ejemplo me da esta lista de errores:

ReadFile(hCom, &rata, sizeof(rata), &bytesRead, NULL); //hCom identificador no declarado

gszPort = PORT; //PORT identificador no declarado

disculpa mis preguntas elementales pero es que soy muy nuevo programando


----------



## Unikfriend (May 19, 2011)

Hi Alvaro;
coloca estas declaraciones con las variables globales

#define[/SIZE] PORT TEXT("Com1")                      //Com1=0x3f8, Com2=0x2f8, Com3=0x3e8, Com4=0x2e8
HANDLE hCom;


----------

