Oscillatore esterno per swRTC - Problema con ATMEGA 328 settato ad 8MHz

Salve a tutti, vi scrivo perché non ce la faccio più, sono giorni che leggo pagine e pagine del forum senza venire a capo del mio problema.
Sto costruendo un orologio a parete con ArduinoUno e qualche giorno fa mi sono accorto che sballava un po' troppo, così ho iniziato a leggere il topic sulla swRTC. Sono arrivato alla conclusione che non avrò mai un orologio preciso, ma ho trovato una discreta soluzione: modulo DCF77 + oscillatore esterno da 32768 KHz. Il problema che sorge adesso è, come si collega l'oscillatore esterno? Va bene questo schema?

Ho letto che la frequenza di funzionamento deve essere settata a 8MHz, quindi ho usato un altro ArduinoUno ed ho cambiato i lfuse in 0xe2, ma adesso ho la scheda bloccata, non riesco a caricare nessun programma, mi da l'errore avrdude: "stk500_getsync() attempt 10 of 10: not in sync: resp=0x03".
Pensando di aver fatto danni ho ripristinato il bootloader originale, ma dopo averlo caricato non mi fa comunque caricare gli sketch. Allora mi sono ricordato che a scuola spesso premevamo il pulsante di reset e lo lasciavamo mentre caricava il programma. Risultato? Con bootloader a 16MHz funziona il metodo, dopodiché funziona come prima, ma con il bootloader a 8 MHz non va, ho provato per più di mezz'ora!
L'orologio è un regalo di compleanno, Sabato sera si festeggia, se risolvo questo problema posso farcela, sono nelle vostre mani. Grazie a tutti e scusate per la lunghezza del post.

Se vuoi usare l'Arduino a 8Mhz con bootloader devi caricare un bootloader che vada a 8 Mhz.
Ad esempio quello per Arduino Pro, scegliendo ATmega328 (8 Mhz).
Poi devi ricambiare il fuse per mettere il clock interno a 8Mhz e non esterno come l'Arduino Pro.

Perdona la mia ignoranza, come faccio a selezionare il bootloader da cambiare? Io finora ho pensato che cambiare i fuse equivalesse a cambiare il bootloader... I fuse li ho cambiati con una linea di comando da AVRdude perché non sapevo come cambiarli con l'IDE. Qualcuno potrebbe spiegarmi cosa devo fare, passo passo? Il modulo DCF non riesce a prendere il segnale, quindi usare un quarzo esterno sta diventando sempre più vitale...

Certo non hai scelto un nik facile da ricordare/leggere per i mie poveri occhi. :stuck_out_tongue:

Ti posso dare per certo che il fuse 0xe2 equivale a: 8MHz Internal RC oscillator e il fuse bit CKDIV8 non selezionato.
Quindi il clock è effettivamente ad 8MHz.

Ora hai due strade percorribili:

  1. Usi un device programmatore, tipo AVRISP MKII.
  2. Usi una board arduino (o standalone) su cui gira il firmware ArduinoISP, il quale trasforma la board Arduino in un device programmatore.

Tramite l'uno o l'altro device puoi scrivere il bootloader o oppure direttamente il firmware del tuo orologio. Nel secondo caso però perdi la possibilità di aggiornare il firmware tramite la presa USB.

Quindi al momento c'è un bootloader pensato per lavorare a 16MHz, ma il micro viaggia alla metà di 16, cioè 8MHz.
Questo vuol dire anche il baud rate della seriale lavora male.

Qual'è il bootloader da compilare e inviare tramite uno o l'altro device programmatore non sono in grado di dirtelo, in genere qualunque bootloader per ATmega328 pensato per lavorare a 8MHz dovrebbe andare bene.

Ciao.

N4pst3r_95:
Perdona la mia ignoranza, come faccio a selezionare il bootloader da cambiare?

Apri l'IDE, menù Strumenti --> Scheda. Selezioni dall'elenco Arduino Pro or Mini Pro.
Riapri il menù Strumenti --> Processore. Selezioni ATmega328 (3.3V 8mhz)
Sempre dal menù Strumenti --> Programmatore. Selezioni Arduino as ISP.
Colleghi un secondo Arduino con caricato lo sketch "Arduino as ISP" all'Arduino da programmare e premi (sempre menù strumenti) Carica Bootloader.

Per il segnale DCF devi aspettare almeno 2 minuti con buon segnale prima che si sincronizzi.

Ieri ho provato a cambiare qualche lfuse e credo di aver fatto danno perché mi dice "firma non valida". Prima di fare questo però avevo settato i lfuse a 0xe2, ma non mi permetteva di caricare il programma, seppur avessi aggiunto e selezionato ATMEGA 328 8Mhz (internal), aggiungendo al file boards le seguenti righe :

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

ATmega328p-8.name=ATmega328p-Internal 8Mhz
ATmega328p-8.upload.tool=avrdude
ATmega328p-8.build.mcu=atmega328p
ATmega328p-8.build.f_cpu=8000000L
ATmega328p-8.build.core=arduino:arduino
ATmega328p-8.build.variant=ATmega328p
ATmega328p-8.upload.maximum_size=32000

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

Menomale che avevo un 328 di scorta che utilizzavo per uno standalone...

Parlando del DCF vi devo dire che fin'ora non sono riuscito ad ottenere una sincronizzazione. So che il segnale è nettamente migliore di notte e so che i display interferiscono con esso. Stanotte ho lasciato tutto collegato, seriale aperta e display spento. Mi alzo e noto, con sommo dispiacere, che il mio pc ha deciso di riavviarsi stanotte, per cui non saprò mai se si fosse sincronizzato. Adesso sto cambiando il codice dell'orologio implementando la libreria Time, che viene usata per il DCF. Sto diventando scemo vicino st'orologio, ho poco tempo e devo risolvere per forza.

N4pst3r_95:
Salve a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Per funzionare il bootloader deve essere compilato per girare al clock del micro.
Il bootloader della UNO è compilato per girare a 16Mhz e su quella velocità si basano le tempistiche della seriale.
Il bootloader della PRO o MINI PRO è compilato anche per gli 8Mhz. Quindi se vuoi caricare degli sketch via seriale a 8Mhz devi usare quel bootloader o uno compilato per gli 8Mhz.
Riguardo ai fuse sinceramente non ricordo i parametri corretti.

Che libreria usi per il DCF?

Chiedo scusa se non mi sono presentato, lo farò senz'altro. Chiedo scusa anche a MauroTec per il mio nickname, ma è quello che utilizzo quasi per tutto, se lo cambio non riesco ad accedere a nulla :smiley:

PaoloP, vorrei un po' di chiarezza riguardo fuse e bootloader. L'azione di cambiare i fuse, è cambiare il bootloader? Così mi sembra di aver capito... Se così fosse, so farlo, ma non riesco a caricare gli sketch sull'Arduino a 8 Mhz. Devo selezionare come scheda la PRO o la MINI PRO per caricare il programma dopo averlo settato ad 8MHz? Inoltre, va bene questo schema per usare il quarzo da orologio?

Per il DCF sto utilizzando questa libreria :

http://playground.arduino.cc/Code/DCF77

Con questo modulo:

http://www.hkw-shop.de/out/media/FBD11030R_EM2S_DCFn_DD.pdf

Con il seguente collegamento:

ed il pin LP2 su GND, altrimenti non si attiva.

Scusate le mille domande, magari anche insulse, ma ho bisogno di fare chiarezza e di risolvere il problema.

Aggiornamento, sono riuscito a programmare l'ATMEGA 328 settato ad 8MHz con un blink modificato. Adesso provo uno sketch con quarzo esterno, sperando funzioni...

:slight_smile:

Niente da fare... Qualcuno riesce a darmi uno sketch funzionante con relativo schema elettrico per utilizzare un quarzo da 32.768 KHz come timer? Nel topic sulla swRTC tutti ne parlavano ma non ho mai visto un esempio d'applicazione. Ripeto, sto usando un ATMEGA 328 settato ad 8MHz, programmato tramite un'altra Arduino UNO as ISP.

Perfetto, adesso non riesco nemmeno più a settare i fuse, quando provo a leggerli ho questo errore:

stk500_program_enable(): protocol error, expect=0x14, resp=0x50 avrdude: initialization failed, rc=-1

Double check connections and try again, or use -F to override
this check.

Se però carico degli sketch utilizzando ArduinoUno as ISP me lo fa fare, solo che non riesco più a settare i fuse originali. Non ditemi che questo è il secondo chip che faccio fuori, oltre a non risolvere il problema sto solo buttando roba nel cestino :cry:

Forse questo ti è sfuggito:

Tramite l'uno o l'altro device puoi scrivere il bootloader oppure direttamente il firmware del tuo orologio. Nel secondo caso però perdi la possibilità di aggiornare il firmware tramite la presa USB.

Quello che hai fatto è appunto di usare ArduinoISP per scrivere il firmware, questa operazione rimuove il bootloader per cui dovrai leggere i fuse lockbit ecc tramite ArduinoISP. Ora pui scrivere tutte le volte che vuoi la flash del tuo firmware, ma se obbligato ad usare ArduinoISP, che è meno comodo della presa USB + un PC.

Sei confusione perché sembra che tu non abbia idea di cosa sono i fuse e cosa è il bootloader e il lavoro che compie.
Intanto sono due cose separate.
I fuse sono delle porzioni di memoria ad uso speciale, normalmente trovi 3 fuse da 8 bit, Low Fuse, High Fuse ed Extended Fuse. Ogni bit o collezione di bit permettono di configurare il micro.

Il bootloader è un firmare che risiede in una porzione di flash riservata a lui, porzione che viene determinata dalle impostazioni dei fuse. Il bootloader è il primo codice ad essere eseguito dopo un reset, esso controlla che a seguire il reset
ci siano o meno dei dati, se ci sono li valuta, probabilmente i dati chiedono al bootloader di prepararsi a trasferire nella memoria flash riservata al firmware utente, i dati che arrivano sono il firmware da scrivere in flash.

Mentre quando non arrivano dati e non c'è intenzione di trasferire firmware, e il bootloader cede il controllo al firmware utente che viene eseguito normalmente.

solo che non riesco più a settare i fuse originali.

Come tenti di cambiare i fuse? Tramite ArduionoISP?

Se hai il fuse 0xe2 il tuo firmware deve essere ricompilato per lavorare ad 8MHz, come si da passo passo non so spiegartelo, posso dirti che la macro F_CPU deve essere impostata a 8000000UL se il micro ha il clock a 8MHz.

Vedrai che in qualche modo ne viene fuori, ma non se poi sarà troppo tardi per presentare il tuo regalo.

Ciao.

Grazie per la risposta, ieri mi sono scervellato online ed ho capito a tarda serata quello che mi hai detto tu adesso. Infatti ho riesumato i vecchi due ATmega328 che pensavo fossero rotti, tramite ISP funzionano benissimo. Per il settaggio dei fuse ho fatto tutto su breadboard stavolta ed è andato tutto liscio, ho riconfigurato con successo il chip a 16 Mhz. Per il quarzo esterno ci ho rinunciato, ho ordinato un RTC, quando leo72 farà la swRTC 2 avrò la possibilità di implementare il cristallo da 32.768KHz, fino ad allora cercherò di aggiornare l'orario con un modulo DCF. Purtroppo qui sorgono altri problemi, non riesco in nessun modo a farlo sincronizzare, ho un segnale a dir poco pietoso. Adesso ho trovato un'altra libreria per il DCF, solo che mi occorrono due Arduino, poiché uno serve solo per filtrare il segnale... Apro un nuovo topic per il DCF? Il titolo sarebbe ot per il nuovo problema...

Io ci ho rinunciato tempo fa --> DCF77 - RTC DS1307 - Software - Arduino Forum

Mah ormai credo di aver rinunciato anche io, non mi sono mai riuscito ad agganciare al segnale. Ho ordinato degli RTC termocompensati, sballano di qualche secondo l'anno, mi posso accontentare...