logo microc
    microC®
Líder en la programación de microcontroladores PIC
©2009-2012
Síguenos en    
logo facebook
Inicio La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | Mapa del sitio |

Timer 0: Temporizador y contador con el PIC 16F877A - 16F628A

Extracto del Capítulo V del libro Cómo programar en lenguaje C los microcontroladores PIC16F88, 16F628A y 16F877A. 2da edición. 2010

Regístrate aquí para descargar una muestra gratis de este libro

Timer 0

Este módulo 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 de este módulo se controla a través del registro OPTION_REG (figura 5.1). En el modo temporizador (TOCS=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.
option reg
Figura 5.1 Bits del registro OPTION_REG

En el modo contador (TOCS=1), se produce un incremento por cada transición ascendente (T0SE=0) o descendente (T0SE=1) en el pin RA4.

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 Timer 0 y el perro guardián (WDT), y no se puede leer ni escribir. Cuando se asigna el prescaler al Timer 0 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 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.

Ejemplos de programación

Estos ejemplos corresponden al PIC16F88. El código fuente para los PICs 16F628A y 16F877A se encuentra en las carpetas correspondientes que acompañan a este libro.

Ejemplo-Timer0_1.c: Cada vez que se actúe sobre el pulsador conectado en RA4 se incrementa un contador que se visualiza en el LCD (circuito de las figuras 3.1.1 y 3.1.2).

//Timer0_1.c
//El registro OPTION_REG tiene todos sus bits en 1 después del encendido
//por lo tanto el Timer 0 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 módulo 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 256-28=228. El ciclo de instrucción tiene una duración de 4 us para una frecuencia de oscilador de 1 MHz (16F88). Sin prescaler mediría un tiempo de 28x4x1 us = 112 us. Con un prescaler 1:8, el tiempo medido sería 28x4x8 us = 896 us. De manera general, el intervalo de temporización T se puede calcular con la siguiente fórmula:
T=NxTCIxn
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 500 us, con un prescaler 1:1 (prescaler asignado al perro guardián WDT) y un TCI = 4 us se necesitan 500/4 = 125 ciclos de instrucción. El valor inicial del TMR0 debe ser 256-125=131.

Encontrará más ejemplos en el libro



Si esta información te ha sido útil
entonces considera la posibilidad
de hacer una contribución para microC.
Tu apoyo es muy importante para seguir adelante.
Muchas gracias.






Copyright © microC
Quito-Ecuador