Hola Bruno, un pregunta...
el buffer de 80bits de este ejemplo se modifica según los datos de cada fila, cierto?
Hola! El buffer es de 80 bytes. Un byte por columna, un bit por LED. No entendí lo de modificar los datos según cada fila.
si se desea hacer algunos efectos, por ejemplo solo desplazar un texto, si ya tengo un mensaje cargado para desplazar una columna se debe rotar el buffer en cada fila, si voy en el décimo desplazamiento debo rotar 10 veces el buffer cada vez que lleguen los datos de una fila.
Ah! Creo que logré entender algo...Bien. Tu has utilizado otro método. Mi propuesta "destruye" los datos a medida que van siendo reemplazados por otros. En mi algoritmo, cuando roto, voy destruyendo columna por columna, aunque debería ser ocupada por nuevos datos. Si entendí bien, lo que hacés es almacenar los datos originales, sin transformaciones, y luego realizar las transformaciones necesarias para generar el resultado que deberá ser mostrado en pantalla. No está mal. Técnicamente funciona. Lo que pasa es que deberías asegurarte en ese caso que todos los efectos que hagas se puedan realizar en tiempos breves, y no sean acumulativos de manera tal que cada vez demanden mayor tiempo de procesado.
Yo no llegué a explicarle a marvicdigital que hay una optimización más a la hora de rotar el buffer, sea hacia arriba, abajo, derecha o izquierda, y se basa en usar punteros. Un puntero que indique la primer columna del buffer, y otro que indique la primer fila del mísmo.
Lo explayo un poco(caso de rotaciones hacia la izq y der):
Cuando comienza el programa, el puntero de columnas apuntará a la posición donde se encuentre COL1. El algoritmo de refresco "mostrará" fila x fila los valores, comenzando desde lo que el puntero le indique, es decir, desde COL1 hasta COL32 en el programa de marvicdigital. Ahora, si yo quisiera rotar un lugar a la derecha el buffer, usando punteros, puedo sencillamente sólo cambiar el puntero, haciendo que ahora apunte a la posición donde está COL2. El algoritmo de refresco comenzará a refrescar las filas comenzando desde COL2 hasta COL1, que será la última. Fijemonos que usando punteros, el tiempo que se requiere para procesar los datos se minimiza. Sólo cambiamos el valor del puntero, para que luego la rutina de refresco se adapte a ello.
En tu caso, esto resolvería las 10 rotaciones. Sólo deberías incrementar o decrementar el puntero en 10 unidades. SIEMPRE TENIENDO EN CUENTA QUE EL BUFFER ES CICLICO. CUANDO TERMINA, HAY QUE VOLVER A RECORRERLO DESDE EL PRINCIPIO Y VICEVERSA.
Lo que yo hice fue usar excesiva RAM , creándome en CCS un arreglo bidimensional o matriz que emula a mi matriz de leds, si tengo por ejemplo 40 columnas tendré una matriz[40][8] y ahí cargo los datos los roto, los animo y hago quizá todo, lo más complicado creo que serán algunos algoritmos para efectos llamativos, y muestro los datos fila por fila de mi matriz[40][8] cargando a los registros byte por byte.
Crees que es un desperdicio de ram? o como se hace solo con uno o dos buffers?
un saludo.
no me especificaste si la matriz de [40][8] son bits o bytes. Si son bits, no hay desperdicio. Si son bytes y no estás usando tonalidades de color(es decir, sólo enciendes o apagas el LED(biestado)) entonces sí habría desperdicio ya que de 8 bits por LED solo usas 1. Ten en cuenta que si puedes hacer lo mísmo con una matriz de una sóla dimension, todos los accesos y operaciones son más rápidas que con matrices de más dimensiones.
Podés usar un solo buffer sin problemas si se cumple con lo que dije más arriba. Un doble buffer da 100% de seguridad, porque te permite modificar a gusto sin tener que preocuparte por si los datos se están refrescando o no mientras estás todavía realizando modificaciones al buffer. Si tenés la posibilidad de crear dos buffers, te recomiendo que lo hagas, especialmente si deseas agregarle efectos que puedan requerir de mucho tiempo para procesarlos.
Como ya mencioné, el peligro de hacer sólo un buffer es que como dependemos de nuestro buffer interno para poder ir refrescando las filas en el cartel, puede suceder que se visualicen en los LEDs los cambios que vamos realizando en el buffer. Y no es posible esperar a que termine de procesarlos para visualizarlos, porque sino mientras no podríamos refrescar las filas. Un solo buffer significa que compartimos el buffer para visualizarlo y para modificarlo.
Un saludo.
Saludos, disculpa por responder después de tanto tiempo, y si usé la matriz [6][8] de bytes, me equivoque, no es de 40 la matriz; ésta representa en el programa del micro a la matriz física. Aclarar que la matriz de leds física está formada de matrices pequeñas de 8x8 en total solo tengo 5 matrices de 8x8, la 6ta posición de la matriz en soft lo uso como temporal. Ya que comencé por desplazar el mensaje de derecha a izquierda, y coloque esta 6 posición para que la 1ra letra aparezca primeramente en esta virtual, y exista un espacio entre el fin e inicio del mensaje cuando este termine de pasar.
Les menciono los pasos y muestro algunas imágenes de lo que hago, y al menos lo que ví en otros mensajes, quizá en idea general vaya por buen camino, pero en el uso de la matriz en soft quizá no sea lo mejor, y todavía no logro entenderlo sin usar la matriz y usar solamente unos cuantos buffers y lograr todos los efectos que uno puede ver en estos letreritos tan vistosos.
1. Tengo mi mensaje guardado en ASCII
2. Leo la primera letra del mensaje y la decodifico en sus 8 bytes que tiene, los 8 bytes resultantes los almaceno en la última posición de la matriz (uso caracteres de 8x8).
3. muestro el contenido de la matriz[6][8] que inicialmente esta cargada solamente con la 1ra letra del mensaje (sus 8 bytes), por tanto como tengo físicamente 5 matrices de leds no se verá nada.
4. muestro varias veces el contenido de la matriz[6][8], para que el mensaje no pase demasiado rápido.
lo muestro fila por fila: 1ro cargo los registros con los datos
- [0], [1][0], [2][0]... [4][0], ya no muestro el [5][8] pues es "mi matriz física virtual". Después cargo el siguiente dato de las filas
- [1], [1][1], [2][1]... [4][1] y así sucesivamente hasta terminar las filas todo refrescado en un tiempo corto por el TMR0, y nuevamente mostrar la fila 1 para repetir ello una determinada cantidad de veces, para que el mensaje tenga cierta pausa, mientras más veces repita la muestra del mismo mensaje será más lento, y por el contrario mientras menos, será más rápido
5. roto todos los bytes de la matriz[6][8] a la izquierda.
6. vuelvo a mostrar el contenido de la matriz de la misma manera, pero ahora ya aparecerá la primera columna de la primera letra en la matriz física, los leds correspondientes estarán encendidos
y así sucesivamente hasta mostrar todas las letras del mensaje.
Les muestro unas cuantas imágenes de lo que creo ya todos lo conocemos.
primera fila:
segunda:
tercera:
cuarta:
quinta:
sexta:
septima:
octava
mensaje que se obtiene visualmente:
Esa es la idea que plasme en código, pero fue esencialmente pensando en solo desplazar el mensaje de der a izq, pero ahora hay tantos efectos que hay como que el mensaje se desplace hacia arriba o abajo o que desaparezca columna por columna desde la izq o der o desde el medio hacia ambos lados y bueno nose, supongo que con bastante código (algoritmos) se podrá lograr estos efectos usando la matriz[6][8] que tengo en RAM, pero seguramente es lo menos efectivo como mencionó Bruno.
Todavía no logro entender muy bien donde van los punteros y como sabes que letra apunta el puntero si esta almacenado en ascii y debes decodificar primeramente...
como lo haces tu? o como debería ser?
un saludo y muchas gracias por la ayuda, y disculpas que me entrometa en el hilo, pero quizá esto también pueda ayudar a alguien que tenga un problema parecido al mío.
pd. Felicidades marvicdigital por el cartel, te ha quedado muy bien, se ve bien en el video