You are on page 1of 40

GUA DE EJERCICIOS RESUELTOS Y

PROPUESTOS
TEMA 4:
TIMER 0 E INTERRUPCIONES

Prof. Luis Zurita 1 Microcontroladores I


1. Realicemos un programa completo que contenga varias interrupciones.
Si la causa ha sido la activacin del pin RB0, se debe mostrar un dos en
binario en el puerto A, si ha sido un cambio de nivel en RB4:RB7, se debe
mostrar el uno en binario en el puerto A y si se ha desbordado el TMR0,
se debe mostrar el cuatro en binario en el puerto A. Este ejercicio permite
analizar
alizar y determinar la causa de una interrupcin, y ejecutar las tareas
que le correspondan a la interrupcin que se ha activado.

Paso 1. Diagrama de Flujo. Es el mismo que se mostr en la clase de teora:

Prof. Luis Zurita 2 Microcontroladores I


Paso 2. Lenguaje ensamblador.

LIST P=16F84A
INCLUDE P16F84A.INC

W_TEMP equ 20H ; Se declaran los registros generales pa


ESTADO_TEMP equ 21H ; salvar los registros STATUS y W

org 00H
goto INICIO
org 04H ; Se coloca el vector interrupcin para que se
goto RUTINTERR ; Ejecute la rutina de interrupcin

RUTINTERR movwf W_TEMP ; Se inicia a la rutina de servicio de


swapf W_TEMP,1 ; interrupcin (RSI)
movf STATUS,0
movwf ESTADO_TEMP
btfsc INTCON,0 ; Se empieza exploracin de causa de
goto INTERRB47 ; interrupcin. Si RBIF=1, se va a ejecutar
btfsc INTCON,1
goto INTERRB0 ; Si INTF=1, se va a ejecutar
btfsc INTCON,2
goto INTERRTMR ; Si TOIF=1, se va a ejecutar
goto SALIRINT ; Si no es ninguna, se sale de la interrupcin
SALIRINT bsf INTCON,7 ; Se habilita GIE, para permitir de nuevo otra
movf ESTADO_TEMP,0 ; Interrupcin y se restaura el entorno
movwf STATUS
swapf W_TEMP,0
retfie ; El uso de return o retlw k, puede producir
; errores en la ejecucin del programa
;*** Subrutina de tratamiento de cambio de RB4:RB7 ***
INTERRB47 bcf INTCON,0
movlw 01H
movwf PORTA
movf PORTB,0 ; Ver NOTA (1)
bcf INTCON,0 ; Se borra por software el
sealizador de esta
goto SALIRINT ; Interrupcin

Prof. Luis Zurita 3 Microcontroladores I


;*** Subrutina de tratamiento de activacin de INT/RB0 ***
INTERRB0 movlw 02H
movwf PORTA
bcf INTCON,1 ; Se borra por software el sealizador
goto SALIRINT
;*** Subrutina de tratamiento del desborde del TMR0 ***
INTERRTMR movlw 04H
movwf PORTA
movlw d'100' ; Se carga el valor calculado para el TMR0
movwf TMR0 ; para asegurarnos que al regresar tenga este valor
bcf INTCON,2 ; Se borra el sealizador
goto SALIRINT
;***Programa Principal***
INICIO bsf STATUS,5
clrf PORTA ; PORTA como entrada
movlw 0FFH
movwf PORTB ; PORTB como entrada
movlw b'01000110'
movwf OPTION_REG ; Diga: Cmo se configur OPTION?
bcf STATUS,5
movlw b'10111000' ; Se habilita GIE y las interrupciones
movwf INTCON ; Individuales
DORMIR nop
movlw d'100'
movwf TMR0
SINFIN CLRWDT
goto SINFIN ; Se coloca al microcontrolador en
; bucle o lazo sin fin
end

;NOTA (1): En este tipo de interrupcin, internamente el procesador lee el nibble


;alto del puerto B y hace una copia; la interrupcin se genera cuando la lectura del
;nibble alto del puerto B difiere de la ;copia. Dentro de la ejecucin de esta rutina
;de interrupcin, es importante que se lea el puerto B, para actualizar la copia, y el
;procedimiento adecuado es el mostrado anteriormente.

Prof. Luis Zurita 4 Microcontroladores I


2. Genere una seal cuadrada de 200 Hz. Diseo libre.
Este ejercicio permite generar una seal cuadrada, con el desborde del
TMR0, sea o no por interrupcin. Se muestran los dos casos, sin embargo
se recomienda el manejo por interrupcin por ser de mayor efectividad y
de aprovechamiento de recursos disponibles en los PICs.
Paso 1. Enunciado y delimitacin del problema:
Como no se ha especificado por cual pin del microcontrolador saldr la
seal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los clculos que se
hayan realizado para generar el retardo deseado.
Para una frecuencia de 200 Hz, tendremos un perodo de:
1 1 1
= = = = 5
200
Como no se ha especificado el ciclo de trabajo, asumiremos el 50 %, por lo
que el perodo en alto y en bajo sern iguales, es decir 2,5 ms
Hagamos los clculos para 2,5 ms:
De la frmula proporcionada en la Unidad IV, despejando nos quedar:

=
4 0
Sustituyendo los valores (Como no se nos especific el oscilador,
asumiremos el estndar de 4 MHz:
2,5
= = 39,0625 39
1
4 64
4

= 256 0 0 = 256 = 256 39 = 217

Por lo que el valor a cargar en el TMR0= 217

Prof. Luis Zurita 5 Microcontroladores I


Paso 2. Diagrama de Flujo:

Prof. Luis Zurita 6 Microcontroladores I


Paso 3. Lenguaje ensamblador:
FORMA A. POR EXPLORACIN (POLLING) DEL BIT TOIF:
list P=16F84A
include P16F84A.inc

org 00H
goto INICIO

;************************************
;***PROGRAMA PRINCIPAL***
;************************************
INICIO bsf STATUS,5 ;Zona de configuraciones
clrf TRISB
movlw B'00010101' ; Reloj interno (Temporizador) Predivisor
movwf OPTION_REG ; asignado a TMR0, valor= 128
bcf STATUS,5
clrf PORTB ;Inicializamos el Puerto B
nop

Prof. Luis Zurita 7 Microcontroladores I


CICLO bsf PORTB,0 ;Seal a nivel alto
call DELAY2_5MS ;Llamamos subrutina 2,5 ms
bcf PORTB,0 ;Seal a nivel bajo
call DELAY2_5MS ;Llamamos subrutina 2,5 ms
goto CICLO ;Repetimos ciclo

DELAY2_5MS movlw .217 ;Cargamos TMR0 con valor


movwf TMR0 ;calculado previamente
bcf INTCON,2 ;Borramos el sealizador
ESPERA btfss INTCON,2 ;Se desbord el TMR0?
goto ESPERA ;No. Seguimos esperamos
return ;Si, han transcurrido 2,5 ms
end

FORMA B. POR INTERRUPCIN


list P=16F84A
include P16F84A.inc

org 00H ;Vector de inicio


goto INICIO ;del programa principal
org 04H ;Vector de inicio de
goto RSI ;la subrutina de interrupcin

;*****************************************
;***RUTINA DE INTERRUPCIN***
;*****************************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupcin es desborde
;del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el sealizador TOIF
movlw .01
xorwf PORTB,1
movlw .217 ;Cargamos el valor del TMR0
movwf TMR0 ;Para una nueva temporizacin
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie

;*************************************
;***PROGRAMA PRINCIPAL***
;*************************************
INICIO bsf STATUS,5
clrf TRISB
movlw B'00010101' ; Reloj interno (Temporizador) Predivisor
movwf OPTION_REG ; asignado a TMR0, valor= 128
movlw B'10100000' ; Habilitamos las interrupciones

Prof. Luis Zurita 8 Microcontroladores I


movwf INTCON ;Con GIE=1 y TOIE=1
bcf STATUS,5
clrf PORTB ;Inicializamos el Puerto B
movlw .217 ;Cargamos el TMR0 con el
movwf TMR0 ;valor previamente calculado
SINFIN clrwdt ;Usamos esta instruccin para
goto SINFIN ;evitar reinicio del programa
;De resto, el programa se queda en este bucle sin fin esperando el desborde
;del TMR0, que ocurrir segn sea el tiempo calculado.
end

Nota: Generalmente cuando los puertos A y/o B pueden sufrir modificaciones


dentro de la rutina de interrupcin, se salva el entorno (Se vern en los ejemplos
3, 4 y 5), sin embargo para este ejemplo, no se modifican otros bits de los puertos,
por lo que no es necesario salvar el entorno.

3. Disee un control de nivel para un tanque.


Este ejercicio muestra el uso de un botn, pulsador o sensor de
emergencia, que debe detener todo el proceso de manera automtica,
protegiendo al operador o a los equipos. Se introduce el concepto de
Salvar/Restaurar el entorno.
Se tiene un interruptor selector de MODO
Si MODO es manual, las bombas se activan sin importar el nivel del
tanque subterrneo.
Si MODO es automtico, la activacin de las bombas depender de:
Si el nivel del agua est por debajo del nivel mnimo, se activar la
bomba 1 hasta que se alcance el nivel Mximo, y proceder a apagarse.
Si el nivel del agua est por encima del nivel mnimo, pero por debajo
del nivel mximo, se activar la bomba 2 hasta que se alcance el nivel
Mximo y proceder a apagarse.
Se debe monitorear si ha cambiado el MODO.
Importante: Si no hay agua en el tanque subterrneo, se deben apagar
las bombas hasta que el nivel del tanque de trabajo alcance al sensor de
operacin

Prof. Luis Zurita 9 Microcontroladores I


MODO
Manual
Auto

OPERACIN
PARADA

SOLUCIN:

Paso 1. Enunciado y delimitacin del Hardware: Tenemos el enunciado, sin


embargo debemos delimitar el hardware.
Para lograr esta tarea debemos asignar los pines de control de Entrada y de
salida, con la finalidad de saber qu vamos a controlar y quin nos dar la
informacin.
Como el sensor de parada se va a utilizar por interrupcin de cambio de
nivel de RB0, este ser configurado como entrada

Debemos identificar cuales elementos son entrada y cuales salida:

ENTRADA Qu pin SALIDA Qu pin


Asignamos? Asignamos?
Interruptor INICIO RA0 Bomba B1 RB3
Sensor Mximo RA1 Bomba B2 RB1
Sensor Mnimo RA2 Indicador RB2
Manual
Sensor Parada RB0 Indicador Auto RB3
Sensor Operacin RA3

Y si quiero asignar otros pines? Perfecto, queda a libre eleccin.

Prof. Luis Zurita 10 Microcontroladores I


VDD

MANUAL
R1 RB4
1k AUTO
RB2
RA0

VSS
MODO
VSS

SENSOR NIVEL ALTO


VDD

NIVEL MXIMO
R2
1k

RA1

TANQUE VSS
RB3

RB1

VDD
PRINCIPAL
M1 B1 B2 M2 SENSOR NIVEL BAJO
VDD
VDD
R1B
1k OPERACIN
R1A R3
PARADA 1k
1k VSS
VSS RA3
RA2
VSS
RB0
TANQUE SUBTERRNEO
VSS
VSS
C1
22p U1
X1 16
OSC1/CLKIN RA0
17
RA0
15 18
C2 OSC2/CLKOUT RA1 RA1
1
RA2 RA2
4 2
MCLR RA3 RA3
3
VSS VDD RA4/T0CKI
22p
6
RB0/INT RB0
7
RB1 RB1
8
RB2 RB2
9
RB3 RB3
10
RB4 RB4
11
RB5
12
RB6
13
RB7
PIC16F84A

Prof. Luis Zurita 11 Microcontroladores I


Paso 2. Diagrama de Flujo:

INICIO RSI

Configurar Deshabilitar
INTCON Interrupciones

Salvar entorno
Configurar
Puerto A y B

NO
Bomba 1= OFF INTF=1? SALIR
Bomba 2=OFF
SI
M
Bomba 1= OFF
SI Bomba 1= ON Bomba 2= OFF
Manual?
Bomba 2= ON

Auto NO NO
Lleg a
Noperacin?
Nivel NO Nivel NO
M SI
Mnimo? Mximo?
SALIR
SI SI Restaurar entorno

Bomba 1= OFF
Bomba 1= ON INTF=0
Bomba 2= ON
Bomba 2= OFF

Habilitar
Interrupciones
Nivel NO
Mximo? retfie
SI

Bomba 1= OFF
Bomba 2= OFF

Prof. Luis Zurita 12 Microcontroladores I


Paso 3. Del Diagrama de Flujo al Lenguaje Ensamblador:

list P=16F84A
include P16F84A.INC
WTEMP equ 20H ;Declaramos registros para
PBTEMP equ 21H ;Utilizarse para salvar y restaurar
STATEMP equ 22H ;El entorno

org 00H ;Vector de Inicio


goto INICIO
org 04H ;Vector de Interrupcin
goto RSI
;*************************************
;***Rutina de servicio de Interrupcin***
;*************************************
RSI bcf INTCON,7 ;Interrupciones deshabilitadas
PUSH movwf WTEMP ;Salvamos el entorno
movf STATUS,0
movwf STATEMP
movf PORTB,0
movwf PBTEMP
btfss INTCON,1 ;INTF=1? Fue por RB0/INT?
goto PULL ;No. Salimos de la RSI
SI bcf PORTB,2
bcf PORTB,3 ;Bomba 1= OFF
bcf PORTB,1 ;Bomba 2= OFF
OPER btfsc PORTA,3 ;Nivel de Operacin?
goto OPER ;No. Esperamos a que se alcance el
;nivel de operacin
PULL movf PBTEMP,0 ;Restauramos el entorno
movwf PORTB
movf STATEMP,0
movwf STATUS
movf WTEMP,0
bcf INTCON,1 ;Borramos el sealizador
bsf INTCON,7 ;Interrupciones habilitadas
retfie ;Salimos de las interrupciones

;***********************
;***Programa Principal***
;***********************
INICIO bsf STATUS,5 ;Vamos al banco 1 a configurar
movlw 1FH
movwf TRISA
movlw B'00000001' ;RB0= Entrada, Resto Salidas

Prof. Luis Zurita 13 Microcontroladores I


movwf TRISB
movlw B'10010000' ;Habilitamos las interrupciones
movwf INTCON ;Con GIE=1 y INTE=1
movlw B'01000000' ;Configuramos el tipo de flanco
movwf OPTION_REG ;De activacin de RB0/INT
bcf STATUS,5 ;Vamos al banco 0 a trabajar
clrf TRISB ;Bombas=OFF
MODO btfsc PORTA,0 ;MODO AUTO?
goto AUTO
MANUAL bsf PORTB,2 ;No. Modo manual= ON
bcf PORTB,4 ;Modo Auto=OFF
bsf PORTB,3 ;Bomba 1=ON
bsf PORTB,1 ;Bomba 2=ON
goto MODO
AUTO btfsc PORTA,2 ;MNIMO?
goto DOS ;Hay Agua
bsf PORTB,2 ; Modo Auto=ON
bcf PORTB,4 ;Modo Manual=OFF
bsf PORTB,3 ;Bomba 1=ON
bcf PORTB,1 ;Bomba 2=OFF
CERR btfss PORTA,1 ;(NHA)MXIMO?
goto CERR ;No Hay Agua
MODO2 bcf PORTB,2 ; Modo Auto=OFF
bcf PORTB,3 ;Bomba 1=ON
bcf PORTB,1 ;Bomba 2=OFF
goto MODO
DOS btfsc PORTA,1 ;(NHA)MXIMO?
goto MODO ;HA
MODO1 bcf PORTB,2 ; Modo Auto=OFF
bcf PORTB,3 ;Bomba 1=OFF
bsf PORTB,1 ;Bomba 2=ON
goto CERR
end

Prof. Luis Zurita 14 Microcontroladores I


4. Realice la automatizacin de la mezcladora de pinturas, mostrada en la
figura siguiente, bajo la siguiente secuencia de funcionamiento:

El sistema de mezclado se inicia al pulsarse MARCHA, mediante el cual,


se activa B1, por espacio de por espacio de 10 minutos. B2, MM, VD, MA
deben estar apagados. Se enciende un led verde que indica que el sistema
esta en marcha.
Transcurrido este tiempo, se enciende B2. B1, MM, VD, MA, deben estar
apagados.
B2 se mantiene encendido hasta que el sensor Nivel alto se activa,
mediante el cual se detiene B2, se activa MM. B1, VD, MA, se mantienen
apagados.
MM se mantiene encendido por espacio de 2 minutos. B1, B2, VD, MA se
mantienen apagados. Una vez transcurrido este tiempo, se detiene MM.
Se activa VD, hasta que se activa el sensor Nivel bajo, mediante el cual se
cierra VD y se activa MA por espacio de 7,5 minutos, reinicindose el
proceso nuevamente.
El sistema cuenta con un pulsador de PARE, que al activarse en
cualquier momento detiene todo el proceso, apagando B1, B2, VD, MM y MA,
activando un led rojo y apagando al led verde, indicando que existe una
parada del proceso.
Para reiniciar el proceso nuevamente en donde se qued al momento de
detenerlo, se debe pulsar REINICIO.
Este ejercicio muestra el uso de un botn, pulsador o sensor de
emergencia, que debe detener todo el proceso de manera automtica,
protegiendo al operador o a los equipos. Se introduce el concepto de
Salvar/Restaurar el entorno.

Nota: Utilice el TMR0 para generar la rutina de 1 segundo. (no se realiza por
interrupcin sino por polling, puede ser sustituida por una rutina de 1
segundo generada por el PICDEL)

Prof. Luis Zurita 15 Microcontroladores I


PINTURA 1 PINTURA 2
B B

MEZCLADORA DE PINTURAS Nivel Alto

TANQUE MEZCLADOR
Nivel Bajo

MM
VD

PINTURA PINTURA

LISTA LISTA

MA

Prof. Luis Zurita 16 Microcontroladores I


Nomenclaturas:
B1: Bomba 1
B2: Bomba 2
MM: Motor de Mezclado
VD: Vlvula de Desage
MA: Motor de Avance

Paso 1. Enunciado y delimitacin del Hardware: Tenemos el enunciado, sin


embargo debemos delimitar el hardware.

Debemos identificar cuales elementos son entrada y cuales salida:

ENTRADA Qu pin SALIDA Qu pin


Asignamos? Asignamos?
Pulsador MARCHA RA0 Led Marcha RB1
Pulsador REINICIO RA1 Led PARE RB2
Sensor Nivel Alto RA2 Vlvula RB3
Pintura 1
Sensor Nivel Bajo RA3 Vlvula RB4
Pintura 2
Sensor PARE RB0 Motor RB5
Mezclado
Vlvula RB6
Desage
Motor RB7
Avance

Prof. Luis Zurita 17 Microcontroladores I


El circuito quedara de la siguiente manera:

RB3

RB4
VDD

PINTURA 1 PINTURA 2
VDD
VDD
CAJA DE CONTROL VSS
VSS
MARCHA NIVEL ALTO
RA0
VDD RB1 TANQUE RA2

PARE
RB0
RB2
MEZCLADOR
VDD

REINICIO

RB5
RA1

NIVEL BAJO
VSS RB6
RA3

MOTOR MZ VLVULA DESAGUE

VSS VSS

PINTURA PINTURA
RB7

LISTA LISTA

MOTOR AVANCE
RB7

Prof. Luis Zurita 18 Microcontroladores I


Paso 2. Diagramas de Flujo:
INICIO 1 RSI

Declarar Registros de Deshabilitar


trabajo VD=ON Interrupciones

Configurar Salvar entorno


NO
INTCON y OPTION_REG NBAJO
=0?
Configurar SI NO
Puerto A y B INTF=1? SALIR

A
VD=OFF SI
Limpiar Registros en general MA=ON
B1=OFF
y Puerto B B2=OFF
MM=OFF
RET7_5S VD=OFF
MA=OFF
NO LMARCHA=OFF
MARCHA MA=OFF LPARE=ON
=0?

SI
1
B1=ON REINICIO NO
B2=OFF =0?
MM=OFF
VD=OFF LEYENDA: SI
MA=OFF VD=Vlvula de Desage
LMARCHA=ON B1= Vlvula de Llenado Pintura 1 LPARE=OFF
LPARE=OFF B2= Vlvula de Llenado Pintura 2
LMARCHA= Led Marcha
LPARE= Led Pare Restaurar entorno
NALTO= Sensor Nivel Alto
RET13SEG NBAJO=Sensor Nivel Bajo
INTF=0
MM= Motor Mezclado
MA= Motor de Avance SALIR
B1=OFF MARCHA= Pulsador de inicio
B2=ON Habilitar
PARE= Pulsador de parada
LMARCHA=ON Interrupciones
REINICIO= Pulsador de reinicio del proceso
LPARE=OFF Lgica de los sensores=
0=Activado retfie
1= Desactivado
NO NALTO
=0?

SI

B2=OFF
MM=ON

RET1M

MM=OFF

Prof. Luis Zurita 19 Microcontroladores I


Paso 3. Lenguaje Ensamblador:
list P=16F84A
include p16F84A.inc

W_TEMP equ 20H ;Declaramos los registros


ESTADO_TEMP equ 21H ;A utilizar para salvar y restaurar
PB_TEMP equ 22H ;El entorno
REGAUX1 equ 23H ;Registros para generar retardos
REGAUX2 equ 24H ;Por Software

org 00H
goto INICIO
org 04H
goto RSI
;***********************************
;***Rutina de Servicio de Interrupcin***
;***********************************
RSI btfss INTCON,1 ;INTF=1?
goto SALIR ;No. Salimos de la Interrupcin
movwf W_TEMP ;Salvamos el entorno
swapf W_TEMP,1
movf STATUS,0
movwf ESTADO_TEMP
movf PORTB,0
movwf PB_TEMP
movlw b'00000100' ;Si. Todo OFF. LPARE= ON
movwf PORTB ;(ROJO=ON)
REINI btfsc PORTA,1 ;Se puls REINICIO?
goto REINI ;Esperamos
bcf INTCON,1 ;Borramos sealizador INTF
movf PB_TEMP,0 ;Restauramos el entorno
movwf PORTB
movf ESTADO_TEMP,0
movwf STATUS
swapf W_TEMP,0
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI

;**********************
;***Programa Principal ***
;**********************
INICIO bsf STATUS,5 ;Configuramos los Puertos
movlw 01FH
movwf TRISA ;PA como entrada
movlw b'00000001'
movwf TRISB ;PB como entrada/salida
movlw b'01000111' ;Prescaler= 256

Prof. Luis Zurita 20 Microcontroladores I


movwf OPTION_REG ;Y configuramos el flanco de RBO/INT
movlw b'10010000' ;GIE= 1 y INTE=1
movwf INTCON
bcf STATUS,5
clrf PORTB ;Limpiamos el Puerto B
EMPIEZA btfsc PORTA,0 ;Se puls INICIO
goto EMPIEZA ;No. Esperamos
REPITE bsf PORTB,3 ;B1= ON
bsf PORTB,1 ;Led Marcha=ON (Verde= ON)
bcf PORTB,2 ;Led PARE=OFF
bcf PORTB,4 ;B1=OFF
bcf PORTB,5 ;MM=OFF
bcf PORTB,6 ;VD=OFF
bcf PORTB,7 ;MA=OFF
call RET13 ;Llamamos a Subrutina de 13 seg.
bcf PORTB,3 ;B1= OFF
bsf PORTB,4 ;B2= ON
NAOK btfsc PORTA,2 ;Nivel Alto= 0?
goto NAOK ;No. Esperamos
bcf PORTB,4 ;B2= OFF
bsf PORTB,5 ;MM= ON
call RET1M ;Llamamos subrutina de 1 minuto.
bcf PORTB,5 ;MM= OFF
bsf PORTB,6 ;VD= ON
NBOK btfsc PORTA,3 ;Nivel Bajo= 0?
goto NBOK ;No. Esperamos
bcf PORTB,6 ;VD= OFF
bsf PORTB,7 ;MA= ON
call RET7_5 ;Subrutina de 7,5 seg
bcf PORTB,7
goto REPITE
;**********************************
;***Rutina de 7,5 segundos***
;**********************************
RET7_5 bcf INTCON,2
movlw d'114'
movwf REGAUX1
RECAR75 bcf INTCON,2
clrf TMR0
ESPERA1 btfss INTCON,2
goto ESPERA1
decfsz REGAUX1,1
goto RECAR75
return

Prof. Luis Zurita 21 Microcontroladores I


;*********************************
;***Rutina de 13 segundos***
;*********************************
RET13 bcf INTCON,2
movlw d'198'
movwf REGAUX1
RECAR13 bcf INTCON,2
clrf TMR0
ESPERA2 btfss INTCON,2
goto ESPERA2
decfsz REGAUX1,1
goto RECAR13
return
;****************************
;***Rutina de 1 minuto***
;****************************
RET1M movlw d'30' ;Original= 60, se cambi para la simulacin
movwf REGAUX2
RECAR4 movlw d'15'
movwf REGAUX1
RECAR5 bcf INTCON,2
clrf TMR0
ESPERA4 btfss INTCON,2
goto ESPERA4
decfsz REGAUX1,1
goto RECAR5
decfsz REGAUX2,1
goto RECAR4
return
end ;Fin del programa

Prof. Luis Zurita 22 Microcontroladores I


5. Se desea automatizar una lavadora CHACACHACA bajo dos modos de
lavado (uno de Lavado Rpido de 30 minutos de duracin y otro de
Lavado Lento de 50 minutos de duracin), el sistema constar de un
pulsador de INICIO y un interruptor selector de modo de lavado.
Automatice bajo las siguientes condiciones:
Este ejercicio muestra el uso de un botn, pulsador o sensor de emergencia,
que debe detener todo el proceso de manera automtica, protegiendo al
operador o a los equipos. Se introduce el concepto de Salvar/Restaurar el
entorno.
Se elige entre lavado rpido lento
Se presiona INICIO y realiza lo siguiente:
Se llena la CHACACHACA hasta el nivel de agua mximo; lava bate por
la mitad del tiempo; se detiene; se vaca; se llena otra vez de agua; lava
bate hasta que falten tres minutos; se detiene; se vaca; se llena otra vez
de agua; lava bate por el resto del tiempo; se vaca nuevamente y emite
una alarma sonora por espacio de 10 segundos; y se detiene a la espera de
un nuevo proceso de lavado.
Si no hay agua en el depsito de agua, se detiene el lavado, se cierra la
vlvula de llenado y se emite una alarma sonora hasta que se solucione el
problema agregando agua al depsito hasta el nivel mnimo de lavado.
ML: Motor de Lavadora. VD: Vlvula de Desage. VLL: Vlvula de
Llenado.
Nmnimo, Nmximo, Nmnimo de lavado, Nivel de alarma: Sensores de
nivel.

Nota: Utilice el TMR0 para generar la rutina de 1 segundo.

Prof. Luis Zurita 23 Microcontroladores I


Paso 1. Enunciado y delimitacin del Hardware: Tenemos el enunciado, sin
embargo debemos delimitar el hardware.

Debemos identificar cuales elementos son entrada y cuales salida:

ENTRADA Qu pin SALIDA Qu pin


Asignamos? Asignamos?
Interruptor MODO de RA0 Motor de RB1
Lavado Lavadora
Pulsador INICIO RA1 Vlvula de RB2
Desage
Sensor Nivel Mnimo RA2 Vlvula de RB3
Llenado
Sensor Nivel Mximo RA3 Led RB4
INICIO
Sensor Nivel Mnimo RA4 Led RB5
de lavado Rpido
Sensor Nivel de Alarma RB0 Led Lento RB6
ALARMA RB7

Como podemos observar, de manera comn, se asignan las entradas al


puerto A y las salidas al puerto B.

Prof. Luis Zurita 24 Microcontroladores I


El circuito del hardware a simular quedara de la siguiente manera:

VDD

RB7
RA4
VSS

ALARMA NMNIMO DE LAVADO


VDD
DEPSITO
VSS DE AGUA

RB3
RB0
VSS
VLVULA DE LLENADO
NIVEL DE ALARMA
PANEL DE CONTROL
VDD
VDD
VSS

ON NIVEL ALTO
RA1
INICIO RB4 LAVADORA RA3

VDD RPIDO
RB5
VDD
LENTO
LAVADORA0 RB6
RB1

NIVEL BAJO
RB2
RA2

MOTOR MZ VLVULA DESAGUE

VSS VSS

Prof. Luis Zurita 25 Microcontroladores I


Paso 2. Diagramas de Flujo:

INICIO LEYENDA: 1
VD=Vlvula de Desage
VLL= Vlvula de Llenado
Declarar Registros de NMAX= Sensor Nivel Mximo
trabajo NMIN=Sensor Nivel Mnimo VLL=OFF
NMINLAV=Sensor Nivel Mnimo de Lavado MotorL=OFF
MotorL= Motor Lavadora VD=ON
Configurar
CONTA=Contador de minutos
INTCON y OPTION_REG
CONTAMEDIO=Contador precargado con la
mitad del tiempo
Configurar CONTALAV=Contador precargado con el NO
Puerto A y B tiempo total de lavada NMIN=0?
Lgica de los sensores=
A
0=Activado SI
Limpiar Registros en general 1= Desactivado
y Puerto B VD=OFF
VLL=ON

(Lento) Led Rpido=OFF


NO Led Lento=ON
INTLAV?
ContaMed=12 NO
ContaLav=25 NMAX=0?
(Rpido) SI
SI
Led Rpido=ON
Led Lento=OFF VLL=OFF
ContaMed=22 MotorL=ON
ContaLav=45

SI
NO CONTALAV=CONTALAV-3
INICIO?

RET1MIN

VD=OFF
Led Inicio=ON CONTA=CONTA+1
VLL=ON

NO CONTA=
NO CONTALAV?
NMAX=0?

SI SI

VLL=OFF VLL=OFF
MotorL=ON MotorL=OFF
VD=ON

RET1MIN

NO
NMIN=0?
CONTA=CONTA+1

SI

NO CONTA= SI
1 2
CONTAMEDIO?

Prof. Luis Zurita 26 Microcontroladores I


2 RSI

SI
Deshabilitar
VD=OFF Interrupciones
VLL=ON
Salvar entorno

NO
NMAX=0? NO
INTF=1? SALIR
SI
SI
VLL=OFF ALARMA=ON
MotorL=ON MotorL= OFF
VLL= OFF
VD=OFF
RET1MIN

Lleg a NO
RET1MIN NMINLAV?

SI

RET1MIN ALARMA=OFF
SALIR

VLL=OFF Restaurar entorno


MotorL=OFF
VD=ON
INTF=0

Habilitar
NO Interrupciones
NMIN=0?

SI retfie

RET10SEG
Vamos al Inicio
del programa
para una nueva
A lavada

Prof. Luis Zurita 27 Microcontroladores I


Paso 3. Lenguaje Ensamblador:
LIST P=16F84A
INCLUDE P16F84A.INC
;Declaraciones de registros:
RET4 EQU 2DH ;Registros para generar
RET5 EQU 2EH ;Rutinas de retardo
RET6 EQU 2FH
W_TEMP EQU 30H ;Registros para salvar el
STATUS_TEMP EQU 31H ;Entorno durante la interrupcin
PA_TEMP EQU 32H
PB_TEMP EQU 33H
PC_TEMP EQU 34H
CONTA EQU 35H ;Registro contador de comparacin
CONTAMED EQU 20H ;Registro que se cargar con el tiempo
;medio de la duracin del lavado
CONTALAV EQU 21H ;Registro que posee el tiempo total de
;lavado
CONTASEG EQU 22H ;Registro contador de segundos

ORG 00H
GOTO INICIO
ORG 04H
GOTO RUTIN
;***********************************
;***Rutina de Servicio de Interrupcin***
;***********************************
RUTIN BCF INTCON,7 ;Deshabilitamos las interrupciones
BTFSS INTCON,5
GOTO SALIR
MOVWF W_TEMP ;Salvamos el entorno durante la
SWAPF W_TEMP,1 ;Interrupcin al modificarse el Puerto B
MOVF STATUS,0 ;dentro de la RSI
MOVWF STATUS_TEMP
MOVF PORTA,0
MOVWF PA_TEMP
MOVF PORTB,0
MOVWF PB_TEMP
ESPERA BSF PORTB,7 ;SSONORA=ON
BCF PORTB,1 ;ML=OFF
BCF PORTB,2 ;VD=OFF
BCF PORTB,3 ;VLL=OFF
BTFSC PORTA,4 ;NMINLAV?
GOTO ESPERA
BCF PORTB,7 ;SSONORA=OFF
POP MOVF PB_TEMP,0
MOVWF PORTB

Prof. Luis Zurita 28 Microcontroladores I


MOVF PA_TEMP,0
MOVWF PORTA
MOVF STATUS_TEMP,0
MOVWF STATUS
SWAPF W_TEMP,1
MOVF W_TEMP,0
BCF INTCON,1 ;INTF=0
SALIR BSF INTCON,7 ;GIE=1
RETFIE

;*****************************
;***Programa Principal***
;*****************************

INICIO BSF STATUS,5 ;Configuramos los Puertos A y B


MOVLW 1FH
MOVWF TRISA
MOVLW B'00000001' ;RB0 como entrada
MOVWF TRISB
BCF OPTION_REG,6 ;Configuramos el flanco de RB0/INT
MOVLW B'10010000' ;Activamos GIE y INTE
MOVWF INTCON
BCF STATUS,5
NUEVOLAV CLRF CONTASEG ;Inicializamos los registros
CLRF CONTA ;Y el Puerto B
CLRF PORTB
MODO BTFSS PORTA,0 ;Qu MODO es?
GOTO MODOLENTO ;Ir al modo lento
BSF PORTB,5 ;Modo RPIDO= ON
BCF PORTB,6 ;LENTO OFF
MOVLW D'12' ;Precargamos los valores
MOVWF CONTAMED ;Para el lavado rpido
MOVLW D'25'
MOVWF CONTALAV
GOTO MARCHA ;Va a preguntar si se puls INICIO
MODOLENTO BCF PORTB,5 ;Activamos el MODO lento
BSF PORTB,6
MOVLW D'22' ;Y precargamos los valores
MOVWF CONTAMED ;de este modo
MOVLW D'45'
MOVWF CONTALAV
GOTO MARCHA
MARCHA BTFSC PORTA,1 ;INICIO?
GOTO MODO ;No, vamos a explorar el MODO
ESPLL1 BSF PORTB,4 ;LEDINI=ON
BSF PORTB,3 ;VLL ON
BTFSC PORTA,3 ;NMAX?

Prof. Luis Zurita 29 Microcontroladores I


GOTO ESPLL1
BCF PORTB,3 ;VLL OFF
BSF PORTB,1 ;ML ON
SUBEMIN1
CALL RET1s ;PARA SIMULACION, ES UN MINUTO
INCF CONTA,1
MOVF CONTAMED,0
SUBWF CONTA,0 ;CONTA=CONTAMED?
BTFSS STATUS,2 ;Z=1?
GOTO SUBEMIN1
ESPVAC BCF PORTB,3 ;VLL OFF
BCF PORTB,1 ;ML OFF
BSF PORTB,2 ;VD ON
BTFSC PORTA,2 ;NMIN?
GOTO ESPVAC
ESPLL2 BCF PORTB,2 ;VD OFF
BSF PORTB,3 ;VLL ON
BTFSC PORTA,3 ;NMAX=0?
GOTO ESPLL2
BCF PORTB,3 ;VLL OFF
BSF PORTB,1 ;ML ON
DECF CONTALAV,1
DECF CONTALAV,1
DECF CONTALAV,1 ;A FALTA DE 3 MINUTOS
SUBEMIN2 CALL RET1s ;PARA SIMULACION, ES UN
MINUTO
INCF CONTA,1
MOVF CONTALAV,0
SUBWF CONTA,0 ;CONTA=CONTALAV?
BTFSS STATUS,2 ;Z=1?
GOTO SUBEMIN2
ESPVAC2 BCF PORTB,3 ;VLL OFF
BCF PORTB,1 ;ML OFF
BSF PORTB,2 ;VD ON
BTFSC PORTA,2 ;NMIN?
GOTO ESPVAC2
ESPLL3 BCF PORTB,2 ;VD OFF
BSF PORTB,3 ;VLL ON
BTFSC PORTA,3 ;NMAX?
GOTO ESPLL3
BCF PORTB,3 ;VLL OFF
BSF PORTB,1 ;ML ON
CALL RET1s
CALL RET1s ;ESPERA 3 MINUTOS FINALES
CALL RET1s ;(SE SIMULA CON 1 SEG)
ESPVAC3 BCF PORTB,3 ;VLL OFF
BCF PORTB,1 ;ML OFF

Prof. Luis Zurita 30 Microcontroladores I


BSF PORTB,2 ;VD ON
BTFSC PORTA,2 ;NMIN?
GOTO ESPVAC3
BCF PORTB,2 ;VD OFF
PITAZO BSF PORTB,7 ;ALARMA SONORA ON
CALL RET1s
INCF CONTASEG,1
MOVLW D'10'
SUBWF CONTASEG,0
BTFSS STATUS,2 ;10 SEG?
GOTO PITAZO
BCF PORTB,7 ;ALARMA SONORA OFF
GOTO NUEVOLAV

;*********************************************************
;***Rutina de 1 segundo. Generada por PDEL***
;*********************************************************
RET1s movlw .14 ; 1 set numero de repeticion (C)
movwf RET4 ;1|
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf RET5 ;1|
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf RET6 ;1|
PLoop2 clrwdt ; 1 clear watchdog
decfsz RET6, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz RET5, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz RET4, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.

END

Prof. Luis Zurita 31 Microcontroladores I


6. PROGRAMA PARA GENERAR UN CONTADOR DE 00-99 mediante interrupcin del
TMR0

Paso 1. Enunciado: El TMR0 se desbordar cada 50 ms, luego de 20 desbordes


(50ms*20=1000 ms) se incrementar en uno. Existe un contador que llevar la cantidad
de estados que se muestra en los displays de 7 segmentos conectados directamente al
PUERTO B. Como se van a mostrar todos los estados, es decir del 00 al 99, se utilizan dos
registros (UNIDAD y DECENA) sin tener que utilizar la rutina de binario a bcd. Por
simplicidad se coloc en el diagrama de flujo un solo registro contador que va a
incrementarse, pero que en realidad incrementa un contador clsico de 00 a 99. Este
programa muestra el uso de un registro auxiliar para obtener retardos mayores a los
que se pueden obtener directamente con el TMR0. Adicional a esto realiza un contador
con el uso de la interrupcin del TMR0, permitiendo utilizar el programa principal para
tareas de automatizacin.
Paso 2. Diagrama de Flujo

INICIO
RSI TMR0 (50ms)

Configurar
Puerto A y B Borramos el
Sealizador TOIF
Configurar
OPTION_REG E INTCON
Decf CONTAVECES

Inicializamos
PORTA Y B, CONTADORES NO van 20
desbordes?

MOSTRAR SI

CONTAVECES=20

NO
ARRANCAR?
CONTADOR NO
incf CONTADOR
SI =100?

SI
Cargamos valor
calculado en el TIMER0
REGISTRO AUXILIAR CONTADOR=0
HABILITAMOS TOIE=1

Cargamos valor calculado


MOSTRAR en el TIMER0

NO RETFIE
CONTADOR
=100? Rutina de Interrupcin
SI

Programa Principal

Prof. Luis Zurita 32 Microcontroladores I


Paso3. Lenguaje Ensamblador:

LIST P=16F84A ;TIPO DE PROCESADOR


INCLUDE P16F84A.INC ;DEFINICIONES DE REGISTROS INTERNOS
;*******************************
;****ZONA DE DECLARACIONES******
;*******************************
UNIDAD EQU 20H ;UNIDAD
DECENA EQU 21H ;DECENA
CONTAVECES EQU 22H ;REGISTRO AUXILIAR, CONTADOR DE 20 DESBORDES
CONTADOR EQU 23H ;CONTADOR GLOBAL DE 100 ESTADOS
PDEL00 EQU 24H ;REGISTRO DE TIEMPO DEL PICDEL
PDEL11 EQU 25H ;REGISTRO DE TIEMPO DEL PICDEL

ORG 00H ;VECTOR DE RESET


GOTO INICIO
ORG 04H ;VECTOR DE INTERRUPCIN
GOTO RUTIN ;VA A RUTINA DE INTERRUPCIN
;*****************************
;****SUBRUTINA DE INTERRUPCIN****
;*****************************
RUTIN BCF INTCON,T0IF ;REPONE FLAG DEL TMR0
DECFSZ CONTAVECES,F ;DECREMENTA EL CONTADOR
GOTO COMUN
MOVLW .20 ;SI HAN OCURRIDO 20 DESBORDES (1000 MS) SE INCREMENTA
;EL CONTADOR EN EL DISPLAY
MOVWF CONTAVECES ;REPONE EL CONTADOR DE DESBORDE DEL TMR0
SUBE MOVF UNIDAD,0
SUBLW .9
BTFSS STATUS,Z ;ES 9?
GOTO SUBEUNI ;NO. VA A INCREMENTAR UNIDAD
CLRF UNIDAD ;SI. VA A SUBIR DECENA
INCF CONTADOR,1
MOVF DECENA,0
SUBLW .9
BTFSS STATUS,Z ;ES 9?
GOTO SUBEDEC ;NO. VA A INCREMENTAR DECENA
CLRF DECENA ;SI. REINICIA EL CONTADOR
SUBEUNI INCF CONTADOR,1
INCF UNIDAD,1
GOTO COMUN
SUBEDEC INCF DECENA,1
GOTO COMUN
COMUN MOVLW .61
MOVWF TMR0 ;REPONE EL TMR0 CON 61 PARA NUEVO DESBORDE
RETFIE ;RETORNO DE INTERRUPCIN

Prof. Luis Zurita 33 Microcontroladores I


;********************************
;****ZONA DE CONFIGURACIONES****
;********************************
INICIO CLRF PORTB ; BORRA LOS SEGMENTOS DE SALIDA
BSF STATUS,5 ; SELECCIONA BANCO 1
MOVLW B'00000100' ;RA0 Y RA1 SALIDAS Y RA2 ENTRADA
MOVWF TRISA ; PORTA SE CONFIGURA
CLRF TRISB ; PORTB SE CONFIGURA COMO SALIDA
MOVLW B'00000111'
MOVWF OPTION_REG ; PREESCALER DE 256 PARA EL TMR0,
BCF STATUS,5 ;SELECCIONA BANCO 0
REINICIO MOVLW B'10000000'
MOVWF INTCON ;ACTIVA LA INTERRUPCIN GLOBAL GIE=1.
CLRF UNIDAD ;PUESTA A 0 DE UNIDAD Y DECENA QUE SE MOSTRARN
CLRF DECENA ;EN EL DISPLAY
CLRF CONTADOR ;CONTADOR GENERAL DE 100 ESTADOS
;*************************
;***PROGRAMA PRINCIPAL***
;*************************
;***CERROJO PARA ARRANCAR CUENTA***
ARRANCA CALL MOSTRAR
BTFSC PORTA,2 ;SE PRESION ARRANCA?
GOTO ARRANCA ;NO.SE QUEDA MOSTRANDO EL NMERO EN EL DISPLAY
;***CARGA REGISTRO AUXILIAR, TIEMPO DE DESBORDE DEL TMR0
;***Y HABILITA LA INTERRUPCION POR DESBORDE DEL TMR0
CARGA MOVLW .20 ;SI. CARGA EL REGISTRO AUXILIAR CON
MOVWF CONTAVECES ;EL N DE VECES DE DESBORDE DEL TMR0
MOVLW .61 ;CARGA EL VALOR DEL PRIMER DESBORDE
MOVWF TMR0 ;CARGA EL TMR0 CON 61
BSF INTCON,5 ;Y ACTIVA INTERRUPCIN DE TMR0. TOIE=1
;***SE QUEDA MOSTRANDO UNIDAD Y DECENA EN DISPLAY
;HASTA QUE SE CUENTEN 100 ESTADOS (FUNCIN DEL REGISTRO CONTADOR)
CICLO2 CALL MOSTRAR
MOVF CONTADOR,0
SUBLW .101
BTFSS STATUS,2 ;UNIDAD=0?
GOTO CICLO2 ;NO.CONTADOR LLEG A 100 ESTADOS? ESPERA
GOTO REINICIO ;SI. DECENA=0 Y UNIDAD=0
;VA A REINICIAR EL CONTADOR PARA NUEVO CICLO DE CUENTA
;******************************
;***RUTINA MOSTRAR EN DISPLAYS
;******************************
MOSTRAR BSF PORTA,0 ;DISPLAY UNI ON
BCF PORTA,1 ;DISPLAY DEC OFF
MOVF UNIDAD,W
CALL TABLA ; CONVIERTE BCD A 7 SEGMENTOS
MOVWF PORTB ; VISUALIZA EL VALOR DE LA UNIDAD
CALL DELAY5MS

Prof. Luis Zurita 34 Microcontroladores I


BCF PORTA,0 ;DISPLAY UNI OFF
BSF PORTA,1 ;DISPLAY DEC ON
MOVF DECENA,W
CALL TABLA ; CONVIERTE BCD A 7 SEGMENTOS
MOVWF PORTB ; VISUALIZA EL VALOR DE LA UNIDAD
CALL DELAY5MS
RETURN

;************************************************
;****TABLA DE CONVERSIN DE BCD A 7 SEGMENTOS****
;************************************************
;TABLA: ESTA RUTINA CONVIERTE EL CDIGO BCD PRESENTE EN LOS 4 BITS DE MENOS PESO
;DEL REG. W EN SU EQUIVALENTE A 7 SEGMENTOS. EL CDIGO 7 SEGMENTOS RETORNA TAMBIN
;EN EL REG. W
TABLA ADDWFPCL,1 ;PUNTERO O ENCABEZADO DE LA TABLA
RETLW B'11000000' ;0. VALOR 0
RETLW B'11111001' ;1. VALOR 1
RETLW B'10100100' ;2. VALOR 2
RETLW B'10110000' ;3. VALOR 3
RETLW B'10011001' ;4. VALOR 4
RETLW B'10010010' ;5. VALOR 5
RETLW B'10000011' ;6. VALOR 6
RETLW B'11111000' ;7. VALOR 7
RETLW B'10000000' ;8. VALOR 8
RETLW B'10011000' ;9. VALOR 9
;***************************RUTINA DE 5mS******************************
;**********************GENERADA POR EL PICDEL**************************
;***************************RUTINA DE 5mS******************************
DELAY5MS movlw .6 ; 1 set numero de repeticion (B)
movwf PDel00 ;1|
PLoop11 movlw .207 ; 1 set numero de repeticion (A)
movwf PDel11 ;1|
PLoop22 clrwdt ; 1 clear watchdog
decfsz PDel11, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop22 ; 2 no, loop
decfsz PDel00, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
PDelL11 goto PDelL22 ; 2 ciclos delay
PDelL22 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END ;FIN DEL PROGRAMA

Prof. Luis Zurita 35 Microcontroladores I


7. Generar la siguiente seal. (Use Timer 0 e interrupcin) (Este tipo de
seal es utilizada como seal patrn para algunas pruebas que realizan
los estudiantes de Ingeniera en Electrnica) (no aplica para los
estudiantes de Ingeniera en Instrumentacin y Control)

100 ms
2 segundos

Paso 1. Enunciado y delimitacin del problema:


Como no se ha especificado por cual pin del microcontrolador saldr la
seal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los clculos que se
hayan realizado para generar el retardo deseado.
En la grfica, podemos extraer el perodo de la seal cuadrada cuyo valor
es de 100 ms, y asumiendo un ciclo de trabajo del 50 %, tendremos que la seal

Prof. Luis Zurita 36 Microcontroladores I


en alto es igual a la seal en bajo, por lo tanto su duracin o perodo ser de 50
ms.
Hagamos los clculos para 50 ms:
De la frmula proporcionada en la Unidad IV, despejando nos quedar:

=
4 0
Sustituyendo los valores (Como no se nos especific el oscilador),
asumiremos el estndar de 4 MHz:
50
= = 195,31 195
1
4 256
4

= 256 0 0 = 256 = 256 195


= 61
Por lo que el valor a cargar en el TMR0= 61
Por qu el predivisor de 256?
Sencillo, repasando la teora, recordaremos que el valor del Timer 0 a
cargar no podr exceder bajo ningn concepto 256. Si colocamos otro predivisor
del rango disponible, el resultado ser mayor a 256.
Cmo encaro el problema?
En esta seal solicitada, si nos damos cuenta, la seal cuadrada se genera
10 veces, dando un tiempo de 1 segundo, si la seal entera, antes de que se
repita el ciclo nuevamente, es de 2 segundos, vale decir que durante 10 veces el
tiempo de 100 ms, la seal no bascula u oscila, por lo que podemos utilizar un
contador de temporizacin para determinar si la seal oscilar o no.
Durante las primeras 20 temporizaciones de 50 ms, la seal de salida
oscilar, durante las siguientes 20 temporizaciones de 50 ms, la seal de salida no
oscilar, utilizando el contador resolveremos este problema.
Y dnde utilizo el contador?
El desarrollo de la seal se fundamenta en una interrupcin por desborde
del Timer0 para los 50 ms calculados, por lo tanto el contador se utilizar dentro
de la rutina de servicio de la interrupcin. Veamos el Diagrama de flujo para
entenderlo mejor:

Paso 2. Diagrama de Flujo:

Prof. Luis Zurita 37 Microcontroladores I


INICIO RSI

Declarar Deshabilitar
CONTADOR Interrupciones

Configurar NO
Puerto A y B TOIF=1? SALIR

SI
Configurar
SUBE
INTCON y OPTION_REG Borramos el
Sealizador TOIF

Inicializamos NO
CONTADOR y PORTB
Contador NO Contador
>20? >40?
Cargamos valor calculado
en el TIMER0 SI SI
Bascular RB0 CONTADOR=0
SUBE
Para evitar un reinicio del programa
Limpiamos el Perro Guardin CONTADOR=CONTADOR+1

SALIR

Habilitar
Interrupciones

retfie

Paso 3. Lenguaje ensamblador:


list P=16F84A
include P16F84A.inc

CONTADOR equ 20H ;Declaramos el registro

org 00H
goto INICIO
org 04H
goto RSI

;********************************
;***RUTINA DE INTERRUPCIN***
;********************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupcin es
;desborde del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el sealizador TOIF
Prof. Luis Zurita 38 Microcontroladores I
movlw .20
subwf CONTADOR,0 ;Contador-20.
btfsc STATUS,0 ;C=0? Contador < 20?
goto NOBASCULA ;No.
BASCULA movlw .01 ;Si.
xorwf PORTB,1 ;Basculamos (Toggle) RB0
goto SUBECONT
NOBASCULA movlw .40
subwf CONTADOR,0 ;Contador-40. Contador>40?
btfsc STATUS,0 ;C=0?
goto LIMPIAR
SUBECONT incf CONTADOR,1 ;Contador=Contador+1
movlw .61 ;Cargamos el valor del TMR0
movwf TMR0 ;Para una nueva temporizacin
bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI
LIMPIAR clrf CONTADOR ;Limpiamos el contador
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI

;***************************
;***PROGRAMA PRINCIPAL***
;***************************
INICIO bsf STATUS,5 ;Zona de configuraciones
clrf TRISB
movlw B'00010111' ;Predivisor=256
movwf OPTION_REG
movlw B'10100000' ;Habilitamos las interrupciones
movwf INTCON ;Con GIE=1 y TOIE=1
bcf STATUS,5
clrf PORTB
clrf CONTADOR
bcf PORTB,0
movlw .61 ;Cargamos el valor del TMRO
movwf TMR0 ;Previamente calculado
SINFIN clrwdt
goto SINFIN
end

Prof. Luis Zurita 39 Microcontroladores I


A
C1
B
U1
C
22p 16 17
X1 15
OSC1/CLKIN RA0
18
CRYSTAL OSC2/CLKOUT RA1 D
C2 1
RA2
4 2
MCLR RA3
3
VDD RA4/T0CKI
22p R1
6
RB0/INT
VSS 7
RB1 330R
8
RB2
9
RB3
10
RB4
11
D1
RB5 LED-GREEN
12
RB6
13
RB7
PIC16F84A

VSS

Seal en el osciloscopio del Proteus

Prof. Luis Zurita 40 Microcontroladores I

You might also like