Matriz led 8x8 controlada con 4 pines.

Ir abajo

Matriz led 8x8 controlada con 4 pines.

Mensaje por arcachofo el Mar 30 Dic 2008 - 3:18

Pues estoy experimentando con matrices de leds; esta primera prueba es con una sola matrix 8x8, de las pequeñitas (unos 2x2cm) con dos registros de desplazamiento 74HC164, uno para filas y otro para columnas, con la idea de controlarlo solo con 4 pines.

Normalmente he visto por ahí que lo hacen con un 74HC164 + 8 pines del pic, pero por probar algo distinto lo hice de esta manera....

El esquema es este: matriz led 8x8
Se me olvidó en el esquema que los "clear" van conectados a +5v si no se van a usar.

Las primeras pruebas daban resultados algo extraños, debido a que los led permanecen encendidos mientras se hace el desplazamiento, así que se veía el "rastro" que iban dejando a su paso... al final lo hice funcionar decentemente, disminuyendo al máximo el tiempo que toma el desplazamiento y ajustando el tiempo que cada columna permanece encendida al máximo (3 ms) sin que haya parpadeo. Todo esto es con un cristal de 20 MHz, a menor velocidad quizás los resultados sean peores.

Todo esto complica la cosa un poco más que usando un puerto completo del pic, pero al final solo ocupa 4 pines en vez de 10, de esta manera lo puedo usar como display para visualizar cosas que me interesan mientras está funcionando el pic; por ejemplo lecturas adc o distancias medidas con IR, nivel de luz, nivel de batería... lo que sea .

Los datos a visualizar los tengo en 8 variables tipo char y las vá representando una en cada columna.

Todavía no tengo claro como integrarlo en un programa, quizás con un timer que cada 3 ms imprima lo que hay en la "memoria de pantalla" a la matriz... no sé...

Otra cosa que me gustaría hacer es buscar la manera de que cada led pueda tener distintas intensidades... alguna idea?

En cuanto haga algo que valga la pena ver pongo un video.
avatar
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por arcachofo el Miér 21 Ene 2009 - 8:21

Pues después de hacer algunas pruebas estoy usando esta sencilla matriz de leds para algunos experimentos de medida de distancias con infrarrojos, simplemente mide la distancia a la derecha y a la izquierda, cada medida se representa en una columna que ocupa la mitad de la matriz, así puedo ver más o menos como se comporta según cambio cosas en el programa,.. si aumenta o disminuye el alcance, la estabilidad de las medidas,... como se vé afectado por la luz ambiente y ese tipo de cosas.

Aquí un video donde se vé más o menos el tema:


la verdad es que con doś 74hc164 se hace dificil manejar la matriz y los resultados no son los mejores... creo que con un 74hc164 y un 74hc595 sería mucho mejor... a ver si hago algunas pruebas...

Hasta otra...
avatar
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por ciccero el Jue 16 Jul 2009 - 0:06

Veo que estas publicaciones ya tienen tiempo... pero bueno voy a comentar algo...jeje.

Para lo del control de intensidad del led, la forma viable que veo, es tener una variable extra que controle el numero de pulsos por segundo que ingresas para cada LED, es decir si la matriz es de 8X8 serian 64 variables extras, si las haces de 4 bits para que no ocupes tanta memoria en RAM serian 32 bytes, y por ende podrias tener solo 16 niveles de intensidad para cada led (claro eso si lo permitiera la velocidad de refresco de tu pantalla).

Mencionas que tienes encendido cada led por espacio de 3mS, entonces el refresco de cada led seria de (3mS)(64) que son 194mSeg, 1/5 de segundo que eso si lo alcanza a ver el ojo humano.......o no se si me puedas dar mas información y te pueda ayudar con algo.

Estoy haciendo pruebas con SDCC y funciona muy bien, alguno detalles pero ya lo estoy superando......jejeje.

atte.
ciccero

ciccero
Participante
Participante

Mensajes : 11
Fecha de inscripción : 10/07/2009

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por Pikitin el Jue 16 Jul 2009 - 13:21

Si, el sistema de las variables está bueno; el problema, como comentas, está en los tiempos; pero el problema de fondo es que uso dos 74HC164, que no tienen "Output Enable", entonces mientras los datos van avanzando por el registro de desplazamiento, se ven los leds encendiendo y apagando hasta que llegan a su lugar... para que este efecto no se note hay que dejarlos encendidos mucho tiempo, sinó los leds apagados también se ven un poco encendidos...
Esto se puede solucionar usando un 74HC164 y un 74HC595 (creo) que sí tiene "Output Enable", entonces se pueden meter todos los datos y al final se encienden todos, así los leds se ven bien y no es necesario dejarlos tanto tiempo encendidos, con esto se puede reducir mucho el tiempo que están encendidos y usar el sistema de variables para conseguir un efecto PWM.

Pero para hacer esto hay que dividir la velocidad de refresco x los niveles de intensidad, osea si queremos una velocidad de refresco de 10 ms habría que comprobar qué leds están encendidos o apagados cada 10/16 ms y como con este sistema se enciende una columna cada vez, eso habría que dividirlo por 8; con lo que al final nos quedan unos 78 uS... demasiado poco. Con una velocidad de refresco de 20 ms ya se vé parpadear un poco, sobre todo a intensidades bajas y aún así tendríamos solo unos 150 uS.

Conclusión: este sistema es muy sencillito, pero las posiblidades son limitadas, en todo caso es mejor usar al menos un 74HC595 o cualquier otro que tenga "Output Enable".

Luego he hecho otras pruebas pero con 64 leds en vez de una matriz, controlados uno a uno con 8 registros de desplazamiento en serie; entonces se meten los 64 bits en serie de una vez y se encienden todos los leds. así multiplicamos x 8 el tiempo disponible. Las pruebas las he hecho con 64 niveles de intensidad y usando una base de tiempo de 500 uS con un reloj de 20 MHz.

Aún así el tiempo está muy justito para hacerlo todo... quizás pruebe tu idea con 16 niveles y solo 32 variables, con esto tengo 2 ms que me dá tiempo para refrescar los leds y hacer otras cosas, porque hace falta mucho tiempo para realizar las operaciones que queramos sobre las 64 (o 32) variables... como haya que hacer alguna división o un par de operaciones matemáticas sobre tantas variables hacen falta milisegundos incluso con reloj de 20 MHz.


Saludos y gracias por las sugerencias.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por ciccero el Jue 16 Jul 2009 - 18:12

Que tal Pikitin.

Me gusta el empeño que le pones a tus proyectos...felicidades!!! Very Happy

Lo que comentas del 74HC595 es cierto, ese integrado es el que resolvería los problemas de encendido indebido de los led's por corrimiento y también te permitiría un refresco 8 veces más rápido, el único inconveniente es que necesitarías una salida más del PIC para controlar el OE del 74HC595, pero soluciona el problema. En fin voy a hacer un pequeño análisis aquí para ver si te sirve de algo con la matriz que ya tienes armada con los 8 registros:

Siempre hay que iniciar con la velocidad de refresco que queramos en este caso queremos que sea justa para la sensibilidad del ojo humano por lo que de 24 hz a 30 hz son suficientes:
por lo tanto:
Tiempo de refresco (TR) = 1/24 = 41.67 mSeg.

si quisieramos tener 4 niveles de intensidad en base a un sistema PWM de refresco lineal necesitariamos:
Tiempo de refresco gris (TRG) = TR/4 = 10.42 mSeg

Ese seria el tiempo de refresco de toda la matriz para poder tener un control con 4 intensidades de LED y que el ojo humano no detectara parpadeo alguno (en teoria claro...jeje).

Ahora bien si pones un TIMER que te interrumpa cada 10 mSeg (margen para la teoria..je) en donde tendrias que hacer lo siguiente:
1.- Habilitar el OE de tus registros de corrimiento (LATCH de la interrupción anterior).
2.- Incrementar un contador de intensidad (tambien verificar si llego al máximo de intensidad e inicializarlo en cero en caso de que haya llegado o pasado).
3.- Comparar el contador de intensidad con las intensidades de cada LED.
4.- Aprovechar este ciclo anterior para hacer el corriento del resultado de cada led en los registros de los 64 led's a la máxima velocidad soportada por 74HC595 (1 uSeg al parecer es sufiente).
5.- Una vez que se hayan comparado y cargado los 64 bits Salir de la interrupción y esperar la siguiente.......listo.


No habia caido en cuenta que no necesitas una variable para saber si esta encendio el LED o no, la misma variable de intensidad te arrojará ese resultado en la comparación... Surprised .

Eso te debe funcionar en el tipo de registro que tienes armado, si armas el anterior entonces el tiempo de refresco será por fila y no por matriz completa por lo que tendras un Tiempo de refresco de fila gris (TRFG)= TRG/8= 1.3 mSeg (que con un Timer de 1 mSeg resuelves del problema).

Claro este ejercicio es solo para 4 niveles de gris, si deseas más este algoritmo te debe de servir tambien....je

Espero que te sea de ayuda y cualquier duda para eso estamos para apoyarnos.

atte.
ciccero

ciccero
Participante
Participante

Mensajes : 11
Fecha de inscripción : 10/07/2009

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por Pikitin el Sáb 18 Jul 2009 - 0:59

Gracias por las explicaciones, voy a retomar el tema de los 64 leds, que lo tenía un poco abandonado... bueno, la verdad es que llegué a un punto que se ponía la cosa dificil y lo dí por casi imposible, le voy a echar un ojo a lo que tenía hecho y te comento.

El tema del TR en teoría con 30 Hz es suficiente, pero luego incluso a 50 Hz se nota un poco el parpadeo, solo pasa a intensidades muy bajas... osea cuando el tiempo que está apagado es muy largo. Para que no se vea nada nada de parpadeo hacen falta al menos 70 u 80 Hz, entonces para que los cálculos fueran más fáciles yo usé 100 Hz, pero quizás haya que ajustarlo más porque no sobra el tiempo... más bién falta.

Ahora que recuerdo... al final estaba usando 150 uS de TRG y 64 niveles de intensidad: 150x64=9600= 9.6 mS de TR , osea algo más de 100 Hz.

Tenía que meterlo todo en 150 uS... al final hice que funcionara más o menos , pero solamente eso.... no me quedaba más tiempo para por ejemplo hacer algunos efectos de luz en base a cálculos matemáticos.

Creo que con 16 niveles / 32 variables y ajustando al máximo el TR quizás consiga algún milisegundo libre para poder hacer algo más que encender los leds... Wink

Quizás abro otro tema, porque esto en realidad no es una matriz, sino 64 LEDs individuales.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por Pikitin el Miér 22 Jul 2009 - 0:36

Bueno... me he dado cuenta de un fallo que estaba cometiendo en la matriz 8x8 con los 74HC164, y es que mezclaba la parte de hacer cálculos o decidir que led estaba encendido o apagado con la parte de transferir los datos al registro de desplazamiento, entonces todo el proceso se hacía muy largo y se notaba mucho el desplazamiento de los leds.

Pero he hecho algunas pruebas con los 64 leds, he puesto 8 74HC164 en paralelo, conectado cada uno a una salida del PIC, primero determino que leds se encienden o apagan y eso lo paso a 8 variables; luego la transmisión de los bits al 74HC164 es la variable directa al puerto, quedándome un bucle con 10 instrucciones asm para mandar cada grupo de 8 bits.

En GcBasic me queda esto:
Código:

Sub reg_despla
    actual = salida(0)      'esto es solo para que FSR apunte al primer registro
    for actual = 0 to 7
        PORTB = INDF
        set clock on
        FSR += 1
        set clock off
    Next
End Sub

No dejo una pausa de 1 uS al clock del 74HC174, con una pausa de una instrucción es suficiente y uso una de las instrucciones necesarias en el bucle.

Total: a 20 MHz son unos 16 uS para mandar los 64 bits.
Ajustando el refresco al máximo tengo 64 niveles con un TRG de 300 us, osea unos 19 mS; aunque todavía se nota un poquito de parpadeo.

Entonces está 16 us con los leds rotando frente a 300 uS encendido/apagado, con lo que se nota muy poco la rotación.

Y en realidad todavía se podría hacer más rápido, simplemente algo así:

Código:

Sub reg_despla
PORTB = salida0
set clock on
NOP
set clock off

PORTB = salida1
set clock on
NOP
set clock off

PORTB = salida2
set clock on
NOP
set clock off

......
...etc
End Sub

Y se queda todo en unos 8 uS a 20 MHz.

El tema está en que la transmisión al 74HC164 sea muy rápida...
Y todo por no usar 74HC595 .. Laughing ... mira que me gusta complicarme la vida.

Lo que si tengo comprobado es que con TR mayor de 19 ms ya se nota bastante el parpadeo, sobre todo en las intensidades más bajas, incluso tendría que bajarlo un poco más.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por ciccero el Jue 23 Jul 2009 - 17:54

Pense que no ibas a tener tiempo para esta matriz de leds, veo que estas muy ocupado con el IDE en GEDIT, a ver que dia tengo tiempo de inmiscuirme en su trabajo y tratar de aportar algo...(aunque de python la verdad no se nada...je).

Con respecto lo de la matriz de led veo que ya lo tienes dominado, lo que si tendrías que cambiar un 74HC164 por un 74HC595 y tener uno y uno (con el 164 haces el barrido de los renglones y con el 595 pones los datos en cada renglon), eso resolvería el problema de parpadeo ya que actualmente no cuentas con "Output Latch" y el corrimiento de información hace que se vean parpadeantes los led's que tienen baja intensidad o deberían estar apagados.

No dejo una pausa de 1 uS al clock del 74HC174, con una pausa de una
instrucción es suficiente y uso una de las instrucciones necesarias en
el bucle.

En realidad aqui no es necesario 1 uS solo lo puse suponiendo que usabas un oscilador de 4Mhz.

Para eficientar un poco la rutina de interrupción te recomendaria lo siguiente:

1.- Ingresar el valor a TMR0 la constante para desbordamiento requerido y limpiar bandera de interrupción. (siempre se debe realizar al inicio de la rutina de interrupción para que las operaciones realizadas despues se contabilizen en el TMR0 y tengas tiempos realmente periódicos de interrupción).
2.- Habilitar la salida del 74HC595 (esto tambien con el fin de que la duración de encendido o apagado siempre sea precisa y periódica).
3.- Realizar los cálculos de intensidad del siguiente renglon (dependiendo como se diseñe puede llegara ser con tiempos variables de ejecución, es decir puede tomar 30 o 50 uSeg depende la información si es cero o tiene un valor de intensidad, es por eso que se debe realizar despues de haber dado el paso 2, para que la salida calculada no salga atrazada o adelantada esos 20 uS de diferencia).
4.- salir de la rutina de interrupción.


En el caso de sistemas visuales de LED's el algoritmo anterior no es tan crítico, el sistema puede funcionar sin ningun problema, pero en casos de sistemas de control y medición de variables ADC, es imprescindible que se haga este tipo de análisis de tiempos para que nuestro sistema no trabaje de más queriendo controlar algo que siempre esta oscilando por problemas de programación.

Bueno espero que les sirva de algo esto.

Saludos

atte.
ciccero

ciccero
Participante
Participante

Mensajes : 11
Fecha de inscripción : 10/07/2009

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por Pikitin el Jue 23 Jul 2009 - 21:55

Gracias ciccero.

Pues si... veo que en el tema de los tiempos está la cuestión, sobre todo en que no se sobrepase el tiempo entre una actualización y la siguiente.

Entonces si por ejemplo quisiera meter más rutinas que creen efectos visuales o lo que sea va a estar dificil la cosa.

Que tal veis la idea de usar un PIC solo para controlar los leds?, que solo se dedique a representar los valores que tenga almacenados; se podría programar para aprovechar al máximo la capacida del PIC y que funcionara bien incluso con 100 niveles de luz; y luego que eso se pueda usar en otros circuitos y solo mandarle los datos de intensidad de cada led.

El plugin de Gedit me tenía un poco liado, porque llegué aun punto que me quedé bloqueado, ahora estoy descansando de eso y recuperando algunas cosillas que tenía aparcadas, como esto de los leds.

A ver si comento el tema del plugin y me echais una manita... ya estoy soñando con código python cada noche... creo que hasta estoy empezando a pensar en python... Neutral

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por ciccero el Vie 24 Jul 2009 - 19:08

Utilizar el PIC como controlador del display es muy buena idea, si quieres hacer algo mayor (una pantalla gigante de led's por ejemplo), estaría genial un proyecto asi......me apunto.

Para el caso de 8x8 led creo que sería mejor reducir el numero de intensidades a 7 o 15 y así aprovechar el pic para que pueda realizar otras cosas, pero la última palabra siempre la tiene el que esta batallando con los fierros.....jejeje. Asi cualquier cosa que quieras hacer o si crees que te puedo apoyar en algo cuenta conmigo.

A ver si este fin de semana publico unos avances de calentamiento en electronica...jeje.

atte.
ciccero

ciccero
Participante
Participante

Mensajes : 11
Fecha de inscripción : 10/07/2009

Volver arriba Ir abajo

Re: Matriz led 8x8 controlada con 4 pines.

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.