Beruflich Dokumente
Kultur Dokumente
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:
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).
1 1
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
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 ; registro STATUS movwf ST_TEMP 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 ; $ ;
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
;----- ISR debido a desborde en TMR0 ISR_T0IF CONT_DES ; decfsz 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 END
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
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? ________________________________________________________________________
; 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 Valor_TMR1 bcf movf movwf movf movwf movlw movwf movlw movwf clrf clrf bsf bcf retfie AUN_NO movlw movwf bcf retfie .61 TMR0 INTCON,T0IF ; Establece valor inicial ; Apaga bandera T1CON,TMR1ON TMR1H,W ; PORTB ; TMR1L,W ; PORTD ; .20 CONT_DES .61 TMR0 TMR1L TMR1H T1CON,TMR1ON INTCON,T0IF 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 CONT_DES,F AUN_NO ; Decrementa desbordes ; Desbordes = 0? No
Reinicia contador de desbordes CONT_DES <- 20 Establece valor inicial para TMR0 Borrar los registros implicados en las mediciones
en
; ---- 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. Valor de los puertos: _______________________________________________________
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' ; 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? ________________________________________________________________________
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? ________________________________________________________________________ ________________________________________________________________________