OBJETIVO: ?? Identificar los diferentes temporizadores disponibles en el MCU PIC16F877, su s modos de operacin, preescaladores (pre-divisores de frecuencia) y postescaladores (post-divisores de frecuencia). ?? Configurar adecuadamente los registros de control asociados al Timer0 para qu e funcione en modo temporizador. ?? Configurar adecuadamente los registros de control asociados al Timer1 para qu e funcione en modo contador. INTRODUCCIN El microcontrolador PIC16F877 tiene implementado un sofisticado mdulo de temporizadores. Estos estn disponibles para aquellos usuarios que manejen aplicac iones que requieran que decisiones de control sean hechas en tiempo real. Este mdulo es t 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 igu al forma, con la ayuda del bit T0SE es posible configurar el flanco con el que el c onteo 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 band era T0IF en el registro INTCON. Con ella es posible programar una interrupcin cada ve z que se presente este evento por medio del bit T0IE. Cabe sealar que cada vez que se ejecuta una instruccin de escritura que modifica e l valor en el registro TMR0, se producir un retardo de dos ciclos de instruccin dura nte 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 cicl os 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 f orma acostumbrada. 3. Implemente el circuito de la figura 8.1, descargue el programa al PIC y ejecte lo. 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 va lor inicial del registro TMR0 y permanecer en un ciclo ocioso. Cada vez que se desborde el r egistro 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 cua ndo 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 eject elo. 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 camb i. 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 reta rdo. Para calcular el tiempo que dura el retardo intervienen alguna variables ya util izadas: Temporizacin=4TOSCValorRealTMR0ValorPreescale Donde: TOSC=periodo de osciacin=1/FOSC FOSC=Dado por el cristal de cuarzo utilizado 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 e stablece la interrupcin de habilitacin global. Por ello, cuando se da una interrup cin en el hardware, limpia la interrupcin de habilitacin global y ejecuta una instr uccin CALL. De esta forma, la accin de habilitar las instrucciones y regresar al p rograma principal, se puede hacer en un solo paso. RETFIE es fundamental en primer lugar porque es necesario regresar al programa p rincipal, 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 p rincipal. 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. Q u 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 de l 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 s e 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, se gn el valor de los bits T1CKPS0 y T1CKPS1 del registro T1CON. Tomando en cuenta estas caractersticas se pueden realizar retardos mayores sin ut ilizar los desbordes hasta cierto lmite, dependiendo de la base de tiempo del microcontr olador. 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 --------------------------------