Display Electronico con diodos Led

Iniciado por {_The_Alwar_}, 30 Octubre 2006, 17:19 PM

0 Miembros y 2 Visitantes están viendo este tema.

{_The_Alwar_}

Hola
llevo un tiempo con ganas de hacer una matriz de leds para poder poner mensajes pero nunca he sabido como, y ayer buscando encontre en esta web
uno que venia hecho, pero no entiendo muy bien el funcionamiento
y queria saber como funciona, porque la matriz de leds sale asi:
a b c d
1-|-|-|-|-
2-|-|-|-|-
3-|-|-|-|-
4-|-|-|-|-

y yo me pregunt si quiero dibujar un L tendria que encender los siguientes leds: 1a,2a,3a y 4a y luego 4b,4c y 4d pero si enciendo todas a la vez se encenderian todas, pero para que no se encendiesen todas tendria que tener cada columna 4 cables y si la matriz fuera mas grande no tendria donde conectarlos, entonces
¿como se haria una display de estos?
¿alguien sabe como funcionan?

Gracias

Syphroot

#1
Es algo complejo el tema, pero si de verdad te interesa puedes aprender mucho. Forzosamente hay que programar algun dispositivo, ya sea un pic, micro, etc. Busca informacion sobre: "Multiplexaje por division de tiempo". En pocas palabras de lo que trata es que vas a dedicar una fraccion de tiempo muy corto a encender una columna de la matriz y pasarle que leds se van a encender en ese instante, pasarte a la siguiente y asi sucecivamente. Todo esto teniendo solo una columna activa para cada fraccion... de ahi el nombre. y lo que se hace es un barrido pasando los codigos para cada columna muy rapido para que el ojo humano vea una imagen. busca sobre ese tema y encontraras multiples aplicaciones sobre dicha tecnica.

Yo he hecho una matriz de 7 filas X 50 columnas, tengo un registro de 8 bits para las filas 74LS374 (sobra un bit que se puede usar estrategicamente para conectar otro bloque) y para las columnas tengo registros de corrimiento de 8 bits 74LS264 si no mal recuerdo, entrada serial salida paralelo, asi con 7 de estos conectados en serie puedo conectar hasta 56 columnas. Lo que hago en el programa de un PIC es mandar limpiar todos los registros de corrimiento, hecho esto enviar el codigo para la primera columna y mandar el bit que active la columna y asi sucecivamente. La verdad, es algo complejo y tedioso, pero aprendes mucho. Si te interesa mucho puedes ponerte en contacto conmigo via messenger  <salacke00@hotmail.com> y hablamos apliamente del tema y despues haces algun reporte, diagramas, codigo fuente y lo publicamos para que todos disfruten de ello.

Pongo un video en funcionamientode esto:

http://k.1asphost.com/NSGSystems/etc/matrixsc.wmv+

Cuando lo descarguen solo quitenle el + de la extension pues el servicio de host no me permite los wmv.

Aqui solo se ve un modulo de 7 X 5 desplegando el abecedario, solo que llega hasta la letra T porque la memoria del pic que uso se termino. esta es una version vieja de la ultima que tengo desarrollada, con ella, mediante una macro puedes poner:



;Algo asi es el prototipo:

Show "Mensaje", Tamaño mensaje, Velocidad de barrido

;Y para poner algo es asi:

Show "Syphroot", 8, .30



La velocidad no es exacta, y esta macro de momento solo funciona para un modulo, pero facilmente adaptable para los modulos que tengo, que son 10. Lo que hace es tomar las letras que le pasas y convertirlas a algo que se me ocurrio nombrar CBytes (Column Bytes) alojadas en dos tablas de 1 pagina cada una (255 bytes), en una se encuentra la parte baja del ASCII y en la otra la parte alta. Identifica a que tabla pertenece el caracter y extrae de la tabla hacia un buffer temporal que será barrido despues en la posicion actual del puntero de las columnas, el buffer consta de 5 bytes pues cada bloque de los que uso tiene 5 columnas (esto es para simplificar las cosas, pues hacer que las letras queden desfasadas de los bloques es algo complejo y requiere de mucha programacion y memoria en el dispositivo). De ahi se llaman a subrutinas que se encargan de hacer el barrido y hacer los tiempos de espera, mover el puntero de columna, etc,etc...es muy tedioso, te repito, pero muy gratificante verlo funcionar.

Con la nueva version de esta macro creo que se pueden desplegar hasta 32 carácteres aprox. Y lo mejor es que todo se puede optimizar, pero requiere de mas trabajo e ingenio, el pic que uso es el 16F627A de 2K de memoria, en 1K estan las tablas y en el otro K lo que se alcance a poner de mensajes, pues las macros consumen mucha memoria pero simplifican las cosas.


saludos

lu8emw

http://www.josepino.com/pic_projects/indexsp.pl?matrix_display.jps

un claro ejemplo de un dispositivo... en este caso la cantidad de "datos mostrados" no esta reducida a la cantidad de E/S del micro, sino de su memoria. Saludos

{_The_Alwar_}

Bueno, ahora ya entiendo como funcionan los displays, pero cuando quieres mostrar por ejemplo una e, tienes que encender varias columnas, entonces en la tabla esa que dices, lo que guardas es en binario la informacion del caracter no? osea lo que hace una tabla es la equivalencia del ascii a que luces tiene que encender no? vas a llevar razon en que es complicado jejej pero weno lo intentare y podre aqui lo que valla consiguiendo.
Saludos!

Syphroot

Así es, se tiene que hacer para la matriz que tengo de 7 x 5, 5 códigos para cada caracter, por ejemplo aquí te pongo un poco de las tablas que hice:

Chr30 dt 0x03E, 0x051, 0x049, 0x045, 0x03E ; '0'
Chr31 dt 0x000, 0x042, 0x07F, 0x040, 0x000 ; '1'
Chr32 dt 0x042, 0x061, 0x051, 0x049, 0x046 ; '2'
Chr33 dt 0x021, 0x041, 0x045, 0x04B, 0x031 ; '3'
Chr34 dt 0x018, 0x014, 0x012, 0x07F, 0x010 ; '4'
Chr35 dt 0x027, 0x045, 0x045, 0x045, 0x039 ; '5'
Chr36 dt 0x03E, 0x049, 0x049, 0x049, 0x032 ; '6'
Chr37 dt 0x001, 0x071, 0x009, 0x005, 0x003 ; '7'
Chr38 dt 0x036, 0x049, 0x049, 0x049, 0x036 ; '8'
Chr39 dt 0x006, 0x049, 0x049, 0x029, 0x01E ; '9'
Chr3A dt 0x000, 0x036, 0x036, 0x000, 0x000 ; ':'
Chr3B dt 0x000, 0x056, 0x036, 0x000, 0x000 ; ';'
Chr3C dt 0x008, 0x014, 0x022, 0x041, 0x000 ; '<'
Chr3D dt 0x014, 0x014, 0x014, 0x014, 0x014 ; '='
Chr3E dt 0x000, 0x041, 0x022, 0x014, 0x008 ; '>'
Chr3F dt 0x002, 0x001, 0x051, 0x009, 0x006 ; '?'
Chr40 dt 0x03E, 0x041, 0x05D, 0x055, 0x01E ; '@'
Chr41 dt 0x07E, 0x011, 0x011, 0x011, 0x07E ; 'A'
Chr42 dt 0x07F, 0x049, 0x049, 0x049, 0x036 ; 'B'


Le puse nombres "ChrXX" donde XX es el código hexadecimal del ASCII de cada  caracter (el equivalente es el que está después de los comentarios de cada definición de tabla, recuerda que el código es para un pic de microchip)

OOOOO
OOOOO
OOOOO
OOOOO
OOOOO
OOOOO
OOOOO


Arriba, imagina que es una matriz de leds, y para obtener el código de una "e" se hace lo siguiente:


  12345
1 OOOOO
2 OOOOO
3 O+++O
4 +OOO+
5 +++++
6 +OOOO
7 O+++O


Los leds encendidos son los marcados con el signo de "+" y estos son los que nos interesan. Ahora sacamos el código de cada columna en binario; pero esto va a depender si la matriz es de tipo anodo o catodo. Para este ejemplo lo haremos para catodo. Empezando por la primer columna y desde la parte superior tenemos (0 para apagado y 1 encendido) :

8 765 4321  <- Posicion de los bits

0 011 1000 (espaciado en nibbles)
^
Bit 8 puede ser de cualquier valor (0 o 1)

Pero como solo tenemos 7 filas, y para acompletar un byte nos falta un bit, el cual puede ser a tu gusto, pero yo elegi ponerlo en 0. Así este número en hexadecimal nos queda: 38h.

Las demás columnas quedan:

Columna 2: 01010100, 54h
Columna 3: 01010100, 54h
Columna 4: 01010100, 54h
Columna 5: 00011000, 18h

estudia un poco estos códigos para que le entiendas mejor y observa el pequeño diagrama de la matriz. Y así le haces para cada caracter que quieras codificar.

Y si, es como un ASCII pero no estandar. A lo que me referia con eso es que el código de la macro que escribí lo que hace es recibir un código del ASCII estandar  y colocar en un buffer los 5 códigos necesarios para dibujar el caracter. Osea que si le paso un 65h que equivale a una "e", de cierta forma decodifica a los códigos de columna. Y la aplicación que se me ocurre de esa decodificación es que ese sistema se puede conectar a una PC por puerto serial por ejemplo y así nadamas enviar los caracteres en ASCII al PIC y este se encargue de decodificar y barrerlos en la pantalla de matriz de leds.

Saludos.








{_The_Alwar_}

Hola! de nuevo, gracias Syphroot por toda la info tan bien explicada.
He estado viendo el esquema de la web Josepino.com y haber si me aclaro, yo es que se poquito de electronica y no se para que vale cada pic, entonces querria aclarar, el PIC 16F627A es el que hay que programar no? y es el que dice que fila de leds se enciende no?, y los otros o el otro 74LS374 lo que hace es cambiar de columna no? osea este ultimo hace de multiplexor? y lo que haces es enviarle una señal desde el pic 16F627A al multiplexor para que valla cambiando de columna no? Si me puedes explicar que pics utilizas y como te lo agradezco, mientras voy a mirar datasheets para ver como funcionan estos chips. Saludos!

lu8emw

el microcontrolador es el 16f628. Y si, hay que programarlo.

{_The_Alwar_}

y el 74LS374 o el 74CH164 eso como funcionan? porque he encontrado algunos datasheet pero no entiendo los esquemas
74LS374
74HC164

Syphroot

#8
Los PICS son microcontroladores, como microprocesadores para aplicaciones no muy grandes, aunque se han desarrollado algunos con capacidades impresionantes!!!. A este chip le cargas un archivo binario ".HEX" generalmente que se obtiene a partir de un codigo fuente normalmente escrito en ASM para pics. Para ello usas un programador de pics (hay muchos por la red tanto circuitos como para que los compres)...

El 74LS374 es un registro, NO es un multiplexor. Este registro es como una pequeña memoria de 8 bits, en la que por un lado en los pines DX, donde X es un numero del 0 al 7, se ponen los datos que quieres que se almacenen y mediante un pulso de reloj (cambiar de un estado logico a otro... investiga un poco de esto es algo sencillo) se almacenen dentro del chip, para asi mediante un pin que habilita el flujo de salida (normalmente nombrado CS, OC Chip Select y Output Control respectivamente) en los pines normalmente llamados QX, igual X del 0 al 7... esto es porque este registro es de tres estados: Entrada, Salida y Alta impedancia (Como si estuviera desconectado). Este ultimo estado es para que puedas deshabilitar el chip y desconectarlo practicamente para que las salidas no hagan corto circuito en un BUS de datos.

En pocas palabras, a este registro le pones un dato  de 8 bits en sus entradas, envias un pulso de reloj a su pin CLK y almacena el dato, Despues para cuando nececites el dato en las salidas simplemente pones en nivel bajo (0 logico) el pin OC o CS como lo nombren en el datasheet... y el dato saldrá por los pines Q.

Este registro es un conjunto de Flip Flops tipo D conectados en paralelo.

El otro tambien es un registro el 74LS264 o 74HC264 (es lo mismo pero se supone son mas veloces los chips que tienen HC), pero es un registro de corrimiento, igualmente son Flip Flops tipo D si no mal recuerdo, pero conectados en serie, Así mediante tres pines (pueden ser dos) introduces los datos de forma serial y las salidas son en paralelo (asi tienes el byte de datos en los pines correspondientes). Como puedes ver este chip se puede seguir conectando en serie con otros y asi tener muchos bits como salidas controlados de forma serial con dos pines (conectando la Entrada1 y la Entrada Dos juntas y aqui poner el dato que quieres introducir al registro y con el pin CLK meterlo...funcionan de manera similar ambos registros)...

En cuanto al tipo de PIC que se puede usar puede ser cualquiera, en el diagrama de Josepino usan el 16F627A que es lo mismo a un 16F628 pero este ultimo tiene unas funciones mas y un poco mas de memoria pero funcionan de manera similar.

Usa el puerto de 8 bits para controlar el registro 74LS374 y con el otro puerto manejar las señales de Reloj de ambos registros, las habilitaciones y el dato que entra en Serie para las columnas de la matriz (En mi matriz es similar el conexionado excepto que tengo 7 Filas X 5 Columnas por cada modulo, el de Josepino creo los pone acostados 5 Filas por 7 columnas)... Digo que puedes usar cualquier pic pues puedes conectar otro registro de corrimiento entre el pic y el 74LS374 y asi introducir sus datos de forma serial para Filas y Columnas, asi solo usas Cuatro pines y otros dos para los Chip Select... con lo cual puedes usar un pic de 8 patillas como un 12F675 o un 12F629 que a final de cuentas entre un 16F627 y un 12F625/12F629 tienen la misma memoria que es lo mas importante para esto pues con ella puedes desplegar mas informacion en la pantalla...En pocas palabras, aqui dependes de la memoria del dispositivo y de la eficiencia de tus subrutinas para controlar el barrido y efectos que pudiera hacer.... Despues pongo mas info... mientras investiga algo de esto para que te enteres bien...y sigue preguntando por aca.

saludos

{_The_Alwar_}

Bueno, mas enlaces que voy pillando que pueden ser de gran ayuda para los lectores:
Flip-Flop tipo D

Cita de: lu8emw en 31 Octubre 2006, 05:41 AM
un claro ejemplo de un dispositivo... en este caso la cantidad de "datos mostrados" no esta reducida a la cantidad de E/S del micro, sino de su memoria. Saludos
Ahora entiendo esto :D
Y se me habia ocurrido una cosa. No se si tu Syphroot tendras conectado el display al pc, pero se me acaba de ocurrir conectar el puerto paralelo (que tiene 8 salidas) a los registros de desplazamiento y suprimir el pic, y en el ordenador (que tengo mas potencia y puedo hacer mejores programas) pasarle lo que quiero mostrar. Esto no se si seria posible, pero le veo varias ventajas, como que puedo dibujar en la pantalla lo que quisiera, hacer mejores rutinas de barrido y cambiar el mensaje mas facilmente, ademas me estoy dando cuenta que para hacer el efecto marquesina es muy complicado en el pic (por no decir imposible) pero en el ordenador se podria hacer, solo e de actualizar mucho el texto (haber si me explico, primero envio que salga "A", luego "AL", luego "ALW" y asi se iria desplazando el texto no?

Weno y no si se ya la puse, pero e visto este tema de un foro, es una simulacion de proteus (no se q es) pero esta el codigo fuente del programa que hace el barrido:
http://miarroba.com/foros/ver.php?foroid=58527&temaid=4510808

Saludos!