Dato che l'ATmega 328p, ma anche il 168, è previsto per una frequenza di clock fino a 20 Mhz ecco come modificare Arduino per ottenere il massimo delle prestazioni.
Piccola premessa, il software allegato è da considerarsi una "release candidate 1.0" pertanto è possibile che dia origine a problemi imprevisti e malfunzionamenti di varia natura, sebbene ampiamente testato non posso garantire al 100% che funzioni tutto sempre e comunque.
Per effettuare la modifica la prima cosa da fare è caricare sull'ATmega il bootloader modificato che trovate all'interno del file zip allegato, potete usare la tecnica che preferite non ci sono particolari vincoli.
Il file .hex da caricare si trova all'interno della cartella "Arduino_20" che dovete copiare nella cartella "bootloaders" dell'IDE, stessa cosa per il file boards.txt che dovete copiare al posto di quello originale, prima fate una copia di quest'ultimo.
Fatte le modifiche all'IDE e caricato il bootloader 20 MHz sull'ATmega installatelo su una board dotata di quarzo da 20 MHz, oppure sostituite il quarzo originale di Arduino, potete farlo sia su una 2009 che su una UNO.
Ora nell'elenco board dell'IDE trovate la nuova voce "Arduino 20 MHz", ed è questa che dovete usare sia per compilare i programmi sia per caricare il bootloader tramite lo sketch ISP.
Ho testato tutte le funzioni legate alle temporizzazioni quali millis, delay, etc, e vanno tutte quante bene, stessa cosa per le librerie legate al timing come quella per la seriale, i servo, l'I2C etc, unica differenza che ho trovato tra Arduino a 16 MHz e questa versione a 20 MHz è la frequenza del PWM che passa da circa 490 Hz a circa 610 Hz, cosa a mio avviso più positiva che negativa.
Sotto il profilo velocità operativa il guadagno è un bel +25%, e non è poco, sopratutto quando si devono fare molti calcoli matematici.
Il bootloader modificato per 20MHz è quello della 2009, l'optiboot mi ha dato svariati problemi con questa modifica e per il momento l'ho accantonato, ho in previsione, a breve, di rilasciare una ulteriore versione di questo bootloader in grado di lavorare a 115kbps, come l'optiboot, in modo da dimezzare i tempi di upload degli sketch.
Lo zip con le modifiche lo trovate qui
Ottimo lavoro, astrobeed!
Son curioso di provarlo ![]()
pitusso:
Ottimo lavoro, astrobeed!
Son curioso di provarlo
Si concordo ![]()
domani filo e mille fori mi faccio una nuova board ![]()
Preso nota!
Ma perché hai dovuto modificare il bootloader? Per sistemare i tempi (delay, millis, ecc)? In effetti nelle prove che ho fatto io settando, p.es. il chip a 8MHz osc. int. i tempi sballano completamente, 1s diventa 4-8s; la cosa che non mi spiego è perché succede questo; l'oscillatore interno dovrevve essere tarato per lavorare correttamente, quindi il problema è nel software? E' questa la spiegazione?
@Michele:
il problema che tu segnali deriva dal fatto che con la tecnica ISP non si riescono a programmare i fuse per impostare la frequenza corretta, più precisamente impostando il chip a 8 MHz non si riesce a disattivare il divisore x8 sulla frequenza dell'oscillatore interno. Usando un quarzo esterno non hai di questi problemi perché non devi selezionare a priori una frequenza particolare ma dire soltanto all'Atmega di usare la fonte esterna, appunto.
E, come ti dissi a suo tempo nell'altro post, al momento l'unico modo di modificare i fuse usando un Arduino come programmatore ISP è quello di pilotarlo direttamente con l'avrdude patchato contenuto nell'IDE.
@astrobeed:
scusa una cosa, non sei riuscito a compilare una versione dell'Optiboot che lavora a 20 MHz?
leo72:
@Michele:
il problema che tu segnali deriva dal fatto che con la tecnica ISP non si riescono a programmare i fuse per impostare la frequenza corretta, più precisamente impostando il chip a 8 MHz non si riesce a disattivare il divisore x8 sulla frequenza dell'oscillatore interno. Usando un quarzo esterno non hai di questi problemi perché non devi selezionare a priori una frequenza particolare ma dire soltanto all'Atmega di usare la fonte esterna, appunto.
E, come ti dissi a suo tempo nell'altro post, al momento l'unico modo di modificare i fuse usando un Arduino come programmatore ISP è quello di pilotarlo direttamente con l'avrdude patchato contenuto nell'IDE.
Hello! avendo fatto miliardi di prove per la Guida ora è come non averne fatte per niente :~ una cosa è certa: non so se ricordi che ad un certo punto, leggendo della possibilità di portare sul pin 8 del chip la frequenza dell'oscillatore interno, dissi che questa cosa sarebbe stata comodissima qualora una circuiteria esterna (come mi è capitato di fare) avesse bisogno di un suo oscillatore; alla fine, dopo un po' di prve riuscii a portare fuori questa frequenza e leggerla (nacque anche una querelle simpatica con astrobeed sulla precisione di quanto leggevo); ricordo perfettamente, visto che la cosa mi interessava per i nanetti, di aver letto anche 8MHz e 1MHz, la cosa confermata anche dalla progressiva riduzione dei consumi. Altrimenti non l'avrei scritto nella Guida. ![]()
@astrobeed:
scusa una cosa, non sei riuscito a compilare una versione dell'Optiboot che lavora a 20 MHz?
questa cosa conferma quanto dico, forse, altrimenti qui col quarzo esterno, che problemi dovevano esserci? ![]()
Guarda, di cose ne abbiamo dette talmente tante che tenerle tutte a mente è IMPOSSIBILE ![]()
Ora che me lo hai ricordato, è vero: lo ricordo che l'avevi detto. Però da parte mia posso dirti che a me non era riuscito modificare i fuse né sugli Atmega né sugli Attiny usando l'Arduino come programmatore ISP agendo dall'IDE.Questo perché, e ti ricordo che era entrato nella discussione anche brainboost, l'IDE semplicemente non passava i parametri. A me era riuscito solo usando l'ArduinoISP da terminale pilotandolo con l'avrdude patchato.
Mi sa che un giorno dovremo incontrarci e stare tipo 6/8 ore a "spippolare" sui chippettini per fare, una volta per tutte, un sunto universale XD
@astrobeed:
Mi ero dimenticato di aggiungere una cosa a riguardo della compilazione dell'Optiboot. Adesso sono in ferie e sto lavorando con un netbook con una versione datata di Linux (non so se dipende da questo) ma io non riesco a compilare l'Optiboot ricevendo degli errori sulle costanti SIGNATURE_0, SIGNATURE_1 e SIGNATURE_2 all'interno dell'Optiboot: non so da dove il compilatore dovrebbe prelevare questi valori né a che cosa si riferiscono.
Ovviamente ho modificato il file makefile inserendo la voce riguardante un atmega a 20 MHz ma non riesce comunque a compilare nessun hex per nessuna scheda/chip per il problema di cui sopra.
Non è detto che non possa succedere davvero
naturalmente la pausa pranzo la offro io XD
Il problema l'ho avuto anch'io con gli attiny, infatti non sono riuscito a far salire il clock, poi mi sono fermato con le prove visto che in realtà a me servivano con clock a 1MHz per i nanetti e tu mi confermasti che "nascevano" già così.
Per il momento ho accantonato tutte le sperimentazioni, ne avevo iniziate troppe e il tempo non ce l'ho, ho deciso si mettere tutto in una bella cartella "progetti futuri" e da lì usciranno uno per volta: inizio-sperimentazione-fine. Quindi ho deciso di completare i nanetti, finalmente stasera ho stampato il pcb sulla piastra di rame, fra due giorni arriva la vaschetta per l'incisione, primo montaggio, test e poi "produzione in serie" (sono 7, ovviamente...); ti posto il png, sono troppo felice XD XD XD, naturalmente grazie a te e gioblu che mi avete presentato le attiny (il femminile è per evitare facile battuta di qualche furbone ]:D), lungo corteggiamento e poi amore profondo ![]()
Risposte in generale:
Il bootloader deve essere scritto in funzione della frequenza di lavoro del micro, cioè tutti i vari registri che hanno a che vedere con le temporizzazioni, p.e. quello per il baud rate della seriale, devono essere calcolati in base al valore del quarzo e/o l'eventuale uso del prescaler.
L'optiboot, una volta modificato per i 20 MHz, mi ha dato problemi di affidabilità, cioè spesso e volentieri gli sketch non vengono caricati, l'IDE si ferma mostrando vari errori di AVRdude o addirittura non parte proprio la procedure di programmazione.
Sicuramente è una cosa semplice da sistemare, ma per il momento ho lasciato perdere a favore del bootloader 2009 che non mi ha dato nessun problema dopo la modifica, a mio avviso è pure migliore dell'optiboot anche se occupa molto più spazio.
Il bootloader viene usato dal micro solo durante il power up o un reset, dal momento in cui il bootloader cede il controllo al programma principale questo non viene più utilizzato in nessun modo, cioè non ha alcun effetto sullo sketch.
Eventuali problemi di timing con clock diversi da quello standard possono dipendere dal fatto che wiring adatta le temporizzazioni in funzione del parametro F_CPU specificato in boards.txt.
Non tutti i possibili valori F_CPU possono funzionare correttamente per tutte le funzioni legate ad un timing, sopratutto tenuto conto dei calcoli matematici usati in alcune macro, p.e. quella per il timeout che avevo già segnalato in un altro thread.
astrobeed, Complimenti per il Tuo lavoro.
Uwe
astrobeed:
Dato che l'ATmega 328p, ma anche il 168, è previsto per una frequenza di clock fino a 20 Mhz ecco come modificare Arduino per ottenere il massimo delle prestazioni.
Piccola premessa, il software allegato è da considerarsi una "release candidate 1.0" pertanto è possibile che dia origine a problemi imprevisti e malfunzionamenti di varia natura, sebbene ampiamente testato non posso garantire al 100% che funzioni tutto sempre e comunque.
Per effettuare la modifica la prima cosa da fare è caricare sull'ATmega il bootloader modificato che trovate all'interno del file zip allegato, potete usare la tecnica che preferite non ci sono particolari vincoli.
Il file .hex da caricare si trova all'interno della cartella "Arduino_20" che dovete copiare nella cartella "bootloaders" dell'IDE, stessa cosa per il file boards.txt che dovete copiare al posto di quello originale, prima fate una copia di quest'ultimo.
Fatte le modifiche all'IDE e caricato il bootloader 20 MHz sull'ATmega installatelo su una board dotata di quarzo da 20 MHz, oppure sostituite il quarzo originale di Arduino, potete farlo sia su una 2009 che su una UNO.
Ora nell'elenco board dell'IDE trovate la nuova voce "Arduino 20 MHz", ed è questa che dovete usare sia per compilare i programmi sia per caricare il bootloader tramite lo sketch ISP.
Ho testato tutte le funzioni legate alle temporizzazioni quali millis, delay, etc, e vanno tutte quante bene, stessa cosa per le librerie legate al timing come quella per la seriale, i servo, l'I2C etc, unica differenza che ho trovato tra Arduino a 16 MHz e questa versione a 20 MHz è la frequenza del PWM che passa da circa 490 Hz a circa 610 Hz, cosa a mio avviso più positiva che negativa.
Sotto il profilo velocità operativa il guadagno è un bel +25%, e non è poco, sopratutto quando si devono fare molti calcoli matematici.
Il bootloader modificato per 20MHz è quello della 2009, l'optiboot mi ha dato svariati problemi con questa modifica e per il momento l'ho accantonato, ho in previsione, a breve, di rilasciare una ulteriore versione di questo bootloader in grado di lavorare a 115kbps, come l'optiboot, in modo da dimezzare i tempi di upload degli sketch.
Lo zip con le modifiche lo trovate qui
Una curiosità, nella cartella dell'optiboot originale, mentre cercavo altro, ho visto un optiboot a 20MHz, non dovrebbe essere sufficiente quello per lavorare col quarzo a 20MHz, altrimenti a che serve, secondo te?
menniti:
Una curiosità, nella cartella dell'optiboot originale, mentre cercavo altro, ho visto un optiboot a 20MHz, non dovrebbe essere sufficiente quello per lavorare col quarzo a 20MHz, altrimenti a che serve, secondo te?
Si l'avevo visto pure io, dovrebbe essere per l'omonima scheda, non più in produzione, di Sparkfun con clock a 20 MHz, l'ho provato ma, apparentemente, non funziona.
Come ho già detto devo rimetterci mano all'optiboot, però devo trovare il tempo per dedicarmici e di sicuro non sarà nell'immediato futuro.
Confermo che anche a me quell'Optiboot a 20 MHz non funzionava.
Come non detto ![]()
Cmq, Mick, che ce ne importa, scusa?
Con il bootloader a 20 MHz dovresti avere un Arduino a 20 MHz ma con la tecnica ISP puoi programmare un chip senza bootloader e farlo lavorare a quanto ti pare ![]()
leo72:
Cmq, Mick, che ce ne importa, scusa?
Con il bootloader a 20 MHz dovresti avere un Arduino a 20 MHz ma con la tecnica ISP puoi programmare un chip senza bootloader e farlo lavorare a quanto ti pare
Vero! la mia era una curiosità dettata dal fatto di aver visto questo file mentre cercavo info per il post che scrivevo a te, tutto qui. Il problema che mi ponevo era anche quello di capire se mettendo un quarzo da 20MHz in stand alone i tempi non sballano, hai mai provato?
Sinceramente no. Quando ho usato il micro a 20 MHz l'ho fatto con un firmware compilato a 20 MHz (non mi ricordo cos'era, l'ho fatto intorno a gennaio).
menniti:
Il problema che mi ponevo era anche quello di capire se mettendo un quarzo da 20MHz in stand alone i tempi non sballano, hai mai provato?
Che il micro lavori su Arduino o in stand alone non cambia nulla, se metti il quarzo da 20 MHz e compili usando il boards.txt che ho allegato a questo thread funziona tutto in modo regolare.
Se lo compili per un normale Arduino ti ritrovi con tutte le temporizzazioni più veloci e la seriale che non funziona perché il baud rate è sbagliato.
Poco importa se carichi il programma tramite bootloader, in questo caso serve la versione a 20 MHz, oppure lo carichi direttamente tramite ISP, è il programma che è compilato per funzionare a 20 MHz, non è il bootloader ad influenzare questa cosa.
La maggior velocità è molto allettante, si tradurrebbe anche in un maggior campionamento nel caso di sensori esterni. Non vorrei entrare nello specifico, ma se utilizzassi i 20Mhz nel mio progettino che prevede l'uso dei TLC5940 cosa otterrei? "Solo" maggior velocita'? Funzionerebbe tutto ugualmente?
