Sunteți pe pagina 1din 10

Universidad Catlica de Santa Mara

Facultad de Ciencias Fsicas y Formales


Programa Profesional de Ingeniera Mecnica,
Mecnica Elctrica y Mecatrnica









PRCTICA 3


Presentado por:
Delgado Herrera, Luis
Gmez Chacn Carolina
Gutirrez Suclla, Andre
Zegarra Paredes, Carlos

Arequipa, Abril 2014

PRCTICA 4
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).

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 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 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 forma
acostumbrada.
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.

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?
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
cambi.
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 retardo.

Para calcular el tiempo que dura el retardo intervienen alguna variables ya utilizadas:


Donde:




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 establece la interrupcin de habilitacin global. Por ello, cuando se da una
interrupcin en el hardware, limpia la interrupcin de habilitacin global y ejecuta una
instruccin CALL. De esta forma, la accin de habilitar las instrucciones y regresar al
programa principal, se puede hacer en un solo paso.

RETFIE es fundamental en primer lugar porque es necesario regresar al programa
principal, 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
principal.

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?

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 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.
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 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 --------------------------------
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 ; Banco 1
movlw b'11000111' ; Timer0 en modo temporizador
movwf OPTION_REG ; configura preesc. para el
timer0
bcf STATUS,RP0 ; Banco 0
bcf INTCON,T0IF ; Desactiva bandera del TMR0
bsf INTCON,T0IE ; Act. int. por desbordes en
TMR0
movlw .20
movwf CONT_DES ; CONT_DES <- 20
movlw .61 ; Establece valor inicial
movwf TMR0 ; para TMR0. Temp = 50 mS
return
; ---- 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
escala adecuada en el generador, vare la frecuencia hasta que se observe en el
osciloscopio que el periodo de la seal sea de 10ms.
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.

Valo r de los puertos
Binario 1001010101011
Del generador
Decimal 100
11.Cmo son entre si?
son directamente proporcional ya que van aumentado respectivament, tienen una relacion
equivalente
Existe mucha diferencia entre los valores mostrados en los leds y el mostrado por el
generador de funciones?
Si, ya que le valor que nos dan los leds mayor que el 100% que ns brinda los generadores
El valor dado por los leds es de b'1001010101011', y en cambio de los generadores es de
b'1100100'
A qu se debe esto?
Se debe a las interrupciones de TMR0,mientras 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
Cul fue el rango obtenido? Escriba el valor mximo y mnimo.
El rango es entre 1Hz a 10hz
A que se debe que el rango de medicin sea limitado?
Al cambio de frecuencia y al valor dado a los registros (TMR1H y TMR1L)
12Cmo se puede incrementar el rango de medicin? Justifique su respuesta.
Aumentando el divisor de voltaje asi al ingresar mayor voltaje sera mayor el rango de la
medicin
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?
Si debido a que mayor se la frecuencia el valor que se genera es menor (valor inicial
d'4779' reduce de una forma
realmente drastica D'111'

Binario 1101111
Decimal 100
el rango es entre 1Hz a 10hz
cambiando a movlw b'00000010' ; Configura TMR1 en modo


La lnea de cdigo hizo que cambie dos bits
El valor en binario es 100011101011
En decimal es 100
Para variar el valor y aproximarse al del generador se necesita entre 0.1 a 1 Hz
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?

Es el comando que apaga la bandera, cuando se compilo y se carg no se produjo
respuesta en los leds

S-ar putea să vă placă și