Atmega 328P senza quarzo o oscillatore e libreria Timer1

Ho visto che si può fare andare l'Atmega328P con l'oscillatore interno a 1MHz e lo vorrei fare.
Devo però usare la libreria Timer1, posso farlo o poi vista la diversa frequenza dell'Atmega la libreria dà frequenze sbagliate?

Su un 328P standalone senza bootloader lo posso fare?
Cosa e come devo modificare nell'ide per poter non mettere un quarzo o un oscillatore? uso linux

d407336:
Ho visto che si può fare andare l'Atmega328P con l'oscillatore interno a 1MHz e lo vorrei fare.
Devo però usare la libreria Timer1, posso farlo o poi vista la diversa frequenza dell'Atmega la libreria dà frequenze sbagliate?

Dando uno sguardo alla lib ho visto un metodo per adeguare il timer a diverse frequenze però non ci sono espressamente scritti i valori supportati. L'unica è provare.

Su un 328P standalone senza bootloader lo posso fare?
Cosa e come devo modificare nell'ide per poter non mettere un quarzo o un oscillatore? uso linux

Scaricati la guida di Michele Menniti per la programmazione ISP.

La libreria Timer1 l'ho già provata e la frequenza che serve a me la supporta perfettamente :wink:
Grazie per l'info, la guida è quà: GUIDA alle Tecniche di Programmazione dei
microcontrollori ATMEL - http://www.michelemenniti.it/vhd/Elettronica/GPAT_v4.pdf

Una curiosità: cosa cambia tra 328 e 328P?

Stò leggendo la guida.
Se io ho un atmega328p vergine senza bootloader sarà settato per lavorare a 16MHz o a 1MHz?
Per farlo lavorare a 8MHz devo per forza caricargli il bootloader prima di caricargli lo sketch?

p.s. penso di programmarlo ISP

d407336:
Stò leggendo la guida.
Se io ho un atmega328p vergine senza bootloader sarà settato per lavorare a 16MHz o a 1MHz?

Se è di fabbrica, arriva a 1 MHz.

Per farlo lavorare a 8MHz devo per forza caricargli il bootloader prima di caricargli lo sketch?

No, basta togliere il divisore x8 del clock così va ad 8 MHz.
Poi lo programmi con avrdude da terminale usando ArduinoISP come sketch programmatore caricato sull'Arduino

p.s. penso di programmarlo ISP

ovviamente con la guida del Menniti :wink:

se di fabbrica è a 1MHz per portarlo da 1MHz a 8MHz non mi serve il quarzo ma mi basta modificare il file boards.txt dell'ide come descritto nella guida del Menniti?
quindi in pratica se io uso un arduino uno come programmatore isp:

  • modifico il file boards.txt e aggiungo l'atmega a 8MHz con l'oscillatore interno
  • carico sull'arduino uno lo sketch ArduinoISP selezionando come board l'arduino uno
  • collego l'atmega328p via isp all'arduino uno
  • carico lo sketch sull'atmega328p nuovo selezionando come board l'atmega a 8MHz

In pratica il bootloader non lo devo neanche usare, è corretto?

Per togliere il divisore x8 del clock non mi basta modificare i fuse nel file boards.txt e caricare via isp come scritto nella guida?
Non capisco cosa devo fare con avrdude, o lo fa l'ide direttamente?

Comunque, c'è un modo per sapere se l'atmega è settato per andare proprio a 1MHz e non 8MHz o 16MHz?

d407336:
se di fabbrica è a 1MHz per portarlo da 1MHz a 8MHz non mi serve il quarzo ma mi basta modificare il file boards.txt dell'ide come descritto nella guida del Menniti?
quindi in pratica se io uso un arduino uno come programmatore isp:

  • modifico il file boards.txt e aggiungo l'atmega a 8MHz con l'oscillatore interno
  • carico sull'arduino uno lo sketch ArduinoISP selezionando come board l'arduino uno
  • collego l'atmega328p via isp all'arduino uno
  • carico lo sketch sull'atmega328p nuovo selezionando come board l'atmega a 8MHz

In pratica il bootloader non lo devo neanche usare, è corretto?

Per togliere il divisore x8 del clock non mi basta modificare i fuse nel file boards.txt e caricare via isp come scritto nella guida?
Non capisco cosa devo fare con avrdude, o lo fa l'ide direttamente?

Comunque, c'è un modo per sapere se l'atmega è settato per andare proprio a 1MHz e non 8MHz o 16MHz?

No, così non va.
Tu hai detto che non vuoi programmarci sopra il bootloader. Se usi l'IDE l'unico modo per cambiare i fuse è scriverci il bootloader sul tuo chip. Se programmi solo lo sketch non cambi i fuse.
Vai perciò di terminale ed avrdude e cambi solo il fuse che ti serve (è i fuse basso):

  1. carichi l'ArduinoISP sull'Arduino
  2. stacchi la scheda e monti il 328 da programmare su breadboard seguendo la guida di Michele
  3. apri un terminale e poi dai questo comando
avrdude -P /dev/ttyACM0 -c stk500v1 -p m328p -U lfuse:w:0xe2:m -b 19200

se hai Linux, se hai Windows devi adattare il comando relativamente alla porta da usare
Se hai fatto tutto bene, avrdude ti dirà che ha flashato correttamente il micro, ed ora andrà a 8 MHz.

Per sapere il valore attuale del micro puoi leggere i fuse e guardare cosa c'è scritto nel fuse basso. Usa il comando del punto 3) sostituendo la parte relativa al parametro -U

-U lfuse:r:./fuseBasso.txt

mi pare.

leo72:
Per sapere il valore attuale del micro puoi leggere i fuse e guardare cosa c'è scritto nel fuse basso. Usa il comando del punto 3) sostituendo la parte relativa al parametro -U

-U lfuse:r:./fuseBasso.txt

mi pare.

Deve aggiungere alla fine anche in che modo deve salvare i dati, quindi

-U lfuse:r:./fuseBasso.txt:h

Vero, "h" per esadecimale, "d" per decimale.

Credo sia più utile in esadecimale, almeno può verificare meglio il fuse impostato.
Se lo imposta in esadecimale, tanto vale che...
:wink:

Io comunque son dell'idea di settarlo subito a E2 ]:smiley:

@ d407336: la Guida va letta con la dovuta attenzione, altrimenti sfugge qualche passaggio e poi escono interpretazioni inesatte come quelle che hai fornito tu. In sintesi, per andare sul sicuro al primo colpo, a prescindere dal fatto che il micro sia settato a 1, 8 o 16MHz, fai così:
carica ArduinoISP su Arduino
prepara il micro sulla bread (con quarzo e condensatori) e collegalo via ISP ad Arduino
modifica boards.txt aggiungendo la board a 8MHz con oscillatore interno
carica il bootloader (attenzione alle differenze tra IDE 0022 e 1.0.1) via ISP
carica lo sketch via ISP

l'operazione del bootloader ti setterà i fuse per 8MHz oscillatore interno, il caricamento dello sketch disattiverà il bootloader, a motivo del settaggio dei fuse.
Ciao
il menniti :smiley:

Ma lui ha detto che non voleva il bootloader, ecco perché gli ho consigliato, visto che il micro è vergine, di settare solo il fuse basso.

grazie delle risposte!
ma se carico il bootloader poi se lo programmo via isp non ci sarà nessuna differenza tra caricarlo non caricarlo oltre al fatto di dover settare i fuse?

per l'operazione con avrdude l'atmega và collegato via isp all'arduino normalmente come per le altre operazioni?

il mio problema era il quarzo, perchè se è necessario per forza lo devo comprare e poi visto che ce l'ho tanto vale lasciare lavorare l'atmega a 16MHz, se invece di fabbrica esce a 1MHz posso portarlo a 8MHz senza quarzo esterno visto che è già impostato per usare l'oscillatore interno?

non avevo capito che non hai il quarzo e siccome volevi leggere i fuse pensavo non fossi sicuro che è vergine

visto che è sicuramente vergine allora puoi fare tutto ciò che ti ho consigliato SENZA usare quarzo e condensatori

mettere il bootloader e poi uno sketch significa, a motivo dei settaggi dei fuse, che alla fine è come se il bootloader non fosse mai stato caricato

naturalmente non ho inteso dire che il consiglio di Leo non è corretto (non sono un pazzo :grin:), cercavo solo di suggerire una strada aggirando l'uso di AVRDUDE, come ho detto io puoi fare tutto via IDE senza scomodare la riga di comando

se non ho capito un zz della situazione abbiate pietà, ignoratemi, fate finta che io non abbia detto niente :sweat_smile:

nono, hai capito benissimo, anzi, grazie di tutte le informazioni, ora ho le idee più chiare :wink: