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.