Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

5
voti

Lampeggio led tramite Timer Interrupt - Parte 2

Introduzione

Questa è la seconda parte dell'articolo Lampeggio led tramite Timer Interrupt.

Valori tipici del Timer0 Overflow

I valori tipici: quante piccole maledizioni ho lanciato ai miei Professori universitari quando parlavano di una grandezza fisica di un componente elettrico, di un sistema, di un processo, e non ne svelavano mai i valori usualmente riscontrati nella pratica!
Dateci un'idea di quanto vale 'sto benedetto parametro! E invece... niente!

Nel nostro caso però abbiamo tutta la teoria disponibile per ragionare e fare calcoli e trovarceli da soli i valori tipici del Timer0 overflow.
Allora ragioniamo un po' su un PIC che viene fatto lavorare alla velocità di 4 MHz da un quarzo esterno.
Il concetto basilare da ricordare è che il Timer è un contatore che conta con un tempo scandito dalla velocità di clock, normalmente conta una unità ogni 4 cicli di clock.

La frequenza di 4 MHz corrisponde ad un periodo di 1/4 microsecondi (Periodo = reciproco della Frequenza).
Un periodo equivale ad un ciclo di clock.
4 cicli di clock corrispondono in questo caso a 4 * 1/4 = 1 microsecondo: ogni microsecondo il Timer0 incrementa di una unità.

E' un tempo decisamente "rapido"!!!
Certo, bisogna tenere conto che il Timer0 overflow avviene dopo 256 unità (ammesso che il Timer0 parta da 0, cioè che non lo si precarichi -vi ricordate?- con un valore maggiore), ossia dopo 256 microsecondi: rimane comunque troppo rapido, troppo "distante" dai 500 millisecondi che desideriamo usare come tempo di lampeggio del led.

Ricordiamoci ora che possiamo mettere le mani su un Prescaler che permette di moltiplicare (per 2 o 4 o 8 o 16 o 32 o 64 o 128 o 256) il numero di cicli di clock necessari all'incremento di una unità del Timer0.

Vediamo a quale valore massimo possiamo ottenere il Timer0 overflow: facciamo i conti senza ricorrere al precaricamento e considerando il Prescaler impostato a 256.
In pratica il tempo ottenuto prima si moltiplica di 256 volte, ossia 256 * 256 = 65536 microsecondi.
Cambiando l'unità di misura in millisecondi, abbiamo 65,536 millisecondi.

Ecco quindi svelati i valori tipici del Timer0 overflow di un PIC che "corre" con un quarzo da 4MHz.

Ovviamente con un quarzo che non oscilla a 4 MHz ma ad altre frequenze, questi valori cambiano perchè cambia "il tempo base" con cui lavorano il PIC, ed anche il Timer0.
E' già interessante, a mio avviso, notare che abbiamo a disposizione tempi che spaziano da 1 microsecondo a 65 millisecondi... chi di voi prima d'ora avrebbe detto di poter controllare, agire, intervenire su un evento che dura un microsecondo?
Fra l'altro solamente con una manciata di righe di codice.
Penserete che è un tempo decisamente breve, ad esempio che sfugge sicuramente al nostro occhio: la nostra vista non può catturare una cosa così rapida... ma non esistono solamente led che lampeggiano (che francamente ci hanno un po' stancato!).
Ma chiudiamo la parentesi e torniamo al problema del lampeggio del led, ora ci dobbiamo occupare di questo.

Bene, dicevamo che siamo passati dai microsecondi ai millisecondi, per essere precisi alle decine di millisecondi; che valore "scomodo" però 65,536 con quei decimali.
Forse è meglio a questo punto cercare di ottenere il Timer0 overflow ogni 1 millisecondo, e contare 500 Timer0 overflow con l'ausilio della variabile sopra nominata per raggiungere così l'intervallo di 500 millisecondi.

PicTimer

Dopo tutta questa UTILE fatica, per fare i calcoli velocemente... anzi, per non farli proprio ;) potete usare l'ottimo PicTimer dell'autore Giovanni Bernardo.

PicTimer di Giovanni Bernardo

PicTimer di Giovanni Bernardo

Come vedete in questo caso PicTimer suggerisce di impostare il Prescaler a 4 e precaricare il Timer0 a 6 per ottenere esattamente il tempo di 1 millisecondo. Anzi, tenendo conto addirittura anche del "tempo perso" dal PIC per effettuare il precaricamento, che dura 2 cicli di clock, il precaricamento del Timer0 deve essere 8.

Cliccando su "Codice" otteniamo senza alcuna fatica il codice in Hitec-C (con una piccolissima modifica lo si rende valido per il compilatore XC8 che è quello che ho ad esempio installato io) pronto da copiare ed incollare nel nostro MPLAB X IDE.

// Generato da PicTimer 1.0.1.0
// © Bernardo Giovanni - www.settorezero.com
// Codice valido per Hitec-C

// Fosc           :4MHz
// Timer0 preload :6
// Prescaler      :4
// Interrupt time :1,0000mS

// OPTION
// bit 0 -> PS0    Prescaler Rate Select bit 0
// bit 1 -> PS1    Prescaler Rate Select bit 1
// bit 2 -> PS2    Prescaler Rate Select bit 2
// bit 3 -> PSA    Prescaler assegnato a Timer0 (1=Watchdog Timer)
// bit 4 -> T0SE   Timer0 Signal Edge: 0=low->high 1=high->low
// bit 5 -> T0CS   Timer0 Clock Select: internal clock (1=T0CKI transition)
// bit 6 -> INTEDG INTerrupt Edge (1=raise 0=fall)
// bit 7 -> RBPU   PortB PullUp (0=off 1=on)

OPTION=0b00000001;

// INTCON
// bit 0 -> RBIF   PortB Interrupt Flag
// bit 1 -> INTF   RB0/INT Interrupt Flag
// bit 2 -> T0IF   Timer0 Interrupt Flag
// bit 3 -> RBIE   PortB Interrupt Enable (off)
// bit 4 -> INTE   INT Interrupt Enable (off)
// bit 5 -> TMR0IE Timer0 Interrupt Enable (on)
// bit 6 -> PEIE   PEripheral Interrupt Enable (off)
// bit 7 -> GIE    Global Interrupt Enable (on)

INTCON=0b10100000;

// Preload Timer0
// TMR0=8; // valore con correzione

TMR0=6; // senza correzione
0

Commenti e note

Inserisci un commento

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.