Sei sulla pagina 1di 5

PRCTICA 4

LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F877


OBJETIVO:
?? Identificar los diferentes temporizadores disponibles en el MCU PIC16F877, su
s
modos de operacin, preescaladores (pre-divisores de frecuencia) y postescaladores
(post-divisores de frecuencia).
?? Configurar adecuadamente los registros de control asociados al Timer0 para qu
e
funcione en modo temporizador.
?? Configurar adecuadamente los registros de control asociados al Timer1 para qu
e
funcione en modo contador.
INTRODUCCIN
El microcontrolador PIC16F877 tiene implementado un sofisticado mdulo de
temporizadores. Estos estn disponibles para aquellos usuarios que manejen aplicac
iones
que requieran que decisiones de control sean hechas en tiempo real. Este mdulo es
t
conformado por:
?? Timer0.
?? Timer1.
?? Timer2.
De los tres, el Timer0 es el ms empleado, ya que los dos ltimos suelen ser usados
en
forma individual o como perifrico de apoyo para el mdulo CCP
(Capture/Compare/PWM).

Pre-reporte:
(ADJUNTO)
I. El Timer0
El Timer0 es un temporizador/contador que consta de un registro de 8 bits (TMR0)
que
puede ser escrito o ledo en cualquier instante. Puede ser programado (con el bit
T0CS)
para incrementar su conteo ya sea con impulsos externos en la terminal RA4/T0CKI
(modo contador) o por medio de la seal interna Fosc/4 (modo temporizador). De igu
al
forma, con la ayuda del bit T0SE es posible configurar el flanco con el que el c
onteo se
incrementar en el caso que la seal sea externa.
Asimismo, cuando el conteo del TMR0 pasa del valor FFh al 00h, se activa la band
era
T0IF en el registro INTCON. Con ella es posible programar una interrupcin cada ve
z que
se presente este evento por medio del bit T0IE.
Cabe sealar que cada vez que se ejecuta una instruccin de escritura que modifica e
l
valor en el registro TMR0, se producir un retardo de dos ciclos de instruccin dura
nte los
cuales se inhibe tanto el predivisor como el TMR0. Ser necesario tener en cuenta
esa
inhibicin temporal a la hora de realizar una precarga (compensar sumando los cicl
os de
instruccin que se pierden).
1. Edite un archivo con el programa fuente que aparece a continuacin.
Programa que rota cada segundo un led a la derecha en el
; puerto B, usando interrupciones por desborde del Timer0
LIST P=16F877
RADIX HEX
INCLUDE "p16f877a.inc"
cblock 20h
CONT_DES ; Contador de desbordes de TMR0
ST_TEMP ; Copia del registro STATUS
endc
org 0
goto INICIO
org 4
goto ISR_T0IF
;----- Subrutina que configura al puerto B como salida------
CONF_PUERTOS
bsf STATUS,RP0 ; conmuta a banco 1
clrf TRISB ; Puerto B = salida
bcf STATUS,RP0 ; conmuta a banco 0
movlw b'0001000'
movwf PORTB ; Puerto B = 0001 0000
movf STATUS,w ; Guarda el estado del
movwf ST_TEMP ; registro STATUS
return
;----- Subrutina que configura al Timer0 --------------------
CONF_TIMER0
bsf STATUS,RP0 ; Banco 1
movlw b'11010101' ; Timer0 en modo temporizador
movwf OPTION_REG ; configura preesc. para el timer0
bcf STATUS,RP0 ; Banco 0
bsf INTCON,T0IE ; Activa int. por desbordes en TMR0
return
; ---- Programa principal -----------------------------------
INICIO
call CONF_PUERTOS
call CONF_TIMER0
movlw .62
movwf CONT_DES ; CONT_DES <- 62
movlw 0xF7 ; Establece valor
movwf TMR0 ; inicial para TMR0
bcf INTCON,T0IF ; Borra bandera
bsf INTCON,GIE ; Activa mascara global
goto $ ; Espera interrupcin
;----- ISR debido a desborde en TMR0 -------------------------
ISR_T0IF
decfsz CONT_DES ; Decrementa desbordes
goto AUN_NO ; Desbordes = 0? No
movf ST_TEMP,w ; Si
movwf STATUS ; Recupera STATUS
rrf PORTB,f ; Rota Puerto B
movf STATUS,w ; Guarda STATUS
movwf ST_TEMP
movlw .62 ; Reinicia contador de desbordes
movwf CONT_DES ; CONT_DES <- 62
movlw 0xF7 ; Establece valor inicial
movwf TMR0 ; para TMR0
AUN_NO
bcf INTCON,T0IF ; Apaga bandera
retfie
END
2. Elabore el proyecto correspondiente y proceda a ensamblar el programa en la f
orma
acostumbrada.
3. Implemente el circuito de la figura 8.1, descargue el programa al PIC y ejecte
lo.
Verifique el funcionamiento del circuito viendo el comportamiento de los leds.
4. Observe que el programa principal est formado por 9 lneas y bsicamente lo que
hace es inicializar la variable CONT_DES, configurar el Timer0, establecer el va
lor inicial
del registro TMR0 y permanecer en un ciclo ocioso. Cada vez que se desborde el r
egistro
TMR0, el PIC generar una interrupcin y realizar las tareas programadas en la rutina
de
servicio, las cuales en este caso son decrementar el contenido de CONT_DES y cua
ndo
sea cero realizar el desplazamiento a la derecha de un bit en el puerto B.
5. Del archivo fuente anterior, dentro de la subrutina que configura al Timer0,
localice la
lnea de cdigo
movlw b'11010101' ; Timer0 en modo temporizador
sustityala ahora por la siguiente:
movlw b'11010000' ; Timer0 en modo temporizador
Almacene el archivo, reensamble el proyecto, descargue el programa al PIC y eject
elo.
Cul es el comportamiento de los leds ahora?
Los LEDS parpadean en serie: uno tras otro.
Exactamente qu fue lo que hizo la nueva lnea de cdigo?
Cambi la instruccin sobre un LED en especfico. Es decir, su tiempo de oscilacin camb
i.
De qu manera influye en el programa?
Hace que la secuencia concatenada vare.
Cul es el tiempo que permanecern encendidos los leds con este cambio?
El delay equivale a 100ms

Escriba la frmula mediante la cual es posible calcular el tiempo que dura el reta
rdo.
Para calcular el tiempo que dura el retardo intervienen alguna variables ya util
izadas:
Temporizacin=4TOSCValorRealTMR0ValorPreescale
Donde:
TOSC=periodo de osciacin=1/FOSC
FOSC=Dado por el cristal de cuarzo utilizado
6. Analizando la rutina de servicio de interrupcin del Timer0, puede notarse que
la
funcin de la penltima lnea de cdigo es fundamental para el buen funcionamiento del
programa. Explique: Por qu?
RETFIE cumple exactamente la funcin de lo comnmente conocemos como RETURN. Tambin e
stablece la interrupcin de habilitacin global. Por ello, cuando se da una interrup
cin en el hardware, limpia la interrupcin de habilitacin global y ejecuta una instr
uccin CALL. De esta forma, la accin de habilitar las instrucciones y regresar al p
rograma principal, se puede hacer en un solo paso.
RETFIE es fundamental en primer lugar porque es necesario regresar al programa p
rincipal, y, en segundo lugar, porque realiza sta accin en un solo paso.
Para el programa es fundamental porque sino, el puntero no regresa al programa p
rincipal.
7. Verifique su respuesta eliminando del programa la lnea de cdigo a la que hace
referencia el punto anterior, compile el proyecto, reprograme el PIC y ejectelo. Q
u es
lo que sucede ahora?
La rutina de parpadeo se ejecuta una sla vez.
II. El Timer1 en modo contador
El Timer1 es un mdulo temporizador/contador ascendente de 16 bits que puede ser
escrito o ledo en cualquier instante, est implementado en dos registros especficos
TMR1H y TMR1L, que contienen el valor de las cuentas a cada momento. El valor de
l
registro TMR1H-TMR1L incrementa desde 0000h hasta FFFFh, el cual al reanudar la
cuenta activa el sealizador TMR1IF.
Como fuente de impulsos de reloj existen tres alternativas:
?? Generacin interna (4*Tosc).
?? Generacin mediante un oscilador externo controlado por cristal que se conecta
a
la pin RB6/T1OSO/T1CKI/PGC y RB7/T1OSI/PGD. El oscilador se activa poniendo
a 1 el bit T1OSCEN del registro T1CON. El bit del TMR1CS del registro T1CON
selecciona entre reloj interno y externo
?? Trabajar en modo contador de eventos, cuando los impulsos externos a contar s
e
introducen al pin RB6/T1OSO/T1CKI/PGC. La fuente de los impulsos de reloj se
aplica al divisor de frecuencias (Preescaler) que los divide por 1, 2, 4 y 8, se
gn el
valor de los bits T1CKPS0 y T1CKPS1 del registro T1CON.
Tomando en cuenta estas caractersticas se pueden realizar retardos mayores sin ut
ilizar
los desbordes hasta cierto lmite, dependiendo de la base de tiempo del microcontr
olador.
8. Edite un archivo con el programa fuente que aparece a continuacin.
; Programa que mide la frecuencia de una seal
; introducida por el pin RC0 como base de tiempo de TMR1.
LIST P=16F877A ; Tipo de Procesador
INCLUDE "p16f877A.inc" ; librera del PIC16F877A
cblock 20h
CONT_DES ; Contador de desbordes
endc
org 0x00
goto INICIO
org 0x04
goto ISR_TMR0 ; Servicio de interrupcin
;----- ISR debido a desborde en TMR0 -------------------------
;------ cada 50 mS aproximadamente ---------------------------
ISR_TMR0
btfss INTCON,T0IF
goto AUN_NO
UN_SEG
decfsz CONT_DES,F ; Decrementa desbordes
goto AUN_NO ; Desbordes = 0? No
Valor_TMR1
bcf T1CON,TMR1ON
movf TMR1H,W ; Leer el valor de la parte alta
movwf PORTB ; de TMR1 y lo despliega en PORTB
movf TMR1L,W ; Leer el valor de la parte baja
movwf PORTD ; de TMR1 y lo despliega en PORTD
movlw .20 ; Reinicia contador de desbordes
movwf CONT_DES ; CONT_DES <- 20
movlw .61 ; Establece valor inicial
movwf TMR0 ; para TMR0
clrf TMR1L ; Borrar los registros
clrf TMR1H ; implicados en las mediciones
bsf T1CON,TMR1ON
bcf INTCON,T0IF
retfie
AUN_NO
movlw .61 ; Establece valor inicial
movwf TMR0
bcf INTCON,T0IF ; Apaga bandera
retfie
;----- Subrutina que configura al puerto B y D como salida------
;----- y al pin T1CKI como entrada para TMR1 ------------------
CONF_PUERTOS
bsf STATUS,RP0 ; conmuta a banco 1
clrf TRISB ; Puerto B como salida
clrf TRISD ; Puerto D como salida
bsf TRISC,0 ; RC0/T1CKI como entrada
; Pin T1CKI como entrada
bcf STATUS,RP0 ; conmuta a banco 0
clrf PORTB
clrf PORTD
return
;----- Subrutina que configura al TMR1 en modo contador ----------
;----- eventos externos por T1CKI --------------------------------

Potrebbero piacerti anche