Delay errato usando clock interno AtMega328

Ciao a tutti.. Come da titolo ho un delay errato su un Arduino standalone che ho creato. In realtà il

problema è abbastanza serio poiché ho creato un orologio. Spiegandomi meglio ho comprato un

AtMega328p-PU e ho inserito il bootloader per usare il quarzo interno (ho usato la guida ufficiale).. Il

problema sorge quando completato il mio orologio al posto di 60 secondi escono 1 minuto e 46 quindi

non posso nemmeno modificare il source... ovvero potrei, facendo un calcolo

106/60.000=60/x

però non c'è la precisione... quindi non c'è un modo per far corrispondere i delay (ripeto che il source

degli 8 mhz l' ho preso dal forum ufficiale, cioè questo)?

Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi ... all'interno del ATmega328 NON c'è alcun quarzo, c'è solo un oscillatore ... assolutamente NON adatto a fare un orologio dato che la frequenza cambia in funzione della temperatura, dell'alimentazione, ecc. ecc.

Se vuoi fare un vero orologio ... DEVI necessariamente collegarci un modulo RTC.

Guglielmo

P.S. : Ad ogni modo devi aver settato male qualche cosa ... perché su UN minuto, ci può essere l'errore di un secondo ... non di più ...

gpb01:
Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi ... all'interno del ATmega328 NON c'è alcun quarzo, c'è solo un oscillatore ... assolutamente NON adatto a fare un orologio dato che la frequenza cambia in funzione della temperatura, dell'alimentazione, ecc. ecc.

Se vuoi fare un vero orologio ... DEVI necessariamente collegarci un modulo RTC.

Guglielmo

P.S. : Ad ogni modo devi aver settato male qualche cosa ... perché su UN minuto, ci può essere l'errore di un secondo ... non di più ...

Grazie della risposta... In ogni caso avevo già letto il Regolamento ma evidentemente non c'era la presentazione(lo dico perchè mi presento in ogni forum di solito).
Un altra cosa... ci stavo pensando al source sbagliato ma dopo averlo ricontrollato dubito che sia lui il problema dato che mi funzionava perfettamente sull' arduino... per quanto riguarda la tensione... ora che ci penso può essere considerate le cadute di tensioni, la mancanza di un integrato stabilizzatore (7805) e l' alimentatore poco stabile e molto economico...
La verità comunque è che ho pensato fosse un quarzo (quello interno) poichè tempo fa spezzai un microcontrollore qualsiasi preso da una scheda che non ricordo e lì c'era all' interno un piccolo vetro.
Fa lo stesso.. Ma in ogni caso il mio problema sta nel capire perchè fa 46 secondi in più...

marcopellegrino99:
Un altra cosa... ci stavo pensando al source sbagliato ma dopo averlo ricontrollato dubito che sia lui il problema dato che mi funzionava perfettamente sull' arduino...

Se su Arduino funzionava (... ma t'assicuro che un orologio degno di tale nome, anche con Arduino ... se non ci metti un RTC ... non lo fai) allora o hai sbagliato la programmazione dei FUSE (... e lo stai mandando ad un clock differente) o nell'IDE stai scegliendo un tipo di "board" che non è compatibile con quanto da te impostato.

Guglielmo

L'oscillatore interno non é a quarzo ma RC percui molto piú impreciso.
Quando hai fatto l' upload hai selezionato un Arduino a 8MHz?
Ciao Uwe

uwefed:
L'oscillatore interno non é a quarzo ma RC percui molto piú impreciso.
Quando hai fatto l' upload hai selezionato un Arduino a 8MHz?
Ciao Uwe

Si ho messo arduino a 8mhz. Grazie dell' interessamento in ogni caso.

marcopellegrino99:
Si ho messo arduino a 8mhz. Grazie dell’ interessamento in ogni caso.

… dai retta, controlla la programmazione dei FUSE.

Guglielmo

Concordo con tutto quanto è stato detto.
L'RC interno è impreciso, hai oscillazioni di +/-10% sulla frequenza nominale e perdere anche 5 secondi al minuto è la norma.

Per avere una buona precisione ti serve un piccolo RTC esterno. Se vuoi "molta" precisione un RTC termocompensato (ma qui si parla di oggettini che costano decine di euri).

Alternativamente, puoi pensare ad utilizzare il modulo Real-Time Counter interno all'Atmega328P stesso. Io tempo fa ci ho fatto un piccolo orologio da tavolo che ho chiamato Micrologio. Ti serve un quarzino esterno da 32k (quello degli orologi classici) ed il chip può essere impostato ad 1 MHz. A te non importa il clock della MCU perché il modulo viaggia con il quarzino da 32K esterno quindi la precisione del tuo orologio la darà questo componente.
Puoi usare questa configurazione in accoppiata con l'ultima versione della mia libreria swRTC che implementa un orologio software nel chip: la versione 1.2.0 gestisce in automatico il quarzino esterno da 32K

Puoi postale la board che hai usato?
Parlo del codice da inserire nel file board.txt.
Così si da una controllata ai FUSE. :wink:

Oppure puoi farlo in autonomia qui:
http://www.engbedded.com/fusecalc/