Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/01/2009 #1

Avatar de cevollin

Matriz de leds 7x80 animada
que tal camaradas construi una matriz de leds de 7 filas por 80 columnas con un pic16f84a y 5 registro de desplasamiento (74hc164) y una memoria eeprom (24c256) el lenguaje de programacion lo realice en el basic del pic simulador ide la matriz me funciona bien es decir el pic lee el texto de la memoria y luego lo volca sobre el registro de desplasamiento tambien consegui animar el cartel de derecha a izquierda es decir de la columna 80 hasta la columna 1 columna por columna pero tengo un problema la animacion acava en la columna 1 la pregunta del millon de dolares es como hago para que el texto se vea como si siguiera desplasandose es decir que las letras se vieran como si ahora entraran por el lado izquierdo del cartel
31/01/2009 #2

Avatar de zgouki

Revisa la documentación del PSI, hay una funcíon llamada ShiftRight que usa 2 argumentos, el priemero es un byte (creo q tambien puede ser un word, pero revisalo), el cual estaria representado la fila de leds, y el 2do es el numero de lugares q deseas correr los bits del byte hacia la derecha....
Supongamos q aux es un byte q representa la fila del texto q va a aparecer desde la derecha, y que text es el byte q efectivamente se va a pasar al registro de desplazamiento. Este byte al principio tiene q ser todos 0 (ya q la pantalla al principiono mostrara nada e iran apareciendo los caracteres por la derecha:

aux = %10110011 'El texto q aparecera por la derecha e ira corriendose hacia la izquierda
text = %00000000 'El texto q esta siendo mostrando en la matriz

text = ShiftRight(text, 1) 'Lo que hace aca la funcion es mover todo el arreglo de bits (byte) a la derecha 1 solo bit
text.7 = aux.0 'Aca reemplazamos el bit del final (q es basura) por el 1ero del byte q queremos mostrar
aux = ShiftRight(aux, 1 'Volvemos a hacer lo mismo con el byte que queremos q se vaya moviendo a la izquierda

Esto lo repetimos las veces q queramos. Trata de probar vos algun otro algoritmo.
Saludos
01/02/2009 #3

Avatar de cevollin

si eso si lo entiendo perfectamente pero mas bien yo use otro tipo de algoritmo use el mismo algoritmo que utilizan en la pagina de ucontrol primero lo que hise es meter el texto en el registro de desplasamiento antes de activar la fila despues de esto meti 80 ceros para que el texto se fuera desplasando fuera de la pantalla y luego activo la fila de este modo primero no se veria nada en la pantalla pero despues ago lo mismo pero en vez de meter 80 ceros meto 79 y asi sucecivamente se ve como si se fuera desplasando el texto a la derecha
01/02/2009 #4

Avatar de cevollin

ahora mi pregunta es esta el texto se esta desplasando pero ahora llego a la columna 1 osea el texto esta en la columna 1 ahora como le ago para que el texto se viera como si fuera desapareciendo columna por columna por el lado izquierdo como en la imagen que voy a poner a continuacion fijate en el lado izquierdeo
Imágenes Adjuntas
Tipo de Archivo: gif el_moe_130.gif (13,5 KB (Kilobytes), 1340 visitas)
02/02/2009 #5

Avatar de zgouki

Lee bien lo que te escribí en el anterior post....la forma en que tu vuelcas en la pantalla de leds lo que esta en tu variable (sea word o byte) esta perfecto y no tiene nada que ver con como realizar la pasada de derecha a izquierda.
Utiliza la función que te describí, o sino de última, la otra q hace todo al reves: ShiftLeft
Si no te sale, trata de imaginarte como hacerlo, ten en cuenta que la parte mas divertida de hacer un programa es justamente, desarrollar el algoritmo mas eficiente y efectivo...
Saludos.

EDIT: Dsp de leer de nuevo tu pregunta, quiero aclararte una cosa: lo que tu haces para que el texto vaya apareciendo por la derecha es poner 1ero todos los ceros necesarios para borrar la matriz. Entonces lo que debes hacer para que vaya saliendo de la pantalla por la izquierda es tambien agregarle los mismos ceros pero al final. Supongamos que tu matriz es de 8 filas (lo hago pequeña porq es mas facil y rapido de explicar, pero puede tener cualquier tamaño) y deseas que una fila del texto pasante sea la siguiente: 1111. Entonces debes utilizar estos bytes (volcandolos en la matriz en orden): %00000000 , %00111100 y %00000000
Espero haberte ayudado.
02/02/2009 #6

Avatar de cevollin

pero no puedo agregarle los ceros antes de que el texto sea metido en el registro de desplasamiento ya que al meter los 40 ceros primero y despues meter el texto los 40 ceros van a salir desplasados afuera del registro de desplasamiento y de este modo no podria ver el texto desplasado si no el texto fisico sin moverse

otra opcion es hacer la propuesta que tu dices voy a intentar hacerlo
04/02/2009 #7

Avatar de luis_e

Podes hacer lo siguiente:

En un ciclo for pones un contador a 0 y que llegue como maximo a 80, y dentro de este for pones otro, con un contador que enpieze en 0 y que llegue como maximo a 80 - el primer contador, dentro de este for escribis cero en las columnas, despues de esto pones otro for que arranque desde donde dejo el for anterior y que llegue como maximo a 80, y en este escribis los valores que tenes en la matriz de texto.

si fuera en lenguaje c, seria mas o menos

for ( Cont = 0; Cont < 80; Cont++ ) {
for ( Cont2 = 0; Cont2 < ( 80 - Cont ); Cont2 ++ ) {
// y escribo ceros en las columnas de leds
}
for ( ;Cont2 < 80; Cont2++ ) {
// y escribo los valores de la matriz
}
}

de esta forma se va a ir desplazando el texto hacia la izquierda, pero se va a desplazar una columna por fotograma( osea una vuelta completa), lo que es muy rapido (verias casi todos los leds prendidos), para solucionar esto, tenes que agregar depues del primer for, otro mas, para que se repita la misma secuencia una determinada cantidad de veces y se pueda ver el movimiento. quedaria mas o menos asi:


for ( Cont = 0; Cont < 80; Cont++ ) {
for ( i = 0; i < 50; i ++) { // cambiando este valor vas a regular la velocidad de desplazamiento
for ( Cont2 = 0; Cont2 < ( 80 - Cont ); Cont2 ++ ) {
// y escribo ceros en las columnas de leds
}
for ( ;Cont2 < 80; Cont2++ ) {
// y escribo los valores de la matriz
}
}
}

No se como esta hecho tu programa, si trabaja con interrupciones o no. De la forma en que hago mis programas esta es la mejor solucion.
Si subes tu codigo talvez lo pueda estudiar un poco, y darte una mejor solucion.
Y si podes tambien el esquema, para estar ver como son las conexiónes, ya que no estoy muy seguro de como trabaja tu circuito.
04/02/2009 #8

Avatar de cevollin

Aqui dejo mi codigo para que lo chequen
ha caray! mm ps la verdad soy un poco principiante en esto de la programacion de pics y como soy principiante no se nada de programacion en C he de corregir que mi matriz de leds no es de 7x80 me equivoque al postera el titulo mi matriz es de 7x40 mmmm y ya logre desplasar el texto de derecha a izquierda columna por columna de la columna numero 40 hasta la columna numero 1 pero aqui ya no se como hacerle para que las letras entren por el lado izquierdo

ahora he de aclarar me han dicho en foros que ponga caracteres en blanco al principio o al final de el texto que voy a mostrar de esta manera los caracteres limpiarian la pantalla y desplasarian el texto hacia la izquierda pero esto no se puede ya que si meto los caracteres en blanco y luego meto los 40 datos a mostrar los cuarenta datos votarian fuera del registro de desplasamiento los caracteres en blanco

posdata aqui dejo mi proyecto hecho en el basic del pic simulador ide para que juntos lo analisemos y podamos llegar a una conclusion
05/02/2009 #9

Avatar de luis_e

Podrias subir un esquema, porque aun no me termino de imaginar las conexiónes y no puedo pensar una solucion con presicion.

Yo utilize pic basic mucho tiempo, asi que conozco este lenguaje bastante, por lo que voy a poder ayudarte con la programacion.

Ahora me voy a poner a estudiar un poco tu programa.
05/02/2009 #10

Avatar de luis_e

Otra cosa, los datos que almacenas en la eeprom son caracteres? O son como un mapa de bits de lo que queres mostrar?
05/02/2009 #11

Avatar de cevollin

bueno mas bien es un mapa de bits de lo que quiero mostrar aqui te dejo el diagrama con algunas especificaciones para que asi mas le entiendas al codigo el diagrama esta hecho en proteus ya que alli es donde lo tengo simulado y ps alli bienen algunas especificacifines de como es que esta armado como es que el pic 16f84a lee los datos de la memoria i2c y los vuelca en el registro
Imágenes Adjuntas
Tipo de Archivo: jpg matriz_de_leds_7x40_by_elmoe_cevollin_294.jpg (125,2 KB (Kilobytes), 1207 visitas)
05/02/2009 #12

Avatar de luis_e

Podrias subir el archivo del proteus, asi evito tener que hacerlo. Ya que tu lo tienes hecho...

Ahora ya tengo claro como trabaja, me imaginaba que lo hacia de esa forma.
05/02/2009 #13

Avatar de cevollin

ok ahorita mismo subo los archivos correspondientes al proteus
Archivos Adjuntos
Tipo de Archivo: rar mi_apodo_desplasado_en_matrz_e_i2c_correjido_665.rar (183,0 KB (Kilobytes), 1815 visitas)
05/02/2009 #14

Avatar de luis_e

He terminado de entender completamente el funcionamiento de tu diseño, y tengo una idea para el programa. En vez de activar de a una fila y cargar los datos en las columnas, podes cargar los datos en las filas y activas de a una columna. De esta forma va a ser mas facil poner los datos en los leds. Aunque va a demandar una velocidad mayor de actualizacion, ya que se tendrian 40 barras de 7 leds contra 7 barras de 40 leds. Pero como el micro esta dedicado solamente a la matriz de leds no va a ser problema. Deve correr a la maxima velocidad, 20MHz.

Tambien tendrias que modificar los datos de la eeprom, almacenando los caracteres en bytes consecutivos, no en saltos de a 8 como haces ahora. Despues voy a hacer un grafiquito para que lo entiendas mejor.

Modificando eso, el programa seria muy simple:

Para empezar cargas un 1 en el registro de desplazamiento, la idea es que este activo solamente un pin de todo el registro (para activar una sola columna).
Luego lees un byte en la eeprom, lo negas(porque el led se activaria con un 0) y lo pones en el puerto b.
Haces una pausa de unos 350us. (despues de esta pausa ya se mostro la primer columna)
Despues lo unico que tenes que hacer es darle pulsos de reloj al registro (con el pin de data a 0), leer el dato en la eeprom, negarlo, ponerlo en el puerto b, esperar los 350us y volver a repetir hasta que hayas mostrado las 40 columnas.

Con esto conseguirias mostrar el texto, pero no se moveria. Ya voy a explicar como hacer para que se desplaze.

Lo que vas a conseguir con estos cambios es una forma muy sencilla de mostrar los datos. Si queres probrar a hacer alguna de estas modificaciones, hacelas en una copia de tus archivos originales, por si despues queres volver a tu diseño y tu programa.
Tengo que buscar un compilador de basic(no lo tengo ahora porque no estoy en mi compu), asi te puedo ayudar con codigo testeado.
06/02/2009 #15

Avatar de cevollin

8-) ok entiendo perfectamente lo que me dices pero hay un pequeño problema si hago esto tal como lo dice ariel palazessi en la pagina de ucontrol si lo hago de esta forma la columna estaria encendida 1/40 de tiempo eso quiere decir que el brillo de los leds de la columna se va a reducir a 1/40 osease que la columna tiene 7 leds imaginemos que cada uno consume 20ma que seria un consumo total por columna de 0,14 amp ahora dividimos este resultado entre 40 y la columna nos va a dar un consumo total de 0,0035

pero si lo hago de tal forma que primero meta los 40 datos correspondientes a la columna y active la matriz por filas la fila va a estar encendida 1/7 del tiempo eso quiere decir que si tengo 40 leds de 20ma cada uno el consumo normal de toda la fila seria 0,8 amp pero como no va estar ensendido fijamente se dividiria entre 7 por que nada mas la fila estaria encendida 1/7 entons el consumo total de la fila seria 0,114 amp aumentando mas el brillo de la fila no se si me entienda pero asi es como imagino que susederia
06/02/2009 #16

Avatar de cevollin

ahora tendria susventajas hacer lo que tu me dices ya que solo tomaria 40 direcciones de tipo byte de la memoria lo que me ahorraria 16 direcciones de typo byte a como yo lo estoy construllendo pero al hacer esto sacrificaria mas el brillo de los leds de mi matriz completa por eso es que lo hago asi ya que prefiero sacrificar mas direcciones de memoria ya que no es mucho lo que voy a mostrar que intencidad de brillo
06/02/2009 #17

Avatar de cevollin

ahora lo que yo solo quiero saber es como hacerle para que las letras se sigan desplazando pero ahora por el lado izquierdo de la pantalla osease que se vean las letras como si ahora entraran por el lado izquierdo de la pantalla

pero hasta ahora no he logrado hacerlo me han dicho que meta caracteres en blanco despues o antes de el texto a mostrar y ya lo he hecho pero descubro que al meter los caracteres en blanco y luego meter los 40 datos a mostrar los 40 datos a mostrar siempre me van votar fuera del registro de desplasamiento por la derecha los caracteres en blanco que puse por que por que la matriz solamente me va a mostrar 8 caracteres y los caracteres que meta al final del texto siempre van a salir votados por el lado derecho del registro de desplasamiento no puedo hacer que los caracteres en blanco me voten el texto a mostrar por el lado izquierdo por que porque el registro de desplasamiento solo es capas en desplasar los datos de izquierda a derecha
18/02/2009 #18

Avatar de cevollin

Resuelto

jajajaja bueno ayer acavo de resolver mi problema despues de unos dos dias de estar revisando el codigo hice unas modificaciones en el codigo y utilize un pic16f628a ya que el pic16f84a no me aguanto el programa no cupo pero bueno lo que hice para resolver mi problemas fue hacer una rutina en la cual voy modificando el numero de columnas a meter voy disminullendo una columna cada vez pero la disminucion por columna la hago en la primera columna del primer caracter a escribir

en resumen lo que hise fue disminuir los datos a meter en la matriz de los 40 datos a mostrar metia 39 y luego 38 y 37 y asi sucesivamnente hasta que el texto desaparece por el lado izquierdo

de ante mano les agradesco su ayuda ya que sin ideas no huviera salido de este enbrollo

attentamente: eduardo rodriguez gonzalez
18/02/2009 #19


Hola amigos; quisiera que me expliquen nuevamente, cómo puedo hacer que los caracteres tengan movimiento, como si una paloma volara, y pasarle por la matríz, lo que necesito es que me indiquen qué tengo que hacer para que en éste caso poderles dar movimiento ya sea caractéres o gráficos. Yo ya tengo programado, y se me visualizan en éste caso los caracteres que estoy codificando, pero quisiera darle el movimiento de derecha a izquierda, también quisiera saber como ustedes manifiestan en el foro que se puede utilizar una memoria EEPROM; cómo le grabo a dicha memoria osea cómo le grabo los datos y cuál es el proceso de utilizanle con el PIC, quisiera otra explicación a parte del amigo Luis_e que por cierto es excelente, pero quisiera saber desde el principio cómo empiezo a utilizar ésta memoria.
Otra cosita necesito poner también en mi matríz que se visualice la temperatura, cómo lo hago?. Por cierto estoy urilizando el compilador CCS. Gracias por su colaboración.

Saludos cordiales
Atentamente
Luis_P
19/02/2009 #20

Avatar de cevollin

Desplasamiento solucionado
a bueno amigo para meter los datos en la memoria eeprom utilisa un grabador de memorias solo tienes que grabarle el archivo en formato.bin y ya esta ahora para hacer el archivo bin utilisa un programa como el winpic800 o el icprog arma tu cartel a visualisar en la memoria eeprom ya que hisiste esto paso a explicar como es que hise yo mi cartel de leds


primero el pic es el cerebro de todo la funcion del pic es de leer los datos de la memoria eeprom y luego volcarlos en el registro de desplasamiento una vez que esten todos los datos volcados en el registro de desplasamiento meto 40 ceros para que hago esto para que el cartel se salga fuera de la pantalla por medio de los registros de desplasamiento ahora hago lo mismo pero para la fila 2 3 4 5 6 7 esto lo repito unas 20 veses con los mismos 40 ceros esto genera un retardo como de medio segundo despues de acabar mostrando el cartel 20 veses repito el mismo proceso pero ahora en vez de meter 40 ceros disminuyo el rango a una unidad es decir ahora meto 39 ceros de esta manera se veria primero el primer bit del caracter a mostra y a medida que vamos reduciendo los ceros a meter el cartel se va ir mostrando columna por columna
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.