Referència | Trucs | Perifèrics | Recursos CITCEA | |
Tutorial | Exemples | Projectes | Inici |
El microcontrolador té tres temporitzadors físics que poden funcionar de diferents maneres. Cal tenir present, però, que els temporitzadors (o alguns dels seus elements) estan compartits amb altres funcionalitats del microcontrolador; si no ho tenim en compte podem tenir funcionaments inesperats. En concret:
▸ El prescalador del timer 0 és el mateix que el del temporitzador de vigilància. Si el destinem a un ús, l'altra aplicació funcionarà sense prescalador.
▸ El timer 2 es fa servir per al control del PWM.
El Timer0 és un comptador de 8 bits. Quan funciona com a temporitzador, agafa la sortida del rellotge del microcontrolador (període d'un microsegon), el divideix per un factor d'escala i el fa servir per incrementar el registre TMR0. Quan aquest registre arriba a zero (incrementa un 255) s'activa un bit en un altre registre.
La configuració del Timer0 es fa al registre OPTION_REG on els tres bits de la dreta indiquen el factor d'escala pel que es divideix el rellotge. El registre TMR0 és on hi ha el valor actual de comptatge de Timer0; hi podem escriure un valor per tal que en aquell cicle comenci a comptar a partir d'ell. Quan el registre de Timer0 arriba a zero (ha incrementat un 255) s'activa el bit T0IF del registre INTCON. Aquest bit s'ha de desactivar des del programa per tal de poder veure quan es torna a activar. A l'Exemple TM es pot veure una aplicació del Timer 0.
En lloc de consultar manualment el bit T0IF, podem fer que el Timer0 faci una interrupció cada cop que arribi a zero. Per habilitar la interrupció del Timer0 cal activar el bit T0IE del registre INTCON; també cal activar globalment les interrupcions amb el bit GIE del mateix registre. Això ho podem veure a l'Exemple IT
A continuació tenim les funcions dels bits d'OPTION_REG:
Bits | Nom | Funció | Observacions |
7 | RABPU | Resistències de pull-up dels ports A i B | Si està activat, les resistències estan inhabilitades (valor per defecte) Si està desactivat, es poden controlar a WPUA i WPUB |
6 | INTEDG | Control d'interrupció a RA2 | Si és 1 serà a l'activar i si és 0 al desactivar |
5 | T0CS | Rellotge del Timer0 | Si és 1 es controla externament (pota T0CKI) i si és 0 depèn del rellotge |
4 | T0SE | Control extern de Timer 0 | Si és 0 serà a l'activar T0CKI i si és 1 al desactivar |
3 | PSA | Ús del prescalador | Si és 1 serà per al Watchdog i si és 0 per al Timer0 |
2-0 | PS | prescalador del Timer0 i el Watchdog | Valors per al Timer 0:000 1/2 001 1/4 010 1/8 011 1/16 100 1/32 101 1/64 110 1/128 111 1/256 |
El següent tros de programa mostra una possible configuració i utilització:
; Inicialització ... bsf STATUS,RP0 ; Tria el banc 1 movlw b'10000111' ; Configuració de Timer0 ; Com a temporitzador basat en rellotge ; 111 = Factor d'escala de 256 ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda al registre de configuració del Timer0 bcf STATUS,RP0 ; Tria el banc 0 ... ; Cos del programa ... Espera btfss INTCON,T0IF ; Mira si Timer0 ha arribat a zero ; Si hi ha arribat, no fa la instrucció següent goto Espera ; Si no hi ha arribat, repeteix la instrucció bcf INTCON,T0IF ; Si ha arribat, desactivem el bit ; Aquí hi hauria el que cal fer quan ha passat el temps ...
Si el rellotge del microcontrolador funciona a la seva freqüència per defecte (4 MHz) el temporitzador s'incrementa cada 1 μs multiplicat pel denominador del factor d'escala triat. És a dir que amb un factor 1/64 (bits 101) el valor del temporitzador s'incrementa cada 64 μs.
Quan el valor del temporitzador arriba a zero s'activa el bit T0IF. Atès que el comptador s'incrementa, arriba a zero quan incrementa un 255. Si no posessim cap valor al registre TMR0 cada cop començaria a comptar des de zero i, per tant, acabaria cada 256 increments. En el cas del factor d'escala 1/64 això seria cada:
1 μs · 64 · 256 = 16384 μs = 16,384 ms
Però cada cop que el temporitzador acaba nosaltres podem posar un valor a TMR0 per tal que comenci a comptar des d'aquest valor i així podem ajustar el temps. Per exemple, si posem un valor o preselecció de 131 a TMR0 tindrem que el nombre d'increments que farà el temporitzador serà el que falta per arribar a 256:
N = 256 - 131 = 125
I, per tant, el temporitzador acabaria cada:
1 μs · 64 · 125 = 8000 μs = 8 ms
A l'hora d'ajustar el temps hem de tenir present que hem de fer servir preseleccions que siguin nombres enters i que només poden estar entre 0 (que correspon, com hem vist, a 256) i 255.
Imaginem-nos que volem tenir una interrupció cada 4 ms (o sigui, 4000 μs). Podem provar diferents configuracions, com mostra la taula següent. Observem que la primera opció que surt a la taula és possible però no és precisa ja que no podem posar decimals. Les dues opcions següents (marcades en negreta) són les més adequades i la darrera opció no és directament possible ja que el nombre d'iteracions és superior a 500. En cas que no hi hagués altre remei, podríem fer que a cada interrupció s'incrementés un comptador fins assolir el temps desitjat. Però, atès que hi ha altres opcions més adequades, en aquest cas ho descartaríem. El valor que hi ha a la columna preselecció és el que posarem al registre TMR0 cada cop que acabi el temporitzador.
Bits | Escala | Període | Iteracions | Preselecció |
101 | 1/64 | 64 μs | 62,5 | --- |
100 | 1/32 | 32 μs | 125 | 131 |
011 | 1/16 | 16 μs | 250 | 6 |
010 | 1/8 | 8 μs | 500 | --- |
El Timer1 és un comptador de 16 bits. Quan funciona com a temporitzador amb rellotge intern, agafa la sortida del rellotge del microcontrolador (període d'un microsegon), el divideix per un factor d'escala i el fa servir per incrementar el registre TMR1 (bytes TMR1L i TMR1H). Quan aquest registre arriba a zero (incrementa un 65535) s'activa un bit en un altre registre.
La configuració del Timer1 es fa al registre T1CON on els bits 4 i 5 indiquen el factor d'escala pel que es divideix el rellotge. Als registres TMR1L i TMR1H és on hi ha el valor actual de comptatge de Timer1; hi podem escriure un valor per tal que en aquell cicle comenci a comptar a partir d'ell però convé aturar el timer abans (bit TMR1ON a T1CON) ja que cal modificar dos registres i no es pot fer simultàniament. Quan el registre de Timer1 arriba a zero (ha incrementat un 65535) s'activa el bit TMR1IF del registre PIR1. Aquest bit s'ha de desactivar des del programa per tal de poder veure quan es torna a activar.
En lloc de consultar manualment el bit TMR1IF, podem fer que el Timer1 faci una interrupció cada cop que arribi a zero. Per habilitar la interrupció del Timer1 cal activar el bit TMR1IE del registre PIE1; també cal activar globalment les interrupcions amb els bits GIE i PEIE del registre INTCON.
A continuació tenim les funcions dels bits de T1CON:
Bits | Nom | Funció | Observacions |
7 | T1GINV | El Timer1 és sensible al flanc de pujada o de baixada | No és gaire útil amb el rellotge intern |
6 | TMR1GE | Control auxiliar del Timer1 | No el fem servir si treballem amb el control principal |
5-4 | T1CKPS | Prescalador del Timer1 | Valors:00 1/1 01 1/2 10 1/4 11 1/8 |
3 | T1OSCEN | Activa el rellotge extern del Timer1 | No el fem servir si treballem amb el rellotge intern |
2 | T1SYNC | Control de la sincronització del Timer1 | No el fem servir si treballem amb el rellotge intern |
1 | TMR1CS | Selecció del rellotge del Timer1 | El posarem a 0 per treballar amb el rellotge intern |
0 | TMR1ON | Marxa del Timer1 | Mentre està a 1 el Timer1 compta |
El Timer2 és un temporitzador de 8 bits amb comparació. Agafa la sortida del rellotge del microcontrolador (període d'un microsegon), el divideix per un factor d'escala i el fa servir per incrementar el registre TMR2. Quan el valor d'aquest registre coincideix amb el valor del registre PR2 passen dues coses. Per un costat es posa TMR2 a 0 i per un altre es compta l'activació. Quan el nombre d'activacions coincideix amb el valor de postescalat s'activa un bit en un altre registre.
La configuració del Timer2 es fa al registre T2CON on els bits 0 i 1 indiquen el factor d'escala pel que es divideix el rellotge i els bits 3 a 6 el postescalat.
El registre TMR2 és on hi ha el valor actual de comptatge de Timer2; hi podem escriure un valor per tal que en aquell cicle comenci a comptar a partir d'ell. Quan el valor del registre TMR2 coincideix amb el del PR2 s'activa el bit TMR2IF del registre PIR1. Aquest bit s'ha de desactivar des del programa per tal de poder veure quan es torna a activar.
El temps que triga el Timer2 en fer un cicle complet, si no toquem el valor de TMR2, el podem calcular amb l'equació següent, en la que Tclk és 1 μs si no hem modificat l'oscil·lador del rellotge.
En lloc de consultar manualment el bit TMR2IF, podem fer que el Timer2 faci una interrupció cada cop que arribi a zero. Per habilitar la interrupció del Timer2 cal activar el bit TMR2IE del registre PIE1; també cal activar globalment les interrupcions amb els bits GIE i PEIE del registre INTCON.
Si, per exemple, el prescalat és 4 vol dir que el Timer2 s'incrementa cada 4 μs. Si el postescalat és 8 vol dir que la vuitena vegada que el seu valor coincideixi amb PR2 s'activarà el bit TMR2IF.
Cal tenir present que el Timer 2 es fa servir per controlar el PWM. Això vol dir que si fem servir la sortida PWM no podem disposar d'aquest temporitzador per a altres funcions.
A continuació tenim les funcions dels bits de T2CON:
Bits | Nom | Funció | Observacions |
7 | No es fa servir | ||
6-3 | TOUTPS | Postescalat del Timer2 | Valors:0000 1/1 (s'activa TMR2IF a cada coincidència) 0001 1/2 (s'activa TMR2IF cada 2 coincidències) 0010 1/3 (s'activa TMR2IF cada 3 coincidències) 0011 1/4 (s'activa TMR2IF cada 4 coincidències) 0100 1/5 (s'activa TMR2IF cada 5 coincidències) 0101 1/6 (s'activa TMR2IF cada 6 coincidències) 0110 1/7 (s'activa TMR2IF cada 7 coincidències) 0111 1/8 (s'activa TMR2IF cada 8 coincidències) 1000 1/9 (s'activa TMR2IF cada 9 coincidències) 1001 1/10 (s'activa TMR2IF cada 10 coincidències) 1010 1/11 (s'activa TMR2IF cada 11 coincidències) 1011 1/12 (s'activa TMR2IF cada 12 coincidències) 1100 1/13 (s'activa TMR2IF cada 13 coincidències) 1101 1/14 (s'activa TMR2IF cada 14 coincidències) 1110 1/15 (s'activa TMR2IF cada 15 coincidències) 1111 1/16 (s'activa TMR2IF cada 16 coincidències) |
2 | TMR2ON | Marxa del Timer2 | Mentre està a 1 el Timer2 compta |
1-0 | T2CKPS | prescalador del Timer2 | Valors:00 1/1 01 1/4 10 1/16 11 1/16 |
Per a una informació completa dels temporitzadors, consulteu l'apartat 5 del document de característiques del PIC 16F690.
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.