Reporte Práctica #8 “LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F887”
Laboratorio de Microcontroladores Horario: Jueves 8:00-10:00a.m. Profesor: Francisco Javier Armenta Luna Integrantes: José Rafael Ochoa Parra José Honorio Zermeño Aguirre Luis Rafael Reyes Vega 12 de Abril del 2018
ID: 00000133085 ID: 00000133756 ID: 00000117476 Cd. Obregón, Sonora.
RESULTADOS Codigo ensamblador ; 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' movwfPORTB ; Puerto B = 0001 0000 movf STATUS,w ; Guarda el estado del movwfST_TEMP ; registro STATUS return ;----- Subrutina que configura al Timer0 -------------------CONF_TIMER0 bsf STATUS,RP0 ; Banco 1 movlw b'11010101' ; Timer0 en modo temporizador movwfOPTION_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 movwfCONT_DES ; CONT_DES <- 62 movlw 0xF7 ; Establece valor movwfTMR0 ; inicial para TMR0 bcf INTCON,T0IF ; Borra bandera bsf INTCON,GIE; Activa mascara global goto $ ; Espera interrupción ;----- ISR debido a desborde en TMR0 ------------------------ISR_T0IF
decfszCONT_DES ; Decrementa desbordes goto AUN_NO ; Desbordes = 0? No movf ST_TEMP,w ; Si movwfSTATUS ; Recupera STATUS rrf PORTB,f ; Rota Puerto B movf STATUS,w ; Guarda STATUS movwfST_TEMP movlw .62 ; Reinicia contador de desbordes movwfCONT_DES ; CONT_DES <- 62 movlw 0xF7 ; Establece valor inicial movwfTMR0 ; para TMR0 AUN_NO bcf INTCON,T0IF ; Apaga bandera retfie END
2. EIabore eI proyecto correspondiente y proceda a ensambIar eI programa en Ia forma acostumbrada.
II. El Timer1 en modo contador 9. Edite un archivo con eI programa fuente que aparece a continuación y reaIice Ias modificaciones necesarias para que funciones con eI PIC16F887.
Codigo ensamblador ; Programa que mide la frecuencia de una señal ; introducida por el pin RC0 como base de tiempo de TMR1. LIST
P=16F887
radix
hex
; Tipo de Procesador
INCLUDE
"p16f887.inc" ;librería del PIC16F877A
__CONFIG
_CONFIG1,0x20F4
__CONFIG
_CONFIG2,0x3FFF
cblock 20h CONT_DES ; Contador de desbordes endc org
0x00
goto
INICIO
org
0x04
goto
ISR_TMR0
; Servicio de interrupción
;----- 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
; Leer el valor de la parte baja
TMR1L,W
movwf PORTD movlw .20
; de TMR1 y lo despliega en PORTD
; 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 ; Activa interrupción ; 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
bsf
INTCON,GIE ; Habilita int. de TMR0
goto
$
; Enciende TMR1
; Espera interrupción
END
10. Implemente el circuito de la figura 8.2, descargue el programa al PIC y ejecútelo. 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 también un canal del osciloscopio (debidamente calibrado) y encienda ambos. A continuación elija la escala adecuada en el generador, varíe la frecuencia hasta que se observe en el osciloscopio que el periodo de la señal sea de 10 ms.
11. Observe que el programa principal está formado por 6 líneas y básicamente lo que hace es configurar los puertos, al Timer0 en modo temporizador, al Timer1 en modo contador asíncrono, encender el Timer1, habilitar la máscara global de interrupciones y entrar en un ciclo ocioso a espera de la interrupción de 50 mS de TMR0. Convierta el valor hexadecimal anterior y compárelo con el valor de las carátula del generador de funciones. ¿Cómo son entre sí?: Casi idénticos. ¿Existe alguna diferencia entre los valores mostrados en los leds y el mostrado por el generador de funciones?: Una mínima diferencia. ¿A qué se debe esto?: A la configuración del programa. Varíe 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 carátula del generador de funciones. ¿Cuál fue el rango obtenido? Escriba el valor máximo y mínimo.: Valor máximo es 65535 y el minimo es 0. ¿A que se debe que el rango de medición sea limitado?: A que el contador llega a su limite máximo.
¿Cómo se puede incrementar el rango de medición? Justifique su respuesta. Contando el valor en decimal debido a que así está programado previamente. Si incrementa mucho el valor de frecuencia es posible que el resultado mostrado sea mucho menor al valor real, ¿Cuál es la razón de esto?, ¿Cómo se puede evitar este efecto?: Esto paso por que al llegar a su valor máximo los bit no dejan de contar pero no se muestra el valor completo y se puede malinterpretar.
CONCLUSIONES (José Rafael Ochoa Parra) Por ultimo para concluir con esta práctica podemos llegar a un acuerdo en que Dependiendo del número que sea establecido en el Timer0, el contador interno será más rápido o más lento. Mientras más pequeño sea el número, más lento será el contador, y viceversa. Una desventaja del PIC de la familia 16 es que cuando está en modo de contador externo, con el prescaler se debe realizar varias pulsaciones para activar el contador. El contador interno del PIC es una buena forma para establecer tiempos internos y ejecutar acciones dependiendo de la necesidad y la programación. (José Honorio Zermeño Aguirre) En esta práctica se utilizó otro tipo de PIC, en este caso se utilizó el PIC 16F877 solo para la primera parte de la práctica, en la segunda parte se utilizó de nuevo el PIC 16F887, en ambos se observó las diferencias con las que cuentan en los diferentes temporizadores, sus prescaladores y modos de operación, también se observó en cómo cambiar la configuración de los timer, para que el timer0 sea un temporizador, y el timer1 funcione como un contador, en esta práctica no se contó con gran dificultad, lo único difícil fue cambiar la palabra de configuración del PIC 16F877ya que no estamos familiarizados con esa palabra, ya que normalmente usamos el PIC 16F887. (Luis Rafael Reyes Vega) Con la ayuda de la práctica observamos gracias al contador del programa como podemos mostrar los valores de frecuencia del osciloscopio en una secuencia de leds con una resolución bastante buena también miramos lo preciso que es este método y como utilizarlo. Los contadores son de gran utilidad siempre y cuando se ajuste bien los cálculos para tener una medición bastante precisa.