Ma siamo sicuri che i FUSE di Arduino UNO sono i migliori possbili?

Carissimi, ho ripreso a studiare per la mia prossima fatica, sto nuovamente approfondendo la tematica dei FUSE, si scoprono cose nuove ad ogni lettura, complice il fatto che li aggiornano in continuazione.
Come tutti sappiamo il LOW FUSE BYTE di Arduino UNO è FF, cioè tutti i suoi bit sono disabilitati. Dal punto di vista della sorgente di clock ciò significa:

Low Power Crystal Oscillator

Frequency range 8.0 - 16.0

Crystal Oscillator, slowly rising power

Start-up time from sleep 16K CK and additional delay from reset 14CK + 65ms

Bene, anzi male, Arduino UNO non ha mai avuto un quarzo esterno bensì un risonatore ceramico, quindi la corretta impostazione dovrebbe essere:

Ceramic resonator, slowly rising power

Start-up time from sleep 1K CK and additional delay from reset 14CK + 65ms

Di conseguenza il LOW FUSE BYTE dovrebbe essere CF.

Il discorso si fa un po' più lungo leggendo le note relative all'opzione che ho appena citato come corretta:

These options are intended for use with ceramic resonators and will ensure frequency stability at start-up. They can also be used with crystals when not operating close to the maximum frequency of the device, and if frequency stability at start-up is not important for the application.

Quindi le problematiche legate alla tempistica, durante l'uso di Arudino UNO potrebbero anche essere parzialmente legate al non corretto settaggio del FUSE LOW, e chi ha giocherellato con timer, soprattutto generando frequenze di 1Hz o chi, come me, ha lavorato con una libreria per la lettura di frequenze, sa benissimo quanto Arduino UNO sia decisamente impreciso rispetto al fratello più vecchio Duemilanove, sul quale invece campeggia un bel quarzo! Allora la domanda è: pensate sia importante quanto qui detto e che valga la pena cambiare il Low Fuse? Servirebbero dei Test e qui chiamo in causa Testato, perché lui combatte con orologi e frequenze ed è attrezzato per farla una prova, ma naturalmente chiunque è invitato a fare prove, ovviamente avendo un micro di ricambio con bootloader, in caso si dovesse bloccare qualcosa :slight_smile: (io sono ancora fuori sede...)

Ancora un approfondimento; la stessa ATMEL, a proposito della sorgente Low Power Crystal Oscillator scrive sul data-sheet

Pins XTAL1 and XTAL2 are input and output, respectively, of an inverting amplifier which can be configured for use as an On-chip Oscillator. Either a quartz crystal or a ceramic resonator may be used. This Crystal Oscillator is a low power oscillator, with reduced voltage swing on the XTAL2 output. It gives the lowest power consumption, but is not capable of driving other clock inputs, and may be more susceptible to noise in
noisy environments. In these cases, refer to the ”Full Swing Crystal Oscillator”

Quindi per evitare problemi di "rumore" e, per poter correttamente gestire altri ingressi di clock (ma qui vorrei capire se si stanno riferendo, p.es. al watchdog o a cosa...), sarebbe stato preferibile ricorrere a questo tipo di settaggio, nel qual caso il solito LOW FUSE sarebbe pari a C7.
Con questa configurazione l'amplificatore interno del micro non subirebbe attenuazione alcuna e potrebbe operare nelle migliori condizioni possibili, a discapito di un maggiore consumo che sarebbe poca cosa considerando che Arduino è di norma alimentato via USB o comunque con una fonte esterna proveniente da un alimentatore.

A voi i commenti, per favore discussioni costruttive, niente polemiche, io sono il primo a non volerne fare, questa è una discussione puramente tecnica, NON una critica ai progettisti che, se qui uscisse un fondo di verità, potrebbero invece trarne beneficio.

No, dipendono solo dalla minore precisione e maggiore instabilità del risonatore rispetto al quarzo, anche cambiando il valore di quei fuse, che alla fine influenzano solo il comportamento dell'oscillatore all'avvio, non succede nulla relativamente alla frequenza di oscillazione e la sua stabilità.
Vuoi un Arduino UNO più preciso su i timing ? Bene allora smonta il risonatore e metti al suo posto un quarzo, meglio se uno di precisione :slight_smile:

Grazie Astro, conosco abbastanza bene (avendoli usati entrambi) la differenza di stabilità e precisione tra un quarzo ed un risonatore ceramico. Nel mio frequenzimetro ho addirittura fatto ricorso ad un chip oscillatore quarzato esterno, stabilissimo, così come feci a suo tempo con il mio Programmatore ISP.
Il mio dubbio si quanto affermi:

.... il valore di quei fuse, che alla fine influenzano solo il comportamento dell'oscillatore all'avvio, ...

è vero i fuse bit CKSEL0 e SUT1-0 servono per settare i ritardi rispetto alla ripresa da uno stato di sleep o di un reset, resta il fatto che ATMEL si prende la briga di scrivere una Tabella con ben 8 diverse combinazioni, di cui 5 dedicate al risonatore e 3 al quarzo, a che pro?
E comunque restano i miei ulteriori due quesiti: non sarebbe più corretto prevedere la combinazione specifica per l'hardware utilizzato e non sarebbe meglio usare una combinazione che garantisca un migliore funzionamento dell'oscillatore, garantendogli immunità da disturbi provenienti dalla circuiteria esterna ad Arduino?

Ribadisco il concetto, quei fuse servono solo per stabilire il comportamento dell'oscillatore durante l'avvio, i quarzi/risonatori non partono di colpo alla loro frequenza nominale, ci mettono un pochino per raggiungerla e per un certo tot di tempo, da us a ms, fluttuano attorno a quel valore prima di stabilizzarsi, a seconda di come si impostano quei parametri è possibile ottimizzare la fase di avvio rendendo minore il tempo per ottenere il funzionamento stabile dell'oscillatore.
Inoltre è possibile settare l'oscillatore come low power oppure full swing, la differenza tra i due modi è il livello di tensione ai capi dell'oscillatore e la corrente disponibile, se setti low power riduci leggermente il consumo dell'oscillatore però non puoi usare Xtal2 come out per pilotare un altro micro su Xtal1, inoltre è maggiore la sensibilità ai disturbi, se setti full swing puoi usare Xtal2 per pilotare Xtal1 di un secondo micro, e volendo altri micro in cascata collegandoli Xtal2->Xtal1, e aumenti leggermente l'immunità ai disturbi.
Te la faccio breve, a meno che non vuoi pilotare due, o più, micro con un solo quarzo non perdere tempo con quei fuse, non ottieni nessun miglioramento che abbia senso con Arduino :slight_smile:

ok, non ho di queste necessità, il fine del Topic è proprio quello e non ne avevo di "secondi", volevo solo essere certo che non si dovessero variare i valori su Arduino UNO. Grazie! :slight_smile:

per quel poco che ne so....

la differenza di stabilita tra un quarzo qualsiasi e un risuonatore è enorme,

non dovrebbero esistere nemmeno i "quarzi di precisione" ma quarzi fatti meglio che si spostano molto meno dalla sua frequenza dichiarata quando la temperatura ambientale cambia , (ricordandoci che il quarzo è una cosa meccanica :open_mouth: )

sicuramente ci sono "quarzi" realizzati all'interno di piccoli contenitori a temperatura controllata termostatati (di solito 60-70° ) e sono super precisi per il fatto che la temperatura e costante,
e sono dispositivi che vengono adoperati nei trasmettitori radioamatoriali come optional 100-200 euro)

Heh ... quando ero giovane, secoli fa :stuck_out_tongue: , ce li si costruiva saldando un transistor di potenza sulla custodia del quarzo ed usandolo come riscaldatore termostatato con una NTC ... ma non so che vantaggio ci sarebbe a fare una cosa del genere adesso, per il micro ... specialmente perche' i quarzi che si usavano all'epoca erano tutto tranne che "miniatura" o "SMD" come adesso :stuck_out_tongue: XD

Etemenanki:
Heh ... quando ero giovane, secoli fa :stuck_out_tongue: , ce li si costruiva saldando un transistor di potenza sulla custodia del quarzo ed usandolo come riscaldatore termostatato con una NTC ... ma non so che vantaggio ci sarebbe a fare una cosa del genere adesso, per il micro ... specialmente perche' i quarzi che si usavano all'epoca erano tutto tranne che "miniatura" o "SMD" come adesso :stuck_out_tongue: XD

per il micro un quarzo comune basta e avanza per il sistema che adoperavi ai "tempi era il massimo"

e mi pare che il quarzo termostatato sia ancora la cosa più stabile che c'è per i comuni mortali :wink:

a meno che non prendiamo un orologio atomico al cesio, con il "piccolo" inconveniente che è grosso come un frigorifero e costa 300.000 euro :frowning:

gingardu:
esistere nemmeno i "quarzi di precisione" ma quarzi fatti meglio che si spostano molto meno dalla sua frequenza dichiarata quando la temperatura ambientale cambia ,

Con "quarzi di precisione" si intende quarzi con errore <= 20ppm, ovviamente riferito alla temperatura dichiarata sul data sheet, tipicamente 20° o 25°, i quarzi economici solitamente possiedono un errore superiore a 50ppm.

Secondo me il gioco non vale la candela.
Se Astro a detto che quelle impostazioni riguardano l'avvio, pochi millisecondi, trovo più complicato modificare i fuse al posto di avere un avvio più stabile del micro.
D'altronde se nel micro c'è il bootloader, quando parte lo sketch il risonatore/cristallo ha avuto tutto il tempo per terminare la fase transitoria e andare a regime.
E se anche non ci fosse, mi pare che comunque si aspettino 65ms proprio per stabilizzare l'oscillazione.

Comunque se trovo 2 ATmega in giro per casa li setto con i fuse diversi. :grin:
Ma non ho attrezzature per poterne controllare il comportamento nei primi istanti. :sweat_smile:
Tra l'altro non ho capito COSA dovrei controllare. :drooling_face:

PaoloP:
Se Astro a detto che quelle impostazioni riguardano l'avvio, pochi millisecondi, trovo più complicato modificare i fuse al posto di avere un avvio più stabile del micro.

Quelle impostazioni sono utili quando il micro deve essere operativo nel minor tempo possibile, in certi casi guadagnare qualche ms può essere vitale, su Arduino non ha alcun senso proprio perché c'è di mezzo il bootloader che ha i suoi tempi, decisamente più lunghi di quelli dell'avvio.
Al limite potrebbe essere utile "giocare" con quei fuse solo nel caso di una standalone senza bootloader, ma anche in questo caso solo se è indispensabile guadagnare tempo sull'avvio del micro, praticamente mai con le tipiche applicazioni Arduino, oppure se fa comodo usare un solo quarzo per pilotare più micro, caso più realistico nel mondo Arduino.

[OT]
Ma se volessi pilotare più micro con un solo quarzo li devo chiudere ad anello?
Quarzo --> Xtal1
Xtal2 --> Xtal1 secondo micro
Xtal2 2°--> Quarzo

Oltretutto si rischia di arrivare all'eccesso opposto, ossia impostare dei tempi di avvio così risicati che il micro necessita del clock prima ancora che il quarzo/oscillatore si sia stabilizzato, col risultato che poi il chip si pianta.

PaoloP:
[OT]
Ma se volessi pilotare più micro con un solo quarzo li devo chiudere ad anello?
Quarzo --> Xtal1
Xtal2 --> Xtal1 secondo micro

Metti il quarzo solo sul primo micro della catena, fuse settato per full swing, poi colleghi il suo Xtal2 sul pin Xtal1 del secondo micro, da questo il suo Xtal2 sul pin Xtal1 del terzo micro e così via.
Devo verificare, però se non mi ricordo male occorre mettere una resistenza da qualche k tra l'Xtal2 dove c'è il quarzo e il primo ingresso Xtal1, tutti gli altri si collegano direttamente.

Paolo, il mio dubbio primario riguardava la "precisione", il cosa sarebbe quindi effettuare p.es. delle misure di frequenze, l'incidenza su librerie (come quelle di Leo) che non fanno riferimento a quarzi aggiuntivi specifici. Astro ha ribadito che tutto rguarda i primi istanti di avvio, e questo è chiaro anche nei data-sheet, ma a me suonava molto male quella possibile sensibilità "ai rumori di fondo (noise)" della modalità low power, a parte il fatto (sul quale non avevo interesse) del non possibile pilotaggio di altri clock (micro).

x iscrizione

astrobeed:

[quote author=Michele Menniti link=topic=184414.msg1365702#msg1365702 date=1377428682]
Quindi le problematiche legate alla tempistica, durante l'uso di Arudino UNO potrebbero anche essere parzialmente legate al non corretto settaggio del FUSE LOW

No, dipendono solo dalla minore precisione e maggiore instabilità del risonatore rispetto al quarzo, anche cambiando il valore di quei fuse, che alla fine influenzano solo il comportamento dell'oscillatore all'avvio, non succede nulla relativamente alla frequenza di oscillazione e la sua stabilità.
Vuoi un Arduino UNO più preciso su i timing ? Bene allora smonta il risonatore e metti al suo posto un quarzo, meglio se uno di precisione :slight_smile:

[/quote]

Quoto e fatto.

Prima di passare ad altra piattaforma avevo messo addirittura un quarzo termocompensato, ovviamente settando o fuse per External Oscillator. Precisione +-5ppm, ovvero 5 parti per milione max.

Ho un circuito con un clock orologesco che devo ancora settare dopo mesi, nel senso che ancora non sballa, mentre prima perdeva anche più di 1 minuto ogni 2-3 settimane.