Temporizador Contador PIC: Guía Completa
Temporizador Contador PIC: Guía Completa
Un temporizador contador PIC es un registro que aumenta su valor en una unidad con cada
4 ciclos de reloj al cual se encuentre funcionando el microcontrolador PIC, si por ejemplo la
frecuencia del oscilador es de 4MHz, entonces el ciclo de trabajo del microcontrolador PIC
será de 1us, por lo que el temporizador contador PIC aumentará su valor de uno en uno en
cada microsegundo; por ejemplo, cuando el temporizador aumenta su valor en 10 unidades
habrán transcurrido 10us.
El temporizador contador PIC es utilizado para obtener medidas de tiempos muy precisas,
de ahí que se le da el nombre de temporizador, en este caso el temporizador contador PIC
funciona con el reloj del sistema; pero también puede ser utilizado para realizar conteos,
por lo que también se le llama contador, en este caso el temporizador contador PIC ya no
aumenta su valor de uno en uno en cada ciclo de trabajo, sino que lo hará mediante el flanco
de subida o el flanco de bajada de alguna señal que llegue a un pin del PIC, estos pines son
identificados como TxCKI donde x es el número temporizador contador PIC que será usado
como contador.
Los microcontroladores PIC suelen tener varios temporizadores, como ejemplo se utilizará
el PIC16F877A, el cual tiene 3 temporizadores que son llamados timer0, timer1 y timer2, el
tiempo que tarda el temporizador contador PIC en aumentar su valor de unidad en unidad,
se puede modificar por programa mediante el uso de prescalers, siendo de esta manera
mucho más provechosos; dependiendo del modelo de microcontrolador PIC utilizado, no
todos los temporizadores pueden ser utilizados como temporizador y también como
contador.
El registro en los microcontroladores PIC donde se guardan y realizan los aumentos de uno
en uno del temporizador PIC, es llamado registro temporizador contador y es representado
por TMRx, donde x es el número de temporizador contador PIC que puede ser 0, 1, 2,
dependiendo del número de temporizadores con que cuente el microcontrolador PIC; el
temporizador contador PIC puede ser de 8 bits o de 16 bits.
El temporizador contador PIC puede aumentar sus valores de 0 a 255 si es de 8 bits como
el timer0, o de 0 a 65535 si es de 16 bits como el timer1, cada vez que estos registros
alcanzan su máximo valor se reinician, volviendo a contar desde su valor mínimo hasta su
máximo, ademas pueden ser programados para provocar interrupciones.
ara el uso del temporizador contador PIC se cuenta además con un grupo de registros
mediante los cuales se puede lo puede configurar de acuerdo a las necesidades que se
tengan.
El registro temporizador contador PIC TMR1 puede ser utilizado para tareas de
comparación, captura y el registro TMR2 es utilizado para la obtención de señales de
modulación de ancho de pulso o PWM, siendo para ello necesario el uso de otros registros.
• Timer 0
• Timer 1
• Timer 2
Timer0 PIC
Contador y temporizador, en lo que sigue se comentará para el caso del PIC16F877A por lo
que es muy importante que se tenga a mano la hoja de datos del PIC16F877A, para el caso
de utilizar algún otro microcontrolador AVR el procedimiento será muy similar a lo aquí
comentado.
El registro TMR0 del timer0 PIC puede ser leído y escrito, puede ser prescalado para que el
tiempo en su incremento de valor en una unidad sea mayor, el timer0 PIC cuando alcanza
su valor máximo de 255 se reinicia, volviendo a incrementar sus valores de 0 a 255, además
cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo que se
decide por programa.
El bit7 al poner este bit a 0 se activan unas resistencias pull up internas que el
El bit6 es para cuando se utilice una interrupción externa por el pin INT, con este bit se
elige si se quiere que la interrupción sea por flanco de subida o por flanco de bajada.
El bit5 T0CS este es el bit que en este caso interesa, al poner este bit a 1 se elige utilizar
el timer0 PIC como contador, si se le pone a 0 se elige utilizar el timer0 PIC como
temporizador.
El bit4 T0SE con este bit se elige si se quiere que el timer0 PIC cuente por flanco
de subida, esto es cuando la señal que llega por el pin T0CKI pase de 0 a 1, o que cuente
por flanco de bajada , esto es cuando la señal que llega por el pin T0CKI pase de 1 a 0,
si T0SE=1 se contará por flanco de bajada, si T0SE=0 se contará por flanco de subida.
Cada vez que la señal digital que llegue al pin T0CKI, de acuerdo a lo que se halla elegido
con el bit T0SE, el valor del contador, esto es el valor del registro TMR0, aumentará en una
unidad hasta un máximo de 255, luego se pondrá nuevamente a 0 y otra vez comenzará a
contar.
El bit3 es para la utilización del prescaler para el timer 0, el prescaler se le puede asignar
Los bits 2, 1 y 0 son para elegir el prescaler a utilizar, mediante las combinaciones de
estos bits se tienen diferentes valores para el prescaler, el que a su vez dependerá de a
quien se le a asignado el prescaler mediante el bit3, tal como se ve en la imagen.
Timer0 PIC como contador ejemplo
El circuito utilizado para el ejemplo del uso del Timer0 como contador es el que se muestra
en la siguiente imagen, la señal que llega al pin T0CKI se genera con la ayuda de un
fotorresistor, cada vez que el fotorresistor disminuya su valor al pin T0CKI le llegará un alto,
lo que provocará que el registro TMR0 aumente en una unidad por flanco de subida de la
señal, los valores que va tomando el registro TMR0 se verán en el puerto B por medio de
leds, estos valores se pueden contar en forma binaria desde el 0 hasta el 255.
La programación será hecha en el XC8 porque este permite trabajar directamente con los
registros, de esta manera se puede uno familiarizar más con el microcontrolador PIC
No se usarán resistencias interna pull up por lo que su bit7 se pone a 1, el bit6 se puede
dejar a 0 o a 1 es igual porque no se utilizar la interrupción externa, el bit5 se pondrá a 1
porque se utilizará el timer0 PIC como contador, el bit4 se pondrá a 0 porque el conteo será
por flanco de subida, el bit3 se pondrá a 1 para asignar el prescaler al registro WDT, para
que mediante la combinación 000 de los bits 2, 1 y 0 se elija que la señal no se prescalará y
el conteo ocurra en cada flanco de subida que suceda.
El programa realizado en el MPLAB XC8 para el uso del timer0 PIC como contador es el
siguiente:
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code
protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off;
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include "xc.h"
int main(void) {
TRISB=0;//Puerto B como salida para ver los valores del registro TMR0 en binario
while(1){//ciclo de programa
return 0;
}
Timer0 PIC como temporizador.
Se verá en este caso el uso del timer0 PIC como temporizador, normalmente el registro
TMR0 del timer0 PIC irá aumentando sus valores con cada ciclo de instrucción del
microcontrolador PIC, y para estos microcontroladores a cada ciclo de instrucción le toma
4 ciclos del oscilador que se esté utilizando, si se usa por ejemplo un cristal de Fosc=4Mhz
entonces cada ciclo del oscilador será de 0,25us, luego cada ciclo de instrucción tardará 4
veces este valor, es decir 4*(0,25us) lo que viene a ser 1us, a esto se se conoce como ciclo
máquina TCM=4/Fosc, entonces el registro TMR0 aumentará en una unidad cada
microsegundo cuando el oscilador es de 4Mhz.
Como el registro TMR0 es de 8 bits este aumentará desde 0 o desde algún valor que se le
ponga como valor inicial hasta un máximo de 255, por ejemplo si va desde 0 hasta 255
habrán transcurrido 255us luego volverá a 0 pero en esa vuelta a 0 transcurre 1us mas, por
lo que en ir de 0 a 255 y volver a 0 transcurren 256us; no siempre se utiliza una FOSC de
4Mhz esto puede variar, por lo que como consecuencia variará el tiempo que trascurre para
que el registro TMR0 aumente su valor en una unidad.
El temporizador contador pic TMR0 cuenta con lo que se conoce como prescaler esto hace
que la frecuencia de trabajo FOSC se divida por este prescaler, con lo que se logra que el
temporizador contador pic tarde un poco más en aumentar su valor en una unidad; el
prescaler del time0 PIC para el PIC16F877A puede tomar el valor de 1, 2, 4, 8, 16, 32, 64,
128 o 256; estos valores se eligen mediante las combinaciones de los bits 0, 1 y 2 del
registro OPTION_REG.
En la siguiente tabla se ve los valores que hay que dar a estos bits para obtener los
diferentes valores de los prescaler para el timer0 PIC.
Como se puede ver hay 2 posibilidades para asignar el prescaler al WDT o al Timer 0, esto
se realiza mediante el bit3 PSA del registro OPTION_REG.
Al utilizar los prescaler se tiene la ventaja de temporizar tiempos más largos, pero muchas
veces se vuelven demasiado largos si el registro TMR0 se inicia a 0, por lo que para
temporizar tiempos que se quieren por ejemplo para temporizar 50ms con el uso del timer0
PIC se tendría que utilizar un prescaler adecuado e iniciar el registro TMR0 a un valor
también adecuado.
Utilizando una regla de 3 simple se llega a la siguiente ecuación que ayudará a encontrar el
valor inicial adecuado a cargar en el registro TMR0 para obtener el tiempo buscado.
TMR0=28-Tretardo*(Fosc/(4*prescaler))-1
Por ejemplo, si se quiere temporizar 50ms, en este caso 50ms sería el tiempo de retardo, y
si el microcontrolador PIC trabaja con oscilador de 4Mhz, habrá que elegir entre los posibles
prescaler que se tienen, reemplazar en la ecuación anterior y ver si el número obtenido esta
entre 0 y 255, de ser así la elección del prescaler es correcta, de lo contrario habrá que
utilizar otro, por ejemplo, si se elige un prescaler de 256 se tendría:
TMR0=59,6875
El valor obtenido está entre 0 y 255 aunque no es un número entero, por lo que hay que
redondearlo a un entero cercano en este caso 60, al hacer esto la temporización no será
exactamente 50ms, pero si un valor bastante próximo y aceptable.
60 sería el valor inicial a cargar en el registro TMR0 para obtener una temporización de
50ms con el timer0 PIC, esto quiere decir que, si se inicia el timer0 PIC con 60 y un prescaler
de 256, cuando aumente su valor de 60 a 255 habrán transcurrido 50ms.
Los resultados obtenidos serán usados en el ejemplo de la utilización del timer0 pic como
temporizador.
Este proceso será el que se seguirá cuando se utilice el timer0 PIC como temporizador.
El bit7 al poner este bit a 0 se activan unas resistencias pull up internas que el
El bit6 es para cuando se utilice una interrupción externa por el pin INT, con este bit se
elige si se quiere que la interrupción sea por flanco de subida o por flanco de bajada.
El bit5 T0CS este es el bit que en este caso interesa, al poner este bit a 0 se elige utilizar
el timer0 PIC como temporizador, si se le pone a 1 se elige utilizar el timer0 PIC como
contador.
El bit4 T0SE este bit es útil cuando se usa el timer0 PIC como contador con este bit se
elige si el timer0 PIC contará por flanco de subida, esto es cuando la señal que llega por el
pin T0CKI pase de 0 a 1, o que cuente por flanco de bajada , esto es cuando la señal que
llega por el pin T0CKI pase de 1 a 0, si T0SE=1 se contará por flanco de bajada, si T0SE=0
se contará por flanco de subida.
Los bits 2, 1 y 0 son para elegir el prescaler a utilizar, mediante las combinaciones de
estos bits se tienen diferentes valores para el prescaler, el que a su vez dependerá de a
quien se le a asignado el prescaler mediante el bit3, tal como se ve en la imagen.
Timer0 PIC como temporizador ejemplo
El circuito de ejemplo utilizado para ver el uso del timer0 PIC como temporizador es el
siguiente, se hará cambiar el estado del pin RB7 cada 50ms, se utilizarán los resultados
obtenidos cuando se comentó sobre el prescaler del timer0 PIC, se obtuvo que para
temporizar 50ms se utiliza el prescaler de 256 y el registro TMR0 se tiene que cargar en un
inicio con 60, esto es TMR0=60.
La programación será hecha en el XC8 porque este permite trabajar directamente con los
registros, de esta manera se puede uno familiarizar mas con el microcontrolador PIC
int main(void) {
TRISBbits.TRISB7=0;//Pin RB7 como salida digital, aquí se colocará el led
PORTBbits.RB7=0;//El led se inicia apagado
El registro TMR1 del timer1 PIC puede ser leído y escrito, puede ser prescalado para que el
tiempo en su incremento de valor en una unidad sea mayor, el timer1 PIC cuando alcanza
su valor máximo de 65535 se reinicia, volviendo a incrementar sus valores de 0 a 65535,
además cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo
cual se decide por programa.
Para el PIC16F877A el registro TMR1 del timer1 PIC está formado por 16 bits por lo que se
puede contar desde 0 hasta 65535, al utilizar timer1 PIC como contador este no aumentará
sus valores o su cuenta con cada ciclo de instrucción, en este caso el timer1 estará
conectado al pin T1CKI por donde se le hará llegar una señal, la cual al cambiar de estado
de un bajo a un alto, esto es por flanco de subida, hará que el timer1 PIC se incremente en
una unidad, estos incrementos en su cuenta serán siempre por cada flanco de subida, por
ejemplo cada vez que la señal que llega al pin T1CKI pase de un bajo a un alto o de 0 a 1, el
registro TMR1 aumentará en una unidad, de esta manera se le puede utilizar como
contador, cuando la señal pase de un alto a un bajo o de 1 a 0 el registro TMR1 no
aumentará su valor o no se incrementará.
Los bits 5 y 4 son para elegir un prescaler, mediante las combinaciones de estos bits se
El bit3 es para cuando se quiere conectar un oscilador independiente al timer1 PIC, este
ocilador se debe colocar entre el pin T1OSO (pin 15) y el pin T1OSI (pin16) para esto hay
que poner este bit a 1.
El bit2 es para hacer que el timer1 PIC cuando es programado como contador trabaje en
El bit1 (TMR1CS), con este bit se elige si el timer1 PIC será utilizado como contador o
como temporizador, al poner este bit a 1 TMR1CS=1 se elige la opción de utilizar el timer1
PIC como contador, al ponerlo a 0 se elige la opción de utilizarlo como temporizador, el
aumento en las cuentas del timer1 PIC será siempre por flanco de subida de la señal en el
pin T1CKI.
El bit 0 (TMR1ON) al poner este bit a 1 se habilita el uso del timer1 PIC, cuando este bit
El circuito utilizado es el que se muestra en la siguiente imagen, la señal que ingresa por el
pin T1CKI se genera con la ayuda de un fotorresistor, cada vez que el fotorresistor
disminuya su valor al pin T1CKI le llegará un alto, esto es un flanco de subida, lo que
provocará que el registro TMR1 aumente en una unidad, la cuenta del timer1 PIC irá desde
0 hasta 65535, se verá de forma indirecta los valores del timer1, se hará que cada vez que
el timer1 aumente en 8000 unidades se encienda un led del puerto b, se empezará con los
leds del puerto b totalmente apagados.
Se utilizará un led más conectado al pin RD1 se hará que este led esté en contacto con el
fotorresistor para que sea este el que genere los altos y bajos que llegarán al pin T1CKI, con
lo que en cada flanco de subida se incremente el valor del registro TMR1, el led se hará
parpadear cada 20ms.
La programación será hecha en el XC8 porque este permite trabajar directamente con los
registros, de esta manera se puede uno familiarizar mas con el microcontrolador PIC
Los bits 7 y 6 no se utilizan por lo que se les pone a 0, el prescaler será de 1 para que los
valores del registro TMR1 se incrementen en una unidad en cada flanco de subida que
ocurra en el pin T1CKI, por lo que los bits5 y 4 se pondrán a 0, no se usará ningún oscilador
externo por lo que el bit3 se pondrá a 0, el conteo será en forma asíncrona por lo que el
bit2 se pondrá a 1, el bit1 se pondrá a 1 porque se utilizará el timer1 PIC en modo contador
y el bit0 se pondrá a 1 para habilitar el timer1 PIC.
int main(void) {
TRISDbits.TRISD1=0;//en el pin RD1 se conecta el led que para generar la señal
//en el pin T1CKI
PORTDbits.RD1=0;//El led se inicia apagado
TRISB=0;//Puerto B como salida para ver indirectamente los incrementos de TMR1
PORTB=0;//El puerto B se inicia a 0
while(1){//ciclo de programa
if(TMR1==0){//cuando el timer1 se ponga a 0, todos los leds del
PORTB=0;//puerto B se apagan
}
Se verá en este caso el uso del temporizador contador pic timer1 como temporizador,
normalmente el registro TMR1 del timer1 PIC irá aumentando su valor en una unidad con
cada ciclo de instrucción del microcontrolador PIC, y para estos microcontroladores a cada
ciclo de instrucción le toma 4 ciclos del oscilador que se esté utilizando, si se usa por ejemplo
un cristal de Fosc=4Mhz para el que cada ciclo del oscilador será de 0,25us, entonces cada
ciclo de instrucción tardará 4 veces este valor, es decir 4*(0,25us) lo que viene a ser 1us, a
esto se le llama ciclo máquina TCM=4/Fosc, entonces el registro TMR1 aumentará en una
unidad en cada microsegundo cuando el oscilador es de 4Mhz.
Como el registro TMR1 es de 16 bits este aumentará desde 0 o desde algún valor que se le
ponga como valor inicial hasta un máximo de 65535, por ejemplo si va desde 0 hasta 65535
habrán transcurrido 65535us luego volverá a 0 pero en esa vuelta a 0 transcurre 1us mas,
por lo cual en ir de 0 a 65535 y volver a 0 transcurren 65536us; no siempre se utiliza una
FOSC de 4Mhz esto puede variar, por lo que como consecuencia variará el tiempo que
trascurre para que el registro TMR1 aumente su valor en una unidad.
El temporizador contador pic TMR1 cuenta con lo que se conoce como prescaler esto hace
que la frecuencia del oscilador FOSC se divida por este prescaler, con lo que se logra que el
timer1 pic tarde un poco más en aumentar su valor en una unidad; el prescaler puede tomar
el valor de 1, 2, 4 o 8; estos valores se eligen programando los bits 4 y 5 del registro T1CON.
En la siguiente tabla se puede ver las combinaciones de los bits 5 y 4 para obtener los
diferentes valores de los prescaler para el timer1 PIC.
Al utilizar los prescaler se tiene la ventaja de lograr temporizar tiempos más largos pero
muchas veces se vuelven demasiado largos si el registro TMR1 se inicia a 0, por lo cual para
lograr las temporizaciones que se quieren por ejemplo de 500ms se tendría que utilizar un
prescaler adecuado e iniciar el registro TMR1 a un valor también adecuado.
Utilizando una regla de 3 simple se llega a la siguiente ecuación que ayudará a encontrar el
valor inicial adecuado a cargar en el registro TMR1 para obtener las
temporizaciones buscadas.
TMR1=216-Tretardo*(Fosc/(4*prescaler))-1
Donde TMR1 es el valor inicial a cargar en este registro para obtener la temporización
buscada, 216 porque el timer1 PIC es de 16 bits, Tretardo es el tiempo que se quiere
obtener con el temporizador, Fosc es la frecuencia del oscilador o del cristal utilizado, y
prescaler será el prescaler elegido según la tabla anterior.
Por ejemplo, si se quiere temporizar 500ms, en este caso 500ms sería el tiempo de retardo,
y si el microcontrolador PIC trabaja con un oscilador de 4Mhz, habrá que elegir entre los
posibles prescaler que se tienen, reemplazar en la ecuación anterior y ver si el número
obtenido esta entre 0 y 65535, de ser así la elección del prescaler es correcta, de lo contrario
habrá que utilizar otro, por ejemplo si se elige un prescaler de 8 se tendría:
TMR1=65535-(500ms) (1Mhz) /8 -1
TCNT1=3035
El valor obtenido está entre 0 y 65535 por lo que 3035 sería el valor inicial a cargar en el
registro TMR1 para obtener una temporización de 500ms con el timer1 PIC, esto quiere
decir que, si se inicia el timer1 PIC con 3035 y un prescaler de 8, cuando aumente su valor
de 3035 a 65535 habrán transcurrido 500ms.
Los resultados obtenidos serán usados en el ejemplo de la utilización del timer0 pic como
temporizador.
Este proceso será el que se seguirá cuando se utilice el timer1 AVR como temporizador.
Los bits 5 y 4 son para elegir un prescaler, mediante las combinaciones de estos bits se
pueden elegir los prescaler 1, 2, 4 u 8.
El bit3 es para cuando se quiere conectar un oscilador independiente al timer1 PIC, este
oscilador se debe colocar entre el pin T1OSO (pin 15) y el pin T1OSI (pin16) para esto hay
que poner este bit a 1.
El bit2 es para hacer que el timer1 PIC cuando es programado como contador trabaje en
forma sincronizada con el sistema interno del pic, en el modo temporizador no se toma en
cuenta.
El bit1 (TMR1CS), Al poner este bit a 0 se elige la opción de utilizar el timer1 PIC como
temporizador, al ponerlo a 1 se elige la opción de utilizarlo como contador.
El bit 0 (TMR1ON) al poner este bit a 1 se habilita el uso del timer1 PIC, cuando este bit está
a 0 el timer1 PIC estará desactivado.
Timer1 PIC como temporizador ejemplo
El circuito de ejemplo utilizado para ver el uso del timer1 PIC como temporizador es el
siguiente, se hará cambiar el estado del pin RB7 cada 500ms, se utilizarán los resultados
obtenidos cuando se comentó sobre el prescaler del timer1 PIC, se obtuvo que para
temporizar 500ms se utiliza el prescaler de 8 y el registro TMR0 se tiene que cargar en un
inicio con 3035, esto es TMR0=3035.
La programación será hecha en el XC8 porque este permite trabajar directamente con los
registros, de esta manera se puede uno familiarizar más con el microcontrolador PIC
Los bits 7 y 6 no se utilizan por lo que se les pone a 0, el prescaler será de 8 por lo que los
bits5 y 4 se pondrán a 1, no se usará ningún oscilador externo por lo que el bit3 se pondrá
a 0, el bit2 se pone a 0 porque en el modo temporizador no se toma en cuenta, el bit1 se
pondrá a 0 porque se utilizará el timer1 PIC en modo temporizador y el bit0 se pondrá a 1
para habilitar el timer1 PIC.
El programa realizado en el MPLAB XC8 para el uso del timer1 pic como temporizador es el
siguiente:
//bits de configuración para el PIC16F877A
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CP = OFF // Flash Program Memory Code Protection bit
int main(void) {
TRISBbits.TRISB7=0;//pinRB7 como salida digital, se colocará el led
PORTBbits.RB7=0;//El led se inicia apagado y parpadea cada 500ms
while(1){//ciclo de programa
if(TMR1==65535){//cuando el timer1 llegue a este valor habrán pasado 500ms
PORTB^=(1<<7);//el led cambiará de estado cada ms
TMR1=3036;//se carga nuevamente el timer1 pic con este valor
} //para seguir obteniendo 500ms
}
return 0;
}
El uso del timer1 PIC como temporizador es mucho más eficaz si se utiliza mediante las
interrupciones, este tema se ve en la sección de interrupciones con el PIC.
El timer2 PIC solo puede ser utilizado como temporizador no como contador, consta de 8
bits por lo que sus valores pueden aumentar desde 0 a 255, se comentará sobre el timer2
PIC para el PIC16F877A, del que se puede ver en su hoja de datos.
Normalmente el registro del timer2 PIC TMR2 irá aumentando su conteo con cada ciclo de
instrucción del microcontrolador PIC, y para estos microcontroladores a cada ciclo de
instrucción le toma 4 ciclos del oscilador que se esté utilizando, si se usa por ejemplo un
cristal de Fosc=4Mhz del que cada ciclo del oscilador es de 0,25us, entonces cada ciclo de
instrucción tardará 4 veces este valor, es decir 4*(0,25us) lo que viene a ser 1us, a esto se
se conoce como ciclo máquina TCM=4/Fosc, entonces el registro TMR2 aumentará en una
unidad cada microsegundo cuando el oscilador es de 4Mhz.
Como el registro TMR2 es de 8 bits este aumentará desde 0 o desde algún valor que se le
ponga como valor inicial hasta el valor cargado en el registro PR2 siendo el máximo valor
de 255, por ejemplo si el valor cargado en el registro PR2=150, entonces cuando el registro
TMR2 va desde 0 hasta 150 habrán transcurrido 150us luego volverá a 0 pero en esa vuelta
a 0 transcurre 1us mas, por lo cual en ir de 0 a 255 y volver a 0 transcurren 151us; no siempre
se utiliza una FOSC de 4Mhz esto puede variar, por lo que como consecuencia variará el
tiempo que trascurre para que el registro TMR2 aumente su valor.
El temporizador timer2 PIC cuenta con lo que se conoce como prescaler y también con un
postcaler pero el postcaler solo hace su trabajo cuando el timer2 PIC es utilizado con
interrupciones esto se ve en la sección de interrupciones con el PIC, por ahora se comentará
como utilizar tanto el prescaler como el postcaler, lo que hacen es que la frecuencia de
trabajo FOSC se divida por este prescaler y a la vez por el postcaler si se utilizan ambos a la
vez se logra que el temporizador timer2 PIC tarde un poco mas en aumentar su valor en una
unidad.
Los bits de 6 al 3 mediante las combinaciones de estos bits se elige el postcaler, el poscaler
puede tener los valores del 1 al 16.
El bit2 al poner este bit a 1 se habilita el uso del timer2 PIC, si se pone a 0 el timer2 PIC
estará deshabilitado.
Los bits 1 y 0 mediante las combinaciones de estos bits se elige el prescaler, el prescaler
puede tener los valores del 1, 4 y 16
En la siguiente tabla se ve los valores que hay que dar a estos bits para obtener los
diferentes valores de los prescaler y el postcale para el timer2 PIC.
Si el prescaler elegido es por ejemplo de 4 y el postcale de 16 cuando la FOSC=4Mhz,
entonces la frecuencia de trabajo del temporizador Ftemp será
de Ftemp=FOSC/(4*prescaler*postcale), el tiempo que tardará ahora el temporizador
timer2 PIC en aumentar una unidad será la inversa de este valor lo que se conoce como
periodo del temporizador Ttemp=(4*prescaler*postcale)/(FOSC) por lo que en este caso
Ttemp=(4*4*16)/(4Mhz) de donde Ttemp=64us, esto quiere decir que ahora el
temporizador aumentará en una unidad cada 64us y en este caso entonces el
registro TMR2 para ir de 0 a hasta el valor cargado en el registro PR2=150 tardará
150*Ttemp=150*64us lo que es igual a 9600us=9,6ms así para los demás prescaler y
postcale.
Al utilizar los prescaler y los postcale se tiene la ventaja de temporizar tiempos mas largos
pero muchas veces se vuelven demasiado largos, por lo que para lograr las temporizaciones
que se quieren por ejemplo de 50ms se tendría que utilizar un prescaler y un poscale
adecuado ademas de cargar en el registro PR2 un valor también adecuado.
Utilizando una regla de 3 simple se llega a la siguiente ecuación que ayudará a encontrar el
valor inicial adecuado a cargar en el registro PR2 para obtener las temporizaciones
buscadas.
PR2=(Tretardo*Fosc)/(4*prescaler*postcale)
Donde PR2 es el valor cargar en este registro para obtener el tiempo buscado, Tretardo es
el tiempo que se quiere obtener en el temporizador, Fosc es la frecuencia del oscilador o
del cristal utilizado, prescaler y postcale será el prescaler y postcale elegido según la tabla
anterior.
Esta será la que se usará para el ejemplo del uso del timer2 sin interrupciones, el valor
máximo del prescaler según la tabla es de 16, ademas PR2 tiene que ser menor o igual a
255, si se usa un cristal de 4Mhz, se puede hallar el Tretardo máximo que se puede lograr
con estas condiciones
El circuito de ejemplo utilizado para ver el uso del timer2 PIC como temporizador es el
siguiente, se hará cambiar el estado del pin RB7 cada 100ms, para ello se utilizará el timer2
PIC utilizando los cálculos anteriores, se obtendrá con el temporizador timer2 PIC 4ms, pero
luego en el programa utilizando una variable auxiliar se puede lograr los 100ms; entonces
se carga el registro PR2=250 para obtener los 4ms como se calculó.
La programación será hecha en el XC8 porque este permite trabajar directamente con los
registros, de esta manera se puede uno familiarizar más con el microcontrolador PIC.
El bit7 no se usa por lo que se pone a 0, el postcale en este modo sin interrupciones no tiene
efecto por lo que en las combinaciones de los bits del 6 al 3 se puede utilizar cualesquiera
en este ejemplo se utilizará 1111, el bit2 se pondrá a 1 para habilitar el uso del timer2 PIC,
para obtener los 4ms el prescaler tendrá que ser de 16 por lo que la combinacion de los bits
1 y 0 sera 10.
/////////////////////////////////////////////////
//////**microcontroladores-mrelberni.com**///////
///////** timer2 PIC como temporizador **////////
/////////////////////////////////////////////////
int main(void) {
int contador=0;//variable auxiliar para lograr los 100ms con el timer2 PIC
TRISBbits.TRISB7=0;//pinRB7 como salida digital, se colocará el led
PORTBbits.RB7=0;//El led se inicia apagado y parpadea cada 100ms