[RISOLTO] ATMega328 - Arduino AVR ISP - set fuse

Semplicemente, quando vuoi far cambiare i fuse al micro devi prima caricare il bootloader e poi, sempre con la procedura ISP, lo sketch che ovviamente sovrascriverà il bootloader, se stai usando le mie board virtuali.
La procedura ISP cambia i fuse SOLO se fai l'operazione del bootloader, se invece la usi direttamente per lo sketch i tempi operano in modo stranissimo.
Pag. 54 della Guida:

Nota importante: nelle immagini seguenti vedremo anche la configurazione Arduino-ISP-Breadboard minimal, con la quale si potrà effettuare il caricamento di sketch, ma deve essere ben chiaro che il buon fine di questa tecnica presuppone che il chip abbia già i fuses settati per lavorare a 8MHz o 1MHz; ciò significa, in poche parole, che la prima volta che si prepara un chip a lavorare con una di queste frequenze, l’operazione deve essere fatta o con due Arduino o con Arduino ed una breadboard in configurazione completa, cioè con quarzo, condensatori, ecc.; questo vale sia che il chip sia vergine, sia che il chip abbia già un bootloader standard a 16MHz, con o senza uno sketch.
Inoltre, se una qualsiasi operazione su chip a 8MHz/1MHz non va a buon fine è molto probabile che non si riesca più a programmarlo con la breadboard minimal, bisogna quindi ripartire dal caricamento del bootloader con breadboard standard o con Arduino target.
È bene tener conto di queste indicazioni, diversamente si andrà incontro ad una sicura serie di insuccessi!

Non ti gambizzo perché non tocco roba pelosa, specialmente se di natura maschile :grin:

menniti:
La procedura ISP cambia i fuse SOLO se fai l'operazione del bootloader, se invece la usi direttamente per lo sketch i tempi operano in modo stranissimo.

Perche' mettere in campo le "stranezze" ?

io direi semplicemente che per cambiare i fuse si deve passare per il caricamento del bootloader, anche se il bootloader non ti serve, se carichi solo uno sketch in ISP i fuse restano come erano, non e' che si mettono in condizioni "strane"

Il perche' non si riesce a cambiare i fuse tramite caricamento sketch non e' dato sapere, o almeno per ora nessuno alk mondo lo ha spiegato :slight_smile:

Testato:

menniti:
La procedura ISP cambia i fuse SOLO se fai l'operazione del bootloader, se invece la usi direttamente per lo sketch i tempi operano in modo stranissimo.

Perche' mettere in campo le "stranezze" ?

io direi semplicemente che per cambiare i fuse si deve passare per il caricamento del bootloader, anche se il bootloader non ti serve, se carichi solo uno sketch in ISP i fuse restano come erano, non e' che si mettono in condizioni "strane"

Il perche' non si riesce a cambiare i fuse tramite caricamento sketch non e' dato sapere, o almeno per ora nessuno alk mondo lo ha spiegato :slight_smile:

Se fai le centinaia di prove che ho fatto io le stranezze le vedi eccome! Non c'è un confine netto tra cambiano i fuse/non cambiano i fuse. Esempio se hai un micro impostato a 8MHz interno e ci carichi su uno sketch ISP per un micro a 16MHZ NON hai necessariamente i tempi dimezzati, ed un sacco di cose del genere; a volte fain la stessa manovra due volte ed i valori dei tempi sono completamente differenti; mi è capitato proprio l'altro giorno, mentre testavo il mio Programmatore ISP, di vedere il classico blink in cui l'accensione durava un secondo e lo spegnimento 16 secondi, me la dai una spiegazione tecnica senza tirare in ballo "stranezze"?
Ciò che è certo (e vale solo per la xx8 family) è che il caricamento del bootloader imposta i fuse in base ai valori della board virtuale, ciò che NON è assolutamente certo è cosa succede quando invii uno sketch ISP usando una board virtuale impostat in modo differente dal micro, poco ma sicuro.
Poiché intanto ho terminato anche l'HV Programmer appena ho un po' di tempo voglio provare a leggere i valori dei fuse quando vedo queste "stranezze", per capire se comunque la programmazione ISP di uno sketch non cambi qualcosa anche senza il caricamento del bootloader.

menniti:
Ciò che è certo (e vale solo per la xx8 family) è che il caricamento del bootloader imposta i fuse in base ai valori della board virtuale, ciò che NON è assolutamente certo è cosa succede quando invii uno sketch ISP usando una board virtuale impostat in modo differente dal micro,

Invece la cosa è chiarissima e semplicissima, per scrivere i fuse devi darli sotto forma di comando ad avrdude, p.e. la riga di comando che usa l'IDE 1.0 per caricare il bootloader tramite sketch isp è la seguente:

...\Arduino\arduino-1.0\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -cstk500v1 -P\\.\COM4 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m

Mentre per programmare uno sketch tramite Arduino come isp è la seguente dove non sono indicati i fuse.

..\Arduino\arduino-1.0\hardware/tools/avr/bin/avrdude -CD:\Elettronica\Arduino\arduino-1.0\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -cstk500v1 -P\\.\COM4 -b19200 - flash:w:C:\DOCUME~1\IMPOST~1\Temp\build3418427712630493306.tmp\BlinkWithoutDelay.cpp.hex:i

Generalizzando possiamo dire che se vuoi programmare anche i fuse, validi per il 328, quando invii uno sketch devi aggiungere i seguenti comandi alla riga per avrdude:

-Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m

Dal punto di vista di avrdude caricare il bootloader o uno sketch è la stessa identica operazione.

Quello che dici è scienza esatta, sono prove che abbiamo fatto tante volte con successo; però io sto parlando della programmazione ISP tramite IDE 0022, senza riga di comando; infatti parlo della sola famiglia xx8 in quanto in tutte le altre i fuse sono programmabili SOLO tramite linea di comando.
Usando l'IDE 0022 (parlo di questa versione che è la mia) tu puoi inviare tramite ArduinoISP il bootloader o uno sketch.
Nel primo caso il micro viene programmato con i fuse contenuti nella board settata nell'IDE ed è pronto per ricevere sketch via seriale.
Nel secondo caso lo sketch "danneggia" il bootloader ed infatti lo usiamo solo per circuiti in stand-alone; ma se inviamo uno sketch ad un micro tramite ArduinoISP il micro non prende i fuse della board settata, ma succedono cose disparate. Tutto qui.

menniti:
Nel secondo caso lo sketch "danneggia" il bootloader ed infatti lo usiamo solo per circuiti in stand-alone; ma se inviamo uno sketch ad un micro tramite ArduinoISP il micro non prende i fuse della board settata, ma succedono cose disparate. Tutto qui.

Guarda che la spiegazione è in quello che ho postato prima, se programmi il bootloader da IDE, non importa se 0022 o 1.0, vengono inviati anche i comandi per i fuse, se programmi solo sketch non vengono inviati i comandi per i fuse, se vuoi modificarli devi aggiungere alla riga di comando di avrdude i necessari comandi, e sono validi per tutti i modelli di AVR e non solo per alcuni.

Testato:
Il perche' non si riesce a cambiare i fuse tramite caricamento sketch non e' dato sapere, o almeno per ora nessuno alk mondo lo ha spiegato :slight_smile:

Chi ha progettato l'IDE ha fatto sì che i fuse fossero cambiati solo durante la flashatura del bootloader. Considera che tutto ruota intorno all'Arduino, che è una scheda impostata per lavorare sempre ad una data frequenza, quindi non è necessario impostare il clock al micro tutte le volte che mandi uno sketch, lo fai una volta sola quando metti il bootloader, e poi il chip è pronto all'uso, rimanendo sempre nella configurazione impostata.

Cmq anche caricare uno sketch con avrdude da terminale non altera i fuse, per cambiarli devi espressamente specificarlo. Così come puoi cambiare i fuse al micro SENZA cancellare la flash.

astrobeed:

menniti:
Nel secondo caso lo sketch "danneggia" il bootloader ed infatti lo usiamo solo per circuiti in stand-alone; ma se inviamo uno sketch ad un micro tramite ArduinoISP il micro non prende i fuse della board settata, ma succedono cose disparate. Tutto qui.

Guarda che la spiegazione è in quello che ho postato prima, se programmi il bootloader da IDE, non importa se 0022 o 1.0, vengono inviati anche i comandi per i fuse, se programmi solo sketch non vengono inviati i comandi per i fuse, se vuoi modificarli devi aggiungere alla riga di comando di avrdude i necessari comandi, e sono validi per tutti i modelli di AVR e non solo per alcuni.

Sì, stiamo dicendo la stessa cosa, per me è tutto chiaro.

e no, non e' la stessa cosa, permettimi :slight_smile:

io, astro e leo stiamo dicendo che non ci sono stranezze (in piu' loro hanno chiarito anche il perche')

cioe' l'ide arduino e' programmato appositamente per cambiare i fuse solo con il caricamento bootloader, tu invece riferisci "stranezze"

Volendo, essendo opensource l'ide, si potrebbe modificare in modo da cambiare i fuse anche durante il caricamento di skcetch via ISP

Caspita, la discussione è andata avanti parecchio :slight_smile:
Cmq come dicevo ho risolto, ho provato (a monte della discussione) a scrivere il bootloader, e poi caricare lo sketch... ora funziona tutto, anzi ricordatevi di guardare le foto che posto nel topic di aggiornamento :slight_smile:

menniti:
Semplicemente, quando vuoi far cambiare i fuse al micro devi prima caricare il bootloader e poi, sempre con la procedura ISP, lo sketch che ovviamente sovrascriverà il bootloader, se stai usando le mie board virtuali.

Menny, la tua guida è davvero ottima, la riprova è che una come me - che a dirla tutta nemmeno sapeva bene cosa stava facendo - in un numero limitato di tentativi è riuscita nell'intento.
Al di la di questo, però, secondo me dovresti specificare meglio questa questione nella guida.
Hai fatto uno sforzo notevole per rendere ultra comprensibili tutti i passaggi ma, secondo la mia niubbagine, questa questione è rimasta criptica.
La pagina che hai riportato, che avevo letto, parla di preparare un chip per lavorare a frequenze di 8 o 1 MHz... che non centra molto con il problema che ho avuto io :
Sicuramente per chiunque abbia esperienza quella nota è immediatamente comprensibile, ma per chi ci capisce poco la questione è diversa.
Si compra un chip vergine, il chip vergine è di fabbrica settato ad una frequenza diversa dai 16 canonici di arduino. Non è possibile settare i fuses caricando uno sketch. I fuses possono essere settati solo tramite bootloader.
Se si compra un chip vergine la prima ed obbligatoria operazione per avere i classici 16MHz deve essere mettere il bootloader.
Questa cosa dovrebbe essere scritta a lettere capitali ad inizio guida :stuck_out_tongue:

Ripeto la guida è ottima ma manca una spiegazione chiara su questa questione.
Sempre in my humble opinion :slight_smile:

@ Testato: ho spiegato chiaramente cosa sono le stranezze a cui mi riferisco e le ribadisco: lo stess osketch, caricato diverse volte su diversi chip, settati ad una stessa frequenza, usando una board virtuale con fuse settati per una frequenza diversa, danno comportamenti differenti e STRANI.
Altrimenti SPEGATEMI questo comportamento:
Micro settato a 16MHz (convinto invece che fosse vergine e quindi a 1MHz)
Carico via ISP il blink
Sulla board ISP Programmer il led si accende per 1 secondo, si spegne per 16 secondi, si accende per 1 secondo e così via.
Ho provato a "simulare" questa cosa ripetendo l'"errore" ma stavolta ho avuto un comportamento diverso
Non me li sono segnati, ma di questi comportamenti anomali ne ho visti a decine, e mi riferisco ai tempi in cui facevo prove per la guida.

@ Daniela: prendo atto, ma a mia memoria è la prima volta che qualcuno mi fa questa obiezione, probabilmente perché la prima operazione della Guida è proprio il caricamento del bootloader a 16MHz, quindi magari molti avranno fatto questo test e si saranno trovati bene; comunque appena possibile aggiungo un paragrafetto in cui scrivo chiaramente questa cosa. Tutto è migliorabile, anche la tua attenzione.... :wink:

menniti:
@ Daniela:prendo atto, ma a mia memoria è la prima volta che qualcuno mi fa questa obiezione
Tutto è migliorabile, anche la tua attenzione.... :wink:

Menny... non era un obiezione, non siamo ad un processo :slight_smile:
Riportavo la mia esperienza con la tua guida, sperando ti potesse essere utile.
Non avendo letto nulla che indicasse di seguire un ordine preciso, sono andata liberamente secondo le esigenze :slight_smile:
Tutto qui...

@ Testato: ho spiegato chiaramente cosa sono le stranezze a cui mi riferisco e le ribadisco: lo stess osketch, caricato diverse volte su diversi chip, settati ad una stessa frequenza, usando una board virtuale con fuse settati per una frequenza diversa, danno comportamenti differenti e STRANI.
Altrimenti SPEGATEMI questo comportamento:
comportamenti anomali ne ho visti a decine, e mi riferisco ai tempi in cui facevo prove per la guida.

Ragazzi ma, sembra a me, o c'è un pochino di tensione sul forum ultimamente?
Cmq, se (condizionale!) ho capito quello di cui state parlando... confermo il comportamento strano.
Due chip vergini, caricato lo stesso blink con delay 1000.
Sul primo il led lampeggiava ad intervalli di 18 secondi, sul secondo ad intervalli di 14.
Magari i secondi non saranno precisi, perché li contavo ad occhio, ma la differenza era chiaramente verificabile.

DanielaES:
Ragazzi ma, sembra a me, o c'è un pochino di tensione sul forum ultimamente?

Insomma.... pare anche a me :sweat_smile:

Cmq, se (condizionale!) ho capito quello di cui state parlando... confermo il comportamento strano.
Due chip vergini, caricato lo stesso blink con delay 1000.
Sul primo il led lampeggiava ad intervalli di 18 secondi, sul secondo ad intervalli di 14.
Magari i secondi non saranno precisi, perché li contavo ad occhio, ma la differenza era chiaramente verificabile.

Stiamo parlando di chip SENZA quarzo esterno, programmati per usare l'oscillatore interno?
Allora la risposta è SI'! Ho fatto tempo fa delle prove: ho messo su una breadboard un Tiny85, un Tiny84, un Atmega328 ed un Atmega644, ognuno impostato per operare con l'oscillatore interno e con lo sketch Blink caricato. I risultati? Dopo neanche 5 secondi si vedeva ad occhio nudo uno sfasamento dei lampeggi, dopo 1 minuto ognuno andava come gli pareva :stuck_out_tongue_closed_eyes:
Tieni presente che il margine dell'oscillatore interno è molto elevato, +-10%, quindi dopo 10 secondi hai perso o guadagnato anche 1 secondo rispetto al tempo reale.

non so sul forum, ma fra me e menny non c'e' nessuna tensione, sono cose da maschi, l'avere ragione fino a prova contraria e' insita nel maschio, chi piu' chi meno, ma di certo e' molto forte in Tecnici e Professori.

sia leo, e secondo me anche daniela, dovrebbero saperlo :stuck_out_tongue_closed_eyes:

1 Like

per quanto riguarda le prove fatte quelli di daniela si spiegano come ha detto leo, mentre quelli di Michele restano davvero "stranezze" perche' riferisce differenze tra on e off a parita' di delay.
servirebbero dei test :slight_smile:

Testato:
non so sul forum, ma fra me e menny non c'e' nessuna tensione, sono cose da maschi, l'avere ragione fino a prova contraria e' insita nel maschio, chi piu' chi meno, ma di certo e' molto forte in Tecnici e Professori.

Mah.... :slight_smile:

sia leo, e secondo me anche daniela, dovrebbero saperlo :stuck_out_tongue_closed_eyes:

Credo di essere l'unico, qui, che crede che la Dany sia appunto una "lei".... :cold_sweat:

@ Daniela: non è facile comunicare solo per iscritto, io quando parlo (e perfino quando scrivo), uso molto la mimica facciale, cosa che peraltro mi torna utilissima durante le mie lezioni; quindi mi rendo conto che una frase si può interpretare in diversi modi, magari in base al proprio stato d'animo... Io non ho preso il tuo intervento come una critica, non ho inteso rispondere ad una critica; cioè, letto il tuo suggerimento ho tenuto a precisare che era la prima volta che mi arrivava una nota del genere in quanto molti altri sono riusciti senza problemi; ciò non significa che la spiegazione sia perfetta e quindi ho detto che era migliorabile, ma nel contempo ho voluto scherzosamente scaricare sulla tua disattenzione un po' di "colpe". Poi tu invece vedi tutto sotto tensione (Ragazzi ma, sembra a me, o c'è un pochino di tensione sul forum ultimamente?) e quindi hai dato la tua interpretazione tutto qui.

leo72:

Testato:
non so sul forum, ma fra me e menny non c'e' nessuna tensione, sono cose da maschi, l'avere ragione fino a prova contraria e' insita nel maschio, chi piu' chi meno, ma di certo e' molto forte in Tecnici e Professori.

Mah.... :slight_smile:

confermo quanto detto da Testato, abbiamo un ottimo rapporto, intra ed extra-forum, ma da quando abbiamo scoperto i nostri rispettivi ruoli nella vita ovviamente è partita l'atavica sfida, e non c'è niente da fare, è più forte di noi, aggiungi inoltre che siamo due capetoste (come dicolo loro... :stuck_out_tongue_closed_eyes:), che non mollano facilmente la preda (oops, le proprie ragioni). Però vedo che finalmente lui ha capito che la storia del delay è assolutamente anomala :sweat_smile:

Credo di essere l'unico, qui, che crede che la Dany sia appunto una "lei".... :cold_sweat:

più che una certezza la tua è una speranza ormonale :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

menniti:
@ Daniela:
più che una certezza la tua è una speranza ormonale :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

:*
Più che altro, facciamo una domanda seria:
Credete sia possibile uppare uno sketch in standalone con l'IDE 1.0?
Al momento ho lavorato per la retrocompatibilità, tutti i codici vanno sia sulla 22 che sulla 1 (con le opportune lib modificate). Però per uppare uno standalone sono legata all'ide 22 e quindi anche agli sketch della 22.
Alternativamente potrei flashare il bootloader con la 22 e caricare gli sketch dalla 1 con il convertitore usb seriale quando mi arriva. Però mi chiedevo, è in programma il porting della guida sul IDE 1?

Francamente, essendo uno con pochissimo tempo a disposizione, faccio gli upgrade molto a rilento, per cui sto alla larga dalla 1.0 in quanto ho letto di vari problemini, di cui in questo momento non sento assolutamente la mancanza :sweat_smile:
E' il motivo per cui per il momento non credo di poter creare una versione nuova della Guida se non per apportare modifiche o implementazioni di qualche novità scovata dopo la sua pubblicazione.
Ma tu stai dicendo che la tecnica ISP non funziona con IDE 1.0? Ora non ricordo bene ma mi pare che Astrobeed dicesse che addirittura in tal senso c'erano state migliorie (se non sbaglio parlava dell'autoreset).

menniti:
Ma tu stai dicendo che la tecnica ISP non funziona con IDE 1.0? Ora non ricordo bene ma mi pare che Astrobeed dicesse che addirittura in tal senso c'erano state migliorie (se non sbaglio parlava dell'autoreset).

Diciamo che ho fatto solo una prova e probabilmente l'ho fatta all'ugello di canide.
Ho provato a modificare il file board dell'ide 1.0 con le stesse modifiche per la 22... Non funziona, quantomeno non come dovrebbe. Probabilmente la sintassi è un po' diversa :slight_smile:
Una volta visto che la board standalone nemmeno mi compariva nell'elenco board, ho lasciato perdere.

Mettero i bootloader con la 22 e poi userò la 1 con il convertitore usb seriale :stuck_out_tongue: