Problemi di memoria...RAM

Ciao a tutti,
sto riscontrando problemi di memoria dinamica in un codice che sto scrivendo per gestire un organo che comunica mediante MIDI con un software pc, utilizzando un arduino MEGA.
Il problema in particolare è questo: sull'arduino ho bisogno di caricare delle informazioni relative a diversi organi, e per farlo mi sono creato un "funzione" struct (organoDett) dove ho definito un array personalizzato, dopo di che ho creato per ogni organo un array basato su questa struct organoDett dove sono andato ad inserire tutti i valori. La finalità è quella che in base all'organo che viene selezionato l'arduno vada a leggere i valori dello specifico array per caricarli su dei display. Ora, se io assegno a priori un valore fisso di quale organo caricare il tutto funziona correttamente, se invece il valore lo assegno a una variabile mi da errore di memoria dinamica insufficiente, come se ci fosse la necessità di caricare tutti i valori nella RAM.
Mi sto quindi domandando se sto sbagliando qualcosa. Mi sarei aspettato che essendo questi dei valori da leggere occupassero solo memoria flash, non capisco perchè invece debbano incidere sulla memoria RAM.

Riporto di seguito la parte di codice interessata.

// Definizione della struttura "organoDett"
struct organoDett {
  int nRR;
  int nTast;
  int nRighe;
  char tRegA[20];
  char tRegB[20];
  char tPiedi[20];
  int nTipo;
};

organoDett velesovo[52] = { //velesovo

  /*  1  */ { 0, 0, 0, "", "", "", 0 },
  /*  2  */ { 1, 0, 0, "", "", "", 0 },
  /*  3  */ { 0, 1, 1, "Bordun", "", "16'", 0 },
  /*  4  */ { 1, 1, 1, "Principal", "", "8'", 0 },
  /*  5  */ { 0, 1, 1, "Rohrflot", "", "8'", 0 },
  /*  6  */ { 1, 1, 1, "Gemshorn", "", "8'", 0 },
  /*  7  */ { 0, 1, 1, "Octav", "", "4'", 0 },
  /*  8  */ { 1, 1, 1, "Spitzflot", "", "4'", 0 },
  /*  9  */ { 0, 1, 1, "Octav", "", "2'", 0 },
  /*  10 */ { 1, 1, 1, "Quint", "", "2 2/3'", 0 },
  /*  11 */ { 0, 1, 2, "Sexquint", "altra", "2 fach", 0 },
  /*  12 */ { 1, 1, 1, "Mixtur", "", "4 fach", 0 },
  /*  13 */ { 0, 1, 1, "Cymbel", "", "3 fach", 0 },
  /*  14 */ { 1, 1, 1, "Glocklein", "", "", 0 },
  /*  15 */ { 0, 1, 1, "Fagott", "", "16'", 1 },
  /*  16 */ { 1, 1, 1, "Trompet", "", "8'", 1 },
  /*  17 */ { 0, 1, 1, "Tremulant", "", "", 2 },
  /*  18 */ { 1, 0, 0, "", "", "", 0 },
  /*  19 */ { 0, 2, 0, "Principal", "", "8'", 0 },
  /*  20 */ { 1, 2, 0, "Gedackt", "", "8'", 0 },
  /*  21 */ { 0, 2, 1, "Quintathen", "", "8'", 0 },
  /*  22 */ { 1, 2, 2, "Viol di", "gamba", "8'", 0 },
  /*  23 */ { 0, 2, 1, "Octav", "", "4'", 0 },
  /*  24 */ { 1, 2, 1, "Kleingedackt", "", "4'", 0 },
  /*  25 */ { 0, 2, 1, "Salicinal", "", "4'", 0 },
  /*  26 */ { 1, 2, 1, "Octav", "", "2'", 0 },
  /*  27 */ { 0, 2, 1, "Waldflot", "", "2'", 0 },
  /*  28 */ { 1, 2, 1, "Quinta", "", "1 1/2'", 1 },
  /*  29 */ { 0, 2, 1, "Nassat", "", "3'", 2 },
  /*  30 */ { 1, 2, 1, "Tertia", "", "1 1/2'", 0 },
  /*  31 */ { 0, 2, 1, "Scharff", "", "4 fach", 0 },
  /*  32 */ { 1, 2, 2, "Vox", "humana", "8'", 1 },
  /*  33 */ { 0, 2, 1, "Tremulant", "", "", 2 },
  /*  34 */ { 1, 0, 0, "", "", "", 0 },
  /*  35 */ { 0, 4, 1, "Untersatz", "", "32'", 0 },
  /*  36 */ { 1, 4, 1, "Subbass", "", "16'", 0 },
  /*  37 */ { 0, 4, 1, "Violon", "", "16'", 0 },
  /*  38 */ { 1, 4, 1, "Octavbass", "", "8'", 0 },
  /*  39 */ { 0, 4, 1, "Gedacktbass", "", "8'", 0 },
  /*  40 */ { 1, 4, 1, "Octav", "", "4'", 0 },
  /*  41 */ { 0, 4, 1, "Nachthorn", "", "2'", 0 },
  /*  42 */ { 1, 4, 1, "Mixtur", "", "5 fach", 0 },
  /*  43 */ { 0, 4, 1, "Posaune", "", "16'", 1 },
  /*  44 */ { 1, 4, 1, "Trompet", "", "8'", 1 },
  /*  45 */ { 0, 4, 1, "Clarin", "", "4'", 1 },
  /*  46 */ { 1, 4, 1, "Tremulant", "", "", 2 },
  /*  47 */ { 0, 0, 0, "", "", "", 0 },
  /*  48 */ { 1, 0, 0, "", "", "", 0 },
  /*  49 */ { 0, 5, 1, "Ped-Hw", "", "", 0 },
  /*  50 */ { 1, 5, 1, "Ped-Ow", "", "", 0 },
  /*  51 */ { 0, 5, 1, "Hw-Ow", "", "", 0 },
  /*  52 */ { 1, 0, 0, "", "", "", 0 },
};

organoDett forcalquier[52] = {
  /*  1  */ { 0, 0, 0, "", "", "", 0 },
  /*  2  */ { 1, 0, 0, "", "", "", 0 },
  /*  3  */ { 0, 1, 1, "Bourdon", "", "16'", 0 },
  /*  4  */ { 1, 1, 1, "Gambe", "", "8'", 0 },
  /*  5  */ { 0, 1, 1, "Bourdon", "", "8'", 0 },
  /*  6  */ { 1, 1, 1, "Flute", "", "8'", 0 },
//..... tronco qui il codice per semplicità, ma ci sono altri 7/8 array da 52 righe analoghi

Qualcuno riesce a chiarirmi dove può essere il problema o ha qualche suggerimento da darmi per ottenere il medesimo risultato in maniera più efficiente?

Grazie a tutti!

Su AVR per mettere le tue variabili in flash e non in SRAM, devi usare PROGMEM e le relative funzioni per accedere ai dati.

Guglielmo

Grazie Guglielmo, scusa se solo ora do riscontro alla tua risposta, ma solo ora sono riuscito a testare la soluzione che hai proposto e sta funzionando alla perfezione!
Peccato che ora nel mio progetto stanno uscendo altri problemi, ma questi sono un'altra storia!!
Grazie
Sam