Practica 6. Uso del TMR1 para generar 3 señales PDF

Title Practica 6. Uso del TMR1 para generar 3 señales
Course Microcontroladores
Institution Instituto Tecnológico de Tijuana
Pages 19
File Size 1.1 MB
File Type PDF
Total Downloads 7
Total Views 76

Summary

Tecnológico Nacional de MéxicoInstituto Tecnológico de TijuanaMicrocontroladoresPractica 6. Uso de Temporizador 1 del PIC 16F877A para generar 3señales de tiempoCalvillo Lopez Alejandro – 16212214Sanchez Saavedra Eduardo Francisco – 16212267ABRIL 2019ObjetivoProgramar el temporizador 1 del PIC 16F87...


Description

Tecnológico Nacional de México Instituto Tecnológico de Tijuana Microcontroladores

Practica 6. Uso de Temporizador 1 del PIC 16F877A para generar 3 señales de tiempo

Calvillo Lopez Alejandro – 16212214 Sanchez Saavedra Eduardo Francisco – 16212267

ABRIL 2019

Objetivo Programar el temporizador 1 del PIC 16F877A para generar una señal cuadrada con un nivel alto de 150ms, otra de 200ms y una tercera de 500ms.

Marco teórico Introducción a los Temporizadores En muchas aplicaciones el microcontrolador debe trabajar con la variable tiempo, como es el caso de cuando se requiere generar señales a una determinada frecuencia o medir el periodo de una señal. En los microcontroladores PIC de clase media se presentan hasta tres módulos básicos para temporizar, denominados Timer0, Timer1 y Timer2, además de uno o dos módulos de Comparación, Captura y Modulación de Pulsos o CCP. Cada uno de los temporizadores posee integrado como elemento esencial un contador síncrono ascendente de 8 o 16 bits. Dichos contadores pueden ser programados para contar pulsos internos o externos. El número del contador puede ser leído o modificado mediante la lectura o escritura de los registros de las funciones especiales vinculadas con el timer. Por tal razón, el desbordamiento de los contadores queda reportado en bits indicadores disponibles en dichos registros, además de la posibilidad de conllevar a una interrupción del microcontrolador. Además del contador síncrono, los temporizadores cuentan con un contador asíncrono auxiliar que se inserta en el camino de los pulsos, de tal manera que puede actuar como un predivisor si se posiciona antes del contador síncrono, o postdivisor si se posiciona después del contador síncrono.

Predivisor

Contador síncrono

Postdivisor

Pulso de entrada Desbordamiento

Figura 1. Esquema de Bloques general de un temporizador

Configuración de Temporizadores Timer0 El modulo del Timer0 consta básicamente de un predivisor de 8-bits, un contador/temporizador de 8-bis, selectividad entre fuente de señal de reloj interna o externa y una interrupción en la sobrecarga de FFh a 00h. Si opera mediante los ciclos de máquina, entonces se dice que opera como un temporizador, en cambio, si cuenta los pulsos externos, el modulo opera como contador de pulsos que llegan por medio de la terminal T0CKI.

Figura 2. Diagrama de Bloques del Timer0

A su paso por el Timer0, los pulsos llegan al bloque de sincronización, siendo mostrados en dos instantes de tiempo dentro de cada ciclo de máquina, de lo que resulta una señal cuyos flancos suceden en fase con el reloj interno del microcontrolador. Cuando el Timer0 opera en el modo contador, el bloque de sincronización determina el valor mínimo del periodo de los pulsos que entran por medio de la terminal T0CKI. Si

es el periodo del oscilador principal y P es el factor

de división del predivisor, entonces el periodo Ti de los pulsos que entran por la terminal T0CKI debe cumplir la condicional

.

Para calcular el tiempo de desbordamiento del Timer0, si N es la cantidad de pulsos que deben llegar al Timer0 para que se desborde, operando como temporizador, y Ti es el periodo de un ciclo máquina, entonces el tiempo Td que tarda en desbordarse es

.

En modo de bajo consumo, el oscilador del microcontrolador se paraliza y, por tanto, no funciona el bloque de sincronización del Timer0.

El registro OPTION_REG es un registro en el cual se pueden realizar las acciones de lectura y escritura, y en el que se contienen múltiples bits de control para la configuración del predivisor del Timer0/Watch Dog Timer. Numero de bit 7 6

Nombre del bit RBPU INTEDG

Acción Para 0 Habilita los pull-ups debiles Interrupcion por flanco de bajada

Para 1 Deshabilita los pull-ups débiles Interrupcion por flanco de subida La fuente del contador a partir del pin 5 T0CS La fuente del contador interna T0CKI Incremento por transición de Incremento por transición de alto a 4 T0SE bajo a alto bajo El predivisor se asigna al módulo El predivisor se asigna al módulo del 3 T0SE del Timer0 WDT Los bits 2 al 0 corresponden a la razón del predivisor, dependiendo si se asignó al módulo del Timer0 o al módulo del WatchDog Timer Valor de los bits Razón del Timer0 Razón del WatchDog Timer 000 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 Debido a que la salida del predivisor esta sincronizada con los impulsos internos de la señal de reloj, se presenta un pequeño retraso entre el tiempo que el flanco de la señal externa ocurre y el tiempo en que el modulo del Timer0 incrementa.

Figura 3. Retardo de propagación del predivisor

Timer1 El módulo de Timer1 es un contador/temporizador de 16-bit que consta de dos registros de 8-bits, denominados TMR1H y TMR1L). Este par de registros incrementa desde 0000h hasta FFFFh. La interrupción del Timer1, si se encuentra habilitada, es generada por el sobreflujo a través de la bandera de interrupción en el bit TMR1IF. Dicha interrupción puede ser habilitada o deshabilitada estableciendo en set o en clear el bit de habilitación TMT1IE. Por tanto, el modulo del Timer1 puede actuar como un contador síncrono o asíncrono, o como un temporizador síncrono. El modo de operación es determinado por el bit de selección de reloj, TMR1CS o T1CON (bit-1) y el bit de sincronización T1SYNC. En modo de temporizador, el módulo Timer1 incrementa cada ciclo de instrucción. Caso similar, en modo de contador, incrementa en cada filo de subida de la señal de reloj de entrada por el pin T1CKI. El modulo del Timer1 a su vez, puede ser prendido o apagado mediante el bit de control TMR1ON o T1CON (bit-0), además de operar gracias a un cristal externo, en donde el oscilador del Timer1 es habilitado, o el bit T1OSCEN se encuentra en alto, y los pines T1OSI y T1OSO se convierten en entradas.

Figura 4. Diagrama de Bloques del Timer1

Para que no se pierdan pulsos en la sincronización, es necesario que los pulsos que entran en el bloque de sincronización permanezcan en 1 o en 0 al menos durante la mitad del tiempo que dura un ciclo de máquina. Con ello se determina el valor mínimo del periodo de los pulsos que entran en el Timer1 en el modo de contador sincronizado. Si

es el periodo del oscilador principal del microcontrolador y P es el factor de división del

predivisor, entonces el periodo Ti de los pulsos en T1CKI debe cumplir la condicional

.

Si el Timer1 está programado como contador asíncrono, este continúa aperando incluso cuando el microcontrolador se encuentra en modo de bajo consumo. En el registro T1CON están los bits de control del Timer1. Acción

Numero

Nombre del

de Bit

Bit

Para 0

Para 1

7y6

-

No implementado

No implementado

Apaga el oscilador. El inversor 3

T1OSCEN

del oscilador y el resistor de

El oscilador se habilita

retroalimentación se apagan para eliminar el drenado de voltaje

2

T1SYNC

Ignorado si TMR1CS=0, de otra

Ignorado si TMR1CS=0, de otra

forma, sincronización con el

forma, no se sincroniza con el reloj

reloj externo

externo

1

TMR1CS

Señal de reloj interna (Fo/4)

0

TMR1ON

Frena el Timer1

Señal de reloj externa del pin T1OSO/T1CKI en flanco de subida Habilita el Timer1

Los bits 5:4 o T1CKPS1:T1CKPS0 indican la escala del predivisor del reloj de entrada en el módulo del Timer1. T1CKPS1:T1CKPS0

Escala del predivisor

00

1:8

01

1:4

10

1:2

11

1:1

Con el circuito de oscilador de cristal, entre los pines T1OSI (entrada) y T1OSO (salida amplificada), se habilita por medio de establecer en set el bit de control T1OSCEN. El oscilador

continuara operando en estado de bajo consumo, principalmente para cristales de 32kHz, la cual es una frecuencia ideal para el conteo del tiempo real. Tipo de Oscilador

LP

Frecuencia

C1

C2

32kHz

33µ

33µ

100kHz

15µ

15µ

200kHz

15µ

15µ

Timer2 El modulo del Timer2 es un temporizador de 8-bits con un predivisor, un postdivisor y un registro de periodo. Empleando el predivisor y el postdivisor al máximo, el tiempo de la sobrecarga es el mismo que para un contador de 16-bits.

Figura 5. Diagrama de Bloques del Timer2

Asimismo, el modulo del Timer2 está basado en la modulación de amplitud de pulso cuando el módulo CCP se encuentra en modo de PWM. El predivisor puede ser programado con factores de división de 1,4 o 16, mientras que el postdivisor para factores desde 1 hasta16. El Timer2 no se incrementa mientras el microcontrolador está en el modo de bajo consumo, y el conteo se reanuda cuando el PIC se despierta.

En el registro T2CON están los bits de control del Timer2.

Número del bit

Nombre del bit

7 2

Acción Para 0

Para 1

-

Sin implementar

Sin implementar

TMRAON

Apaga el Timer2

Enciende el Timer2

Los bits 6:3 o TOUTPS3:TOUTPS0 indican el postdivisor de la salida del módulo de Timer2 TOUTPS3:TOUTPS0

Razón del postdivisor

0000

1:1

0001

1:2

0010

1:3

0011

1:4

0100

1:5

0101

1:6

0110

1:7

0111

1:8

1000

1:9

1001

1:10

1010

1:11

1011

1:12

1100

1:13

1101

1:14

1110

1:15

1111

1:16

Los bits 1:0 o T2CKPS1:T2CKPS0 indican el predivisor de entrada del Timer2 T2CKPS1:T2CKPS0

Razón del predivisor

00

1:1

01

1:4

1X

1:16

Procedimiento Se abre el software MPLAB X IDE

Figura 6. Pantalla de Inicio de MPLAB X IDE

Se hace click en la pestaña File->New Project

Figura 7. Creación de nuevo proyecto

En la ventana de Choose Project se selecciona la opción de Standalone Project

Figura 8. Selección del tipo de proyecto

En la ventana Select Device se indica el circuito integrado con el que se va a trabajar, para fines de la práctica presente, será el PIC16F877A

Figura 9. Selección del dispositivo

En la ventana Select Tool se hace click en la opción Simulator

Figura 10. Selección de herramienta opcional

En la ventana Select Compilier se selecciona el compilador mpasm, el cual permite debuggear y compilar archivos de tipo Assembler Source Module ASM.

Figura 11. Selección del compilador MPSAM

Se determina el nombre del proyecto y la carpeta dentro de la unidad de memoria en la cual se resguardara

Figura 12. Nombrado del proyecto

En la pestaña de Proyectos, Práctica6, hacer click derecho en Source Files->New>AssemblyFile.asm

Figura 13. Creación del archivo .asm

En la ventana Name and Location se nombra el archivo .asm correspondiente al proyecto actual

Figura 13. Nombrado del archivo .asm

Una vez creado el archivo del código fuente, se es escribió el siguiente código empleando el Timer1 para obtener tres señales de salida con un tiempo en alto y en bajo de 150ms, 200ms y 500ms respectivamente.

__CONFIG _WDT_OFF&_PWRTE_OFF&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para el programador LIST p=16F877A INCLUDE ;Include file correspondiente al PIC16F877A ORG 0x00 ;Inicio de programa cblock 40h rl5, rh5, C2, C3, C5 endc MOVLW B'00110001' ; valor de configuracion MOVWF T1CON movlw b'10010101' ;REAL movwf rl5 movlw b'11100111' ;REAL E7 movwf rh5 BSF STATUS,RP0 clrf TRISB ;Habilitar el puerto B como salida BCF STATUS,RP0 clrf PORTB ;Limpia puerto B ;todavia no los uses movlw b'00000011'

movwf C2 movlw b'00000100' movwf C3 movlw b'00001010' movwf C5 inicio ;------------------------- INICIO DE CÓDIGO PRINCIPAL BCF T1CON,0 ; detener timer1, TICON,TMR1ON = 0 MOVFW rl5 ; valor de recarga byte bajo MOVWF TMR1L ; ponerlo en registro TMR1L MOVFW rh5 ; valor de recarga byte alto MOVWF TMR1H ; ponerlo en registro TMR1H BSF T1CON,0 ; iniciar el timer de nuevo, TICON,TMR1ON = 1 RUN BTFSS PIR1,TMR1IF GOTO RUN

; Verifica si Timer1 sobrepasó su máximo valor

BCF PIR1,TMR1IF LEDBLINK ;Ajusta el parpadeo de los LED DECFSZ C2,1 ;CONTEO DE 100mS GOTO TEST2 ;Si no llega a 0, prueba el 2do bit GOTO BIT0 ;Ajuste de b0 TEST2 DECFSZ C3,1; Conteo de 150mS GOTO TEST3;Si no llega a 0, prueba 3er bit GOTO BIT1 ;Ajusta b1 TEST3 DECFSZ C5,1 ;Cuenta hasta 500mS goto inicio GOTO BIT2 ;Si la cuenta llega a 0, ajusta b2 ;------------------------- INICIA ENCENDIDO DE BITS BIT0 BTFSS PORTB,0 GOTO A0 BCF PORTB,0 R0 movlw b'00000011' movwf C2 GOTO TEST2 A0 BSF PORTB,0 GOTO R0 BIT1

BTFSS PORTB,1 GOTO A1 BCF PORTB,1 R1 movlw b'00000100' movwf C3 GOTO TEST3 A1 BSF PORTB,1 GOTO R1 BIT2 BTFSS PORTB,2 GOTO A2 BCF PORTB,2 R2 movlw b'00001010' movwf C5 goto inicio A2 BSF PORTB,2 GOTO R2 END;------------------------- FIN DE CÓDIGO PRINCIPAL

Al instante de que se terminó de escribir el código y se verifico que no presentaba de un error de sintaxis, por medio de la herramienta de construcción del proyecto principal, se procedió a exportar el archivo .hex correspondiente al proyecto.

Figura 14. Exportación del archivo .hex

En Proteus se simulo el circuito, estableciendo los bits RB0, RB1 y RB2 como las salidas del sistema.

Figura 15. Simulación en Proteus

Desarrollo Se configura el PIC16F877A con la directiva CONFIG, bajo los parámetros del Watch Dog Timer apagado, el Power-Up Timer Enable apagado, se declara el oscilador XT de cristal de 4MHz, el apagado del Low-Voltage Programming y del Flash Program Memory Code Protection. La directiva LIST le indica al lenguaje ensamblador que encienda el listado de archivos, es decir, la combinación de los códigos fuente, las direcciones de memoria y los opcodes. La directiva INCLUDE permite añadir el archivo P16F877A.INC que consta del nombre y la localidad de los registros de memoria del PIC16F877A. Con las directivas CBLOCK y ENDC se marca el inicio y el fin, respectivamente, del bloque de variables a partir de la localidad de memoria 40h dentro del banco 0. Posteriormente se carga la literal 49 binario al registro de trabajo W, y del registro W al registro T1CON para configurar el Timer1 con un predivisor escaladado a una razón de 1:1, se habilita el oscilador y el Timer0, además de configurarse por medio del oscilador interno (Fo/4). Se carga las literales 141 y 229 a los registros r15 y rh5, respectivamente. Se accede el banco 1 estableciendo en set el bit RP0 del registro STATUS, se pone el clear todos los bits del registro TRISB habilitando el PORTB como salida, se regresa al banco 0 estableciendo en clear el bit RP0 y se limpia el contenido del PORTB.

Como las tres señales comparten el submúltiplo de 50ms, entonces se declaran tres variables C2, C3 y C5, con los valores binarios 3, 4 y 10. En la subrutina Inicio se pone en clear T1CON,0 para detener el Timer1, se desplazan los registros r15 y rh5 a los registros TMR1L y TMR1H. Posteriormente se retorna el Timer1 con la línea BSF T1CON,0. En la subrutina Run se verifica si se presenta un sobreflujo en TMR1IF, si no, es continua ejecutando, caso contrario, la línea BCF P1R1, TMR1IF pone el cero dicho bit. Con la subrutina LEDBLINK y las subrutinas auxiliares TEST2 y TEST3 se efectúa un decremento en 1 de las variables C2, C3 y C5, saltando de línea cuando llegan a 00. Si llegan a 00, se dirigen a las subrutinas BITO, RO, AO, BIT1, R1, A1, BIT2, R2 y A2, que manejan de los bits de salida RB0, RB1 y RB2, comprobando si cada bit es 1, en caso de que sea 0, dirigirse a la subrutina Ax, la cual establece en set el bit correspondiente y se redirecciona a la subrutina Rx, que vuelve a mover la literal correspondiente a C2, C3 o C5, sea el caso, y llamando a la subrutina Test. Caso contrario, si es 1, salta a línea y pone en clear el respectivo bit. Por tanto, las subrutinas BITx se encargan de realizar la tarea del timer1 y establecer los niveles alto y bajo lógicos de las señales de salida por el PORTB.

Observaciones y conclusiones La práctica presente requirió analizar el datasheet del PIC16F877A para el análisis del funcionamiento a nivel lógico del Timer1 y de los registros TMR1H y TMR1L, además de la necesidad de visualizar la forma en que se puede manipular el predivisor del Timer1 para la obtención de múltiples señales con distintos periodos. Un inconveniente al instante de programar el código de la práctica fue que no se terminó en un solo día y no se documentó propiamente por medio de los comentarios, retrasando su verificación posterior para hacer las correcciones necesarias para su correcto funcionamiento. Esto nos dejó en claro que sería una buena costumbre de programación comentar nuestro trabajo para retomarlo en su futuro, si se presenta el caso de que un código previo se pueda implementar en un proyecto ajeno.

En el laboratorio observamos las señales obtenidas por medio de un osciloscopio de dos canales Tecktronix TDS 2012B, empleando el cristal de cuarzo como nuestro oscilador, contrastando la señal de RB0 contra las señales de RB1 y RB2.

Referencias PIC 16F87XA Datasheet. Disponible en: http://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf Valdez, Pallas, “Microcontroladores. Fundamentos y aplicaciones con PIC”, Alfaomega, 2007...


Similar Free PDFs