PROGMEM

Già che ci siamo... facciamo anche questa domandina :slight_smile:
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.

Un po' di documentazione la trovi anche sul sito di Arduino: PROGMEM - Arduino Reference

Ma scusate una cosa. Forse ho capto male io.

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.

Ciao Uwe

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

son 56 byte (memore della ns. chiacchierata!)

leo72:

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 :slight_smile:

Anzi, una domanda ce l'ho.
E' solo teorica perché all'atto pratico a me non serve.

// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.

valori da 0 a 255? e se io volessi metterci un -3?

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.

Mumble, più o meno ci sono anche se mi vengono in mente strane domande.

esprimile, vediamo che ci caviamo fuori :slight_smile:

E' la una di notte lesto :open_mouth:
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 :slight_smile:

l'una e mezzo ormai... meglio andare a nanna :grin:

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.