ATtiny 2313 e HV programming, tutti in sciopero

@Pelletta e Mike:
sì, abbiamo già parlato dell'erase della EEPROM ed abbiamo visto che l'erase della EEPROM è una operazione che viene eseguita solo per 2 motivi:

  1. esplicita richiesta tramite il parametro "-e"
  2. scrittura su EEPROM (-U eeprom:.....)
    Solo nel caso in cui sia richiesta una scrittura su una memoria, avrdude esegue preventivamente l'erase della stessa.
    Il caricamento di uno sketch non cancella la EEPROM perché scrive solo sulla Flash e l'IDE non passa il parametro "-e" perché si parte dal presupposto che l'utente abbia potuto salvare dei dati o delle configurazioni.

x iscrizione

astrobeed:

[quote author=Michele Menniti link=topic=128007.msg963094#msg963094 date=1350668378]
Perché il chip pancia all'aria no? ROTFL XD magari una volta che non funzionava il magnete gli diceva di passarci sopra con un cotton fioc e fargli "viriviriviri" per farlo sbellicare dalle risate :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Giusto per la cronaca, mi sono ispirato alla tecnica "tonic immobility" che viene utilizzata con gli squali, se li metti a pancia in su entrano in uno stato catatonico e puoi fargli quello che ti pare senza pericolo, ovviamente la puoi mettere in pratica solo con gli squali piccoli perché voglio proprio vedere come si fa con un bestione famelico di qualche metro :smiley:
[/quote]
ah, ti mangia e l'unico ricordo che resta di te è la calamita :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

ah, ti mangia e l'unico ricordo che resta di te è la calamita :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:
[/quote]
No, lo squalo mangia anche quella :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

La "tonic immobility" funziona anche sulle galline e sugli alligatori

Ti confermo con una curiosita' che non molti conoscono, nella eeprom di Arduino c'e' un bel numero di serie, e ti rimane intatta sempre fino a che non la cancelli definitivamente.
Se sul tuo non hai mai usato/cancellato la eeprom ci sara' ancora scritta dentro, prova a fare un print della eeprom e vedi

Testato:

[quote author=Michele Menniti link=topic=128007.msg963413#msg963413 date=1350684416]
qualcuno dice che programmando Arduino via IDE l'EEPROM resta intatta,

Ti confermo con una curiosita' che non molti conoscono, nella eeprom di Arduino c'e' un bel numero di serie, e ti rimane intatta sempre fino a che non la cancelli definitivamente.
Se sul tuo non hai mai usato/cancellato la eeprom ci sara' ancora scritta dentro, prova a fare un print della eeprom e vedi
[/quote]
Non è un numero di serie, bensì un contatore a 32 bit (occupa gli ultimi 4 byte della memoria) in cui viene scritto il numero di erase della Flash così da sapere quante volte è stata aggiornata la memoria.
Non è una caratteristica di Arduino ma di avrdude. Si tratta del parametro "-y". C'è anche la possibilità di scrivere quel valore qualora mancasse usando il parametro "-Y".

bella questa,
ma quindi e' un parametro che passa l'ide di arduino stessa ?
perche' dopo aver cancellato la eeprom non riinizia a contare da solo ? (e' giusto che non lo faccia altrimenti potrebbe creare problemi ad un porprio codice, ma chi gli dice di non farlo piu' dopo un erase ?)

Credo che i primi 2 byte rappresentino una sorta di firma per cui se non li trova, avrdude ignora quelle celle di memoria, nel caso ad esempio che l'utente abbia necessità di tutta la EEPROM. Gli altri 2 byte contengono invece il contatore vero e proprio. Sapendo che una Flash regge circa 10.000 riscritture, un contatore a 2 byte (65536 valori) è più che sufficiente.

Per completezza, con l'opzione "-e", che fa l'erase di Flash ed EEPROM, il contatore viene salvato prima della cancellazione della memoria, incrementato e poi riscritto sul micro.

quindi senza saperlo, perche' nessuno lo ha mai messo in luce questo fatto, "consumiamo sia cicli di riscrittura flash che eeprom" :slight_smile:

Perché è una cosa che può essere cancellata dall'utente scrivendo sulla EEPROM fino a quelle celle.
E poi, alla fine, non tutti flashano con la mia intensità ]:smiley: :stuck_out_tongue_closed_eyes:

PS:
comunque mi pare l'Arduino ultimamente non aggiorni più quel valore. Ho fatto un test impostando il contatore a 100 ma, dopo una flashatura, il contatore registra ancora 100.

hai trovato un bug del nuovo ide ?

Ho studiato un poco, perché non mi faccio ancora convinto :smiley:
1 - Il Chip_Erase cancella solo la flash o solo l'EEPROM o entrambe in base a cosa si sta per scrivere, poi resetta i lock bits, giusto?
2 - Però nel manuale di AVRDUDE (opzione -e) c'è scritto "This will reset the contents of the flash ROM and EEPROM to the value ‘0xff’, and clear all lock bits"
3 - Il data-sheet del 328P dice "The Chip Erase will erase the Flash and EEPROM(1) memories plus Lock bits. The Lock bits are not reset until the program memory has been completely erased. The Fuse bits are not changed. A Chip Erase must be performed before the Flash and/or EEPROM are reprogrammed.
Note: 1. The EEPROM memory is preserved during Chip Erase if the EESAVE Fuse is programmed."

Infatti: "Fuse bit EESAVE 0 (programmed): EEPROM memory is preserved through the Chip Erase"

Cioè, e da qui la mia convinzione nel periodo in cui scrissi il lavoro sul programmatore HV, da nessuna parte è scritto di questa cancellazione parziale (solo flash) a meno che non si debba scrivere qualcosa sulla EEPROM; dappertutto sembra che la cancellazione avvenga su entrambe e punto.

Ora Leo sostiene che il -e cancella l'EEPROM ed a me risulta che ANCHE l'IDE esegue un Chip_Erase prima di riprogrammare un micro, e NON esistono svariate opzioni di Chip_Erase quindi, a rigore, se nella riga di comando AVRDUDE non ci sono istruzioni di scrittura della EEPROM, il -e NON dovrebbe toccare questa memoria, altrimenti qui i conti non tornano.

Ma…. sempre nel manuale di AVRDUDE si legge "Note that in order to reprogram EEPROM cells, no explicit prior chip erase is required since the MCU provides an auto-erase cycle in that case before programming the cell". Quindi teoricamente il comando Chip_Erase potrebbe non cancellare preventivamente l’EEPROM perché è il micro stesso che ci pensa prima di riscriverla. Ovviamente se uno volesse cancellare la EEPROM senza dover riscriverci nulla quest’ultima funzionalità non servirebbe a nulla.

Spunti di riflessione……

La cancellazione eseguita con "-e" viene effettuata su entrambe le memorie, Flash ed Eeprom (oltre ai lock bit). E su questo siamo d'accordo.
C'è da dire una cosa, che si legge nel manuale di avrdude. Quando si scrive sulla Flash con -U flash:ecc..., il programma esegue un erase automatico del chip. Per evitare che l'operazione azzeri la EEPROM l'IDE passa il parametro "-D" (basta vedere il verbose dell'output durante l'upload), che impedisce proprio ad avrdude di cancellare la EEPROM.

-D Disable auto erase for flash. When the -U option with flash memory is specified, avrdude will perform a chip erase before starting any of the programming operations, since it generally is a mistake to program the flash with?out performing an erase first. This option disables that.

Leo ma dove lo leggi che -D NON cancella l'EEPROM? Io sto capendo che parla solo della flash, che l'autoerase è disabilitato ma se è attiva l'opzione -U il chip erase viene eseguito lo stesso perché è richiesto obbligatoriamente

Uh oh... ho letto male.... :astonished:

Disable auto erase for flash

Sarà l'ora mista ad un leggero stato di inca@@atura per problemi miei che mi hanno fatto prendere fischi per fiaschi.

Scusate.

Ma figurati, quindi la questione resta aperta. Le prove fatte da voi (io non ho mai usato l'EEPROM, né interna, né esterna) dicono che il Chip Erase dell'IDE non cancella l'EEPROM, la quale, a questo punto, viene preventivamente cancellata dalla stessa MCU, quando intercetta un comando di scrittura su di essa. Allora tutto ciò che è scritto sia in AVRDUDE che nei Reference è falso; ma nel Reference c'è la scusante che il comando Chip_Erase viene associato alla programmazione HV, quindi dovrei provare a scrivere qualcosa in una EEPROM del micro, dare un Chip_Ersase con il mio Programmatore HV e riferificare il contenuto. Ma resta il "mistero" di AVRDUDE.
Qualcuno ha da fornire chiarimenti provati?

Confermo, se carichi un nuovo sketch la EEPROM rimane inalterata, del resto è una entità fisica distinta dalla flash e richiede una diversa procedura, a livello hardware, per poter essere letta/scritta.

Ma resta il "mistero" di AVRDUDE.

Quale sarebbe il mistero di AvrDude ? Lui fa quello che gli dici.
L'opzione -U di AvrDude permette di alterare a piacere sia la Flash che l'EEPROM che i FUSE:
"-U :r|w|v:[:format]:" dove al posto di memtype ci si mette flash o eeprom o hfuse, lfuse o efuse, r,w,v stanno per read, write, verify, ovviamente filename è il nome del file da utilizzare per leggere/scrivere i dati e format è il formato del file, tipicamente i per il classico .hex intel.
L'opzione -e di AvrDude si limita a dare il comando chip erase e quello che viene realmente fatto dipende solo dal micro su cui stiamo lavorando, sugli ATmega 328 c'è il fuse EESAVE, bit 3 di HighFuse, che preserva la EEPROM dalla cancellazione quando usato questo comando, su Arduino tale fuse non è settato pertanto se arriva un comando chip erase anche la EEPROM viene cancellata.

Quindi ricapitolando se ho capito
. Ide arduinica spara sempre il -e ad avrdude
. Ide arduinica spara anche il -y per aggiornare il conteggio in eeprom
. Avrdude furbo, sapendo che con -e perderebbe il conteggio presente in eprom, prima salva i dati della eprom e poi aggiorna il contatore e lo riscrive.

Quindi la eeprom viene cancellata, ma poi anche riscritta ?
E non solo per questa sezione conteggio ma per tutto il contenuto, perche anche i dati utenti non si perdono ?

Astro nel tuo discorso vi e' contraddizione.
Visto che il -e cancella la eeprom in quanto non protetta dal fuse, caricando uno sketch perche non si perdono i dati utente?