# generador de codigo binario



## murcianico (Nov 14, 2015)

Estimados amigo me llamo Francisco y me gustaria comentaros una duda a ver si vosotros me podeis orientar.

Se trataria de encontrar un integrado que me genere un codigo binario segun tenga activadas sus entradas, intento recrear su tabla de verdad:

IN1  IN2  IN3  IN4  IN5  IN6  IN7    #      OUT1  OUT2  OUT3  OUT4
 0      0     0     0     0     0     0      #         0       0        0        0
 1      0     0     0     0     0     0      #         0       0        0        1
 1      1     0     0     0     0     0      #         0       0        1        0
 1      1     1     0     0     0     0      #         0       0        1        1
 1      1     1     1     0     0     0      #         0       1        0        0
 1      1     1     1     1     0     0      #         0       1        0        1
 1      1     1     1     1     1     0      #         0       1        1        0
 1      1     1     1     1     1     1      #         0       1        1        1

Esto es un resumen de lo que me gustaria que hiciera realmente lo que necesito son 25 entradas ya se que esto no podra ser en un solo integrado pero si que me gustaria que me indicaseis el que mas entradas tenga y que se adecue al ejemplo anterior.

Muchas gracias


----------



## chclau (Nov 14, 2015)

Veinticinco entradas y cuatro salidas es realmente mucho para hacerlo con logica discreta o memorias. Podrias explicar lo que quieres hacer? Porque poder, se puede, un CPLD puede facilmente hacer lo que dices, por ejemplo, un dispositivo de la familia Cyclone III de Altera. Pero usarlos puede ser un poco complicado, asi que convendria entender que quieres hacer.


----------



## juanma2468 (Nov 14, 2015)

Pues si tienes 25 entradas y 4 salidas, entonces van a haber casos en  los que a determinadas entradas se va a repetir salidas ya que con 4 bits de salida solo se pueden obtener 16 combinaciones diferenctes. Para 25 entradas tendrian que ser 5 bits de salida al menos.


----------



## MrCarlos (Nov 15, 2015)

Hola murcianico

Puedes utilizar el 74LS147 pero es de tan solo 9 BIT’s de entrada y 4 de salida.
Es el más grande que encontré.

También puedes utilizar una memoria donde a las Direcciones, Adderess BUS, serían las entradas que tienes señaladas como Inx y por las salidas, Data BUS, las que nombraste como OUTx.

O puedes desarrollarlo con compuertas lógicas basándote en el esquema que biene en las hojas de datos del 74LS147.
Esas hojas de datos las puedes bajar de este enlace: [/COLOR]http://www.alldatasheet.com/

O Que tal con un PIC ?

saludos
a sus ordenes


----------



## murcianico (Nov 15, 2015)

la tabla de verdad que intente escribir era solo a modo de ejemplo, habra que utilizar las salidas necesarias para poder traducir a binario el numero 25.

Lo que quiero hacer:

Tengo 25 micro interruptores los cuales se abren o se cierran siempre en la misma secuencia ( uno detras de otro siempre) estas entradas digitales quiero meterlas a un arduino pero habia pensado que en vez de ponerle al arduino 25 entradas digitales poner un circuito que me traduzca la posicion de los interruptores a binario y utilizar solo 4 - 5 o 6 entradas.


Entradas 
0000000000000000000000000
0000000000000000000000001
0000000000000000000000011
0000000000000000000000111
0000000000000000000001111
0000000000000000000011111
0000000000000000000111111
0000000000000000001111111
0000000000000000011111111
0000000000000000111111111
0000000000000001111111111
0000000000000011111111111
0000000000000111111111111
0000000000001111111111111
0000000000011111111111111
0000000000111111111111111
0000000001111111111111111
0000000011111111111111111
0000000111111111111111111
0000001111111111111111111
0000011111111111111111111
0000111111111111111111111
0001111111111111111111111
0011111111111111111111111
0111111111111111111111111
1111111111111111111111111


Salidas:

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001

Me gustaria encontrar un integrado que haga una funcion, si los hay no creo que tengan 25 entradas por lo que tendre q poner dos o incluso 3, pero lo fundamental es bajar el numero de entradas del arduino de 25 a 5 

Muchas gracias



muchas gracias Mr Carlos no te habia visto me pongo a ello a ver q tal


----------



## juanma2468 (Nov 15, 2015)

Con el 74LS148 puedes conectar en cascada para ampliar a mayor cantidad de entradas, fijate por aca: http://www.utm.edu/staff/leeb/logic/74ls148.pdf


----------



## Ardogan (Nov 15, 2015)

murcianico dijo:


> la tabla de verdad que intente escribir era solo a modo de ejemplo, habra que utilizar las salidas necesarias para poder traducir a binario el numero 25.
> 
> Lo que quiero hacer:
> 
> ...



Lo primero que se me ocurre es tratar de hacerlo con registros de desplazamiento que tengan carga paralela, y leer los datos usando el puerto spi en forma serie. El puerto SPI requiere 4 líneas (selección de esclavo, lectura, escritura, reloj) pero en este caso ya que es solo lectura se puede reducir a 3. Si no hay un puerto spi hardware disponible en el micro se puede implementar fácilmente por software usando cualquier conjunto de pines disponibles.
Registro serie: 74xx165 o 166.

Algo como está en la imagen adjunta (lo hice rápido, no está prolijo).
La diferencia es que vas a leer entradas sin codificar nada (eso lo hacés en el software del micro), es decir, sería un expansor de entradas digitales.


----------



## Scooter (Nov 15, 2015)

Podrías tratar de simplificar un poco todo eso...
De todos modos memorias de 1MB son fáciles de usar 

1MB son 21 líneas de selección con la memoria y un multiplexor de 4 entradas...
Eso serían memorias de 8MB y un mux


----------



## chclau (Nov 15, 2015)

A mi me gusta la idea de Ardogan, es la mas simple considerando cual es la aplicacion requerida.


----------



## Scooter (Nov 16, 2015)

Lo que necesita quizás es un codificador con prioridad. Con tres integrados es suficiente


----------



## Ardogan (Nov 16, 2015)

Coincido en que lo que propongo no es la solución más ajustada a la aplicación. A la pasada, también se puede ahorrar un integrado más (el último de la cadena) si usa un pin del micro extra.
Sin embargo la solución más ajustada/específica/especializada puede no ser la más conveniente cuando se empiezan a sopesar otros factores.

Comerciales: cual es el integrado más fácil de conseguir, con mayor stock (y por ende más barato). Variedad de encapsulado (smt, tht).

Reutilización del conocimiento: es cierto que se tarda más en hacer la solución porque hay que escribir código (manejar spi, analizar la entrada para ver cual es el 1 de mayor peso, etc), con decodificadores la solución es casi completamente por hardware. 
Pero estoy bastante seguro que no va a ser la primera vez que precise expandir la capacidad de entrada/salida de un micro, sin embargo utilizar un codificador es algo relativamente excepcional hoy en día. La mayor parte del trabajo que realice con registros es probable que la reutilice a futuro, con codificadores quizás no.

Funcionalidad adicional: que pasa si las entradas no se activan de la forma esperada?, si en medio de la cadena de unos aparece un 0 -> switch fallando. Con registros se puede detectar, con codificador no.

Hecha la defensa, no digo que lo que propongo es mejor, esa decisión la tendrá que tomar evaluando las necesidades de la aplicación. Solo que a veces la solución más ajustada en hardware puede no ser la que se termina aplicando. Pero tampoco hay que ir al otro extremo de usar un raspberry pi para manejar leds y un motor. Hay un espectro entre solución especializada y solución genérica (todo me parece un clavo porque tengo un martillo, no clavemos los tornillos), hay que ver que conviene en cada caso.

Bienvenida la variedad de soluciones propuestas, ahora le tocará a murcianico pensar que hacer (a veces el problema es que hay demasiadas soluciones ).


----------



## seaarg (Nov 16, 2015)

Lo primero que pense es usar una eeprom, aunque la solucion con registros de desplazamiento tambien suena bien.

Para ambos casos, solo voy a mencionar: Cuidado con los rebotes. Tener que hacer 25 antirrebotes por hard me parece un desproposito. Yo intentaria hacerlo por soft trabajando con los datos de salida.


----------



## murcianico (Nov 17, 2015)

Estimados amigos :  muchas gracias a todos por tantas y variadas soluciones la de ardogan es muy complicada para mi, no la entiendo bien.

la del 74ls147 me gusta pero la que mas me gusta es la de la eprom se programa y listo.

De todas formas se me a ocurrido una tercera via de solucion y es convertirlo a analogico asi nisiquiera necesitaria micro plc o arduino con un display con entrada analogica me bastaria.

Cada una de las 25 entradas vendra dada por un fototransistor como las señales analogicas se transmiten en 4-20ma con las 25 entradas necesito producir 16 miliamperios.
por lo tanto cada entrada tendra que generarme 0.67 miliamperios.

con un montaje en paralelo de los fototransistores creo que estaria solucionado.


----------



## chclau (Nov 17, 2015)

murcianico dijo:


> Estimados amigos :  muchas gracias a todos por tantas y variadas soluciones la de ardogan es muy complicada para mi, no la entiendo bien.
> 
> la del 74ls147 me gusta pero la que mas me gusta es la de la eprom se programa y listo.
> 
> ...



???

Y si recibes 0,67 mA, como sabes si los produjo la entrada uno, la dos o la dieciocho? (por nombrar algunas)

Y mejor ni me pongo a enumerar las combinaciones posibles si recibes 1.4mA, o 2.2mA, o...


Una solucion asi solo sirve para codificar en forma ponderada, por ej. la entrada uno emite 0.5mA, la 2, 1mA, la 3, 2mA, la 4, 4mA, y la 5, 8mA. Se podria codificar maximo 5 o 6 entradas discretas por entrada analogica, a ojo de buen cubero.


----------



## murcianico (Nov 24, 2015)

Exacto es eso, cada foto transistor cuando se activa me da 0.67 miliamperios asi hasta sumar 20 miliamperios, por lo tanto tendre que utilizar 25 mas una resistencia fija que me da 4 miliamperios.

Con esto consigo una intensidad minima de 4 ml y una maxima de 20ml esta seña la conecto a un diplay con entrada de 4-20 miliamperios lo escalo y ya esta a funcionar


----------

