AVR GCC: la matriz global / estática no se inicializa correctamente

1

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
pregunta Ankit

2 respuestas

2

Encontré la solución. Como sugirieron los miembros en avrfreaks.net aquí el problema era que al usar el makefile predeterminado, la parte de código de datos no se incluyó en el archivo hexadecimal final. como resultado, el ram se inicializó por el valor predeterminado (0xFF) ya que no pudo encontrar los valores de la matriz (en la parte .data). El uso de un makefile personalizado con el indicador -j .data en avr-objcopy resolvió el problema.

    
respondido por el Ankit
0

La inicialización de tu matriz está bien; consulte Cómo inicializar una matriz en C , o K & R para capítulo & verso. Hasta la llamada a writeDisplayBuffer todo es bueno. Quizás el problema esté dentro de write595 (), set2903Pin () o en tu circuito en algún lugar.

    
respondido por el Richard Padley

Lea otras preguntas en las etiquetas