Está en la página 1de 20

lOMoARcPSD|28037802

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

Microcontroladores (Instituto Tecnológico de Tijuana)

Escanea para abrir en Studocu

Studocu no está patrocinado ni avalado por ningún colegio o universidad.


Descargado por Miros (mburberryjm@gmail.com)
lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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.

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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 Nombre Acción


de bit del bit Para 0 Para 1
7 RBPU Habilita los pull-ups debiles Deshabilita los pull-ups débiles
6 INTEDG Interrupcion por flanco de bajada 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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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.

Numero Nombre del Acción


de Bit Bit Para 0 Para 1
7y6 - No implementado No implementado
Apaga el oscilador. El inversor
del oscilador y el resistor de
3 T1OSCEN El oscilador se habilita
retroalimentación se apagan para
eliminar el drenado de voltaje
Ignorado si TMR1CS=0, de otra Ignorado si TMR1CS=0, de otra
2 T1SYNC forma, sincronización con el forma, no se sincroniza con el reloj
reloj externo externo
Señal de reloj externa del pin
1 TMR1CS Señal de reloj interna (Fo/4)
T1OSO/T1CKI en flanco de subida
0 TMR1ON Frena el Timer1 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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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 Frecuencia C1 C2


32kHz 33µ 33µ
LP 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.

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Acción
Número del bit Nombre del bit
Para 0 Para 1
7 - Sin implementar Sin implementar
2 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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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 <P16F877A.INC>;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'

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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 ; Verifica si Timer1 sobrepasó su máximo valor
GOTO RUN

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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.

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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.

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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.

Descargado por Miros (mburberryjm@gmail.com)


lOMoARcPSD|28037802

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

Descargado por Miros (mburberryjm@gmail.com)

También podría gustarte