Tengo problemas con las matrices globales en mi código C. Lo que estoy tratando de hacer es usar un búfer de visualización (matriz de 8 uint8_t con cada uint8_t que representa una fila) para iluminar los leds en una matriz de led de 8x8 mediante el escaneo de columnas.
la parte relevante del código es:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
uint8_t string_size=3; //DISPLAY STRING SIZE
uint8_t display_string[8][3]; //DISPLAY STRING
uint8_t display_buffer[8]; //CURRENT DISPLAY BUFFER
/*****************************************
CHARACTER MAPS
*****************************************/
uint8_t h[8]= {
0b11111111,
0b10000001,
0b10100101,
0b10100101,
0b10111101,
0b10100101,
0b10000001,
0b11111111
};
uint8_t o[8]= {
0b11111111,
0b10000001,
0b10111101,
0b10100101,
0b10100101,
0b10111101,
0b10000001,
0b11111111
};
uint8_t t[8]= {
0b11111111,
0b10000001,
0b10111101,
0b10011001,
0b10011001,
0b10011001,
0b10000001,
0b11111111
};
/*****************************************
FUNCTIONS
*****************************************/
void addCharToString(uint8_t pos, uint8_t chr[]); //ADD PASSSED CHAR TO SPECIFIED POS IN STRING
void setupDisplayBuffer(); //SETUP INITIAL DISPLAY BUFFER
void writeDisplayBuffer(); //DRAW CURRENT DISPLAY BUFFER
int main()
{
addCharToString(0,h);
addCharToString(1,o);
addCharToString(2,t);
setupDisplayBuffer();
for(;;)
{
writeDisplayBuffer();
}
}
void addCharToString(uint8_t pos, uint8_t arr[])
{
for(uint8_t i=0;i<8;i++)
{
//display_string[i][pos] = arr[i]; //PROBLEM HERE!
display_string[i][pos] = 0b10000001;
}
}
void setupDisplayBuffer()
{
//COPY THE FIRST CHARACTER FROM DISPLAY STRING TO DISPLAY BUFFER
for(uint8_t i=0;i<8;i++)
{
display_buffer[i] = display_string[i][0];
}
}
void writeDisplayBuffer()
{
for(uint8_t i=0;i<8;i++)
{
write595(display_buffer[i]);
set2903Pin(i);
_delay_loop_2(1986); // ACCURATE 1MS DELAY .. HIGHER THAN THIS = FLICKERING
}
}
Cuando lo ejecuto, veo que toda la columna se ilumina (con una tapa de cuadrícula de 8x8 completa con escaneo) y parece que el problema está ocurriendo en la línea
display_string[i][pos] = arr[i];
en addCharToString (). si comento esta línea y uso un valor constante (0b10000001) en el código anterior, se muestra perfectamente (la primera y la última columna se iluminan)
Parece que las matrices h, o y t no se están inicializando correctamente. Cualquier idea de lo que podría estar pasando aquí
Estoy utilizando ATMEGA8.
Actualización:
Estoy utilizando la optimización -0s con los siguientes indicadores establecidos
- caracteres de signos divertidos
- funsigned-bitfields
- fpack-struct
- fshort-enums