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