come quasi ogni giorno sto smadonnado pesantemente per capire dove sbaglio,
sto provando uno sketch che prevede un menù gestito con 4 bottoni e come in ogni menù che si rispetti è prevista la funzione "settings".
Nella funzione settings vado a scrivere sulla EEPROM delle variabili di configurazione dello sketch generale e fino a qui nessun problema. Tolgo l'alimentazione e la rimetto e le variabili sono sempre quelle che ho salvato prima.
Dato che ho un atmega 328-PU montato su una millefori, io carico lo sketch tramite programmatore ISP, in particolare l UsbTinyISP. Quando vado a modificare lo sketch per un motivo o per un altro e lo ricarico sul micro mi ritrovo tutte le var a 255.
perchè? Per caso quando vado a fare il "Carica con un programmatore" resetto anche tutta la eeprom?
In particolare adesso sto provando queste funzioni sull' address 0, non so se è di aiuto, magari provo a cambiare address!
per ora sto provando con una variabile piccola (<255)
In realtà la cosa potrebbe dipendere dal settaggio dei fuse (High Byte Fuses, Bit 3, EESAVE) che può essere così descritto :
When the ATmega chip is programmed the memory is erased just before the new code is uploaded. Under normal circumstances the eeprom memory is erased as well as the program memory. The EESAVE fuse can be used to tell the chip not to erase the eeprom. This is useful when you want to upgrade code but keep user settings that are stored in eeprom.
The default value is EESAVE=1, (not set) and eeprom memory is erased during the chip erase cycle when programming.
per memorizzare un dato fino a 65280 mi sono scritto questa cosa
val_h = val/255
val_l = val%255
questi due valori li metto in due address distinti e quando voglio richiamare il mio valore faccio
val_h*255+val_l
secondo voi è una cosa utile? oggi mi ci sono scervellato un po' sopra ma alla fine sono arrivato a questa conclusione per immagazzinare dei valori più grandi di 255 sfruttando meno address possibili
per valori ancora più grandi penso che dovrei fare
per memorizzare un dato fino a 65280 mi sono scritto questa cosa
val_h = val/255
val_l = val%255
Oltre ad usare le apposite funzioni della avrlibc per memorizzare sulla EEPROM, molto comode perché ci pensano loro ad organizzare i dati come serve, per scomporre un valore maggiore di un byte in singoli byte un modo elegante, oltre che leggero per la cpu, è usare lo shift.
byte a;
int b;
a = b; // grazie al casting a contiene solo il byte low di b
a = b>>8; // ora a contiene il byte alto di b
-------------
byte a;
long int b;
a = b;
a = b>>8;
a = b>>16; // ora a contiene il terzo byte di b
a = b>>24; // ora a contiene il quarto byte di b
Scusate l'ignoranza, ho provato a buttare giù due righe di prova.
Probabilmente ho anche sbagliato qualcosa...
#include <avr/eeprom.h>
uint8_t EEMEM value = 150; //alloco una porzione di EEPROM e le assegno il valore 150
void setup(){
Serial.begin(9600);
eeprom_write_byte((uint8_t*)value,value); //vado a scrivere il valore nella cella col puntatore a value
}
void loop(){
if(eeprom_is_ready()){
int v = eeprom_read_byte((uint8_t*)value); //vado a leggere nella cella
Serial.println(v);
}
}
da quello che ho capito con la funzione EEMEM si assegna gli indirizzi da solo in fase di compilazione, quindi ho delle variabili in meno da gestire. non ho capito se la sto usando bene oppure ho fatto una cavolata!