Pagina 1 di 3

Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 21:42
da daniele1996
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?

Re: Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 21:54
da boiler
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

Re: Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 21:59
da daniele1996
Il quarzo è a 32.768 kHz, questo è il datasheet

Re: Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 22:48
da daniele1996
é possibile che ci voglia un partitore sul quarzo e un comparatore per trasformare il segnale in onda quadra? ...

Re: Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 22:52
da boiler
Il circuito necessario è già contenuto nel microcontroller, guarda nel datasheet, paragrafo 10.2.3.
Devi solo collegare il quarzo e due condensatori.

Boiler

Re: Timer 16bit con clock esterno

MessaggioInviato: 12 apr 2022, 22:58
da boiler
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

Re: Timer 16bit con clock esterno

MessaggioInviato: 13 apr 2022, 0:11
da daniele1996
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...

Re: Timer 16bit con clock esterno

MessaggioInviato: 13 apr 2022, 7:37
da EcoTan
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?

Re: Timer 16bit con clock esterno

MessaggioInviato: 13 apr 2022, 12:11
da WALTERmwp
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

Re: Timer 16bit con clock esterno

MessaggioInviato: 13 apr 2022, 18:15
da PietroBaima
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.