"residuati bellici"

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?

le memorie non volatili trattengono i dati scritti fino a nuova scrittura/cancellazione, quindi mi sà che è normale

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

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

GINGARDU:
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.

uwefed: 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... :cold_sweat:

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...

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.

Pelletta: 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 :astonished:

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

Allora:_

scriviamo (chi ha esperienza) uno sketch "sicuro" 8)

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,

GINGARDU:

Pelletta: 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 :astonished:

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.

GINGARDU: Allora:_

scriviamo (chi ha esperienza) uno sketch "sicuro" 8)

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?

GINGARDU: 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.

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

In questo modo non appena togli l’alimentazione e la rendi, il programma riformatta la EEPROM e tu perdi le regolazioni salvate :stuck_out_tongue:

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.

ma questo sketch memorizza zero (una volta sola ) su tutte le 1000 memorie?

No, non serve andare a scrivere sulle celle che non uso. Questa porzione di sketch fa quel che ti dicevo inizialmente. Controlla la presenza o meno di un carattere di controllo.

no non intendo di cancellare/sovrascrivere per sbaglio,

intendo proprio, voglio mettere a zero tutte le memorie (tutte non solo quelle che usero) anche se l'atmega è nuovo intendo proprio farlo apposta, (una specie di formattazione) prima di caricare un tipo di sketch

che qualsiasi cella di memoria provo a leggere da zero

c'è un sistema "rapido" o devo cancellare cella per cella :fearful:

Se l'operazione è "una tantum" puoi eseguirla da riga di comando AVRDUDE, mi pare che ti abbia già scritto Leo l'opzione da usare.

EDIT: è l'opzione "-e":

-e Causes a chip erase to be executed. This will reset the contents of the flash ROM and EEPROM to the value ‘0xff’, and clear all lock bits. Except for ATxmega devices which can use page erase, it is basically a prerequisite command before the flash ROM can be reprogrammed again. The only exception would be if the new contents would exclusively cause bits to be programmed from the value ‘1’ to ‘0’. 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.

però come vedi resta sempre il solito principio per cui ATMEL dice che 0=programmato e 1=non programmato, quindi per cancellazione totale si intende porre tutto a "1" e non a "0".

Appunto, ma vedo che non vengo letto :stuck_out_tongue_closed_eyes: