Offline
God Member
Karma: 6
Posts: 551
|
 |
« on: September 29, 2012, 05:21:38 am » |
ma e una mia impressione che mettendo uno sketch nuovo qualche residuo dei vecchi sketch rimane,
tipo scrittura eeprom
c'è qualche opzione da spuntare/sistema per cancellare davvero tutto?
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2955
The quieter you become, the more you can hear
|
 |
« Reply #1 on: September 29, 2012, 05:52:43 am » |
le memorie non volatili trattengono i dati scritti fino a nuova scrittura/cancellazione, quindi mi sà che è normale
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16132
+39 349 2158303
|
 |
« Reply #2 on: September 29, 2012, 06:43:03 am » |
L' eeprom durante l' upload non viene toccato. Lo sketch viene scritto nella flash. Tutto quello che era nella EEprom e credo anche la parte che non viene sovrascrittto dal nuovo Sketch, se questo ´piú piccolo di quello precedente rimangono. Non dovrebbero esserci problemi in questo.
Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 551
|
 |
« Reply #3 on: September 29, 2012, 06:51:47 am » |
ok se rimane flash scritta "invisibile" che mai influenzera lo sketch attuale fa nulla, per la eeprom provvederemo con uno scketch automatico che porta a zero tutti i valori
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #4 on: September 29, 2012, 08:28:51 am » |
per la eeprom provvederemo con uno scketch automatico che porta a zero tutti i valori
Non scrivere inutilmente sulla EEPROM. Come la Flash, non ha riscritture infinite: la EEPROM è data per 100.000 riscritture. Se fai uno sketch che ogni volta che si avvia cancella la EEPROM rischi di ridurre la sua vita utile molto velocemente.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 389
Posts: 10559
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #5 on: September 29, 2012, 08:32:01 am » |
L' eeprom durante l' upload non viene toccato. Lo sketch viene scritto nella flash. Tutto quello che era nella EEprom e credo anche la parte che non viene sovrascrittto dal nuovo Sketch, se questo ´piú piccolo di quello precedente rimangono. Non dovrebbero esserci problemi in questo.
Ciao Uwe
Però a me questa cosa non suona bene. Il settaggio dei Fuse di Arduino UNO FF-DE-05, in particolare il DE, lascia il bit "Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]" a 1, cioè non attivo, quindi il Chip Erase dovrebbe ogni volta cancellare sia la flash che la EEprom. Il Chip Erase è un comando che AVRDUDE esegue automaticamente ad ogni esecuzione. Dall'IDE non c'è modo di fermarlo, da linea di comando c'è l'opzione -D per evitare che venga eseguito. nelle note di AVRDUDE si legge: Note that in order to reprogram EERPOM cells, no explicit prior chip erase is required since the MCU provides an auto-erase cycle in that case before programming the cell. Quindi qualcosa non torna... 
|
|
|
|
« Last Edit: September 29, 2012, 08:38:56 am by Michele Menniti »
|
Logged
|
|
|
|
|
Marche
Offline
Edison Member
Karma: 25
Posts: 2085
|
 |
« Reply #6 on: September 29, 2012, 08:36:44 am » |
Non capisco comunque la preoccupazione dei vecchi dati che possono rimanere sulla eeprom. Se nel nuovo sketch non ti serve accederci non c'è problema, se la usi invece prima di leggere la eeprom dovrai scriverla immagino...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #7 on: September 29, 2012, 08:47:01 am » |
Ogni volta che viene eseguita una scrittura su una determinata memoria, avrdude provvede alla sua cancellatura. Leggete bene: "ogni volta che viene eseguita una scrittura su una DETERMINATA memoria". Quindi, se si scrive sulla Flash, PRIMA essa viene cancellata e poi ci viene scritto sopra il nuovo contenuto. Avrdude permette di leggere e scrivere su qualunque memoria del microcontrollore: basta specificare la memoria con il parametro "-U". Se però si scrive uno sketch, viene passato solo il contenuto della Flash e viene invocata la scrittura (con relativa cancellazione) solo della Flash. Per leggere e scrivere sulla EEPROM si deve specificare "-U eeprom:ecc....". Ma l'IDE passa il contenuto solo della Flash. Ecco perché la EEPROM non viene toccata quando si carica uno sketch. Se non ricordo male, infatti, nelle ultime 2 locazioni della EEPROM gli Atmega montati sugli Arduino una volta riportavano una coppia di caratteri (non mi ricordo per cosa) che, anche dopo 100 caricamenti di sketch, erano sempre lì.
Se invece si vuole piallare il chip va specificato il parametro "-e", che è l'unico che formatta ogni tipo di memoria del microcontrollore prima di effettuare una successiva riscrittura.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 551
|
 |
« Reply #8 on: September 29, 2012, 09:00:49 am » |
Non capisco comunque la preoccupazione dei vecchi dati che possono rimanere sulla eeprom. Se nel nuovo sketch non ti serve accederci non c'è problema, se la usi invece prima di leggere la eeprom dovrai scriverla immagino...
strano che dici una cosa del genere  se salvi una "taratura" "correzione" (che so numero da aggiungere o sottrarre) in modo che all'accensione sia tutto ok e bello tarato, va bene se invece c'è qualcosa di scritto potrebbero sorgere problemi, poi dipende da applicazione ad applicazione alcune semplicemente partono sempre col scriverla la memoria ed in questo caso non ci sono problemi, alcune altre applicazioni viene detto di leggerla magari nel setup comunque basta sapere che le scritte rimangono e se necessario si prendono provvedimenti
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Offline
God Member
Karma: 6
Posts: 551
|
 |
« Reply #9 on: September 29, 2012, 09:13:48 am » |
Allora:_ scriviamo (chi ha esperienza) uno sketch "sicuro"  che ci scriva zero su tutte le memorie UNA VOLTA SOLA che una volta finito nel serial monitor scriva tutte le memorie messe a zero,
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Marche
Offline
Edison Member
Karma: 25
Posts: 2085
|
 |
« Reply #10 on: September 29, 2012, 09:15:44 am » |
Non capisco comunque la preoccupazione dei vecchi dati che possono rimanere sulla eeprom. Se nel nuovo sketch non ti serve accederci non c'è problema, se la usi invece prima di leggere la eeprom dovrai scriverla immagino...
strano che dici una cosa del genere  se salvi una "taratura" "correzione" (che so numero da aggiungere o sottrarre) in modo che all'accensione sia tutto ok e bello tarato, va bene se invece c'è qualcosa di scritto potrebbero sorgere problemi, poi dipende da applicazione ad applicazione alcune semplicemente partono sempre col scriverla la memoria ed in questo caso non ci sono problemi, alcune altre applicazioni viene detto di leggerla magari nel setup comunque basta sapere che le scritte rimangono e se necessario si prendono provvedimenti @Gingardu: continuo a non vedere il problema. Situazione di esempio: nel setup devi leggere la prima cella della eeprom perchè c'è un valore di configurazione che ti serve. Quando fai l'upload dello sketch la prima volta lo fai scrivere tu (sovrascrivendo così vecchi valori); successivamente togli la scrittura nel setup e ricarichi lo sketch. Funzionerà tutto. Cambi applicazione e qui non ti serve usare la eeprom. Se nella prima cella della eeprom c'è il dato di prima poco importa tanto non ci accedi.
|
|
|
|
|
Logged
|
|
|
|
|
Marche
Offline
Edison Member
Karma: 25
Posts: 2085
|
 |
« Reply #11 on: September 29, 2012, 09:18:12 am » |
Allora:_ scriviamo (chi ha esperienza) uno sketch "sicuro"  che ci scriva zero su tutte le memorie UNA VOLTA SOLA che una volta finito nel serial monitor scriva tutte le memorie messe a zero, Lo 0 è un valore come un altro, come puoi stare sicuro che 0 non ti darà problemi mentre il valore 100 si?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #12 on: September 29, 2012, 09:18:17 am » |
se salvi una "taratura" "correzione" (che so numero da aggiungere o sottrarre) in modo che all'accensione sia tutto ok e bello tarato, va bene se invece c'è qualcosa di scritto potrebbero sorgere problemi,
Basta usare un carattere di controllo scritto in una determinata locazione della EEPROM e verificare se quel carattere, all'avvio, c'è oppure no: se non c'è, si scrivono i dati di "default", se c'è si leggono quelli memorizzati. Se vuoi esser certo che sulla EEPROM non ci sia nulla, ti scrivi un piccolo sketch che metta a $00 tutte le celle, lo lanci 1 volta e poi scrivi il tuo programma e sei a posto.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 551
|
 |
« Reply #13 on: September 29, 2012, 09:29:17 am » |
ma se lo metto nel set uptipo scrivi zero eeprom 00
in un ciclo for fino a 1023 lo esegue solo una volta senza far danni anche se si trova nel setup
poi quando a finito carico uno sketch inoocuo tipo il blink
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #14 on: September 29, 2012, 09:36:03 am » |
In questo modo non appena togli l'alimentazione e la rendi, il programma riformatta la EEPROM e tu perdi le regolazioni salvate  Io ti ho detto come faccio. Ecco un esempio in concreto: void controllaInizializzazione() { byte valore[5]; int i; //leggo la EEPROM interna for (i=0; i<5; i++) { valore[i]=EEPROM.read(i+INDIRIZZO_EEPROM); delay(5); } //il dispositivo è stato inizializzato? if (valore[0]!=0xBA) { //no. valore[0]=0xBA; //codice di controllo valore[1]=highByte(410); //valore iniziale per il CO valore[2]=lowByte(410); valore[3]=highByte(210); //valore iniziale per il CH4 valore[4]=lowByte(210); //li scrivo nella EEPROM for (i=0; i<5; i++) { EEPROM.write(i+INDIRIZZO_EEPROM, (byte)valore[i]); delay(5); } } //imposto le soglie di allarme maxCO=((valore[1]<<8) | valore[2]); maxCH4=((valore[3]<<8) | valore[4]); }
In questo modo se non trovo il carattere di controllo, scrivo i dati di default, se lo trovo li carico.
|
|
|
|
|
Logged
|
|
|
|
|
|