Ciao a tutti,
apro questo post per vedere se ho capito come funziona il clock del Micro.
Tendenzialmente se funziona a 5V ha un quarzo esterno a 16MHz.
Se si alimenta a 3V3 la frequenza si abbassa a 8MHz. In base all'alimentazione ci sono le varie frequenze consigliate.
Ho la necessità di lavorare a 3V3, quindi potrei usare l'oscillatore interno da 8MHz che però è meno preciso rispetto a uno esterno.
Il micro possiede un prescaler del clock "CLKPS" , cioè posso dividere e abbassare la frequenza di lavoro CPU. Se volessi andare a 8MHz con un quarzo esterno da da 16MHz utilizzando il prescale potrei andare a 8MHz e addirittura a 2MHz (CKDIV8) o a 0,5 MHz senza perdere di precisione.
Quindi non ha senso mettere un quarzo esterno da 8MHz. Con il pescale mi gestisco la frequenza (e il consumo) come voglio senza perdere di precisione.
Ho capito bene?
Poi come fare queste cose è un altra storia
NI ... in verità per poter impostare il prescaler, la MCU deve aver già cominciato correttamente a funzionare e, da programma, occorre andare ad agire, dopo aver disabilitato gli interrupts, sul registro CLKPR, sia per abilitare la modifica, che poi, successivamente, per effettuarla e, al termine, occorre riabilitare gli interrupts.
Se l'oscillatore esterno (sia esso un quarzo, sia esso un risuonatore o un segnale di clock proveniente da altra sogrente) e più elevato di quanto la tabella alimentazione/frequenza di clock indica ...
... c'è il rischio che la MCU non parta affatto o funzioni male a quella frequenza, funzionamento che, almeno per un breve periodo, è comunque strattamente necessario per poter far partire il programma ed effettuare le operazioni descritte.
Ora, ad esempio, con un quarzo a 16 MHz, portando l'alimentazione a 3.3V per poi impostare il prescaler in modo che divida per 2 così da scendere ad 8MHz, funziona nel 95% dei casi (verificato, dipende un po' dalle tolleranze fisiche del chip), ma è comunque cosa fuori specifiche e NON garantita funzionare nel 100% dei casi dal costruttore, quindi ... a tuo rischio e pericolo ...
... tutto funziona bene, poi, la mattina che fa freddo e la MCU è ad una temperatura più bassa del solito ... magari non parte ...
Ho capito. Si, potrebbe essere un problema.
Prendiamo per esempio un uC vergine. Nel Data sheet c'è scritto che è spedito con abilitato quello interno a 8MHz e con il pescale a 8, quindi funziona a 1MHz.
Se io accendo il uC a 3,3V (va a 1MHz e dovrebbe andare bene) , poi durante lo svolgimento del programma cambio i registri CKSEL (abilito quarzo esterno) e CKDIV (divido per 8) dovrebbe funzionare. In questo caso non avrei nemmeno bisogno di un bootloader. E' corretto? (scusate ma è la prima volt ache provo a fare questa cosa )
Cioè se cambio questi registri, dopo uno spegnimento rimangono sempre così? E fin da subito parte con il quarzo esterno? Se non rimangono in memoria li aggiorno sempre all'inizio del programma.
Infatti in una configurazione di scheda ho impostato il clock a 2MHz con il quarzo da 16MHz DIV8 . Non è questo che ha chiesto all'inizio?
Se volessi andare a 8MHz con un quarzo esterno da 16MHz utilizzando il prescaler potrei andare a 8MHz e addirittura a 2MHz (CKDIV8) o a 0,5 MHz senza perdere di precisione.
... due cose TOTALMENTE differenti. Poi, se gli basta la sola divisione per 2, è un'altro paio di maniche ... ma NON si può confondere una cosa con l'altra !
Forse Guglielmo hai ragione, sto facendo confusione tra registri e i Fuse. Adesso riordino un attimo le idee e poi vi dico quale soluzione potrei fare.
Ho riordinato le Idee. I Fuse servono per dare delle pre-impostazioni su come dovrà operare il uC. Prima setto i fuse e poi carico il programma. Come interfaccia ho provato AVRDUDESS e riesco a riconoscere il uC e a leggere le attuali impostazione dei FUSE.
Manterrò il divisore da 8 e abiliterò la sorgente esterna. In questo caso dovrebbe funzionare a 2MHz. Se ho capito bene il DS consiglia di utilizzare dei risuonatori ceramici e non dei quarzi.
Ora non mi resta che provare a programmarlo, mi piacerebbe utilizzare Atmel Studio ma sono indeciso su che programmatore comprare:
Pensavo a questi 2:
AVR-ISP-MK2 della Olimex Ltd.(dovrebbe connettersi direttamente con Atmel-Studio)
USBasp con il Jumper che mi permetta di scegliere l'alimentazione.
Il target da programmare funziona a 3,3V e quindi dovrei avere l'opportunità di scegliere la tensione dei segnali. Cosa mi consigliate?