Memória RAM PIC16F877A

Olá,

Estou utilizando o MikroC Pro for PIC para criar um código para um PIC 16F877A, porém estou enfrentando uma dificuldade com relação à memória RAM do mesmo. Ele possui 368 Bytes de memória RAM.

Este programa deve exibir textos no display, e tais textos estão divididos em aproximadamente 640 Bytes de memória, pois são divididos em 40 char string[16]. Algo como:

char LCDstringUm[16] = "ABCDEFGHIJKLMNOP";
char LCDstringDois[16] = "TEXTO DO DISPLAY";

void main(){
  lcd_setCursor(0, 0);
  lcd_print(LCDstringUm);
  lcd_setCursor(0, 1);
  lcd_print(LCDstringDois);
}

Estou tentando pensar em uma forma de economizar memória para execução disso, mas até agora sem sucesso. A primeira forma que pensei foi criar um char alfabeto[26] = {‘A’,‘B’,‘C’,…,‘Z’} e utilizar estas variáveis para montar um char LCD_string[16] e exibi-lo na tela, mas isso ocupou ainda mais espaço da memória RAM, de acordo com o compilador.

char LCDstring[16];
char characters[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
                                    'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
void setStringUm(){
  int i;
  for(i=0; i<16; i++){
    LCDstring[i] = characters[i];
  }
}

void setStringDois(){
  LCDstring[0] = characters[19];
  LCDstring[1] = characters[04];
  LCDstring[2] = characters[23];
  LCDstring[3] = characters[19];
  LCDstring[4] = characters[14];
  LCDstring[5] = ' ';
  LCDstring[6] = characters[3];
  LCDstring[7] = characters[14];
  LCDstring[8] = ' ';
  LCDstring[9] = characters[3];
  LCDstring[10] = characters[8];
  LCDstring[11] = characters[18];
  LCDstring[12] = characters[15];
  LCDstring[13] = characters[11];
  LCDstring[14] = characters[0];
  LCDstring[15] = characters[24];
}

void main(){
  lcd_setCursor(0, 0);
  setStringUm();
  lcd_print(LCDstring);
  lcd_setCursor(0, 1);
  setStringDois();
  lcd_print(LCDstring);
}

Percebi que no primeiro código tem apenas dois arrays totalizando 32 Bytes, enquanto no segundo totalizou 42 Bytes, porém mesmo com uma escala maior o consumo de memória aumenta.

Alguém já fez ou viu algo assim?

Vou postar aqui os dois exemplos reais que usei, talvez seja mais fácil de entender

Exemplo 1:

void main(){
  lcd_setCursor(0, 0);
  lcd_print("ABCDEFGHIJKLMNOP");
  lcd_setCursor(0, 1);
  lcd_print("TEXTO DO DISPLAY");
  lcd_setCursor(0, 0);
  lcd_print("123456789  - 0");
  lcd_setCursor(0, 1);
  lcd_print("ESCREVE NA TELA1");
}
// Used RAM (bytes): 55 (16%)  Free RAM (bytes): 297 (84%)
// Used ROM (program words): 522 (6%)  Free ROM (program words): 7670 (94%)

Exemplo 2:

char LCDstring[16];
char characters[40] = {'0','1','2','3','4','5','6','7','8','9',
                     'A','B','C','D','E','F','G','H','I','J','K','L','M',
                     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                     ' ','*','-', '/'};
#define ZERO characters[0]
#define ONE characters[1]
#define TWO characters[2]
#define THREE characters[3]
#define FOUR characters[4]
#define FIVE characters[5]
#define SIX characters[6]
#define SEVEN characters[7]
#define EIGHT characters[8]
#define NINE characters[9]
#define A characters[10]
#define B characters[11]
#define C characters[12]
#define D characters[13]
#define E characters[14]
#define F characters[15]
#define G characters[16]
#define H characters[17]
#define I characters[18]
#define J characters[19]
#define K characters[20]
#define L characters[21]
#define M characters[22]
#define N characters[23]
#define O characters[24]
#define P characters[25]
#define Q characters[26]
#define R characters[27]
#define S characters[28]
#define T characters[29]
#define U characters[30]
#define V characters[31]
#define W characters[32]
#define X characters[33]
#define Y characters[34]
#define Z characters[35]
#define SPC characters[36]
#define ASTERISK characters[37]
#define DASH characters[38]
#define BAR characters[39]

void setStringOne(){
  LCDstring[0] = A;
  LCDstring[1] = B;
  LCDstring[2] = C;
  LCDstring[3] = D;
  LCDstring[4] = E;
  LCDstring[5] = F;
  LCDstring[6] = G;
  LCDstring[7] = H;
  LCDstring[8] = I;
  LCDstring[9] = J;
  LCDstring[10] = K;
  LCDstring[11] = L;
  LCDstring[12] = M;
  LCDstring[13] = N;
  LCDstring[14] = O;
  LCDstring[15] = P;
}

void setStringTwo(){
  LCDstring[0] = T;
  LCDstring[1] = E;
  LCDstring[2] = X;
  LCDstring[3] = T;
  LCDstring[4] = O;
  LCDstring[5] = SPC;
  LCDstring[6] = D;
  LCDstring[7] = O;
  LCDstring[8] = SPC;
  LCDstring[9] = D;
  LCDstring[10] = I;
  LCDstring[11] = S;
  LCDstring[12] = P;
  LCDstring[13] = L;
  LCDstring[14] = A;
  LCDstring[15] = Y;
}

void setStringThree(){
  LCDstring[0] = ONE;
  LCDstring[1] = TWO;
  LCDstring[2] = THREE;
  LCDstring[3] = FOUR;
  LCDstring[4] = FIVE;
  LCDstring[5] = SIX;
  LCDstring[6] = SEVEN;
  LCDstring[7] = EIGHT;
  LCDstring[8] = NINE;
  LCDstring[9] = SPC;
  LCDstring[10] = SPC;
  LCDstring[11] = DASH;
  LCDstring[12] = BAR;
  LCDstring[13] = ASTERISK;
  LCDstring[14] = SPC;
  LCDstring[15] = ZERO;
}

void setStringFour(){
  LCDstring[0] = E;
  LCDstring[1] = S;
  LCDstring[2] = C;
  LCDstring[3] = R;
  LCDstring[4] = E;
  LCDstring[5] = V;
  LCDstring[6] = E;
  LCDstring[7] = SPC;
  LCDstring[8] = N;
  LCDstring[9] = A;
  LCDstring[10] = SPC;
  LCDstring[11] = T;
  LCDstring[12] = E;
  LCDstring[13] = L;
  LCDstring[14] = A;
  LCDstring[15] = ONE;
}

void main(){
  lcd_setCursor(0, 0);
  setStringOne();
  lcd_print(LCDstring);
  lcd_setCursor(0, 1);
  setStringTwo();
  lcd_print(LCDstring);
  lcd_setCursor(0, 0);
  setStringThree();
  lcd_print(LCDstring);
  lcd_setCursor(0, 1);
  setStringFour();
  lcd_print(LCDstring);
  // Used RAM (bytes): 112 (32%)  Free RAM (bytes): 240 (68%)
  // Used ROM (program words): 881 (11%)  Free ROM (program words): 7311 (89%)
}

Mas esses dados ficam na area do programa que suporta 14.3K.
Então se você coloca tudo dentro da área do programa qual o problema?

Tudo depende, mas tenho projeto que mostra mensagem em LCD num CI de 2K da linha ATMEL

Mas se precisa mesmo de mais memoria, podera usar memoria externa