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

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

of 4

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

  • 7/28/2019 Timer 0 Temporizador y Contador Con El PIC 16F877A-16F628A

    1/4

    Timer 0: Temporizador y contador con el

    PIC 16F877A-16F628AExtracto del Captulo V del libro Cmo programar en lenguaje C los microcontroladores

    PIC16F88, 16F628A y 16F877A. 2da edicin.

    Regstrate aqu para descargar una muestra gratis de este libro

    Timer 0

    Este mdulo tiene las siguientes caractersticas:

    Temporizador - contador de 8 bits.

    Se puede leer y escribir.

    Prescaler programable de 8 bits.

    Seleccin de reloj interno o externo.

    Genera una interrupcin al desbordarse desde 0xFF a 0x00.

    Seleccin de flanco del reloj externo.

    La operacin de este mdulo se controla a travs del registro OPTION_REG (figura 5.1). En

    el modo temporizador (TOCS=0), se produce un incremento del registro TMR0 cada ciclode instruccin (prescaler asignado al perro guardin WDT). Si se escribe en el registro

    TMR0, no se produce el incremento durante los dos siguientes ciclos de instruccin; este

    hecho debe tenerse muy en cuenta por parte del usuario y, de ser necesario, ajustar el valorescrito en TMR0.

    http://www.programarpicenc.com/index.htmlhttp://www.programarpicenc.com/index.html
  • 7/28/2019 Timer 0 Temporizador y Contador Con El PIC 16F877A-16F628A

    2/4

    Figura 5.1 Bits del registro OPTION_REG

    En el modo contador (TOCS=1), se produce un incremento por cada transicin 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

    dividindola para un determinado valor (figura 5.2). Por ejemplo, si la relacin es 1:8, el

    prescaler entrega una frecuencia igual a la octava parte de la frecuencia del oscilador.

  • 7/28/2019 Timer 0 Temporizador y Contador Con El PIC 16F877A-16F628A

    3/4

    Figura 5.2 Prescaler actuando como divisor de frecuencia

    El prescaler es compartido entre el Timer 0 y el perro guardin (WDT), y no se puede leer ni

    escribir. Cuando se asigna el prescaler al Timer 0 no puede ser utilizado por el WDT almismo tiempo, y viceversa.

    Los bits PSA y PS determinan la asignacin y la relacin de divisin 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 instruccin CLRWDT reinicia el

    prescaler y tambin el WDT.

    Ejemplos de programacin

    Estos ejemplos corresponden al PIC16F88. El cdigo fuente para los PICs 16F628A y

    16F877A se encuentra en las carpetas correspondientes que acompaan a este libro.

    Ejemplo-Timer0_1.c: Cada vez que se acte 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 despus del encendido//por lo tanto el Timer 0 acta como contador, incrementa en transicin

    //descendente y el prescaler est asignado al WDT.//Declaracin de las 12 variables necesarias para la conexin//del mdulo 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 declaracin de variables de conexin.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 como E/S digital.

  • 7/28/2019 Timer 0 Temporizador y Contador Con El PIC 16F877A-16F628A

    4/4

    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 mdulo trabaja como temporizador cuenta los ciclos de instruccin (sin

    prescaler) o los ciclos que recibe del prescaler. Como es un contador ascendente el TMR0debe 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 instruccin/prescaler), se

    carga el TMR0 con 256-28=228. El ciclo de instruccin tiene una duracin de 4 us para unafrecuencia de oscilador de 1 MHz (16F88). Sin prescaler medira un tiempo de 28x4x1 us =

    112 us. Con un prescaler 1:8, el tiempo medido sera 28x4x8 us = 896 us. De manerageneral, el intervalo de temporizacin T se puede calcular con la siguiente frmula:

    T=NxTCIxn

    Donde:

    N = nmero de ciclos de instruccin/prescalerTCI = perodo del ciclo de instruccin

    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 guardin WDT) y un

    TCI = 4 us se necesitan 500/4 = 125 ciclos de instruccin. El valor inicial del TMR0 debe ser256-125=131.

    Encontrar ms ejemplos en el libro