La configuración es la siguiente:
Tengo un pequeño programa para manejar matrices led de 8x8 de un solo color utilizando 595 registros de desplazamiento que ATTiny85 proporciona datos a través de USI como SPI Master. Subo el programa a ATTiny85 usando Arduino Uno. El programa se compila y carga mediante el complemento Visualmicro para VS2010 o Arduino IDE (ambos con los mismos resultados). El programa compilado tiene una longitud de 2970 bytes (36.3% de la memoria del chip)
Los problemas son:
-
El problema de la matriz: no puedo declarar la matriz que tiene más de 296 bytes.
Tengo una matriz que contiene una representación binaria de una fuente para mostrar caracteres en matrices de LED. El tamaño deseado para esta matriz es de 760 bytes. Se declara de la siguiente manera:byte font[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char 032 ( ) 0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00, // Char 033 (!) ... 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00, // Char 125 (}) 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Char 126 (~) }// 760 bytes total
Si me refiero al primer elemento de la matriz en el código, recibo el 648º elemento [primer byte del carácter de fuente 113 (q)]. Toda la matriz está en mal estado. Los bloques de 8 bytes o más (n * 8bytes) del contenido de las matrices se mezclan entre sí y con áreas de la memoria que no tienen ninguna relación . Si trato de mostrar texto en las matrices, veo caracteres completamente diferentes o un poco de desorden (creo que lo que realmente veo es el mismo programa que se ejecuta en la memoria; es genial pero inútil). Si reduzco la matriz a 296 bytes, todo funciona bien.
-
El problema del puntero : para solucionar el problema # 1, dividí la matriz en 3 matrices más pequeñas (296 bytes como máximo). Declaré el puntero para apuntar a la matriz de fuente adecuada dependiendo del carácter a "render". No puedo apuntar este puntero a ninguna matriz dentro del bloque "if"
char c1='a'; //character to display byte font1[]={...}; //binary font representation split in to 3 arrays byte font2[]={...}; byte font3[]={...}; byte ascii_offset1= 32,ascii_offset2= 69,ascii_offset3= 106; //offset for each array byte * font_ptr1=font1; //This works fine. font_ptr1=font3; //This also worked fine in tests. if(c1>=ascii_offset3) { font_ptr1=font3; //This DOESN'T work at all c1-=ascii_offset3 } else ...
De hecho, creo que esa línea, comentada como no funciona, en realidad está colgando el ATTiny. No veo nada en las matrices, a excepción de unos pocos LED que se iluminan constantemente.
En el caso del problema # 1, sospecho que el compilador o el enlazador estropea algo. Pero el # 2 es un misterio total para mí. Pensé que tal vez se trata de un desbordamiento de pila, pero de acuerdo con la documentación, el tamaño de la pila está limitado solo por el tamaño de la SRAM, es suficiente y además no asigno ninguna memoria de forma dinámica.