due 328 con un solo quarzo?

Buongiorno e perdonate la domanda probabilmente stupida. mi chedevo se fosse possibile far funzionare due atmega328 in standalone collegati allo stesso quarzo. Grazie a chiunque risponda.

pippo72

Non mi fiderei. Il ATmega328 puó essere pilotato da un clock esterno. Non mi fido di prendere il clock dal ATmega328 che ha il quarzo. Secondo me non puoi prendere il segnale perché 1) non é di livello TTL e 2) collegando qualcosa modifichi l' impedenza dal circuito oscillante e percui si blocca il clock o diventa inaffidabile.

Cosa Ti costa mettere un quarzo o un risuonatore per ogni Controller? Anche usare un oscillatore esterno che alimenta entrambi i ATmega é piú complicato.

Ciao Uwe

ciao

uwefed: Cosa Ti costa mettere un quarzo o un risuonatore per ogni Controller?

Mi costa... il costo del quarzo. :P A parte le battute, non ho nessun problema a mettere un quarzo per ogni MCU, la mia era solo una 'curiosità'.

Grazie per la risposta.

ciao pippo72

Se non ricordo male da un pin può uscire il segnale ttl alla frequenza del quarzo e con questa uscita pilotare il clock dell'altro 328, se non ricordo male qualcosa di simile la fece Menniti.

Ciao.

MauroTec: Se non ricordo male da un pin può uscire il segnale ttl alla frequenza del quarzo e con questa uscita pilotare il clock dell'altro 328, se non ricordo male qualcosa di simile la fece Menniti.

Ciao.

Ma devi comunque abilitarlo via Sketch ( o Fuse) e Ti ruba un pin?? Ciao Uwe

uwefed: Ma devi comunque abilitarlo via Sketch ( o Fuse) e Ti ruba un pin??

Si, lo abiliti tramite il bit 6 (CKOUT) del Low Fuse Byte che, se attivo, fa si che il clock esca dal pin PB0 (... digital pin 8 di Arduino UNO) ;)

Guglielmo

Ma forse lui intendeva collegare allo stesso quarzo entrambi gli atmega....

paulus1969: Ma forse lui intendeva collegare allo stesso quarzo entrambi gli atmega....

Si. è questo che intendevo. Il motivo della domanda, oltre alla semplice curiosità è legato al fatto che i 2 atmega devono comunicare tra loro tramite seriale e con un solo quarzo sono sicuro che vanno alla stessa velocità.

Si, lo abiliti tramite il bit 6 (CKOUT) del Low Fuse Byte che, se attivo, fa si che il clock esca dal pin PB0

A questo punto vorrei aprofondire: un atmega328 ha il suo quarzo ecc. e dà un "segnale" di clock tramite il piedino 14 (PB0). Ma questo segnale di clock dove lo collego all'Atmega328 senza quarzo? Al piedino 9 o 10?

pippo72

Usi un oscillatore e dai il clock ad entrambi i micro, con l'oscillatore risparmi i 1 condensatore (2 se vuoi fare ultra-low-cost) e 1 pin in ogni micro. E' più affidabile e preciso del quarzo in quanto già ben tarato, altrimenti i 2 C del quarzo dovresti tararli.

Altra soluzione come ti hanno già detto è questa: usi il quarzo con un micro e usi 1 pin speciale per avere in uscita un segnale onda quadra alla stessa frequenza del quarzo, già amplificato etc.. Nel secondo micro recuperi il pin visto che invece che 2 pin per il quarzo usi 1 solo pin per l'ingresso dell'onda quadra

Condividere i pin del quarzo direttamente non è una grande idea.. se ti va bene perdi in precisione (e tanto vale usare clock RC interno allora) se ti va male danneggi il quarzo, la via di mezzo è che non funziona ma non si rompe

Ciao

Ma questo segnale di clock dove lo collego all'Atmega328 senza quarzo? Al piedino 9 o 10?

l'ingresso per un clock esterno e' Xtal1 ( pin 9), ma vanno programmati anche i fuse dedicati per il clock esterno

Comunque, sappi che il discorso e' valido se i due Atmega sono a pochi cm di distanza l'uno dall'altro

flz47655: Condividere i pin del quarzo direttamente non è una grande idea.. se ti va bene perdi in precisione (e tanto vale usare clock RC interno allora) se ti va male danneggi il quarzo, la via di mezzo è che non funziona ma non si rompe

Non si rompe nulla, semplicemente non funziona perché non puoi mettere in parallelo due oscillatori su un singolo quarzo.

Agendo sui fuse si potebbe anche attivare il ckout e usare quell'onda quadra

EDIT: da cellulare non avevo letto l'intervento di Guglielmo, che già consigliava questa strada :grin:

Allora ne aggiungo un'altra, riallacciandomi ai ricordi di MauroTec, in realtà quella era l'attivazione del clock out, ma facendo sperimentazione sul 1284P ho scoperto una nuova modalità. In pratica i due pin riservati al quarzo sono l'ingresso e l'uscita di un circuito oscillatore, è possibile attivare i fuse per l'opzione full-swing che, a fronte di un consumo maggiore del micro, aumenta l'amplificazione del segnale e tale segnale, preso sul pin di uscita, può fornire il clock ad altri integrati, quindi anche ad un secondo micro. L'opzione full swing in realtà nasce per sopperire alle problematiche che il "rumore" può provocare al funzionamento corretto del micro, ma sul data-sheet stesso, se non ricordo male, specifica l'opzione di usare il clock per altri componenti.

Detto questo mi permetto di rispondere a Uwe, al di là di una questione di "risparmio" economico, perché sprecare componenti quando se ne può fare a meno senza perdere in prestazioni? Inoltre bisogna considerare un altro fattore: non necessariamente il clock deve servire per altri micro. La mia prima realizzazione, fatta con l'aiuto di Astro, fu un circuito che generava sequenze di bit; all'epoca non conoscevo queste cose e quindi dotai il circuito aggiuntivo, fatto con TTL HCT, di un oscillatore locale; dovessi rifarlo oggi decisamente eliminerei qualla parte di circuito ed utilizzerei il clock del micro ;)

[quote author=Michele Menniti link=topic=272483.msg1923012#msg1923012 date=1413440524] Agendo sui fuse si potebbe anche attivare il ckout e usare quell'onda quadra [/quote] Accidenti prof.. è un po' distratto: questa idea l'ha proposta MauroTec

MauroTec: Se non ricordo male da un pin può uscire il segnale ttl alla frequenza del quarzo e con questa uscita pilotare il clock dell'altro 328, se non ricordo male qualcosa di simile la fece Menniti.

e l'ha finalizzata Guglielmo

gpb01:

uwefed: Ma devi comunque abilitarlo via Sketch ( o Fuse) e Ti ruba un pin??

Si, lo abiliti tramite il bit 6 (CKOUT) del Low Fuse Byte che, se attivo, fa si che il clock esca dal pin PB0 (... digital pin 8 di Arduino UNO) ;)

Guglielmo

Quindi un atmega328 (chiamiamolo "master") con quarzo e bootloader arduino uno con low fuse 0XBF, high fuse 0XDE e extended fuse 0X05 e l'altro atmega328 senza quarzo con bootloader arduino uno senza cambiamenti e con pin9 (XTAL1) collegato al pin14(CLKO) dell'atmega328 precedente. Giusto o sto facendo confusione? grazie pippo72

Edit: @menniti: mi ha anticipato con suo edit.

Andrebbe fatta la prova, secondo me il secondo micro va settato per oscillatore esterno, perché dal ckout esce un segnale a livello logico 5V circa, quindi devi collegare il pin di uscita ckout del primo micro al pin 9 del secondo, lasciando il pin 10 libero.

EDIT: ti ho anticipato con l’EDIT ma intanto la tirata di orecchie l’hai lasciata bella evidente ]:smiley: a buon rendere ]:smiley:

[quote author=Michele Menniti link=topic=272483.msg1923012#msg1923012 date=1413440524] ho scoperto una nuova modalità. In pratica i due pin riservati al quarzo sono l'ingresso e l'uscita di un circuito oscillatore [/quote]

OSC1 e OSC2 (Xtal1 e Xtal2) non sono l'ingresso e l'uscita di un oscillatore, sono i due punti in cui va connesso il quarzo su un oscillatore, in particolare si tratta di un oscillatore di tipo parallelo, di qui la necessità dei due condensatori esterni da ~22pf (l'esatto valore dipende dal quarzo e dalla Cstray del micro). Se metti un qualunque tipo di carico su uno dei due punti dove è connesso il quarzo alteri le condizioni di funzionamento con il risultato di mandare in blocco l'oscillatore, è talmente critico che basta la sonda dell'oscilloscopio per fare casini, come minimo ti altera la frequenza di lavoro. Però OSC1 e OSC2 possono funzionare, previa commutazione interna della relativa circuiteria tramite fuse, come ingresso per un clock esterno e uscita dello stesso per mandarlo su un altro micro, in questo modo è possibile utilizzare un solo clock per tutti i micro presenti sulla scheda.

, è possibile attivare i fuse per l'opzione full-swing che, a fronte di un consumo maggiore del micro, aumenta l'amplificazione del segnale e tale segnale, preso sul pin di uscita,

Il full swing serve solo per aumentare l'immunità ai disturbi, questo perché aumenta il livello di tensione con cui lavora l'oscillatore, non puoi prelevare nulla perché OSC1 e OSC2 rimangono come punti di connessione del quarzo e non come In e Out.

Questa frase del datasheet:

This Crystal Oscillator is a full swing oscillator, with rail-to-rail swing on the XTAL2 output. This is useful for driving
other clock inputs and in noisy environments.

Sebbene abbastanza sibillina fa riferimento all'uso del pin CKOUT, previa abilitazione del relativo fuse, e non alla possibilità di prelevare il clock da OSC2 per pilotare altri micro.

[quote author=Michele Menniti link=topic=272483.msg1923284#msg1923284 date=1413455936] Andrebbe fatta la prova, secondo me il secondo micro va settato per oscillatore esterno, [/quote]

Esatto va settato per il clock esterno, attenzione che con questo setup poi non è più possibile programmare il micro in mancanza del clock, ovvero brick in agguato :)

Comincio a fare confusione:

astrobeed: Esatto va settato per il clock esterno, attenzione che con questo setup poi non è più possibile programmare il micro in mancanza del clock, ovvero brick in agguato :)

Quando dici "settato per clock esterno" intendi che quel atmega328 funziona solo se collego un quarzo ai pin 9 e 10 giusto? Se si allora siamo d'accordo. La mia confusione nasce dal fatto che ho l'impressione che (più o meno) tutti stiamo dicendo la stessa cosa ma sottolineando sfumature diverse. Tornando alla mia (teorica) situazione: un 328 con bootloader arduino uno ma con Lfuse a 0xbf anzichè 0xff (clock esterno e segnale di clock in uscita al pin14) con quarzo, condensatori ecc..; un secondo 328 sempre con bootloader arduino uno (quindi con clock esterno) senza modificare alcun fuse , senza quarzo ma collegando il pin 9 al pin 14 dell'altro 328. Questa configurazione potrebbe funzionare?

grazie pippo72

p.s. @menniti:

ma intanto la tirata di orecchie l'hai lasciata bella evidente

mi seccava cancellare il post : XD

pippo72: Quando dici "settato per clock esterno" intendi che quel atmega328 funziona solo se collego un quarzo ai pin 9 e 10 giusto?

No, intendo proprio un clock esterno che arriva da altro dispositivo, il sistema di clock degli Atmega può essere settato in vari modi, c'è l'oscillatore RC interno, poco preciso ma pratico, c'è l'oscillatore interno tramite quarzo o risonatore ceramico, c'è il clock esterno ed è in questa modalità che OSC1 è un input e OSC2 è output da cui prelevare il clock per applicarlo ad altro micro o device che lo richiede. Come ho sottolineato sopra, se tramite fuse attivi la modalità per il clock esterno in mancanza di questo non solo il micro non funziona, ma non puoi nemmeno programmarlo, infatti alcuni programmatori per AVR prevedono una linea di clock ausiliaria per poter supplire a questa esigenza durante la programmazione off board.

Ok, ora la cosa è un po' piu chiara 8)

La situazione dovrebbe essere questa: io prendo il mio 328 "nuovo", ci scrivo il bootloader della uno con fuse modificati per attivare il clock esterno, dopo di che non posso più farci niente a meno che non prenda il clock dall'altro 328 (quello con il CKOUT abilitato) giusto? Una volta collegato il pin9 all'altro 328 (il segnale di clock) dovrei (credo) poterlo programmare tramite seriale, giusto?

grazie pippo72

edit: pongo meglio la domanda: il segnale di clock esterno mi serve già "mentre" carico il bootloader oppure le modifiche dei fuse avvengono dopo il caricamento? (un po' come "riavvia il sistema per rendere attive le modifiche")

pippo72: giusto?

Si, però tutta questa complicazione non ti serve a nulla, se non per scopo didattico, perché il problema di partenza che ti poni, velocità di comunicazione tra due micro, non esiste se usi un quarzo per ogni micro., Pensa che Arduino usa un risonatore ceramico sul ATmega 328, costa meno del quarzo ed è molto meno preciso e stabile, eppure due Arduino diversi dialogano tra di loro senza problemi :)