Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Microcontroladores
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
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.
Pulso de
entrada
Desbordamiento
Figura 1. Esquema de Bloques general de un temporizador
Configuración de Temporizadores
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.
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.
Timer1
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.
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 el Timer1 está programado como contador asíncrono, este continúa aperando incluso cuando el
microcontrolador se encuentra en modo de bajo consumo.
continuara operando en estado de bajo consumo, principalmente para cristales de 32kHz, la cual es
una frecuencia ideal para el conteo del tiempo real.
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.
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
Procedimiento
Se abre el software MPLAB X IDE
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
En la ventana Name and Location se nombra el archivo .asm correspondiente al proyecto actual
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.
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
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
En Proteus se simulo el circuito, estableciendo los bits RB0, RB1 y RB2 como las salidas del
sistema.
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.
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.
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.
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