Il modulo Timer0

Un pulsante connesso al Timer 0 del PIC18

Questa pagina descrive l'uso del Timer0, uno dei numerosi counter/timer presenti all'interno del PIC18

Un timer è un contatore hardware: semplicemente conta quanti sono i fronti del segnale applicato al suo ingresso, senza l'intervento del processore.

Qualche esempio di possibile utilizzo:

La struttura di Timer0

Il modo relativamente più semplice per comprenderne il funzionamento di Tmer0 è leggere il suo schema, presente sui fogli tecnici, lasciano ad un secondo momento l'individuazione degli SFR che ne configurano il funzionamento.

Schema interno di timer0 - 16 bit

Qualche osservazione sulla struttura di Timer0:

Contiamo gli impulsi in ingresso

In questo primo esempio Timer0 è utilizzato per contare quante volte viene premuto un pulsante. Tale valore viene continuamente letto e visualizzato su 8 LED.

L'hardware prevede il collegamento di 8 LED a PORTC e di un pulsante all'ingresso T0CKI. Di seguito lo schema di principio e, in apertura, una realizzazione pratica con PICdemo R2. Il codice è riportato a fine pagina.

Schema del contatore

La configurazione di Timer0 è in questo caso effettuata usando il solo registro T0CON (TIMER0 CONTROL REGISTER):

Una volta avviato Timer0 non è più richiesto alcun intervento del software ed il conteggio degli impulsi in ingresso ha inizio. Il main() non fa altro che leggere e visualizzare continuamente il numero contenuto nel contatore:
PORTC = TMR0L; // Display timer counter

Vi è un "piccolo" problema: a seconda del tipo di pulsante utilizzato, vengono conteggiati numerosissimo "impulsi fantasma", quasi un generatore di numeri casuale. Perché? Qui un suggerimento

Facciamo lampeggiare un LED

Questo esempio utilizza Timer0 in modalità 16 bit per generare un interrupt quando raggiunge la fine del conteggio, cioè al raggiungimento del valore 0xFFFF. Lo schema dell'hardware di riferimento è costituito da un LED (e relativa resistenza in serie) connesso tra RC0 e massa

Il codice, a fondo pagina, fa lampeggiare i due LED:

Esaminiamo il main() presente nel programma di esempio:

L'aspetto forse più interessante è legato al numero magico 3 036. Esso permette di generare un interrupt dopo un secondo esatto dall'avvio di Timer0. Infatti:

Quindi viene generato un interrupt dopo 4 µs · 4 · 62 500 = 1 s.

Il calcolo del numero magico da caricare in Timer0 può essere fatto con la formula inversa e qualche tentativo (i risultati corretti possono essere infatti più di uno, tutti però spesso approssimati) oppure usando uno dei tanti calcolatori che si trovano on-line.

La funzione di interrupt my_isr_l() è piuttosto convenzionale:

Occorre osservare che, mentre questo metodo è rigoroso nel generare ritardi, è solo approssimativo se siamo interessati a segnali di frequenza rigorosamente costante. Infatti:

Un approfondimento sull'argomento

Codice


Data di creazione di questa pagina: settembre 2014
Ultima modifica: 23 maggio 2016

Una pagina simile: PIC18: il modulo Timer0 (in assembly)


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima