Go Down

Topic: "Carica con un programmatore" resetta la EEPROM? (Read 1 time) previous topic - next topic

Calamaro

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)


uwefed

Mi é nuovo che la programmazione ISP cancellasse la EEPROM.

Ciao Uwe

Calamaro

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

Code: [Select]

#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);

gpb01

In realtà la cosa potrebbe dipendere dal settaggio dei fuse (High Byte Fuses, Bit 3, EESAVE) che può essere così descritto :

Quote
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
Search is Your friend ... or I am Your enemy !

Calamaro

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

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

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_1*255^2+val_2*255+val_3

giusto?

gpb01

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

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

Guglielmo
Search is Your friend ... or I am Your enemy !

Calamaro

#7
Apr 25, 2015, 11:24 pm Last Edit: Apr 25, 2015, 11:30 pm by Calamaro
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!

gpb01

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

Guglielmo

P.S.: E scoprirai che ti risolve anche l'N-esimo+1 problema :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:
Search is Your friend ... or I am Your enemy !

uwefed

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

astrobeed

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.

Code: [Select]

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
Scientia potentia est

Calamaro

#11
Apr 26, 2015, 11:37 am Last Edit: Apr 26, 2015, 11:40 am by Calamaro
Scusate l'ignoranza, ho provato a buttare giù due righe di prova.
Probabilmente ho anche sbagliato qualcosa...

Code: [Select]

#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!

Go Up