# Matriz 8x4 puerto paralelo



## Marcelo (Jul 27, 2005)

Saludos,

Estoy tratando de hacer una matriz de 8 entradas (las 8 del puerto paralelo - desde D0 hasta D7) y 4 salidas, todas a nivel TTL.

La idea es poder escoger cual de las 8 entradas corresponde a cada salida, por ejemplo: 
D5 es la salida 1
D3 es la salida 2
D0 es la salida 3
D7 es la salida 4

De esta forma podré "setear" las 4 salidas con cuatro entradas que yo escoja arbitrariamente desde el puerto paralelo y asimismo podré cambiarlas mediante un DipSwitches o jumpers cuando lo desee.

He intentado utilizar multiplexores 8x1, pero el problema que tengo es como llevar una señal específica a uno solo de los multiplexores (debería usar 4 de ellos para esta idea)

No es problema lo que viene luego de las salidas pues el circuito aislado ópticamente ya lo tengo diseñado. Estas 4 salidas controlan los emisores de unas optocuplas (u optoaislantes) que controlan un circuito de 4 relays.  

Saludos y gracias por la ayuda que puedan dispensar.

Marcelo.


----------



## MaMu (Jul 27, 2005)

Cual es la razon que impide que utilices como entradas las 5 lineas del registro de Estado? ya que puedes conmutar dichas señales a masa y conseguir asi entradas  digitales. El problema de utilizar el registro de Datos como entradas, es que posiblemente tengas una diferencia real entre la tensión en bornes del Latch y la lectura de señales, que lo más común que sucede es que tengas una lectura del registro diferente a la presencia de tensión en bornes, esto se debe a que la lectura se realiza en base a una media sensada desde la configuración del centronics. Esto se explica de la siguiente manera, puedes estar enviando un valor lógico alto (5V) a determinado datos, por ejemplo D3 y estar midiendo con el multímetro un nivel bajo (0V) a la salida del puerto paralelo. En caso de ser necesario el evitar utilizar las entradas desde el registro de estado, yo te recomendaria que lo hagas desde el registro de control. Ten en cuenta que estas configuraciones varian segun la norma del puerto que se haya establecido (ECP - EPP - EX). Tengo muchisimas interfaces por puerto paralelo realizadas, tanto para logica TTL como para control de potencia de CA. Hago esta aclaración ya que el registro de datos abarca los 8 bits del registro de Datos de D0..D7 y se recomienda el uso de los mismos como Salidas y no como entradas. (por el inconveniente anteriormente explicado).
Saludos, cualquier consulta sera respondida a la brevedad.

Pegale una mirada a este thread... tuve problemas por una compra de componentes defectuosos.
http://forosdeelectronica.com/viewtopic.php?t=274


----------



## Marcelo (Jul 28, 2005)

Gracias MaMu por tu respuesta y la excelente explicación.

Te comento, 

Las señales de las cuales hablo en mi post inicial son todas salidas desde el puerto paralelo hacia la interfaz y creo que no lo expliqué lo suficiente.

No hago lecturas de señal desde el puerto en ningún momento.

Ahora te explico porque necesito esto. 

La interfaz controla el movimiento de un telescopio cassegrain de 14 pulgadas (4 señales: Norte, Sur, Este y Oeste) para astrofotografía.

Una cámara toma fotos cada x segundos de una estrella de referencia escogida por mi con la ayuda de un telescopio más pequeño montado sobre el de 14 pulgadas. Esta foto es analizada por un software y determina cuanto segundos de arcos se ha desviado el telescopio y envía las señales pertinentes (todas salidas) hacia el puerto paralelo para corregir esa infima desviación mediante la interfaz que está conectada al telescopio. No hay retroalimentación por el puerto, ésta se realiza por medio de la foto de guiado y el análisis de ella.

Esas desviaciones distorsionan la foto final que está tomando otra cámara colocada en el telescopio principal si no son corregidas (estamos hablando de 5 a 10 minutos de exposición contínua a obturador abierto).

Ahora el problema:

La interfaz que diseñé, está aislada ópticamente del puerto paralelo y éste (el puerto paralelo) solo envía señales hacia la base de un transistor que polarizado,  enciende el led de la optocupla. De allí en adelante tengo, del lado de los transistores del optoaislante, un circuito para controlar las bobinas de 4 relés de 5 voltios (de esos que se usan en los modems)

El problema radica en que utilizo varios programas para tomar fotos y controlar el movimiento del telescopio (y bastante caros por cierto), pero cada uno de ellos está programado para enviar las señales de control por distintos pines del registro de datos (D0 a D7), por consiguiente tendría que hacer una interfaz para cada uno de ellos. 

Actualmente tengo unas especies de "patch cords" o puentecitos de cables por llamarlos de alguna forma, con los cuales "puenteo" a mano los pines que me interesan según el programa que utilizo, pero esto además de peligroso debido al riesgo de volarme algún driver del puerto (aunque tomo la precaución de apagar la interfaz antes de puentear) es muy fastidioso y difícil hacerlo a obscuras y a la intemperie.

La idea es poder hacer una matríz análoga a un teclado por ejemplo, que me permita definír que registro debe conectarse a que pin de entrada de la interfaz (8 del paralelo hacia 4 del circuito), para lo que desearía utilizar un circuito lógico y unos dipswitches o jumpers para hacerlo .  Podría ser un PLA?, también pensé en un manejador de siete segmentos...pero no doy pié con bola todavía

Entiendo el malentendido del post anterior.  Cuando digo una matriz de 8 entradas y 4 salidas me refiero al circuito que necesito. Las 8 entrada de ese circuito serían las salidas D0 a D7 del puerto paralelo, y las salidas de ese circuito serían las entradas a la interfaz.

Bueno, DISCULPA LO LARGO!!! pero espero que haya podido explicar bien el problemita.

Saludos y gracias nuevamente.

Marcelo.


----------



## MaMu (Jul 28, 2005)

Lindo trabajito el del telescopio  .
Ahora bien, a ver si te entendi correctamente, lo que vos tenes es un circuito el cual recoge los 8 bits del puerto paralelo (D0..D7) que, mediante el uso de optoacopladores para proteger el mismo, produce la exitación del fototransistor para la conmutación de las bobinas de los relé. Hasta ahi vamos bien, es muy claro. Tu problema es que, utilizas un programa A que maneja los bits D0, D3 y D7 y utilizas un programa B que maneja los bits D1, D2, D5 y D6, entonces, como solo tenés las 4 salidas necesarias, te vez obligado a puentear las salidas de datos D0..D7 a los optoacopladores según el software que estas utilizando de turno. Lograste determinar cuales son los bits que maneja cada software? Por lo que veo, es que todos los softwares solo manejan 4 bits (de entre D0..D7) es decir 1 bit por cada una de las 4 salidas de relé.

Si es correcto esto, avisame que seguimos adelante con la solución, tengo varios circuitos dando vueltas por aca.

*Edit 1*

El problema del Multiplexor son las lineas de datos, al igual que ocurriria utilizando algun array (PLA) ya que como bien te pregunte, deberiamos conocer que bits utilza cada soft, como para poder definir las salidas. Lo que si se podria hacer, una vez determinando que bits utiliza cada soft, realizar la suma BCD de cada operación y compararla a un valor establecido (Jumpers o Dip Switch y/o memoria) que vos definas, ya que pienso que quizas armas un circuito y el dia de mañana agregas un nuevo soft y seguiras en la misma. Siempre hablando en BCD, seteamos las conbinaciones de cada uno de los soft que estes corriendo, tomamos en cuenta que hay A3,A2,A1 y A0 posibilidades es decir, 4 relés activados o ninguno y sus combinaciones. Como realizamos esto a partir de 8 bits, muy simple, sumamos el valor BCD del puerto paralelo a un numero decimal (por ejemplo y para no salirnos de la lógica TTL) y lo comparamos con nuestros valores almacenados (seria bueno alguna memoria) y que sea el circuito que identifique el software y active las correspondientes entradas. 
Un ejemplo práctico seria :
El Soft "Cosmo X" (jeje que imaginación!!!) utiliza para posicionar un motor de movimiento vertical el dato D2 y para posicionar un motor de movimiento horizontal el D6 , (D2 -> BCD = 4 / D6 -> =64), datos seteados
BCD = 4 activa relé 1 / BCD = 64 activa relé 3, sumatoria 68 activa relé 1 y 3. Y asi por cada soft.

Espero haber sido claro... saludos.


----------



## Marcelo (Jul 28, 2005)

Saludos MaMu,

Lo que explicas es correcto; es tal cual lo que quiero hacer.

Los algoritmos que usan esos programas solo mandan una señal a la vez es decir, solo Norte, Sur, Este u Oeste; nunca van a mandar SurEste por ejemplo lo cual implicaría 2 señales simultáneas, aunque creo que ésto no complica o simplifica el circuito de ninguna manera.

Tal como lo explicas, el circuito debería permitirme hacer cualquier combinación deseada, pues no se con que se van a venir estos tipos de los softwares en un futuro. Más aun, si el circuito me permitiera utilizar 8 entradas y 8 salidas combinadas o mezcladas a voluntad sería más general y útil todavía.  Y te digo esto porque esos mismos programas utilizan otras salidas del mismo puerto paralelo para controlar motores paso a paso o una interfaz pwm para motores DC con contadores digitales (optical encoders), que tienen la función de  enfocar automáticamente la cámara CCD (otro proceso bastante tediosos en astrofotografía).

Sin embargo, como yo utilizo un circuito controlado por puerto serial que diseñé hace ya algún tiempo para esto del foco en realidad no me hace falta aun.

La idea del BCD me parece muy interesante, pero no entiendo mucho como "setearía" desde el punto de vista manual, las entradas y salidas. Tendría 4 dipswitches de 8 siwtches cada uno para programarlo?

Me parece que este sería un buen proyecto para poder dar cierta "compatibilidad" a todos estos desarrollos de software que si a ver vamos no entiendo porque no se ponen de acuerdo para usar todos las mismas señales en una forma estandarizada. 

Los programas que tengo (3) usan:

N      D0     D1     D0
S      D3     D2     D3
E      D4     D3     D5
O      D5     D4     D7

y poseo un cuarto que permite definirlo desde el software (lo que soluciona todo por cierto).

Saludos y gracias.
Marcelo.


----------



## Andres Cuenca (Jul 28, 2005)

Creo que tu problema se resuelve de una forma mas fácil, si partimos del hecho de que cada programa que utilizas ocupa pines diferentes del puerto, solo debes utilizar compuertas OR para sacar una única señal de control.

Ejemplo

N = D0 OR D1 
S = D2 OR D3 
E = D4 OR D5 
O = D6 OR D7

En este caso la salida del la compuerta OR seria la señal que controle el optoacoplador.

Compuertas OR: CD 407, 7432 (Quad input OR Gate)

Saludos.


----------



## MaMu (Jul 28, 2005)

Si, como bien dice Li-ion, el uso de compuertas es lo más sencillo, ya que ahora conociendo los datos, la comparación máxima es en 3 variables, aunque presenta un inconveniente en D3. (Sur o Este), y lo que no quita que en algun futuro soft, presente inconvenientes con algun otro dato.


----------



## Marcelo (Jul 28, 2005)

Gracias muchachos por las respuestas.

La compuertas lógicas básicas fue lo primero que pensé en utilizar, pero luego de un pequeño análisis me di cuenta que funcionan siempre y cuando no hayan pines comunes entre dos direcciones distintas.
Déjenme tratar de explicarles.

Las direcciones que usan los programas son:

N D0 D1 D0
S D3 D2 D3
E D4 D3 D5
O D5 D4 D7 

Si como dice Li-ion, para el  optoacoplador  que controla ESTE implemento D4 OR D3 OR D5 y para el que controla OESTE hago D4 OR D5 OR D7, vemos que  D4 y D5 son comunes para ambos casos.
Esto quiere decir que cuando un programa mande a activar ESTE, en la interfaz se activará tantyo ESTE y OESTE, lo cual no funciona.

Esa solución sirve si no existe coincidencia de pines entre direcciones distintas.

Saludos y gracias.

Marcelo.


----------



## Andres Cuenca (Jul 28, 2005)

Siendo así el caso, entonces utiliza un multiplexor 2 a 1 controlado por los cuatro pines de control del puerto, configuras los cuatro pines con algún programita sencillo en visual basic. El multiplexor que puedes usar es el 74157 (Quad 2- line-to-1 data selector/multiplexer with non-inverting output) o el 74158 que tiene las salidas invertidas.

El posible inconveniente que puedas tener es que alguno de los programas escriba en el registro de control a la ves que lo hace en el de datos, en ese caso debes usar un latch en el circuito, que conserve la configuración de control.


----------



## Marcelo (Jul 29, 2005)

Saludos 

Li-ion, podrías explicarme un poco más tu idea?
Me parece que la solución de utilizar un programa auxiliar (no tengo problemas con VB y C++) controlando el circuito podría se la ideal.
Los programas que menciono no utilizan los registros de control y tampoco los de estado.
Voy a pensar en algo así a ver.

Gracias.

[/img]


----------



## MaMu (Jul 29, 2005)

Pero si la idea de controlarlo por medio de una aplicación te resulta más cómodo, entonces solo arma un circuito genérico para todos los programas, y por medio de tu aplicación redirecciona los registros de datos para que se utilicen siempre los mismos 4 bits, sea cual fuere el programa que estes corriendo, con lo cual en tan solo pocas lineas de código te ahorrarias la circuiteria.


----------



## lucasprieto (Jul 29, 2005)

Hola chochamus como les va... que interesante proyectillo !!!
Marcelo te cuento como lo haría yo para que sea configurable para todos los incompatibles soft que se les pueda ocurrir, se me vienen 2 formas...

1) La mas sencilla: Si los soft que utilizas te permiten configurar el puerto paralelo a utilizar (La dirección base) LISTO !!! Como sigue... mandas al soft a escribir al puerto al cual NO vas a enchufarle tu hardware, luego con un programita secundario muy sencillo a realizar, lees ese puerto al cual esta escribiendo el soft, lo redireccionas a tu gusto y luego escribes el puerto donde SI esta conectada la interfase que por cierto en este caso sería directa. Es decir el soft auxiliar estaría escaneando todo el tiempo "leyendo por fake" -   "adaptando" - "escribiendo port real"

2) Si no va la 1 y para que sea 100% configurable yo le metería un PIC 16F627 entre el puerto (8 Entradas para el PIC) y tus 4 salidas (4 Salidas para el PIC). Luego usaría el puerto serie que trae el PIC y lo conectaría a un COMM de la PC, aca hay que hacer 2 programitas uno en la PC que le bajaría la config. al PIC y el programita del PIC. Además del circuito que sería sencillo.

Espero que te sirvan de algo las ideas, si no dominas el tema del PIC te doy/damos una mano con el código y el tema de programarlo...

Saludos y aprovecho.... vieron ya extraterrestres o bien al pitufo Enrique por las nubes 
Lucas.


----------



## Marcelo (Jul 29, 2005)

JaJaJa....

Mamu, creo que eso es lo que voy a terminar haciendo, tal cual lo dices y como también lo propone Lucas.

En realidad ni se imaginan la cantidad de cosas que tengo conectadas al telescopio.  En la computadora que uso para controlarlo tengo 3 puertos seriales y 2 paralelos, de los cuales utilizo todos menos un serial.  Tiene tantos cables colgados que parece un paciente en terapia intensiva.

Lucas; Si tengo algo de experiencia con microchips (pic).  De hecho, mi telescopio tiene un "enfocador" que se mueve con un motor DC.  A éste le coloqué un "digital encoder" para leer los pasos cuando gira el motor. Esta señal entra a un pic 16F84A que pasa estos pulsos a la compu mediante el puerto serial.  Dentro de la interfaz que mueve el enfocador tengo un puente doble H en la que las bases de los transistores que lo controlan es comandado por el pic (salidas).  De esta forma, polarizando los transistores puedo mover el motor para adelante y para atrás (desde el programa que escribí).
Luego tengo una fase de conexión al puerto serial realizada con un MAX232.

Ese pic no posee instrucciones o librería para comunicación serial, pero mediante unos truquitos que encontré por la internet logro que se comunique sin errores a 9600 baudios (no más). Se me ocurre que lo podría utilizar en lugar del 16F627 para la idea que expones, lo cual me resultaría algo más barato y además creo que tengo alguno por allí.

Bueno, ya tengo varias ideas gracias a la ayuda de todos ustedes.  Ahora me toca agarrar el protoboard, papel y lápiz y empezar a divertirme un buen rato.

Muchisimas Gracias.
Excelente foro.

Marcelo.


----------



## ivan147007 (Jun 20, 2011)

Hola soy nuevo es esto mi pregunta es si sepodria hacer con Java?


----------

