Go Down

Topic: "residuati bellici" (Read 3 times) previous topic - next topic

gingardu

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 cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

BrainBooster

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

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

gingardu

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72


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.

Michele Menniti

#5
Sep 29, 2012, 03:32 pm Last Edit: Sep 29, 2012, 03:38 pm by Michele Menniti Reason: 1

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:
Quote
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... :smiley-roll-sweat:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

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

leo72

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.

gingardu


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  :smiley-eek:

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

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,
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

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  :smiley-eek:

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.

pelletta


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?

leo72


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.

gingardu

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

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

Io ti ho detto come faccio. Ecco un esempio in concreto:
Code: [Select]
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.

Go Up