Timer 0 Temporizador y Contador Con El PIC 16F877A-16F628A

Timer 0: Temporizador y contador con el PIC 16F877A-16F628A Extracto del Capítulo V del libro Cómo programar en lenguaje

Views 149 Downloads 2 File size 133KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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

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.

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 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 sbit sbit sbit sbit sbit // char

Fin

LCD_RS_Direction LCD_EN_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction de declaración

at

de

TRISB4_bit; at TRISB5_bit; at TRISB0_bit; at TRISB1_bit; at TRISB2_bit; at TRISB3_bit; variables de conexión. texto[4];

void main(){ OSCCON=0x40; //Oscilador interno a while (OSCCON.IOFS==0);//Esperar mientras el oscilador está ANSEL=0x00; //Pines AN como E/S

1MHz. inestable. digital.

TMR0=0; //Inicializa Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1,6,"Conteo:"); while { ByteToStr(TMR0,texto); Lcd_Out(2,6,texto); } }

el //Inicializa //Borra //Apaga

registro el el el

TMR0. LCD. display. cursor. (1)

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