Professional Documents
Culture Documents
PRCTICA 8
LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F877
OBJETIVO:
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).
Descripcin
Programador compatible con WinPic800.
Microcontrolador PIC16F877
Push-button
Leds
Resistencias de 330
Resistencia de 10 k
Diodo 1N4148
Tableta experimental
Generador de funciones
91
1
1
Osciloscopio
Fuente de alimentacin de CD
Pre-reporte:
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
92
org
goto
4
ISR_T0IF
CONF_PUERTOS
CONF_TIMER0
.62
CONT_DES
;
0xF7
;
TMR0
;
INTCON,T0IF ;
INTCON,GIE ;
$
;
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
93
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
94
95
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
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
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
AUN_NO
; Apaga bandera
96
-------------------; 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
97
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: _______________________________________________________
98
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?
________________________________________________________________________
________________________________________________________________________
b'00000110'
99
b'00000010'
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?
________________________________________________________________________
________________________________________________________________________