ok sto provando a cambiare codice.... perchè cmq sull'LCD non posso scrivere... però mi sembra un buon tentativo
ok io sarò fuso.... oppure non esperto abbastanza di arduino ma non riesco ad aggiungere questa funzione per controllare la ram libera...
extern void __bss_end;
extern void *__brkval;
int get_free_memory()
{
int free_memory;
if((int)__brkval == 0)
free_memory = ((int)&free_memory) - ((int)&__bss_end);
else
free_memory = ((int)&free_memory) - ((int)__brkval);
return free_memory;
}
i due extern void devono essere dichiarati nelle variabili globali ? cioè prima di tutto ? oppure dopo il void loop ? e la funzione int get_free_memory() devo inserirla in fondo al codice come funzione a se stante ? -.- scusate la domanda ma a me restituisce sempre errore e vorrei capire se il mio problema è proprio derivante da questo.....
questo è l'errore che mi restituisce :
display_4x40_bigfont2_1_7:358: error: variable or field '__bss_end' declared void
display_4x40_bigfont2_1_7.cpp: In function 'int get_free_memory()':
display_4x40_bigfont2_1_7:976: error: '__bss_end' was not declared in this scope
Il buffer della seriale prende 128 byte.
L'SRAM dell'UNO è di 2 kB: se usi tante var. globali e molte chiamate a funzioni, riempi anche lo spazio della RAM usata da stack e heap.
Ma i font che stai usando dove li hai memorizzati? Su Flash con PROGMEM oppure su SRAM?
Sennò allora è facile che tu finisca la memoria....
la funzione è se stante,
extern void __bss_end;
extern void *__brkval;
le puoi mettere tra le globali, per il problema che non vuole void dichiarale int
extern int __bss_end;
extern int *__brkval;
ok sto provando a cambiare il codice.... NON POSSO SCRIVERE NELL'LCD perchè viene comandato dalle altre funzioni.... quindi provo a scrivere direttamente sulla seriale.... ti posto i risultati
Allora nel momento che si blocca.... con il codice inserito nel punto che si blocca mi segna 45.... eliminando tutti i Serial.print lasciando solo il serial.print che mi indica la memoria disponibile mi segna 185....
Abbiamo forse trovato la causa? E a questo punto come potrei fare per "snellire" e far girare il tutto ?
elimina tutte le variabili globali non necessarie, quelle costanti usa un define.
Anche all'inteerno delle perti di codice che usano molte variabili dovresti tentare di riutilizzarle.
la libreria per l'lcd non sembra rubarsi molte risorse... se hai degli array molto grandi prova a farli un poco più piccoli.
un altra ottimizzazione sarebbe quella di modificare HardwareSerial.cpp
in modo che il buffer della seriale (che tanto si usa in ricezione) anzichè essere di 128 byte sia più piccolo (1 byte, se non prevvedi di ricevere dati va benissimo!)
occhio però che la libreria è usata da TUTTI gli sketch, quindi occhio, magari fai un'installazione di arduino a parte per questo progeetto con la libreria modificata.
ok proverò a metter mano a tutto il codice e ti farò sapere.... se è questo almeno servirà anche per gli altri.... quindi cmq vorrebbe dire che sto stressando l'arduino al limite con questo programma ? dimmi di si che ne sarei contento iihihihihihhi
direi di sì per quanto rigurda la ram, ma magri è solo il tuo cofice inefficente, dal'onde con la potenza di 3 o 4 arduini sono arrivati sulla luna
Ripeto. Ma i font dove sono salvati? In genere occupano un sacco di byte: se sono in Flash (con PROGMEM) è un conto, altrimenti vengono anche quelli creati in RAM.
sinceramente non ho visto font nella libreria, credo che se li smazzi da solo il chip dell'lcd (ma mi potrei sbagliare)
Io i 2 set di font li creo così:
byte a1[8] = // array to make an arrow pointing up
{
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B00000,
B00000
};
byte a2[8] = // array to make an arrow pointing up
{
B00000,
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte a3[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B01111,
B00111
};
byte a4[8] = // array to make an arrow pointing up
{
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte a5[8] = // array to make an arrow pointing up
{
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte a6[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B00000,
B00000
};
byte a7[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B11111,
B11111,
B00000,
B00000,
B00000
};
byte a8[8] = // array to make an arrow pointing up
{
B11000,
B01100,
B00110,
B11111,
B11111,
B00110,
B01100,
B11000
};
byte b1[8] = // array to make an arrow pointing up
{
B00111,
B01111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte b2[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B00011,
B00011,
B00011,
B00011,
B11111,
B11111
};
byte b3[8] = // array to make an arrow pointing up
{
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte b4[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B01111,
B00111
};
byte b5[8] = // array to make an arrow pointing up
{
B00000,
B00000,
B11111,
B11111,
B11111,
B00000,
B00000,
B00000
};
byte b6[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte b7[8] = // array to make an arrow pointing up
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11110,
B11100
};
byte b8[8] = // array to make an arrow pointing up
{
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111
};
quelli con prefisso A servono per fare tutti i numeri da 0 a 9 quelli con prefisso B per fare le lettere che mi occorrono.....
Lesto grazie tantissimooooooooooooo .... per caso sono imbattuto nella "soluzione" (o almeno credo) ad un certo punto del codice avevo una scrittina che facevo scorrere.... questa scritta era una variabile di testo di circa 50 caratteri che facevo scorrere tagliandola a dovere e cambiandogli di posizione ogni tot millisecondi.... ebbene il valore che prima era 45 di memoria libera... adesso eliminando il codice di questa scritta è di 361... stava consumando tantissimoooooooo
Grazie per avermi "insegnato" che su arduino le risorse vanno gestite e ottimizzate con molta attenzione....
Finisco di fare le modifiche al codice e ti farò sapere se tutto funziona...
I font li crei in SRAM. Non è il modo migliore per usarli, ti consumano tanta memoria. Quanto occupa il tuo sketch? Perché altrimenti potresti pensare di "migrare" i font in Flash con PROGMEM.
Grazie a tutti di cuore finalmente il tutto funziona .... studierò anche quanto mi hai detto te Leo ma cmq adesso come adesso stà girando tutto... il fatto è che credo due pacchetti di font... uno per i numeri e uno per i caratteri e li carico man mano che devo utlizzarli....
Grazie Ancora.... diciamo che per adesso è stato risolto!!!
8)
Non vedendo tutto il codice non so dirti di più, però ricorda che qualunque dato viene inserito nello sketch affinché il micro possa usarlo in runtime viene ricreata in RAM. Quindi se tu hai un font esso viene creato come variabile nella memoria volatile ogni volta che ti serve. E se nella SRAM non c'è in quel momento spazio sufficiente? Il micro "muore"...
Ecco quindi che, visto che quei font li hai già nella Flash, puoi istruire il micro a leggerli da lì impostando semplicemente
PROGMEM const byte a1[8] = {....}
ecc...
Così il compilatore obbliga il micro a leggere il font direttamente dalla Flash ed evita così che esso venga copiato nella SRAM prima di venir utilizzato.