Programació en C del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Temporitzadors

El microcontrolador té tres temporitzadors físics que poden funcionar de diferents maneres.

Timer 0

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ó
...
	OPTION_REG = 0b10000111;       		// 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)
...
						// Cos del programa
...
		do				// Bucle que repetim mentre esperem que el temporitzador acabi
		{
			...
		} while (INTCONbits.T0IF == 0);	// Sortirà del bucle quan el bit es posi a 1
						// és a dir, quan Timer 0 acabi
		INTCONbits.T0IF = 0;          	// Tornem a posar el bit a zero
...

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 ---

 

 

Timer 1

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. El registre TMR1 é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 PS 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

 

 

Timer 2

El Timer2 és un comptador de 8 bits amb comparació. 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 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 registre de Timer2 arriba a zero (ha incrementat un 255) 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.

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 a cada coincidència)
0001		1/2  (s'activa cada  2 coincidències)
0010		1/3  (s'activa cada  3 coincidències)
0011		1/4  (s'activa cada  4 coincidències)
0100		1/5  (s'activa cada  5 coincidències)
0101		1/6  (s'activa cada  6 coincidències)
0110		1/7  (s'activa cada  7 coincidències)
0111		1/8  (s'activa cada  8 coincidències)
1000		1/9  (s'activa cada  9 coincidències)
1001		1/10 (s'activa cada 10 coincidències)
1010		1/11 (s'activa cada 11 coincidències)
1011		1/12 (s'activa cada 12 coincidències)
1100		1/13 (s'activa cada 13 coincidències)
1101		1/14 (s'activa cada 14 coincidències)
1110		1/15 (s'activa cada 15 coincidències)
1111		1/16 (s'activa cada 16 coincidències)
2 TMR2ON Marxa del Timer2 Mentre està a 1 el Timer2 compta
1-0 PS 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.

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.