Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Timer 16bit con clock esterno

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Timer 16bit con clock esterno

Messaggioda Foto Utentedaniele1996 » 12 apr 2022, 21:42

Ciao a tutti, guardando nel datasheet dell'atmega324 ho notato che nei pin PB0 e PB1 sono indicati T1 e T0
avendo la necessità di un interrupt al secondo, ho pensato di collegare un quarzo a 32KHz.

Nel micro è collegato un display 1602. Ho provato il codice sul micro e sembra funzionare, ma c'è qualcosa che non mi convince: nel display i dati vengono aggiornati più volte al secondo, e questo mi fa pensare che ci sia qualcosa che non va... Se il quarzo è a 32KHz, un secondo non dovrebbe corrispondere a 32K unità?
Codice: Seleziona tutto
int main(){
TCCR1B = (1 << WGM12) | (1<<CS11) | (1<<CS12);
TIFR1 = (1<<ICF1);
TIMSK1 = (1<<ICIE1);
ICR1 = 32768;
sei();
...
...
...
while(1){

}
}


ISR(TIMER1_CAPT_vect){
   display_value += 1;
   LCD_clear();
   print_num(display_value,10);
}


C'è qualcosa di cui non ho tenuto conto?
Il quarzo va vollegato direttamente ai pin senza nessuna circuiteria esterna?
Avatar utente
Foto Utentedaniele1996
608 2 8 11
Sostenitore
Sostenitore
 
Messaggi: 1439
Iscritto il: 29 ago 2011, 11:29

0
voti

[2] Re: Timer 16bit con clock esterno

Messaggioda Foto Utenteboiler » 12 apr 2022, 21:54

Verifica cosa hai, ma di solito i quarzi di quel tipo non sono a 32 kHz, ma a 32.768 kHz, che passando per 15 stadi di un counter ti dà esattamente 1 Hz.

Boiler
Avatar utente
Foto Utenteboiler
20,1k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 3962
Iscritto il: 9 nov 2011, 12:27

0
voti

[3] Re: Timer 16bit con clock esterno

Messaggioda Foto Utentedaniele1996 » 12 apr 2022, 21:59

Il quarzo è a 32.768 kHz, questo è il datasheet
Avatar utente
Foto Utentedaniele1996
608 2 8 11
Sostenitore
Sostenitore
 
Messaggi: 1439
Iscritto il: 29 ago 2011, 11:29

0
voti

[4] Re: Timer 16bit con clock esterno

Messaggioda Foto Utentedaniele1996 » 12 apr 2022, 22:48

é possibile che ci voglia un partitore sul quarzo e un comparatore per trasformare il segnale in onda quadra? ...
Avatar utente
Foto Utentedaniele1996
608 2 8 11
Sostenitore
Sostenitore
 
Messaggi: 1439
Iscritto il: 29 ago 2011, 11:29

0
voti

[5] Re: Timer 16bit con clock esterno

Messaggioda Foto Utenteboiler » 12 apr 2022, 22:52

Il circuito necessario è già contenuto nel microcontroller, guarda nel datasheet, paragrafo 10.2.3.
Devi solo collegare il quarzo e due condensatori.

Boiler
Avatar utente
Foto Utenteboiler
20,1k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 3962
Iscritto il: 9 nov 2011, 12:27

0
voti

[6] Re: Timer 16bit con clock esterno

Messaggioda Foto Utenteboiler » 12 apr 2022, 22:58

Riguardo al tuo codice, non l'ho controllato in dettaglio, perché non ho mai lavorato su Atmega e non posso giudicare la correttezza delle impostazioni, ma non è quello che si fa di solito.

Non si "lavora" all'interno di una ISR. Ci si fa il minimo indispensabile (di solito si conferma l'interrupt e si mette un flag), il resto delle attività avvengono al di fuori della ISR, per esempio triggerate dal main loop.

Boiler
Avatar utente
Foto Utenteboiler
20,1k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 3962
Iscritto il: 9 nov 2011, 12:27

0
voti

[7] Re: Timer 16bit con clock esterno

Messaggioda Foto Utentedaniele1996 » 13 apr 2022, 0:11

Si, infatti questo è un caso abbastanza insolito visti i risultati delle prove che ho fatto... comunque sono andato piu in giù e nella sezione del timer 2 dice che è adatto ai quarzi da 32KHz, però mi tocca risaldare le connessioni del circuito... appena posso faccio una prova... Tenendo conto che è a 8 bit facendo 32k / 256 escono 128 overflow tondi tondi...
Avatar utente
Foto Utentedaniele1996
608 2 8 11
Sostenitore
Sostenitore
 
Messaggi: 1439
Iscritto il: 29 ago 2011, 11:29

0
voti

[8] Re: Timer 16bit con clock esterno

Messaggioda Foto UtenteEcoTan » 13 apr 2022, 7:37

Col mio compilatore XC16, ogni ISR va terminata resettando lo interrupt flag:
Esempio: IFS0bits.T2IF = 0;
inoltre non capisco bene dove hai messo il quarzo, non dovrebbe essere sui pin del clock principale coi fusebits opportunamente configurati, oppure su un oscillatore esterno?
Avatar utente
Foto UtenteEcoTan
6.478 4 11 13
Expert EY
Expert EY
 
Messaggi: 4379
Iscritto il: 29 gen 2014, 8:54

0
voti

[9] Re: Timer 16bit con clock esterno

Messaggioda Foto UtenteWALTERmwp » 13 apr 2022, 12:11

Vado a rimorchio degli altri.
Mancano informazioni(schema e codice incompleto) e, alla coerenza di quanto già scritto, suggerirei di non passare parametri con la routine di interrupt.
Quando scatta l'interrupt fai in modo che la chiamata comporti semplicemente la modifica di una sola variabile(globale) al cui test, da eseguire nel main, subordinerai l'esecuzione di quanto ritieni necessario come, per esempio, l'aggiornamento del display e, sicuramente, il ripristino della variabile in causa.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
26,4k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 7913
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[10] Re: Timer 16bit con clock esterno

Messaggioda Foto UtentePietroBaima » 13 apr 2022, 18:15

Dove hai montato il circuito?

Concordo alla grande con boiler, il fatto che tu abbia messo nel service di interrupt una quantità mostruosa di operazioni potrebbe, già da sola, essere la ragione per la quale il tutto non funziona.

Nel service l’unica cosa che va fatta è aggionare una variabile, tutto il resto lo fai fuori mentre aspetti la nuova chiamata al service.
Generatore codice per articoli:
nomi
emoticon
citazioni
formule latex
Avatar utente
Foto UtentePietroBaima
85,5k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 11349
Iscritto il: 12 ago 2012, 1:20
Località: Londra

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti