tecmikro logo
Programación de microcontroladores PIC en mikroC PRO
Email: tecmikro@gmail.com   Cel. 098 743 8877   Telf. 243 0352 Quito-Ecuador


El Timer0 (TMR0) temporizador-contador de los microcontroladores PIC

 

El Timer0 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 Timer0 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.

Registro de control del Timer 0 (Timer0, TMR0) del PIC
Figura 5.1 Bits del registro de control del Timer0


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 que reduce la frecuencia que ingresa a un temporizador-contador dividiéndola para un determinado valor (figura 5.2). Por ejemplo, si la relación es 1:8, el prescaler entrega una frecuencia igual a la octava parte de la frecuencia del oscilador.

Prescaler
 
Figura 5.2 Prescaler actuando como divisor de frecuencia

El prescaler es compartido entre el Timer0 y el watchdog timer (WDT) del PIC, y no se puede leer ni escribir. Cuando se asigna el prescaler al Timer0 no puede ser utilizado por el WDT 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 Timer0, 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.

Ejemplo en mikroC PRO con el PIC16F88

Estos ejemplos corresponden al PIC16F88 en mikroC PRO. El código fuente para los microcontroladores PIC16F628A y PIC16F877A se encuentra en las carpetas correspondientes que se entregan junto con el libro.

Ejemplo-Timer0_1.c: Cada vez que se actúe sobre el pulsador conectado en el pin RA4 se 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).

Encontrará más ejemplos acerca de este tema en el libro.

 


eBook en formato PDF "Cómo programar microcontroladores PIC"

Guía básica para programar microcontroladores PIC en mikroC PRO. Disponible en formato PDF. A la venta por tan sólo US$12.00

¡Cómpralo ya!