19
NA – L7 1 Corso introduttivo sui microcontrollori A. S. 2007 – 2008 La programmazione dei PIC TIMERS Nicola Amoroso [email protected] http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/

namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2. ... Il timer TMR0 è tratto dal noto corso on line

  • Upload
    lamhanh

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 1

Corso introduttivo sui microcontrollori

A. S. 2007 – 2008

La programmazione dei PICTIMERS

Nicola [email protected]

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 2: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 2

La programmazione dei PICTimers

I timer sono precisi contatori, che possono essere configuratiper incrementarsi su fronti di segnali esterni o su fronti di unsegnale interno ottenuto dal clock, direttamente dall’hardwaredel pic. La frequenza del segnale con cui il registro vieneincrementato è pari a fosc/4 oppure a fosc/4 opportunamenteprescalato [fosc/4 diviso per un multiplo di due (2, 4, 8, 16 …etc...)]

Fosc/4 è un segnale generato internamente al PIC dal circuitodi clock ed è pari alla frequenza di clock divisa per quattro.

Il PIC 16F877 ha tre timer individuati come timer0, timer1 etimer2.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 3: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 3

I timer 0 e 2 sono ad 8 bit mentre il timer 1 è a 16 bit; ciò implica che itimer 0 e 2 tornano nella condizione iniziale dopo 256 impulsi in ingressomentre il timer 1 torna nella condizione iniziale dopo 65536 impulsi iningresso.I registri associati ai timer sono ciclici cioè dopo aver raggiunto il valoremassimo al successivo impulso ricominciano il conteggio da zero in faseUP o dal vaore massimo in fase DOWN.Es per un registro a 8 bit … 254, 255, 0, 1, 2, … UP

… 2, 1, 0, 255, 254, … DOWN

Il passaggio per lo zero viene sempre individuato come condizione di overflow

I registri timer possono essere inizializzati ad un valore iniziale, al successivoimpulso in ingresso il conteggio inizia dal valore immesso e continua in modosequenziale.

La programmazione dei PICTimers

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 4: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 4

La programmazione dei PICTimers – Timer0 TMR0

Il registro TMR0 è un contatore, ovvero un particolare tipo di registroil cui contenuto viene incrementato con cadenza regolare eprogrammabile direttamente dall'hardware del PIC. In pratica, adifferenza di altri registri, il TMR0 non mantiene inalterato il valoreche gli viene memorizzato, ma lo incrementa continuamente, se adesempio scriviamo in esso il valore 10 con le seguenti istruzioni:

movlw 10 ;”Carica” il valore 10 (Decimale) nell’accumulatoremovwf TMR0 ;Sposta il valore dell’accumulatore nel registro TMR0

dopo un tempo pari a quattro cicli macchina, il contenuto del registrocomincia ad essere incrementato a 11, 12, 13 e così via con cadenzacostante e del tutto indipendente dall'esecuzione del resto delprogramma.Se, ad esempio, dopo aver inserito un valore nel registro TMR0,eseguiamo un loop infinito

movlw 10 ;”Carica” 10 nell’accumulatoremovwf TMR0 ;”Sposta” il valore sul registro TMR0

loop ;Label Loopgoto loop

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

il registro TMR0 viene comunque incrementato dall'hardware interno al PIC contemporaneamente all'esecuzionedel loop. Una volta raggiunto il valore 255 il registro TMR0 viene azzerato automaticamente riprendendo quindi ilconteggio non dal valore originariamente impostato ma da zero. La frequenza di conteggio è direttamente proporzionalealla frequenza di clock applicata al chip e può essere modificata programmando opportunamente alcuni bit diconfigurazione.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 5: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 5

La programmazione dei PICTimers – Timer0 TMR0

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

Nella figura seguente viene riportata la catena di blocchi interni al PIC che determinano il funzionamento del registro TMR0.

I blocchi Fosc/4 e T0CKI riportati in blu rappresentano le due possibili sorgenti di segnale per il contatore TMR0.

Fosc/4 è un segnale generato internamente al PIC dal circuito di clock ed è pari alla frequenza di clock divisa per quattro.

T0CKI è un segnale generato da un eventuale circuito esterno ed applicato al pin T0CKI corrispondente al pin 3 nelPIC16F84.

I blocchi T0CS e PSA riportati in verde sono due commutatori di segnale sulla cui uscita viene presentato uno dei duesegnali in ingresso in base al valore dei bit T0CS e PSA del registro OPTION.

Il blocco PRESCALER è un divisore programmabile il cui funzionamento vedremo a breve.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 6: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 6

La programmazione dei PICTimers – Timer0 TMR0

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

Le parti in rosso evidenziano il percorso che effettua il segnale prima di arrivare al contatore TMR0.

Come abbiamo già detto in precedenza, la frequenza Fosc/4 è pari ad un quarto della frequenza di clock. Utilizzando unquarzo da 4Mhz avremo una Fosc/4 pari ad 1 MHz. Tale frequenza viene inviata direttamente al registro TMR0 senzasubire nessun cambiamento. La cadenza di conteggio che se ne ottiene è quindi pari ad 1 milione di incrementi al secondodel valore presente in TMR0.

Vediamo in pratica come è possibile agire su questi blocchi per ottenere differenti modalità di conteggio per il registro TMR0.

Iniziamo programmando i bit T0CS a 0 e PSA a 1. La configurazione di funzionamento che otterremo è rappresentata nella seguente figura:

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 7: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 7

La programmazione dei PICTimers – Timer0 TMR0

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

Questa volta sarà il segnale applicato al pin TOCKI del PIC ad essere inviato direttamente al contatore TMR0determinandone la frequenza di conteggio.

Applicando ad esempio a questo pin una frequenza pari a 100Hz otterremo una frequenza di conteggio pari a centoincrementi al secondo.La presenza della porta logica XOR (exclusive OR) all'ingresso TOCKI del PIC consente di determinare tramite ilbit T0SE del registro OPTION se il contatore TMR0 deve essere incrementato in corrispondenza del fronte didiscesa (T0SE=1) o del fronte di salita (T0SE=0) del segnale applicato dall'esterno.

Ipotizziamo ora di cambiare lo stato del bit T0CS da 0 a 1 la configurazione che otteniamo è la seguente:

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 8: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 8

La programmazione dei PICTimers – Timer0 TMR0

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

Nella figura riportata viene rappresentata lacorrispondenza tra l'andamento del segnaleesterno ed il valore assunto dal contatoreTMR0 in entrambe i casi:[Il contatore viene incrementato sul fontepositivo (edge positive triggered) del segnaledi clock, nel primo caso e sul fronte negativo(edge negative triggered) del segnale diclock].

L'ultimo blocco rimasto da analizzare per poter utilizzare completamente il registro TMR0 è il PRESCALER.

Se configuriamo il bit PSA del registro OPTION a 0 inviamo al registro TMR0 il segnale in uscita dal PRESCALER comevisibile nella seguente figura:

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 9: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 9

La programmazione dei PICTimers – Timer0 TMR0

Il timer TMR0 è tratto dal noto corso on line “Pic by example” – [http://www.tanzilli.com]

Il PRESCALER consiste in pratica in un divisore programmabile a 8 bit da utilizzare nel caso lafrequenza di conteggio inviata al contatore TMR0 sia troppo elevata per i nostri scopi.

Nell'esempio riportato in precedenza abbiamo visto cheutilizzando un quarzo da 4Mhz otteniamo una frequenzadi conteggio pari ad 1Mhz che per molte applicazionipotrebbe risultare troppo elevata.

Con l'uso del PRESCALER possiamo dividereulteriormente la frequenza Fosc/4 configurandoopportunamente i bit PS0, PS1 e PS2 del registroOPTION secondo la tabella a fianco.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 10: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 10

La programmazione dei PICTimers – Timer0 TMR0

La routine di ritardo “Delay” con l’uso di TMR0

Come visto in precedenza, il ritardo (delay) è un periodo di tempo nel quale il microcontrollore esegue delcodice di programma per restare in ‘pausa’. Questo periodo però in realtà non è una vera e propria pausa,in quanto il PIC micro esegue in continuazione un ciclo di istruzioni che in realtà non producono alcuneffetto “pratico”, serve solo per “perdere tempo”.Il ritardo via software visto in precedenza, viene eseguito decrementando per un numero di volte (più o meno alto aseconda del valore impostato sui registri e del numero di registri utilizzati) sufficiente a mantenere impegnato ilPIC micro per un certo intervallo di tempo.Questo tempo può essere approssimativamente calcolato sapendo che l’esecuzione di ogni istruzione occupa unperiodo (o due se viene eseguito anche un salto), e questo periodo è pari all’inverso del clock di sistema/4 [Periodo= 1/(fck/4) – “fck” clock di sistema].

Un delay può però anche essere realizzato in modo estremamente preciso utilizzando la periferica TMR0

Vogliamo ottenere un “Delay” di 500 ms (circa) avendo a disposizione un sistema con clock di 10 MHz => Lafrequenza di esecuzione del codice sarà: fsw = fck/4 = 10/4 = 2.5 MHz => Utilizzando un prescaler pari a64 avremo fTMR0 = fsw/64 = 39062,5 Hz => Il timer TMR0 viene incrementato con frequenzapari a 39.062 Hz cioè un impulso ogni 25,6 µS [tTMR0 = 1/fTMR0 = 1/39.062 = 25,6 µS].Quando TMR0 viene incrementato di 196 valori saranno trascorsi circa:

196 x 25,6 10-6 = 5,0176 mS ≈ 5 mS

Inizializzando TMR0 con il valore iniziale di 60 => TMR0 si azzera dopo (256 –60) 196 impulsi di clock (cioè dopo circa 5 mS)Per un ritardo di 500 mS (circa) bisogna ripetere quanto sopra per 100 volte!

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 11: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 11

Come visto in precedenza, il timer0 è interessato da alcuni bit di controllo che gestiscono tutte le opzioni del dispostivo:

•T0SE (Timer0 Source Edge): imposta il fronte attivo (di salita o di discesa) degli impulsi generati dall’eventuale clock esterno collegato al PIC•T0CS (Timer0 Clock Source select): seleziona quale ingresso utilizzare per incrementare il timer, il clock di lavoro del PIC , fosc/4 oppure il clock esterno su Pin TOCKI•PSA (Prescaler Assignment bit): assegna il prescaler al Watch Dog Timer (WDT) oppure al timer0. •PS0-PS2: Impostano la scala di divisione della frequenza del prescaler.

Tutti i bit accennati in precedenza sono presenti sul registro OPTION_REG del PICmicro; esso è accessibile nei banki RAM 1 e 3, rispettivamente agli indirizzi 81h e 181h.

La programmazione dei PICTimers – Timer0 TMR0

La routine di ritardo “Delay” con l’uso di TMR0

I bit utilizzati per la gestione del timer0 sono i bit 0-5

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 12: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 12

La programmazione dei PICTimers – Timer0 TMR0

La routine di ritardo “Delay” con l’uso di TMR0

Vogliamo ottenere un “Delay” di 500 ms (circa) avendo a disposizione un sistemacon clock di 10 MHz => La frequenza di esecuzione del codice sarà: fsw = fck/4 =10/4 = 2.5 MHz => Utilizzando un prescaler pari a 64 avremo fTMR0 =fsw/64 = 39062,5 Hz => Il timer TMR0 viene incrementato confrequenza pari a 39.062 Hz cioè un impulso ogni 25,6 µS [tTMR0 =1/fTMR0 = 1/39.062 = 25,6 µS].Quando TMR0 viene incrementato di 196 valori saranno trascorsicirca:

196 x 25,6 10-6 = 5,0176 mS ≈ 5 mS

Inizializzando TMR0 con il valore iniziale di 60 => TMR0 si azzera dopo 196 impulsi di clock (cioè dopo circa 5 mS)Per un ritardo di 500 mS (circa) bisogna ripetere quanto sopra per 100 volte!

X X TOCS TOSE PSA PS2 PS1 PS0OPTION_REG

X X 0 0 0 1 0 181hPrescaler = 64TMR0Fosc/4 X

Si

No

Si

No

Questo Init nel main program

Per verificare se il valore di TMR0 è zero, viene salvato il valore del registro nell’accumulatore e confrontato il bit Z [flag di 0 nelregistro di stato (STATUS => 03h), se il flag vale 1 significa che il valore nell’accumulatore è 0)

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 13: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 13

La programmazione dei PICTimers – Timer0 TMR0

La routine di ritardo “Delay” con l’uso di TMR0

Vediamo un esempio, sviluppato precedentemente, con la routine “Delay” realizzato con l’uso di TMR0Esempio: 2 led blinking [alternate ON-OFF ] con ritardo di 500 ms

Si vogliono far lampeggiare alternativamente 2 led ognuno acceso per 500ms e spento per 500 ms.

Dopo le discussioni precedenti il problema è facilmente risolvibile e sicuramente la analisi eimpostazione è quasi immediata; tralasciamo uno schema a blocchi, vista la semplicità delproblema e viene presentato lo schema elettrico opportuno.

N.B. => Lo schema è minimo ed è quello utilizzato per la simulazione con Proteus, anzi per lasimulazione il gruppo oscillatore – Reset non sono indispensabili in quanto con proteus lasezione clock viene impostata via software.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 14: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 14

La programmazione dei PICTimers – Timer0 TMR0

La routine di ritardo “Delay” con l’uso di TMR0

I Led sono collegati su RD2 e RD3con resistenze opportune per limitarela corrente erogata dalmicrocontrollore

Sul circuito di simulazionel’oscillatore e il reset non vengonoriportati per non “appesantire”troppo il disegno

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 15: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 15

La programmazione dei PICTimers – Timer0 TMR0

Esempio: 2 led blinking [alternate ON-OFF ] con ritardo di 500 msLa routine di ritardo “Delay” con l’uso di TMR0

Il nuovo codice assembler con le “novità” rispetto al precedente esempio

Set SystemSet PORT

Set TMR0 use

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 16: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 16

La programmazione dei PICTimers – Timer0 TMR0

Esempio: 2 led blinking [alternate ON-OFF ] con ritardo di 500 msLa routine di ritardo “Delay” con l’uso di TMR0

Il nuovo codice assembler con le “novità” rispetto al precedente esempio

DelayLoop

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 17: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 17

La programmazione dei PICTimers – Timer0 TMR0

Esempio: 2 led blinking [alternate ON-OFF ] con ritardo di 500 msLa routine di ritardo “Delay” con l’uso di TMR0

Il nuovo codice assembler con le “novità” rispetto al precedente esempio

Start

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 18: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 18

La programmazione dei PICTimers – Il Timer 1

La periferica interna Timer 1 può essere utilizzata, come il Timer 0, come timer o contatore; avendo una risoluzione di 16 bit,esso viene solitamente utilizzato per conteggi o tempi molto lunghi (fino a 65536 periodi), oppure nel caso in cui serva utilizzareun oscillatore esterno.Questa periferica dà la possibilità di avere una interruzione periferica all’overflow, cioè nel passaggio da 0xFFFF a0x0000.È possibile avere un input di reset del Timer 1 generato da un modulo CCP.I due registri che contengono l’avanzamento del conteggio sono il TMR1L e il TMR1H, entrambi scrivibili (per determinare unvalore di partenza del conteggio) e leggibili.Il Timer 1 può continuare il conteggio degli impulsi esterni su RC0-RC1 anche nella modalità a basso consumo delmicrocontrollore (SLEEP).Il registro di controllo della periferica è il T1CON (indirizzo 10h):

bit 5:4 T1CKPS Assegnazione del valore di prescaler al clock di ingresso 11 : 1:8 10 : 1:4 01 : 1:2 00 : 1:1

bit 3 T1OSCEN Abilitazione dell’oscillatore esterno del Timer 1 1 : Abilitato (consuma corrente a causa dell’inverter per l’oscillatore) 0 : Disabilitato

bit 2 T1SYNC Sincronizzazione dell’oscillatore esterno (con T1OSCEN=1) 1 : Segnale dell’oscillatore esterno non sincronizzato 0 : Segnale sincronizzato

bit 1 TMR1CS Selezione della sorgente di clock 1 : clock esterno su RC0 e RC1 (lettura sul fronte di salita) 0 : clock interno (fosc/4)

bit 0 TMR1ON Accensione del modulo (1: acceso, 0: spento, conteggio arrestato)

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Page 19: namoroso@mrscuole · Il PIC 16F877 ha tre timer individuati come timer0, timer1 e timer2.  ... Il timer TMR0 è tratto dal noto corso on line

NA – L7 19

La programmazione dei PICTimers – Il Timer 2

Il Timer 2 è modulo a 8 bit, può essere utilizzato solo come Timer in quanto non è previsto l’utilizzo di un segnale esterno diconteggio. È collegabile ad un prescaler o ad un postscaler; viene azzerato da tutte le forme di reset.Il registro nel quale viene salvato l’avanzamento del conteggio è il TMR2, accessibile sia in lettura che in scrittura.Questo Timer ha la particolarità di essere utilizzato come base dei tempi per la modulazione PWM.Il registro di controllo di questo modulo è il T2CON:

bit 6:3 TOUTPS Assegnazione valori del Postscaler0000 : 1:10001 : 1:2 0010 : 1:3 ………1111 : 1:16

bit 2 TMR2ON Accensione del modulo (1: ON)bit 1:0 T2CKPS Assegnazione valori del Prescaler

00 : 1:101 : 1:4 1x : 1:16

Il Postscaler è un dispositivo particolare utilizzato per generare un’interrupt ogni n volte cheviene raggiunto dal timer un valore preimpostato. Questo valore va impostato su un registro diperiodo, il PR2; il Timer 2 si incrementa fino a raggiungere il valore di PR2, dopodichè si resetta.Ad ogni reset si incrementa il postscaler e quando viene raggiunto il valore assegnato sul registroT2CON (bit 6:3), viene generata un’interrupt.

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/