Top Banner
PRÁCTICA 4 LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F877 OBJETIVO: Identificar los diferentes temporizadores disponibles en el MCU PIC16F877, sus modos de operación, preescaladores (pre-divisores de frecuencia) y post- escaladores (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. INTRODUCCIÓN El microcontrolador PIC16F877 tiene implementado un sofisticado módulo de temporizadores. Estos están disponibles para aquellos usuarios que manejen aplicaciones que requieran que decisiones de control sean hechas en tiempo real. Este módulo está conformado por: Timer0. Timer1. Timer2. De los tres, el Timer0 es el más empleado, ya que los dos últimos suelen ser usados en forma individual o como periférico de apoyo para el módulo CCP (Capture/Compare/PWM). MATERIAL Y EQUIPO EMPLEADO Laboratorio equipado con computadoras que tengan instalado el MPLAB versión v7.40 o superior y el Pickit v2.0. Cantidad 1 1 1 5 5 1 1 Descripción Programador compatible con Pickit 2.0 Microcontrolador PIC16F877 Push-button Leds Resistencias de 330 Ω Resistencia de 10 kΩ Diodo 1N4148 1 1 Protoboard Generador de funciones
28

Practica Temporizadores lenguaje asembler y c

Dec 18, 2015

Download

Documents

Carlos Tito

OBJETIVO:
? Identificar los diferentes temporizadores disponibles en el MCU PIC16F877, sus
modos de operación, 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.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 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 post-escaladores (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).

    MATERIAL Y EQUIPO EMPLEADO

    Laboratorio equipado con computadoras que tengan instalado el MPLAB versin v7.40 o superior y el Pickit v2.0.

    Cantidad 1 1155 1 1

    Descripcin Programador compatible con Pickit 2.0 Microcontrolador PIC16F877Push-buttonLedsResistencias de 330 Resistencia de 10 k Diodo 1N4148

    11

    Protoboard Generador de funciones

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • Prcticas con el PIC16F877

    1 Osciloscopio 1 Fuente de alimentacin de CD

    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 P=16F877RADIX HEXINCLUDE "p16f877a.inc"

    cblock 20hCONT_DES ; Contador de desbordes de TMR0 ST_TEMP ; Copia del registro STATUS

    endc

    org 0goto INICIO

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • org 4goto ISR_T0IF

    ;----- Subrutina que configura al puerto B como salida------ CONF_PUERTOS

    bsf STATUS,RP0 ; conmuta a banco 1 clrf TRISB ; Puerto B = salidabcf 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 STATUSreturn

    ;----- Subrutina que configura al Timer0 -------------------- CONF_TIMER0

    bsf STATUS,RP0 ; Banco 1movlw b'11010101' ; Timer0 en modo temporizador movwf OPTION_REG ; configura preesc. para el timer0 bcf STATUS,RP0 ; Banco 0bsf INTCON,T0IE ; Activa int. por desbordes en TMR0 return

    ; ---- Programa principal ----------------------------------- INICIO

    call CONF_PUERTOScall CONF_TIMER0movlw .62movwf CONT_DES ; CONT_DES

  • 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.

    Figura 8.1: Circuito de experimentacin para el Timer0.

    4. Observe que el programa principal est formado por 9 lneas y bsicamente lo quehace 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 lalnea 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?

    ________________________________________________________________________

    ________________________________________________________________________

    Exactamente qu fue lo que hizo la nueva lnea de cdigo?

    ________________________________________________________________________

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • De qu manera influye en el programa?

    ________________________________________________________________________

    Cul es el tiempo que permanecern encendidos los leds con este cambio?

    ________________________________________________________________________

    Escriba la frmula mediante la cual es posible calcular el tiempo que dura el retardo.

    ________________________________________________________________________

    6. Analizando la rutina de servicio de interrupcin del Timer0, puede notarse que lafuncin de la penltima lnea de cdigo es fundamental para el buen funcionamiento del programa. Explique: Por qu?

    ________________________________________________________________________

    ________________________________________________________________________

    7. Verifique su respuesta eliminando del programa la lnea de cdigo a la que hacereferencia el punto anterior, compile el proyecto, reprograme el PIC y ejectelo. Qu es lo que sucede ahora?

    ________________________________________________________________________

    ________________________________________________________________________

    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 ala pin RB6/T1OSO/T1CKI/PGC y RB7/T1OSI/PGD. El oscilador se activa poniendoa 1 el bit T1OSCEN del registro T1CON. El bit del TMR1CS del registro T1CONselecciona entre reloj interno y externo

    Trabajar en modo contador de eventos, cuando los impulsos externos a contar seintroducen 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.

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • 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 ProcesadorINCLUDE "p16f877A.inc" ; librera del PIC16F877A

    cblock 20hCONT_DES ; Contador de desbordesendc

    org 0x00goto INICIO

    org 0x04goto ISR_TMR0 ; Servicio de interrupcin

    ;----- ISR debido a desborde en TMR0 ------------------------- ;------ cada 50 mS aproximadamente --------------------------- ISR_TMR0

    btfss INTCON,T0IFgoto AUN_NO

    UN_SEG decfsz CONT_DES,F ; Decrementa desbordesgoto AUN_NO ; Desbordes = 0? No

    Valor_TMR1 bcf T1CON,TMR1ONmovf 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 desbordesmovwf CONT_DES ; CONT_DES

  • ;----- y al pin T1CKI como entrada para TMR1 ------------------ CONF_PUERTOS

    bsf STATUS,RP0 ; conmuta a banco 1clrf TRISB ; Puerto B como salidaclrf TRISD ; Puerto D como salidabsf TRISC,0 ; RC0/T1CKI como entrada

    ; Pin T1CKI como entradabcf STATUS,RP0 ; conmuta a banco 0clrf PORTBclrf PORTDreturn

    ;----- Subrutina que configura al TMR1 en modo contador ---------- ;----- eventos externos por T1CKI -------------------------------- CONF_TMR1

    movlw b'00000110' ; Configura TMR1 en modomovwf T1CON ; contador de eventos no sinc.clrf TMR1L ; Borrar registro de TMR1clrf TMR1Hreturn

    ;----- Subrutina que configura al Timer0 -------------------- CONF_TIMER0

    bsf STATUS,RP0 ; Banco 1movlw b'11000111' ; Timer0 en modo temporizadormovwf OPTION_REG ; configura preesc. para el

    timer0 bcf STATUS,RP0 ; Banco 0bcf INTCON,T0IF ; Desactiva bandera del TMR0bsf INTCON,T0IE ; Act. int. por desbordes en

    TMR0 movlw .20movwf CONT_DES ; CONT_DES

  • escala adecuada en el generador, vare la frecuencia hasta que se observe en el osciloscopio que el periodo de la seal sea de 10ms.

    Figura 8.2: Circuito de experimentacin para el Timer1.

    11. Observe que el programa principal est formado por 6 lneas y bsicamente lo quehace 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: _______________________________________________________

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • 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 lalnea de cdigo

    movlw b'00000110' ; Configura TMR1 en modo

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • sustityala ahora por la siguiente:

    movlw b'00000010' ; 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?

    ________________________________________________________________________

    A qu se debe esto? Justifique su respuesta.

    ________________________________________________________________________

    ________________________________________________________________________

    13. Analizando la rutina de servicio de interrupcin del Timer0, puede notarse que lafuncin 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 hacereferencia el punto anterior, reensamble el proyecto, reprograme el PIC y ejectelo. Qu es lo que sucede ahora?

    ________________________________________________________________________

    ________________________________________________________________________

    Eduardo Romero A. / Alejandro Aganza T. Laboratorio de Sistemas Digitales III

  • EJEMPLOS DE TIMER0, TIMER1 Y TIMER2 EN C.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una seal cuadrada de 1 kHz utilizando la

    interrupcin TIMER0.

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    Para generar una seal de 1 kHz se necesita un semiperiodo de 500 .

    Segn la ecuacin de desbordamiento del K, utilizando un cristal de 4 MHz y

    un prescaler de 2:

    = . . 256 0

    500 =4

    4000000. 2. 256

    = 6

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    El TIMER0 se debe cargar con el valor 6. Pero esta relacin solo se cumple si

    se trabaja en ensamblador. Al trabajar en C, el compilador genera lneas de

    cdigo que aumentan el tiempo de ejecucin del programa y ,por ello, es

    necesario ajustar el valor final. En este caso se ha utilizado un valor de carga

    de 27.

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una funcin que permita realizar retardos

    de 1 segundo empleando TIMER1.

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

    Se calcula un periodo parcial de 0.5 segundos y se repite dos veces (usando

    un prescaler de 8) :

    = . . 65536 1

    0.5 =4

    4000000. 8. 65536

    = 3036 1

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una seal cuadrada de 1kHz utilizando la

    interrupcin del TIMER2.

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    Para generar una seal de 1 kHz se necesita un semiperiodo de 500 .

    Segn la ecuacin de desbordamiento del TIMER2, utilizando un cristal de 4

    MHz y un prescaler de 4 y un postscaler de 1:

    = . . 2 + 1 .

    500 =4

    4000000. 4. + 1 . 1

    = 125

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    El TIMER2 se debe cargar con el valor 125. Pero esta relacin solo se cumple

    si se trabaja en ensamblador. Al trabajar en C, el compilador genera lneas

    de cdigo que aumentan el tiempo de ejecucin del programa y ,por ello, es

    necesario ajustar el valor final. En este caso se ha utilizado un valor de carga

    de 11.

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    PRCTICA 8LOS TEMPORIZADORES PROGRAMABLES DEL PIC16F877MATERIAL Y EQUIPO EMPLEADO

  • EJEMPLOS DE TIMER0, TIMER1 Y TIMER2 EN C.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una seal cuadrada de 1 kHz utilizando la

    interrupcin TIMER0.

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    Para generar una seal de 1 kHz se necesita un semiperiodo de 500 .

    Segn la ecuacin de desbordamiento del K, utilizando un cristal de 4 MHz y

    un prescaler de 2:

    = . . 256 0

    500 =4

    4000000. 2. 256

    = 6

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

    El TIMER0 se debe cargar con el valor 6. Pero esta relacin solo se cumple si

    se trabaja en ensamblador. Al trabajar en C, el compilador genera lneas de

    cdigo que aumentan el tiempo de ejecucin del programa y ,por ello, es

    necesario ajustar el valor final. En este caso se ha utilizado un valor de carga

    de 27.

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 1.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una funcin que permita realizar retardos

    de 1 segundo empleando TIMER1.

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

    Se calcula un periodo parcial de 0.5 segundos y se repite dos veces (usando

    un prescaler de 8) :

    = . . 65536 1

    0.5 =4

    4000000. 8. 65536

    = 3036 1

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 2.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    Generar una seal cuadrada de 1kHz utilizando la

    interrupcin del TIMER2.

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    Para generar una seal de 1 kHz se necesita un semiperiodo de 500 .

    Segn la ecuacin de desbordamiento del TIMER2, utilizando un cristal de 4

    MHz y un prescaler de 4 y un postscaler de 1:

    = . . 2 + 1 .

    500 =4

    4000000. 4. + 1 . 1

    = 125

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

    El TIMER2 se debe cargar con el valor 125. Pero esta relacin solo se cumple

    si se trabaja en ensamblador. Al trabajar en C, el compilador genera lneas

    de cdigo que aumentan el tiempo de ejecucin del programa y ,por ello, es

    necesario ajustar el valor final. En este caso se ha utilizado un valor de carga

    de 11.

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM

  • Ejemplo 3.

    Universidad Catlica de Santa Mara-PPIMMEM