You are on page 1of 10

90

Los Temporizadores Programables del PIC16F877

PRCTICA 8
LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F877
OBJETIVO:

Identificar los diferentes temporizadores disponibles en el MCU PIC16F877, sus


modos de operacin, preescaladores (pre-divisores de frecuencia) y postescaladores (post-divisores de frecuencia).

Configurar adecuadamente los registros de control asociados al Timer0 para que


funcione en modo temporizador.

Configurar adecuadamente los registros de control asociados al Timer1 para que


funcione en modo contador.

INTRODUCCIN
El microcontrolador PIC16F877 tiene implementado un sofisticado mdulo de
temporizadores. Estos estn disponibles para aquellos usuarios que manejen aplicaciones
que requieran que decisiones de control sean hechas en tiempo real. Este mdulo est
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).

MATERIAL Y EQUIPO EMPLEADO


Laboratorio equipado con computadoras que tengan instalado el MPLAB versin
v7.40 o superior y el WinPic800 v3.55 g.
Cantidad
1
1
1
5
5
1
1
1
1

Descripcin
Programador compatible con WinPic800.
Microcontrolador PIC16F877
Push-button
Leds
Resistencias de 330
Resistencia de 10 k
Diodo 1N4148
Tableta experimental
Generador de funciones

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

91

Los Temporizadores Programables del PIC16F877

1
1

Osciloscopio
Fuente de alimentacin de CD

Pre-reporte:

Leer previamente toda la prctica.

Investigar en la hoja de datos del PIC16F877, los diagramas a bloques de la


arquitectura interna del Timer0, Timer1 y Timer2.

Llevar implementado en un protoboard los circuitos de la figura 8.1 y 8.2.

DESARROLLO:
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 igual
forma, con la ayuda del bit T0SE es posible configurar el flanco con el que el conteo 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 bandera
T0IF en el registro INTCON. Con ella es posible programar una interrupcin cada vez que
se presente este evento por medio del bit T0IE.
Cabe sealar que cada vez que se ejecuta una instruccin de escritura que modifica el
valor en el registro TMR0, se producir un retardo de dos ciclos de instruccin durante 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 ciclos 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
RADIX
INCLUDE
cblock
CONT_DES
ST_TEMP
endc
org
goto

P=16F877
HEX
"p16f877a.inc"
20h
; Contador de desbordes de TMR0
; Copia del registro STATUS

0
INICIO

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

92

Los Temporizadores Programables del PIC16F877

org
goto

4
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
call
movlw
movwf
movlw
movwf
bcf
bsf
goto

CONF_PUERTOS
CONF_TIMER0
.62
CONT_DES
;
0xF7
;
TMR0
;
INTCON,T0IF ;
INTCON,GIE ;
$
;

;----- ISR debido a desborde en TMR0


ISR_T0IF
decfsz
CONT_DES
;
goto
AUN_NO
;
movf
ST_TEMP,w
;
movwf
STATUS
;
rrf
PORTB,f
;
movf
STATUS,w
;
movwf
ST_TEMP
movlw
.62
;
movwf
CONT_DES
;
movlw
0xF7
;
movwf
TMR0
;
AUN_NO
bcf
INTCON,T0IF ;
retfie

CONT_DES <- 62
Establece valor
inicial para TMR0
Borra bandera
Activa mascara global
Espera interrupcin
------------------------Decrementa desbordes
Desbordes = 0? No
Si
Recupera STATUS
Rota Puerto B
Guarda STATUS
Reinicia contador de desbordes
CONT_DES <- 62
Establece valor inicial
para TMR0
Apaga bandera

END

2. Elabore el proyecto correspondiente y proceda a ensamblar el programa en la forma


acostumbrada.

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

93

Los Temporizadores Programables del PIC16F877

3. Implemente el circuito de la figura 8.1, descargue el programa al PIC y ejectelo.


Verifique el funcionamiento del circuito viendo el comportamiento de los leds.

Figura 8.1: Circuito de experimentacin para el Timer0.

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 valor inicial
del registro TMR0 y permanecer en un ciclo ocioso. Cada vez que se desborde el registro
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 cuando
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 ejectelo.


Cul es el comportamiento de los leds ahora?
________________________________________________________________________
________________________________________________________________________
Exactamente qu fue lo que hizo la nueva lnea de cdigo?
________________________________________________________________________

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

94

Los Temporizadores Programables del PIC16F877

De qu manera influye en el programa?


________________________________________________________________________
Cul es el tiempo que permanecern encendidos los leds con este cambio?
________________________________________________________________________
Escriba la frmula mediante la cual es posible calcular el tiempo que dura el retardo.
________________________________________________________________________
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?
________________________________________________________________________
________________________________________________________________________
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. Qu es
lo que sucede ahora?
________________________________________________________________________
________________________________________________________________________

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 del
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 se


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, segn el
valor de los bits T1CKPS0 y T1CKPS1 del registro T1CON.

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

95

Los Temporizadores Programables del PIC16F877

Tomando en cuenta estas caractersticas se pueden realizar retardos mayores sin utilizar
los desbordes hasta cierto lmite, dependiendo de la base de tiempo del microcontrolador.
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
INCLUDE

P=16F877A
"p16f877A.inc"

cblock
CONT_DES
endc

20h

org
goto

0x00
INICIO

org
goto

0x04
ISR_TMR0

; Tipo de Procesador
; librera del PIC16F877A

; Contador de desbordes

; Servicio de interrupcin

;----- ISR debido a desborde en TMR0 ------------------------;------ cada 50 mS aproximadamente --------------------------ISR_TMR0


btfss
INTCON,T0IF
goto
AUN_NO
UN_SEG
decfsz
goto

CONT_DES,F
AUN_NO

; Decrementa desbordes
; Desbordes = 0? No

bcf
movf
movwf
movf
movwf

T1CON,TMR1ON
TMR1H,W
;
PORTB
;
TMR1L,W
;
PORTD
;

movlw
movwf
movlw
movwf
clrf
clrf
bsf
bcf
retfie

.20
CONT_DES
.61
TMR0
TMR1L
TMR1H
T1CON,TMR1ON
INTCON,T0IF

;
;
;
;
;
;

movlw
movwf
bcf
retfie

.61
TMR0
INTCON,T0IF

; Establece valor inicial

Valor_TMR1
Leer el
de TMR1
Leer el
de TMR1

valor de la parte
y lo despliega en
valor de la parte
y lo despliega en

alta
PORTB
baja
PORTD

Reinicia contador de desbordes


CONT_DES <- 20
Establece valor inicial
para TMR0
Borrar los registros
implicados en las mediciones

AUN_NO

; Apaga bandera

;----- Subrutina que configura al puerto B y D como salida------

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

96

Los Temporizadores Programables del PIC16F877

;----- 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 -------------------------------CONF_TMR1
movlw
b'00000110'
; Configura TMR1 en modo
movwf
T1CON
; contador de eventos no sinc.
clrf
TMR1L
; Borrar registro de TMR1
clrf
TMR1H
return
;----- Subrutina que configura al Timer0
CONF_TIMER0
bsf
STATUS,RP0
movlw
b'11000111'
movwf
OPTION_REG
timer0
bcf
STATUS,RP0
bcf
INTCON,T0IF
bsf
INTCON,T0IE
TMR0
movlw
.20
movwf
CONT_DES
movlw
.61
movwf
TMR0
return

-------------------; Banco 1
; Timer0 en modo temporizador
; configura preesc. para el
; Banco 0
; Desactiva bandera del TMR0
; Act. int. por desbordes

en

; CONT_DES <- 20
; Establece valor inicial
; para TMR0. Temp = 50 mS

; ---- Programa principal ----------------------------------INICIO


call
CONF_PUERTOS
call
CONF_TMR1
call
CONF_TIMER0
bsf
T1CON,TMR1ON
; Enciende TMR1
bsf
INTCON,GIE
; Habilita int. de TMR0
goto
$
; Espera interrupcin
END

9. Elabore el proyecto correspondiente y proceda a ensamblar el programa en la forma


acostumbrada.
10. Implemente el circuito de la figura 8.2, descargue el programa al PIC y ejectelo.
Verifique el funcionamiento del circuito viendo el comportamiento de los leds. Conecte una
terminal del generador de funciones al pin RC0 utilizando la salida TTL, como tambin un
canal del osciloscopio (debidamente calibrado) y encienda ambos. A continuacin elija la

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

97

Los Temporizadores Programables del PIC16F877

escala adecuada en el generador, vare la frecuencia hasta que se observe en el


osciloscopio que el periodo de la seal sea de 10ms.

Figura 8.2: Circuito de experimentacin para el Timer1.

11. Observe que el programa principal est formado por 6 lneas y bsicamente lo que
hace es configurar los puertos, al Timer0 en modo temporizador, al Timer1 en modo
contador asncrono, encender el Timer1, habilitar la mscara global de interrupciones y
entrar en un ciclo ocioso a espera de la interrupcin de 50 mS de TMR0.
Durante el transcurso de las interrupciones de TMR0, el temporizador TMR1 recibe
impulsos de reloj provenientes del generador de funciones, lo cual ocasiona que la cuenta
de sus registros (TMR1H y TMR1L) incremente su valor. Se realiza un tiempo de
muestreo con el TMR0 (programa anterior), las muestras capturadas se guardan en los
registros
Cada vez que se llevan a cabo los 20 desbordes del temporizador TMR0 o su equivalente
a un segundo, el PIC generar una interrupcin y realizar las tareas programadas en la
rutina de servicio, las cual en este caso es recargar el valor de inicio de TMR0 en caso de
no haber transcurrido el tiempo de un segundo y mostrar el valor de los registros
TMR1H:TMRL, por los puertos B y D respectivamente.
Qu valor muestran los leds conectados a los puertos B y D? Tome en cuenta que el bit
RB7 es el ms significativo y RD0 el menos significativo.
Valor de los puertos: _______________________________________________________

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

98

Los Temporizadores Programables del PIC16F877

Anote el valor en decimal del dato mostrado en los leds de los puertos B y D, y el valor de
la cartula del generador de funciones.
Valor mostrado en los puertos: _______________________
Valor mostrado en el generador: ______________________
Cmo son entre si?
________________________________________________________________________
Existe mucha diferencia entre los valores mostrados en los leds y el mostrado por el
generador de funciones?____________________________________________________
A qu se debe esto?
________________________________________________________________________
________________________________________________________________________

Vare el valor de frecuencias de entrada al pin RC0, encuentre el rango de frecuencias en


el que los valores mostrados en los leds son aproximados a los mostrados en la cartula
del generador de funciones.
Cul fue el rango obtenido? Escriba el valor mximo y mnimo.
_______________________________________________________________________
A que se debe que el rango de medicin sea limitado?
________________________________________________________________________
Cmo se puede incrementar el rango de medicin? Justifique su respuesta.
________________________________________________________________________
________________________________________________________________________

Si incrementa mucho el valor de frecuencia es posible que el resultado mostrado sea


mucho menor al valor real, Cul es la razn de esto?, Cmo se puede evitar este
efecto?
________________________________________________________________________
________________________________________________________________________
12. Del archivo fuente anterior, dentro de la subrutina que configura al Timer1, localice la
lnea de cdigo
movlw

b'00000110'

Eduardo Romero A. / Alejandro Aganza T.

; Configura TMR1 en modo

Laboratorio de Sistemas Digitales III

99

Los Temporizadores Programables del PIC16F877

sustityala ahora por la siguiente:


movlw

b'00000010'

; Configura TMR1 en modo

Almacene el archivo, reensamble el proyecto, descargue el programa al PIC y ejectelo.


Cul es el comportamiento de los leds ahora? Vari la exactitud del resultado mostrado
en los leds?
________________________________________________________________________
________________________________________________________________________
Exactamente qu fue lo que hizo la nueva lnea de cdigo?
________________________________________________________________________
De qu manera influye en el programa?
________________________________________________________________________

Vare el rango de frecuencia de entrada en el pin RC0, cmo es en comparacin con el


punto 11?
________________________________________________________________________

A qu se debe esto? Justifique su respuesta.


________________________________________________________________________
________________________________________________________________________

13. Analizando la rutina de servicio de interrupcin del Timer0, puede notarse que la
funcin de la lnea de cdigo antes de las instrucciones retfie son fundamentales para el
buen funcionamiento del programa. Explique: Por qu?
________________________________________________________________________
________________________________________________________________________

14. Verifique su respuesta eliminando del programa las lneas de cdigo a la que hace
referencia el punto anterior, reensamble el proyecto, reprograme el PIC y ejectelo. Qu
es lo que sucede ahora?
________________________________________________________________________
________________________________________________________________________

Eduardo Romero A. / Alejandro Aganza T.

Laboratorio de Sistemas Digitales III

You might also like