El Timer 0 del microcontrolador PIC se utiliza cuando el sistema necesita un control estricto del tiempo. Normalmente esto se suele realizar empleando código que genera retardos de tiempo, pero la manera más óptima y precisa de hacerlo es por medio de la programación del Timer 0 del PIC.
El Timer 0 del PIC tiene las siguientes características:
- Temporizador - contador de 8 bits.
- Se puede leer y escribir.
- Prescaler programable de 8 bits.
- Selección de reloj interno o externo.
- Genera una interrupción al desbordarse desde 0xFF a 0x00.
- Selección de flanco del reloj externo.
La operación del Timer 0 se controla a través del registro OPTION_REG (figura 5.1). En el modo temporizador (T0CS=0), se produce un incremento del registro TMR0 cada ciclo de instrucción (prescaler asignado al perro guardián WDT). Si se escribe en el registro TMR0, no se produce el incremento durante los dos siguientes ciclos de instrucción; este hecho debe tenerse muy en cuenta por parte del usuario y, de ser necesario, ajustar el valor escrito en TMR0.
En el modo contador (T0CS=1), se produce un incremento por cada transición ascendente (T0SE=0) o descendente (T0SE=1) en el pin RA4 del Timer0.
Prescaler
Un prescaler es un circuito divisor de frecuencia que se ubica a la entrada de un temporizador/contador. Divide la frecuencia del oscilador en determinadas relaciones entrada-salida (1:n) que se configuran por medio de la programación. Por ejemplo, si la relación es 1:8, el prescaler entrega una frecuencia de salida igual a la octava parte de la frecuencia del oscilador.
El prescaler es compartido entre el Timer 0 y el watchdog timer (WDT) del PIC. Cuando se asigna el prescaler al Timer 0 no puede ser utilizado por el watchdog timer al mismo tiempo, y viceversa.
Los bits PSA y PS<2:0> determinan la asignación y la relación de división del prescaler. Cuando se asigna al Timer 0, todas las instrucciones de escritura en el registro TMR0 reinician el prescaler. Cuando se asigna al WDT, una instrucción CLRWDT
reinicia el prescaler y también el WDT.
¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos. ¡Cómpralo ahora y libera el increíble potencial de esta poderosa tecnología hoy mismo!
Ejemplo en mikroC PRO con el PIC16F88
Ejemplo-Timer0_1.c: Cada vez que se actúe sobre el pulsador conectado en el pin RA4se incrementa un contador que se visualiza en el LCD.
//Timer0_1.c //El registro OPTION_REG tiene todos sus bits en 1 después del encendido //por lo tanto el Timer0 actúa como contador, incrementa en transición //descendente y el prescaler está asignado al WDT. //Declaración de las 12 variables necesarias para la conexión del LCD. sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // Fin de declaración de variables de conexión. char texto[4]; void main(){ OSCCON=0x40; //Oscilador interno a 1MHz. while (OSCCON.IOFS==0);//Esperar mientras el oscilador está inestable. ANSEL=0x00; //Pines AN<6:0> como E/S digital. TMR0=0; //Inicializa el registro TMR0. Lcd_Init(); //Inicializa el LCD. Lcd_Cmd(_LCD_CLEAR); //Borra el display. Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor. Lcd_Out(1,6,"Conteo:"); while (1) { ByteToStr(TMR0,texto); Lcd_Out(2,6,texto); } }
Cuando este módulo trabaja como temporizador cuenta los ciclos de instrucción (sin prescaler) o los ciclos que recibe del prescaler. Como es un contador ascendente el TMR0 debe ser cargado con el valor de los ciclos que se desean contar restados de 256 que es el valor de desbordamiento. Por ejemplo, para contar 28 ciclos (de instrucción/prescaler), se carga el TMR0 con 228 (256-28). El ciclo de instrucción tiene una duración de 4us para una frecuencia de oscilador de 1MHz (PIC16F88). Sin prescaler mediría un tiempo de 28x4x1us = 112us. Con un prescaler 1:8, el tiempo medido sería 28x4x8us = 896us. De manera general, el intervalo de temporización T se puede calcular con la siguiente fórmula:
T=N x TCI x n
Donde:
N = número de ciclos de instrucción/prescaler
TCI = período del ciclo de instrucción
n = valor del prescaler
Mientras que el valor de carga Q del TMR0 se calcula así:
Q=256-N
Para medir 500us, con un prescaler 1:1 (prescaler asignado al perro guardián WDT) y un TCI = 4us se necesitan 500/4 = 125 ciclos de instrucción. El valor inicial del TMR0 debe ser 131 (256-125).