Problema Memoria SRAM

Ciao a tutti

Mi ritrovo con un problema a mio parere imputabile alla dimensioni dei dati da memorizzare. utilizzo arduino mega!!! Praticamente ho una matrice tridimensionale che ha queste dimensioni:

float CubeTransmissivityMatrix[19][9][9]={
    {
        //Matrice Per Alfa= 0°
        {0.0000,    0.0104,    0.0002,    0.0000,    0.0000,    0.0000,    0.0000,    0.0001,    0.0002},
        {0.0000,    0.0060,    0.0001,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000},
        {0.0156,    0.0036,    0.0001,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000},
        {0.0423,    0.0031,    0.0001,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000},
        {0.0782,    0.0048,    0.0002,    0.0001,    0.0000,    0.0000,    0.0000,    0.0000,    0.0000},
        {0.1638,    0.0161,    0.0026,    0.0001,    0.0001,    0.0001,    0.0001,    0.0001,    0.0001},
        {0.6417,    0.0540,    0.0130,    0.0027,    0.0012,    0.0003,    0.0001,    0.0001,    0.0001},
        {1.0000,    0.3387,    0.0600,    0.0305,    0.0144,    0.0063,    0.0035,    0.0027,    0.0026},
        {1.0000,    1.0000,    0.8893,    0.4573,    0.2299,    0.0831,    0.0617,    0.0591,    0.0587}
    },
    {
        //Matrice Per Alfa= 5°
        {0.0078,    0.0196,    0.0103,    0.0108,    0.0114,    0.0118,    0.0121,    0.0122,    0.0123},
        {0.0003,    0.0058,    0.0014,    0.0024,    0.0033,    0.0036,    0.0045,    0.0048,    0.0035},
        {0.0003,    0.0056,    0.0006,    0.0006,    0.0003,    0.0007,    0.0013,    0.0016,    0.0008},
        {0.0005,    0.0047,    0.0005,    0.0003,    0.0003,    0.0007,    0.0007,    0.0006,    0.0000},
        {0.0003,    0.0036,    0.0007,    0.0007,    0.0005,    0.0004,    0.0008,    0.0005,    0.0000},
        {0.0003,    0.0026,    0.0008,    0.0003,    0.0007,    0.0006,    0.0005,    0.0004,    0.0001},
        {0.4966,    0.0004,    0.0022,    0.0025,    0.0002,    0.0004,    0.0009,    0.0004,    0.0004},
        {1.0001,    0.1741,    0.0003,    0.0006,    0.0019,    0.0017,    0.0021,    0.0022,    0.0023},
        {1.0000,    1.0002,    0.7257,    0.3057,    0.0693,    0.0004,    0.0004,    0.0003,    0.0003}
    },
    //non metto tutti i blocchi della matrice , ho messo solo questi per farvi capire  come l'ho dichiarata
    },
};

la matrice è dichiarata come variabile globale e la dimensione totale dello sketch è di 58,046 bytes Commentando la matrice non ci sono problemi e tutto funziona, ma inserendo la matrice l'arduino non funziona più nulla. Vi ringrazio per gli eventuali suggerimenti Ciao a tutti

Per diminuire la dimensione puoi usare un int al posto del float. Memorizzi i dati moltiplicati per 10'000 e prima di utilizzarli li dividi per 10'000. Ma la matrice è costante o devi manipolare i dati? Perchè se è cosi meglio passare alla DUE. Hai 1539 elementi nella matrice, se ognuno occupa 4byte (float) ti avvicini al limite di 8K. La mega può usare RAM esterna, vendono dei moduli aggiuntivi. La DUE ha 96K --> http://arduino.cc/en/Products.Compare

Segui il consiglio di Paolo, trasforma in unsigned long, e poi salva i dati in Flash, da cui li recuperi. Devi cercare PROGMEM, in rete e qui sul forum ci sono tanti esempi di come salvare i dati in Flash e recuperarli da lì.

EDIT: ovviamente la velocità ne risente, devi leggere il dato dalla Flash, lo devi convertire in float e poi infine lo puoi usare.

unsigned int non unsigned long, altrimenti tanto vale lasciarli in float. :(

fischio85: ``` float CubeTransmissivityMatrix[19][9][9]={

};

19*9*4 = 6156 Byte solo per la matrice, sicuramente hai finito la ram e per questo motivo non funziona nulla.

Paolo, con un unsigned int non ci stanno tutti i valori. Prendi ad esempio se c'è 9.0001 Moltiplicato 10000 viene 90001, come vedi siamo oltre 65535. Per non rischiare meglio uint32. Tanto poi li mette in Flash.

Io vedo solo valori tra 0 e 1. Probabilmente è una matrice normalizzata. Quindi... unsigned int ]:)

A parte che c'è un 1.0002 ma lui scrive nei commenti che non metti tutti i valori, che sono 1539. Se è sicuro che nessuno passi il valore di 6.5535 può usare l'uint16.

grazie a tutti per i commenti. Come dice PaoloP la matrice è normalizzata fra 0 e 1, se ci sono valori superiori 1 significa che c'è stato un errore dato dal software di raytracing che ha calcolato le matrici, quindi quei valori sono da modificare ed interpolare con quelli adiacenti.

Modificherò le matrici moltiplicandole per 10'000 per poi salvarle in flash.

Grazie ancora!!

Se è fissa dichiarala const. Per usare PROGMEM --> http://arduino.cc/en/Reference/PROGMEM

Gliel'avevo già consigliato io di usare progmem per salvare i dati in flash, dopo averli trasformati in int secondo tuo consiglio (reply #2) :P

Era per ribadire il concetto. ;)