Está en la página 1de 4

Timer 0 Objetivos de la Clase

& 1. Diseñar aplicaciones para la familia


Watchdog Timer PIC16F87X con base en el TIMER 0.
• Estudiar las especificaciones de
catálogo del TIMER 0.
2. Revisar la función del Watchdog Timer.

Prof.: Carlos H Cruz V. 1 Prof.: Carlos H Cruz V. 2

Generalidades Esquema del TMR0


• El PIC16F87X tiene tres registros temporizadores para aplicaciones • El funcionamiento del TMR0 se configura con el registro OPTION_REG
de usuario: TMR0, TMR1 y TMR2. También tiene un temporizador de (Pág. 25).
aplicación especial llamado WATCHDOG (WDT). • T0CS: configura el TMR0 como CONTADOR/TIMER
• El TMR0 es un registro de ocho bits que puede trabajar en dos • T0SE: selecciona el flanco para el incremento del contador.
modos: Temporizador y Contador. Como temporizador se puede • PSA: Asigna el prescaler al WDT/TMR0.
incrementar con cada ciclo de máquina (cada 4Tclk), y como contador • PS2,PS1,PS0: Ajusta el rango (RD) del prescaler.
se incrementa en los flancos elegidos del RA4/T0CKI.

• El TMR0 y el WDT comparten un divisor de frecuencia (prescaler), el


cual, permite ajustar la temporización de uno de los dos recursos.

• El desbordamiento del TMR0 (paso de FFH a 00) activa su flag de


IRQ (T0IF = INTCON<0>).

• La cuenta del TMR0 inicia tres ciclos de máquina después de


configurarlo en modo de TIMER. Su cuenta NO se puede
Arrancar/Parar como en otros procesadores.
Prof.: Carlos H Cruz V. 3 Prof.: Carlos H Cruz V. 4

Temporización del TMR0


Ejemplo 1
• De la arquitectura del TMR0, se deduce que su temporización
se calcula:
TT0 = 4· Tclk· C· RD • Calcular la temporización máxima del TMR0 cuando la
• Donde frecuencia de reloj es 4 MHz.
• C (Cuenta del TMR0): es el número de pulsos requeridos
en su entrada para desbordarlo. Su rango es [1, 256].
Solución:
• RD (Rango del prescaler): 2, 4, 8, … 256. • Se observa que en TT0 = 4· Tclk· C· RD la temporización es
máxima si C y RD son máximos (Cmax = RDmax = 256), así:
• El Valor Inicial del TMR0 (VI) define C; se calcula,
equivalentemente, de las siguientes maneras: TT0max = 4· ¼ 10-6·(256)·256 = 65536 µs.
• VI = complemento a 2 de la (C)2 • En este caso: T0CS = 1, PSA = 0 y PS2=PS1=PS0 = 1
• VI = 256 - (C)10
• VI = -(C)
Prof.: Carlos H Cruz V. 5 Prof.: Carlos H Cruz V. 6

Prof.: Carlos H Cruz V. 1


Ejemplo 2
• Diseñar el TMR0 para temporizar 1000 µs. si la
frecuencia de reloj es 4 MHz.
Restricción del TMR0
Solución: • La arquitectura del TMR0 NO permite ajustar
TT0 = 4· ¼µs· C· RD= 1000 µs
todas las temporizaciones en su rango de
operación, en estos casos el problema se
• Se deben estimar los valores de C y RD tales que, resuelve algorítmicamente.
respetando las restricciones, su producto sea 1000. Si
C = 125 y RD = 8 tenemos una posible solución. Ejemplo:
• Se debe ajustar PSA = 0 y PS2=0, PS1=1, PS0=0 • Diseñar el TMR0 para temporizar 1000 µs. si la
• Para este caso: VI = 256 – 125 = 131 = -125 frecuencia de reloj es 12 MHz.

Prof.: Carlos H Cruz V. 7 Prof.: Carlos H Cruz V. 8

Ejemplo
• Se quiere diseñar una aplicación que ejecute las
Ejercicio siguientes tareas, si FCLK = 4 MHz:
• T1: Un lazo infinito. Esta es la tarea principal.
• Diseñar el TMR0 para temporizar 2500 µs. si la
frecuencia de reloj es 8 MHz. • T2: Conmutar el estado de D cada 1000 µs.

Prof.: Carlos H Cruz V. 9 Prof.: Carlos H Cruz V. 10

#include <htc.h>
Diseño #define LED RB6
__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_ON & LVP_OFF);
void main(void){
TRISB = 0B10111111; //Configura RB6 de salida
OPTION_REG = 0B11010010;
RD = 8 TMR0 = -125;
INTCON |= 0B10100000; // Hbta Int por TMR0
LED = 0; // Enciende D
Inicializaciones: while(1); // Tarea 1
• Configurar RB6 como salida }
• Configurar e inicializar el TMR0 static void interrupt FunInt(void){
if(T0IF){ // Tarea 2
• Habilitar la interrupción TMR0 = -125;
• Definir el estado inicial de D LED = ~LED; // Conmuta el estado de D
Código en C T0IF = 0; // Repone bandera de IRQ
}
Código en ensamblador }
Prof.: Carlos H Cruz V. 11 Prof.: Carlos H Cruz V. 12

Prof.: Carlos H Cruz V. 2


; Ejecuta las siguientes tareas: ;************** Rutina de Interrupción ********
; T1: Un lazo infinito. Esta es la tarea principal. ORG 04H ;Vector de interrupciones
; T2: Conmuta el estado de RB6 con cada 1000 us. MOVWF TEMPW ;Salva el estado
; Codificado por: Carlos Héctor Cruz Vergara MOVF STATUS, W ;del procesador
;*************************************************** MOVWF TSTATUS
******************* BTFSS INTCON, T0IF ;Consulta IRQ del TMR0
#include P16F877.INC GOTO RETORNO
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF MOVLW -D'125'
;Bits de
MOVWF TMR0 ;Reinicia TMR0
configuración
COMF PORTB, F ;Complementa LED
TEMPW EQU 20H ;Temporal W
BCF INTCON, T0IF ;Repone IRQ
TSTATUS EQU 21H ;Temporal STATUS
RETORNO:
;************************************
MOVF TSTATUS, W ;Recupera estado
ORG 0x0000 ;Vector de Reset
MOVWF STATUS ;del procesador
GOTO INI
MOVF TEMPW, W
RETFIE
Prof.: Carlos H Cruz V. 13 Prof.: Carlos H Cruz V. 14

;************** Programa principal *************


INI: BSF STATUS, RP0 ;Activa banco 1 Watchdog Timer: WDT
BCF STATUS, RP1 • Es un temporizador de 8 bits y de aplicación específica:
MOVLW B'10111111' ;Configura: RB6 de salida resetea el procesador cuando se desborda.
MOVWF TRISB
MOVLW B'11010010‘ • Su temporización por defecto es de 18 ms., la cual, se puede
MOVWF OPTION_REG ;Configura TMR0 aumentar hasta 2,3 s. asignándole el prescaler en su rango
MOVLW B'10100000' ; Habilita interrupción RB máximo (128).
MOVWF INTCON • Puede Habilitarse/Inhabilitarse en el momento de programar
BCF STATUS, RP0 ; Activa banco 0 el chip: “Por defecto está habilitado”
MOVLW B'01000000'
MOVWF PORTB ;Inicia LED encendido • La siguiente macro muestra la forma de inhabilitarlo desde el
PPAL: NOP ; Tarea 1 programa:
GOTO PPAL __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
;************************************
END • NO está mapeado en memoria RAM.
Prof.: Carlos H Cruz V. 15 Prof.: Carlos H Cruz V. 16

• Cuando se produce un reset por


desbordamiento del WDT se
activa el flag /TO: Time Out
Modo de Bajo Consumo
(STATUS<4>). • En este modo, el consumo de corriente del µC es 10 µA, 200
veces menor que los 2 mA del consumo en modo normal.
• Para evitar que el WDT se
desborde, condición anormal, en • Es ideal en aplicaciones donde hay largos periodos de espera,
cada ciclo de programa hay que como la pulsada de una tecla. También es útil en aplicaciones
reiniciar su cuenta con la alimentadas con baterías.
instrucción CLRW como se
muestra en el flujo. • En este modo se detiene el oscilador y los puertos E/S
mantienen sus niveles lógicos.
• El programador debe ajustar la
temporización del WDT para que • El µC se pone en modo de reposo al ejecutar la instrucción
SLEEP, la cual, activa el flag /PD: Power Down (STATUS<2>).
sea mayor que el ciclo del
programa principal. El /PD, activo en nivel lógico bajo, se puede leer pero NO se
puede escribir.

Prof.: Carlos H Cruz V. 17 Prof.: Carlos H Cruz V. 18

Prof.: Carlos H Cruz V. 3


Wake-Up del Procesador Ejemplo
• El procesador se puede despertar de tres formas:
1. Activación del reset externo: pin /MCLR.
2. Activación de la señal Wake-up (Pág. 155). • Diseñar un programa para el
3. Desbordamiento del WDT. sistema, que minimizando el
consumo de energía, conmute
• El procesador reinicia desde el vector del reset al despertar de el estado de D cada 0.58 s.
la forma 1. En las alternativas 2 y 3, la ejecución del programa
reinicia en la instrucción que sigue al SLEEP. • Solución: La temporización por
defecto del WDT es 18 ms. Así:
• En modo de bajo consumo, el WDT se incrementará (al
tenerse activo) hasta desbordarse, pues NO se ejecuta la • 0.58/0.018 ≈ 32. Se asigna el
instrucción CLRWDT periódicamente. En esta condición el WDT prescaler al WDT con RD = 32.
sólo despierta el microcontrolador, NO produce el reset del
procesador.
Prof.: Carlos H Cruz V. 19 Prof.: Carlos H Cruz V. 20

1/2
2/2
2. Codificación ASM
ORG 0x0000 ;Vector de Reset
INI: BSF STATUS, RP0 ;Activa banco 1
BCF STATUS, RP1
; El procesador mantiene en modo SLEEP, MOVLW B'01111111' ;Configura RC7
; se despierta cada 0.576 ms. y conmuta RC7 MOVWF TRISC ;como salida
; Codificado por: Carlos Héctor Cruz Vergara MOVLW B'11111101' ;Asigna divisor al WDT
;************************************************ MOVWF OPTION_REG ;y fija rango en 32
#include P16F877.INC BCF STATUS, RP0 ; Activa banco 0
__CONFIG _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF BCF PORTC, 7 ; Enciende D
;************************************
BUCLA: SLEEP ;Duerme el MC
MOVLW H'80' ;Complementa D
XORWF PORTA, F
GOTO BUCLA
;************************************
END
Prof.: Carlos H Cruz V. 21 Prof.: Carlos H Cruz V. 22

Taller
#include <htc.h> • Diseñar un programa estructurado para los PIC16F87X que
//Bits de configuración controle las siguientes tareas:
__CONFIG(FOSC_XT & WDTE_ON & PWRTE_ON & LVP_OFF); • T1: En el instante de accionar un pulsador se genera una
void main(void){ señal rectangular con TH = 200 µs. y TL = 100 µs. Al accionar
TRISC = 0b01111111; //RC7 como salida nuevamente el pulsador se inhibe la generación de la señal
OPTION_REG = 0b11111101; // rectangular. Consecutivamente, con cada accionada se
RC7 = 0; //Enciende D
genera, se inhibe… la señal rectangular.
do {
SLEEP(); • T2: Generar por el PORTC la secuencia “RESORTICO L5.2”
RC7 = ~RC7; infinitamente. Cada paso de la secuencia tarda 0.8 s.
} while(1);
}
• Nota: La Fclk = 8.5 MHz.

Prof.: Carlos H Cruz V. 23 Prof.: Carlos H Cruz V. 24

Prof.: Carlos H Cruz V. 4

También podría gustarte