Buscar en este blog

miércoles, 12 de enero de 2011

Timer0 del PIC 12F675

El PIC 12F675 posee dos timers/contadores de nombres timer0 y timer1.

Estos se pueden utilizar en modo timer (para medir tiempos) o en modo contador (para contabilizar pulsos externos). Este último modo se podría utilizar por ejemplo para crear un frecuencimetro mediante el PIC.

En este post trato de explicar como utilizar el timer0 en modo timer.

Para configurar el timer0, se utiliza el registro OPTION_REG ubicado en el banco 1 de la memoria RAM del PIC.

 Registro OPTION_REG utilizado para configurar el timer0

Elección timer o contador

Lo primero que se debe hacer es indicar que se desea usar el timer0 en modo timer y no en modo contador. Para esto debemos poner a 0 el bit 5 (T0CS) del registro OPTION_REG.

Prescaler

El timer0 tiene asignado un registro de 8 bits de nombre TMR0 en el banco 0 de memoria. Al usar el timer0 en modo timer, este registro se incrementa en cada cíclo de reloj hasta llegar a su límite máximo de 255 decimal (11111111 en binario).

Mediante el uso de un prescaler, se puede lograr que el timer0 se incremente por ejemplo cada 8 cíclos de reloj y no cada 1 cíclo de reloj. Esto permite medir tiempos mayores con el timer.

El valor de este prescaler puede tomar los valores: 2, 4, 8, 16, 32, 64, 128 o 256. Para indicar que valor deseamos tomar para el prescaler, debemos escribir convenientemente los bits 2 (PS2), 1 (PS1) y 0 (PS0) del registro OPTION_REG según la siguiente tabla:

PS2 PS1 PS0 Prescaler
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256
Valores a escribir en los bits PS2 a PS0 para configurar el prescaler del timer 0

Iniciar el timer0

Para dar inicio al timer, se debe poner a 0 el bit T0IF del registro INTCON.

Registro INTCON desde donde se puede leer el estado del timer0

De esta forma el timer comenzará a incrementarse hasta llegar a su valor máximo de 255 y desbordar.

Al desbordar el timer, el PIC pondrá a 1 el mismo bit T0IF del registro INTCON para indicarnoslo. Por lo tanto, chequeando el valor del bit T0IF, podremos saber si el timer ha llegado a su límite o no.

Ejemplo

Supongamos que elegimos tomar un prescaler de 4. Es decir que nuestro timer0 incrementará su valor cada 4 cíclos de reloj. Si por ejemplo estamos utilizando un oscilador de 4MHz para el PIC, cada cíclo de reloj se realiza en 1us por lo que 4 cíclos de reloj corresponden a 4us. Es decir que el timer se incrementa en una unidad cada 4us por lo que demorará 256x(4us)=1,024ms en desbordar.

Si quisieramos por ejemplo medir 1segundo con el timer0, deberiamos esperar que el timer desbordara unas 1/(1,024ms)=976,5 veces.

Fuentes:
  • Hoja de datos del PIC 12F675

No hay comentarios:

Publicar un comentario en la entrada