Già che ci siamo... facciamo anche questa domandina
Ho un paio di variabili int che voglio mettere in PROGMEM.
Inserirle mi pare piuttosto semplice, recuperarle mi sembra un attimino macchinoso ma se mi trovo qualche tutorial dovrei farcela.
Quello che mi chiedevo è invece un altra cosa.
Le mie due variabili vengono utilizzate spesso nel codice. C'è un modo comodo per tirarle fuori dalla PROGMEM senza andare con il lanternino su e giù a modificare tutte le righe dello sketch?
usi un int normale per lavorarci sopra, e una volta ogni tanto fai variabile progmem = variabile normale... ma non vedo il motivo, tanto vale usare EEPROM per memorizzare un valore tra una sessione e l'altra
Si in effetti quei valori potrei metterli anche nella EEPROM ora che me lo fai notare.
tra l'altro visto che sono numeri a due cifre con segno, potrei usare char ed evitare di dividere la variabile per farla stare nell'address, no?
come dice lesto per il tuo scopo tanto vale usare la EEPROM, i motivi sono 2: hai solo 2 variabili di cui mantenere il valore e non hai un vincolo di velocità.
Usare la PROGMEM per me serve solo nei casi in cui la EEPROM interna non basta e devi leggere e scrivere velocemente. Senza contare che la EEPROM dura 10 volte di più della flash.
Progmem memorizza una variabile nella flash e percui non puó essere modificata.
Il vantaggio rispetto l'uso della EEprom é che puoi definirla nello sketch e trasferirla insieme allo sketch nel upload. Non devi scriverla nella eeprom con un sketch aposito.
Se usi nel Tuo progetto un RTC: alcui modelli hanno qualche byte di Ram non volatile. Puoi usare anche quella.
DanielaES:
Le mie due variabili vengono utilizzate spesso nel codice.
Specifica "utilizzate": lette o anche modificate?
Se le devi anche modificare, non puoi usare PROGMEM. Puoi usare la EEPROM ma ricordati che ha un ciclo di 100.000 riscritture dopodiché... amen. Quindi se a queste variabili cambi valore spesso (intendo nell'ordine dei ms o dei s) devi tener conto del deterioramento della EEPROM.
Progmem memorizza una variabile nella flash e percui non puó essere modificata
..appunto, pertanto in uno sketch dove devi lavorare con variabili, non ha molto senso, come già detto.
Si utilizza piuttosto per gestire valori statici (voci di menù, header, etc).
Se vuoi utilizzare la EEPROM, puoi avvalerti anche di struct per la gestione dei dati, che puoi memorizzare e rileggere semplicemente con eeprom_write_block e eeprom_read_block
Se usi nel Tuo progetto un RTC: alcui modelli hanno qualche byte di Ram non volatile
DanielaES:
Le mie due variabili vengono utilizzate spesso nel codice.
Specifica "utilizzate": lette o anche modificate?
Lette per lo più, modificate sarà cosa rara, sono le due variabili del termostato che voglio rimangano in memoria anche se l'arduino si riavvia.
Cmq ok, ci sono, ho letto come lavora la EEPROM, ci rifletto e metto su qualcosa
la eeprom lavora a celle di byte. un byte può contenere 2^8 valori, ovvero 255. Ma questo se parte da 0, invece se lo usassimo come valore con segno, allora i valori sono da -128 a +127.
Un int, per esempio occupa 2 byte: quindi volendo, usando 2 spazi di memoria, puoi memorizzare valori da -32768 a 32767, oppure, nel caso di un unsigned int, da 0 a 65536...
La variabile byte è unsigned, ovvero solo positivi, ma un char è signed, quindi da -128 a +127, direi sufficiente al tuo scopo.
E' la una di notte lesto
cmq non riguardano ne PROGMEM ne la EEPROM quanto piuttosto le variabili in generale in C.
Magari nei prox giorni apro un topic apposta, accadono cose strane, sicuramente per mia ignoranza
Al max si può prevedere un int che, come ha spiegato lesto, parte da -32768 ed arriva a +32767 per contenere anche una parte decimale. Basta che la temperatura di riferimento venga ad esempio moltiplicata per 10.
Esempio:
vuoi memorizzare -12.5
-12.5*10=-125 -> in memoria
vuoi memorizzare 35.4
35.4*=354 -> dato da memorizzare
Quando recuperi il dato, basta dividere per 10 per riavere il tuo valore.
leo72:
Quando recuperi il dato, basta dividere per 10 per riavere il tuo valore.
Un piccolo consiglio da programmatore esperto, anche se scomodo per noi umani è meglio ragionare in potenze di due per il micro.
Per rappresentare un valore in virgola fissa con gli interi basta moltiplicare, o dividere, per 2-4-8-16 etc tramite operazioni di shift (<< o >>), si ottiene un grosso risparmio di cicli macchina anche lavorando con valori a 16 bit.
Ovviamente il valore contenuto nella variabile sarà pari a quello reale moltiplicato per il valore che abbiamo deciso di usare come base, p.e. se optiamo per 2^4 una temperatura di 20° verrà memorizzata come 20 << 4 = 20*16 = 320 e ogni unità di incremento/decremento vale 1/16 di grado.