Quarzo esterno e prescaler del clock

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 :slight_smile:

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 :grin: ...
... tutto funziona bene, poi, la mattina che fa freddo e la MCU è ad una temperatura più bassa del solito ... magari non parte ... :roll_eyes:

Guglielmo

1 Like

Non basta fare le impostazioni con Burn-O-Mat?

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 :slight_smile: )

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.

Non ho familiarità con questo tool. Cosa mi permette di fare?
Io programmerei il uC tramite USBTinyISP

E' un'interfaccia utente per Avrdude. Provalo.

NO, sono "registri", nelle MCU Atmel, sono in SRAM ... le modifiche somno volatili.

NO, c'è un FUSE dedicato per un divisore per 8 dedicato.

Guglielmo

Non c'enrtrano i FUSE ch puoi programmare, è un "registro" ovvero una locazione in SRAM.

Guglielmo

Stai facendo una grande confusione tra I FUSE ed i "regsitri" ... sono cose totalmente differenti !!!

Guglielmo

Cioè? Diverse volte l'ho fatto: imposto i fuse con Burn-O-Mat e poi uso una "scheda Arduino" modificata per quella frequenza di clock:

C:\Users\giobb\AppData\Local\Arduino15\boards.txt

##############################################################

uno1MHz.name=Arduino uno 1MHz (ATmega328 8MHz int/DIV8)

uno1MHz.upload.tool=avrdude
uno1MHz.upload.protocol=arduino
uno1MHz.upload.maximum_size=32256
uno1MHz.upload.maximum_data_size=2048
uno1MHz.upload.speed=9600

uno1MHz.bootloader.tool=avrdude
uno1MHz.bootloader.low_fuses=0x62
uno1MHz.bootloader.high_fuses=0xd9
uno1MHz.bootloader.extended_fuses=0xfd
uno1MHz.bootloader.unlock_bits=0x3F
uno1MHz.bootloader.lock_bits=0x0F
uno1MHz.bootloader.file=optiboot/optiboot_atmega328.hex

uno1MHz.build.mcu=atmega328p
uno1MHz.build.f_cpu=1000000L
uno1MHz.build.board=AVR_UNO_1MHz
uno1MHz.build.core=arduino
uno1MHz.build.variant=standard

##############################################################

unoEE.name=Arduino Uno con EESAVE

unoEE.vid.0=0x2341
unoEE.pid.0=0x0043
unoEE.vid.1=0x2341
unoEE.pid.1=0x0001
unoEE.vid.2=0x2A03
unoEE.pid.2=0x0043
unoEE.vid.3=0x2341
unoEE.pid.3=0x0243

unoEE.upload.tool=avrdude
unoEE.upload.protocol=arduino
unoEE.upload.maximum_size=32256
unoEE.upload.maximum_data_size=2048
unoEE.upload.speed=115200

unoEE.bootloader.tool=avrdude
unoEE.bootloader.low_fuses=0xFF
unoEE.bootloader.high_fuses=0xD6
unoEE.bootloader.extended_fuses=0x05
unoEE.bootloader.unlock_bits=0x3F
unoEE.bootloader.lock_bits=0x0F
unoEE.bootloader.file=optiboot/optiboot_atmega328.hex

unoEE.build.mcu=atmega328p
unoEE.build.f_cpu=16000000L
unoEE.build.board=AVR_UNO
unoEE.build.core=arduino
unoEE.build.variant=standard

##############################################################

unoEE.name=ATmega328p 2MHz (16MHz Div8) con EESAVE

unoEE.vid.0=0x2341
unoEE.pid.0=0x0043
unoEE.vid.1=0x2341
unoEE.pid.1=0x0001
unoEE.vid.2=0x2A03
unoEE.pid.2=0x0043
unoEE.vid.3=0x2341
unoEE.pid.3=0x0243

unoEE.upload.tool=avrdude
unoEE.upload.protocol=arduino
unoEE.upload.maximum_size=32256
unoEE.upload.maximum_data_size=2048
unoEE.upload.speed=115200

unoEE.bootloader.tool=avrdude
unoEE.bootloader.low_fuses=0x62
unoEE.bootloader.high_fuses=0xD9
unoEE.bootloader.extended_fuses=0xFF
unoEE.bootloader.unlock_bits=0x3F
unoEE.bootloader.lock_bits=0x0F
unoEE.bootloader.file=optiboot/optiboot_atmega328.hex

unoEE.build.mcu=atmega328p
unoEE.build.f_cpu=2000000L
unoEE.build.board=AVR_UNO
unoEE.build.core=arduino
unoEE.build.variant=standard

##############################################################

NON ci sono FUSE per programmare il prescaler come vuole fare lui (quarzo fisso a 16MHz, frequenza fissata da registro CLKPR) ...

Tra i FUSE hai solo la selezione di da dove arriva il clock e la selezione se dividere o meno per 8 detto clock ...

Low Byte Fuses

image

.... tutti gli altri FUSE non hanno nulla a che vedere con il clock.

Guglielmo

Infatti in una configurazione di scheda ho impostato il clock a 2MHz con il quarzo da 16MHz DIV8 :slight_smile:. 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.

8 e 0,5MHz no, ma 2MHz sì.

Tu continui a parlare di un FUSE che divide per 2 e basta, lui parla di un registro che permette:

... 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 !

Guglielmo

1 Like

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?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.