Translate, Traductor

jueves, 5 de julio de 2012

El timer TMR0 en los PIC con ejemplo


El timer TMR0 en los PIC

Es un modulo que sirve como contador o como temporizador de 8 bit's.
Funcionando como temporizador el TMR0 es un registro donde yo puedo almacenar un valor y este se va incrementando de 1 en 1 con los ciclos de instruccion, es decir, con cada ciclo se incrementa en 1 el TMR0, cuando la cuenta llega a 255 y pasa a 0 (cero) se porduce una interrupcion por desborde del TMR0, recordemos que en un registro de 8 Bit's el valor mas alto que se puede almacenar es 255 y que si lo incrementamos estando en 255 pasa a cero, y es a esto a lo que se le denomina desborde.

Cual seria la ventaja entonces de usar el timer TMR0?


Cuando necesitemos temporizar, o lo que normalmente llamamos un retardo, no necesitaremos las acostumbradas rutinas para retardos, esto lo vamos a ver con un ejemplo.

El TMR0 tiene las siguientes caracteristicas:

-se puede leer y escribir
-puede trabajar con relog externo o interno
-detecta el flanco de subida o bajada del relog externo
-tiene un prescaler de 8 bit´s
-tiene una interrupcion por desborde de la cuenta de 255 a 0

los registros asociados a el son el TMR0, INTCON y el OPTION_REG

El bit T0CS (OPTION 2) a 1 trabaja como temporizador, 0 trabaja como contador

El bit T0SE (OPTION 4) en modo contador a 1 flanco descendente, 0 flanco ascendente

El bit PSA (OPTION 3) 0 prescaler al temporizador, 1 prescaler al perro guardian WDT

Cuando se desborda el TMR0, se activa  el bit 2 de INTCON (T0IF) y si el T0IE esta activado el T0IF generara interrupcion y se debe borrar por software cuando se atienda la interrupcion

Para calcular el tiempo de temporizacion

Tiempo = 4 * Tosc * (256 - valor cargado en TMR0)*(Rango presaler)

donde

Tocs  =  1 / Fosc (frecuencia del oscilador)
   

Entonces si necesitamos un determinado tiempo podemos despejar TMR0 y hallar su valor:

                        Tiempo
TMR0 =    ----------------------------    -   256
             4 * Tosc * Prescaler

Formula que nos dara un valor muy aproximado del Tiempo


Empecemos la configuración

Configuramos el OPTION_REG

BANKSEL OPTION_REG
MOVLW B'00000000'

ANALICEMOS

BIT 7 Pull up PORTB Disable
BTI 6 interrupcion por flaco de subida en el INT Pin
BIT 5 fuente del clock para el TMR0, internal 1 ciclo ed intruccion (1/Fosc)
BIT 4 Flanco de bajada para el incremento del TMR0
BIT 3 Prescaler asignado al TMR0
BIT 2-0 Division del prescaler



Configuramos el INTCON

Registro donde activamos las interrupciones globales y la del TMR0

MOVLW B'10100000'
                MOVWF OPTION_REG


BIT 7 Activamos las interrupciones Globales
BIT 6 interrupciones de otros perifericos desactivadas
BIT 5 Habilitamos la interrupcion por desborde en el TMR0
BIT 4 desabilitamos interrupcion externa INT
BIT 3 desabilitamos interrupcion por cambio en el PORTB
BIT 2 bandera interrupcion en TMR0
BIT 1 bandera interrupcion en INT
BIT 0 bandera interrupcion por cambio en PORTB



Ejemplo

Vamos a crear una señal de 1 KHz usando el TMR0.



Código fuente


   LIST P=16F886

    INCLUDE P16F886.INC
ERRORLEVEL -302

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF


CBLOCK 0X20

ENDC

      ORG 0X00
      GOTO CONFIGURA
     
      ORG 0X04
      GOTO INTERRUPCION
      ORG 0X05

INTERRUPCION COMF PORTB,F
MOVLW .7
MOVWF TMR0
BCF INTCON,T0IF
RETFIE
 
   
CONFIGURA CLRF     PORTB
BANKSEL ANSEL
CLRF     ANSEL
CLRF     ANSELH
BANKSEL TRISB
CLRF     TRISB
BANKSEL OPTION_REG
MOVLW B'00000000'
MOVWF OPTION_REG
MOVLW B'10100000'
MOVWF INTCON
BANKSEL PORTB

CLRF TMR0
CLRF PORTB


INICIO  GOTO     INICIO

        END



Copyright 2012  edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".  











No hay comentarios:

Publicar un comentario