"Carica con un programmatore" resetta la EEPROM?

Buongiorno a tutti,

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)

Mi é nuovo che la programmazione ISP cancellasse la EEPROM.

Ciao Uwe

uwefed:
Mi é nuovo che la programmazione ISP cancellasse la EEPROM.

Ciao Uwe

eh era una domanda perchè probabilmente o sbaglio io oppure c'è qualcosa che non torna...

ho scritto uno sketch stupidissimo per buttare una variabile su eeprom e poi andarla a rileggere con il mio sketch originale

#include <EEPROM.h>

void setup(){
EEPROM.write(0,10);
delay(1000);
}

void loop(){}

quando vado a caricare lo sketch grosso sull atmega mi legge la variabile memorizzata all'address 0 come 255.

sicuramente non ho ben compreso io come funziona la eeprom,per leggere uso

value = EEPROM.read(0);

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.

Guglielmo

ecco allora ho ragione :smiley: vedrò di modificare i fuses senza fare troppi casini. Grazie mille :D:D:D

un'ultima cosa stupida e veloce...

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

val_1 = val/(255^2)
val_2 = (val%255^2)/255
val_3= (val%255^2)%255

val = val_1255^2+val_2255+val_3

giusto?

Ma usare le funzioni di base che ti mette a disposizione la libreria AVR libc (... che è altamente ottimizzata) no ? ? ? :smiling_imp:

In particolare, per la gestione della EEPROM, hanno funzioni per salvare e leggere di tutto e di più ... QUI !

Guglielmo

eh... ahahahaha

era la mia prima volta con la eeprom, volevo che fosse speciale ahahahahahahahaha

no dai apparte scherzi, ho cercato a giro una cosa del genere ma ho cercato male evidentemente.
Grazie mille caro!

mi hai risolto lim x -> 0+ n^(1/x) problemi!

per usare sto ben di dio di funzione basta fare

#include <avr/eeprom.h>

ho le lacrime agli occhi! menomale che tra poco esco, sennò ci faccio nottata!

Tieni, studiati l'allegato che ti può essere utile :smiley: :smiley: :smiley:

Guglielmo

P.S.: E scoprirai che ti risolve anche l'N-esimo+1 problema :grin: :grin: :grin:

EEPROM.pdf (181 KB)

secondo me devi usare il numero 256 e non 255.
Ciao Uwe

Calamaro:
un'ultima cosa stupida e veloce...

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!