problema con array di int

Nel tentativo di modificare una libreria per uno schermo lcd mi sono trovato davanti ad un problema al quale non riesco a venire a capo:
Ho questo array:

unsigned int fontLookup[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 29, 27, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 0, 0, 0, 0, 0, 66, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

che in base al valore int di un determinato carattere mi restituisce la posizione di quest'ultimo all'interno di un secondo array.
il problema è che non mi restituisce i valori corretti, ad esempio con questo codice:

Serial.println(fontLookup[65]);

mi viene stampato "59141" (naturalmente senza virgolette) quando invece dovrebbe essere "1" cioè che corrisponderebbe ad "A".
Ho l'impressione che mi sfugga qualcosa di basilare, ma ci sto prendendo la testa.
Grazie a tutti e buona giornata.

Su che Arduino sei ? Sicuro di non aver ... sforato come RAM ??? 256 int sono già 512 Bytes ... :wink:

Guglielmo

Innanzituto grazie per l'interessamente, sono su un arduino uno e durante la compilazione il progetto pesa 6192bytes e mi viene detto che quelli disponibili sono 32k.

Ho parlato di RAM ... non di flash memory ...

I 32KB sono di memoria programma, la memoria dati, la SRAM, su Arduino UNO è di soli 2KB e ... è un attimo riempirla :wink:

Prova mettere qui tutto il tuo programma che gli diamo un'occhiata (mi raccomando ... racchiudilo tra i tag CODE ... bottoncino con # durante l'edit, terzultimo seconda fila).

Guglielmo

Scusa non avevo capito. Pensandoci potresti avere ragione.
Tornando al progetto che per ora è molto semplice

#include "LCD12864RSPI.h"
#include "font.h"

#define FONT_HEIGHT 9

void setup()
{
   Serial.begin(9600); 
   LCDA.initDriverPin(2,7,10);
   LCDA.Initialise();
   delay(100);
   LCDA.CLEAR();
   delay(100);
   
   Serial.println(fontLookup[65]);
}
void loop()
{
}

gli array sono in font.h

unsigned char fontPixel[69][9] = {
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //   (0x20)
    { 0x00, 0x04, 0x0a, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x00 }, // A (0x41)
    { 0x00, 0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e, 0x00 }, // B (0x42)
    { 0x00, 0x0e, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0e, 0x00 }, // C (0x43)
    { 0x00, 0x1c, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1c, 0x00 }, // D (0x44)
    { 0x00, 0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x1f, 0x00 }, // E (0x45)
    { 0x00, 0x1f, 0x10, 0x10, 0x1e, 0x10, 0x10, 0x10, 0x00 }, // F (0x46)
    { 0x00, 0x0e, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0f, 0x00 }, // G (0x47)
    { 0x00, 0x11, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x00 }, // H (0x48)
    { 0x00, 0x0e, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 }, // I (0x49)
    { 0x00, 0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0c, 0x00 }, // J (0x4a)
    { 0x00, 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11, 0x00 }, // K (0x4b)
    { 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00 }, // L (0x4c)
    { 0x00, 0x11, 0x1b, 0x15, 0x15, 0x11, 0x11, 0x11, 0x00 }, // M (0x4d)
    { 0x00, 0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11, 0x00 }, // N (0x4e)
    { 0x00, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // O (0x4f)
    { 0x00, 0x1e, 0x11, 0x11, 0x1e, 0x10, 0x10, 0x10, 0x00 }, // P (0x50)
    { 0x00, 0x0e, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0e, 0x00 }, // 0 (0x30)
    { 0x00, 0x04, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 }, // 1 (0x31)
    { 0x00, 0x0e, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1f, 0x00 }, // 2 (0x32)
    { 0x00, 0x1f, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0e, 0x00 }, // 3 (0x33)
    { 0x00, 0x02, 0x06, 0x0a, 0x12, 0x1f, 0x02, 0x02, 0x00 }, // 4 (0x34)
    { 0x00, 0x1f, 0x10, 0x1e, 0x01, 0x01, 0x11, 0x0e, 0x00 }, // 5 (0x35)
    { 0x00, 0x06, 0x08, 0x10, 0x1e, 0x11, 0x11, 0x0e, 0x00 }, // 6 (0x36)
    { 0x00, 0x1f, 0x11, 0x01, 0x02, 0x04, 0x04, 0x04, 0x00 }, // 7 (0x37)
    { 0x00, 0x0e, 0x11, 0x11, 0x0e, 0x11, 0x11, 0x0e, 0x00 }, // 8 (0x38)
    { 0x00, 0x0e, 0x11, 0x11, 0x0f, 0x01, 0x02, 0x0c, 0x00 }, // 9 (0x39)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00 }, // . (0x2e)
    { 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x00 }, // : (0x3a)
    { 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00 }, // - (0x2d)
    { 0x00, 0x0e, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0d, 0x00 }, // Q (0x51)
    { 0x00, 0x1e, 0x11, 0x11, 0x1e, 0x14, 0x12, 0x11, 0x00 }, // R (0x52)
    { 0x00, 0x0e, 0x11, 0x10, 0x0e, 0x01, 0x11, 0x0e, 0x00 }, // S (0x53)
    { 0x00, 0x1f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00 }, // T (0x54)
    { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // U (0x55)
    { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 }, // V (0x56)
    { 0x00, 0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0a, 0x00 }, // W (0x57)
    { 0x00, 0x11, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x11, 0x00 }, // X (0x58)
    { 0x00, 0x11, 0x11, 0x0a, 0x04, 0x04, 0x04, 0x00, 0x00 }, // Y (0x59)
    { 0x00, 0x1f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1f, 0x00 }, // Z (0x5a)
    { 0x00, 0x00, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x00 }, // a (0x61)
    { 0x00, 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1e, 0x00 }, // b (0x62)
    { 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10, 0x11, 0x0e, 0x00 }, // c (0x63)
    { 0x00, 0x01, 0x01, 0x0d, 0x13, 0x11, 0x11, 0x0f, 0x00 }, // d (0x64)
    { 0x00, 0x00, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x00 }, // e (0x65)
    { 0x00, 0x06, 0x09, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x00 }, // f (0x66)
    { 0x00, 0x00, 0x00, 0x0f, 0x11, 0x0f, 0x01, 0x0e, 0x00 }, // g (0x67)
    { 0x00, 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 }, // h (0x68)
    { 0x00, 0x04, 0x00, 0x04, 0x0c, 0x04, 0x04, 0x0e, 0x00 }, // i (0x69)
    { 0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x12, 0x0c, 0x00 }, // j (0x6a)
    { 0x00, 0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12, 0x00 }, // k (0x6b)
    { 0x00, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x00 }, // l (0x6c)
    { 0x00, 0x00, 0x00, 0x1a, 0x15, 0x15, 0x15, 0x15, 0x00 }, // m (0x6d)
    { 0x00, 0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x00 }, // n (0x6e)
    { 0x00, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x00 }, // o (0x6f)
    { 0x00, 0x00, 0x00, 0x1e, 0x11, 0x1e, 0x10, 0x10, 0x00 }, // p (0x70)
    { 0x00, 0x00, 0x00, 0x0d, 0x13, 0x0f, 0x01, 0x01, 0x00 }, // q (0x71)
    { 0x00, 0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10, 0x00 }, // r (0x72)
    { 0x00, 0x00, 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x1e, 0x00 }, // s (0x73)
    { 0x00, 0x08, 0x08, 0x1c, 0x08, 0x08, 0x09, 0x06, 0x00 }, // t (0x74)
    { 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0d, 0x00 }, // u (0x75)
    { 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x0a, 0x04, 0x00 }, // v (0x76)
    { 0x00, 0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0a, 0x00 }, // w (0x77)
    { 0x00, 0x00, 0x00, 0x11, 0x0a, 0x04, 0x0a, 0x11, 0x00 }, // x (0x78)
    { 0x00, 0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x0e, 0x00 }, // y (0x79)
    { 0x00, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f, 0x00, 0x00 }, // z (0x7a)
    { 0x0c, 0x12, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00 }, // @ (0x40)
    { 0x00, 0x0c, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 }, // ' (0x27)
    { 0x00, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 }  // " (0x22)
};

unsigned int fontLookup[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 29, 27, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 0, 0, 0, 0, 0, 66, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

La libreria LCD12864RSPI serve per gestire l'LCD.
Ho notato che array più corti o persino fontLookup se tagliato non hanno problemi, quindi vorrei chiederti se c'è il modo di verificare se è la RAM e nel caso come posso ottimizzare il tutto.

Grazie.

Quell'array poi viene ricaricato in RAM per essere gestito dal chip, e sono 621 byte... da sommare al resto.
Tutte le variabili vengono sempre caricate in memoria RAM anche se sono inizialmente contenute nella Flash insieme al codice. E' per "colpa" dell'architettura Harvard.

Dovresti salvarlo in flash e leggerlo da lì, usando PROGMEM:

leo72:
Quell'array poi viene ricaricato in RAM per essere gestito dal chip, e sono 621 byte... da sommare al resto.

Occhio, con quello che ci fa vedere, in realtà solo con fontPixel e fontLookup siamo già a 1133 Bytes !!

@ miciomacio : Oltre ad utilizzare PROGMEM, come suggerito da leo, cambia il tipo del tuo array da int a unsigned char (come fontPixel) così DIMEZZI lo spazio occupato (int sono 2 BYTES, unsigned char è 1 BYTE).

Guglielmo

Secondo me la soluzione é usare un Arduino MEGA.
Ciao Uwe

Alleggerendo il codice e trasformando l'array in in char sono riuscito a far partire il codice anche senza l'utilizzo di PROGMEM, anche se credo diventerà necessario con l'avanzare del progetto.
Vi ringrazio molto e colgo l'occasione per chiedervi ancora un paio di cose:
C'è la possibilità di vedere quanta RAM si utilizza? o almeno essere avvertiti quando è piena?
Sempre in questo programma converto i caratteri in int per confrontarli con l'array semplicemente facendo:
Serial.print((int)'c'); però arrivo solo fino al 127 carattere, cioè all'ascii non esteso, è normale o sono ancora problemi di memoria? c'è modo di comprenderlo tutto fino al 256esimo?
Se inserisco un carattere tipo "°" che è il 167esimo mi esce il numero "-15696" e succede una cosa simile con gli altri.
grazie ancora.

miciomacio:
C'è la possibilità di vedere quanta RAM si utilizza? o almeno essere avvertiti quando è piena?

Puoi usare avr-size che dà il quantitativo di memoria RAM impiegata staticamente (non tiene conto degli eventuali array dinamici creati a run-time) oppure c'è anche un altro metodo usabile a run-time che permette di sapere il consumo istantaneo di memoria:
per maggior info ti rimando a questo mio articolo

Sempre in questo programma converto i caratteri in int per confrontarli con l'array semplicemente facendo:
Serial.print((int)'c'); però arrivo solo fino al 127 carattere, cioè all'ascii non esteso, è normale o sono ancora problemi di memoria? c'è modo di comprenderlo tutto fino al 256esimo?
Se inserisco un carattere tipo "°" che è il 167esimo mi esce il numero "-15696" e succede una cosa simile con gli altri.
grazie ancora.

L'implementazione del linguaggio gestisce gli ASCII secondo la tabella standard solo appunto fino al 127° carattere. Oltre il risultato che ottieni dipende molto dal tuo sistema, perché tutti i moderni SO ormai usano codifiche caratteri con più di un byte per carattere (ISO-8859, UTF-8 ecc..)