PROGRAMACIÓN CURRICULAR ANUAL DE CIENCIA Y TECNOLOGÍA
GUÍA DE EJERCICIOS RESUELTOS TEMA 4
1. GUÍA DE EJERCICIOS RESUELTOS
TEMA 5:
TIMER 0 E INTERRUPCIONES
Prof. Luis Zurita 1 Microcontroladores I
2. 1. Genere una señal cuadrada de 200 Hz. Diseño libre.
Paso 1. Enunciado y delimitación del problema:
Como no se ha especificado por cual pin del microcontrolador saldrá la
señal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los cálculos que se
hayan realizado para generar el retardo deseado.
1 1 1
Para una frecuencia de 200 Hz, tendremos un período de:
=ܨ = = ܶ݁ݑݍ ݈ݎ
= 5݉ݏ
ܶ ݖܪ 002 ܨ
Como no se ha especificado el ciclo de trabajo, asumiremos el 50 %, por
lo que el período en alto y en bajo serán iguales, es decir 2,5 ms
Hagamos los cálculos para 2,5 ms:
De la fórmula proporcionada en la Unidad IV, despejando nos quedará:
ܶ݁݉ ݅ݎó݊
݅ܿܽݖ
்ܸெ ோை =
4 ∗ ܶ0ܴ ܯܶݎݏ ݅݀݁ݎܲ ∗ܿݏ
݅ݒ
Sustituyendo los valores (Como no se nos especificó el oscilador,
2,5 ݉ ݏ
asumiremos el estándar de 4 MHz:
்ܸெ ோை = = 39,0625 ≅ 39
1
4 ∗ ቀ4ݖܪ ܯቁ∗ 64
்ܸெ ோை = 256 − ܸ݈ܽ
݈ܸܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ
்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎெ ோை = 256 − 39 = 217
Por lo que el valor a cargar en el TMR0= 217
Prof. Luis Zurita 2 Microcontroladores I
3. Paso 2. Diagrama de Flujo:
FORMA A
INICIO DELAY5MS
Configurar Cargamos valor calculado
Puerto B en el TIMER0
Configurar Borramos el
OPTION_REG Señalizador TOIF
Inicializamos
PORTB
NO
¿TOIF=1?
RB0=1
SI
return
DELAY5MS
RB0=0
DELAY5MS
Prof. Luis Zurita 3 Microcontroladores I
4. Paso 3. Lenguaje ensamblador:
FORMA A. POR EXPLORACIÓN (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' ;Predivisor= 128
movwf OPTION_REG
Prof. Luis Zurita 4 Microcontroladores I
5. bcf STATUS,5
clrf PORTB ;Inicializamos el Puerto B
nop
CICLO bsf PORTB,0 ;Señal a nivel alto
call DELAY2_5MS ;Llamamos subrutina 2,5 ms
bcf PORTB,0 ;Señal 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 señalizador
ESPERA btfss INTCON,2 ;Se desbordó el TMR0?
goto ESPERA ;No. Seguimos esperamos
return ;Si, han transcurrido 2,5 ms
end
FORMA B. POR INTERRUPCIÓN
list P=16F84A
include P16F84A.inc
org 00H
goto INICIO
org 04H
goto RSI
;********************************
;***RUTINA DE INTERRUPCIÓN***
;********************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupción es desborde
;del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el señalizador TOIF
movlw .01
xorwf PORTB,1
movlw .217 ;Cargamos el valor del TMR0
Prof. Luis Zurita 5 Microcontroladores I
6. movwf TMR0 ;Para una nueva temporización
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie
;***************************
;***PROGRAMA PRINCIPAL***
;***************************
INICIO bsf STATUS,5
clrf TRISB
movlw B'00010101' ;Predivisor= 128
movwf OPTION_REG
movlw B'10100000' ; Habilitamos las interrupciones
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 instrucción 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á según sea el tiempo calculado.
end
Nota: Generalmente cuando los puertos A y/o B pueden sufrir modificaciones
dentro de la rutina de interrupción, se salva el entorno (Se verán 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.
Prof. Luis Zurita 6 Microcontroladores I
7. 2. Genera la siguiente señal. (Use Timer 0 e interrupción)
100 ms
2 segundos
Paso 1. Enunciado y delimitación del problema:
Como no se ha especificado por cual pin del microcontrolador saldrá la
señal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los cálculos que se
hayan realizado para generar el retardo deseado.
En la gráfica, podemos extraer el período de la señal cuadrada cuyo
valor es de 100 ms, y asumiendo un ciclo de trabajo del 50 %, tendremos que la
señal en alto es igual a la señal en bajo, por lo tanto su duración o período será
de 50 ms.
Hagamos los cálculos para 50 ms:
De la fórmula proporcionada en la Unidad IV, despejando nos quedará:
ܶ݁݉ ݅ݎó݊
݅ܿܽݖ
்ܸெ ோை =
4 ∗ ܶ0ܴ ܯܶݎݏ ݅݀݁ݎܲ ∗ܿݏ
݅ݒ
Sustituyendo los valores (Como no se nos especificó el oscilador),
50 ݉ ݏ
asumiremos el estándar de 4 MHz:
்ܸெ ோை = = 195,31 ≅ 195
1
4 ∗ ቀ4ݖܪ ܯቁ∗ 256
்ܸெ ோை = 256 − ܸ݈݈ܸܽܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ
்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎெ ோை = 256 − 195
= 61
Por lo que el valor a cargar en el TMR0= 61
Prof. Luis Zurita 7 Microcontroladores I
8. ¿Por qué el predivisor de 256?
Sencillo, repasando la teoría, recordaremos que el valor del Timer 0 a
cargar no podrá exceder bajo ningún concepto 256. Si colocamos otro
predivisor del rango disponible, el resultado será mayor a 256.
¿Cómo encaro el problema?
En esta señal solicitada, si nos damos cuenta, la señal cuadrada se
genera 10 veces, dando un tiempo de 1 segundo, si la señal 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 señal no bascula u oscila, por lo que podemos
utilizar un contador de temporización para determinar si la señal oscilará o no.
Durante las primeras 20 temporizaciones de 50 ms, la señal de salida
oscilará, durante las siguientes 20 temporizaciones de 50 ms, la señal de salida
no oscilará, utilizando el contador resolveremos este problema.
¿Y dónde utilizo el contador?
El desarrollo de la señal se fundamenta en una interrupción por desborde
del Timer0 para los 50 ms calculados, por lo tanto el contador se utilizará
dentro de la rutina de servicio de la interrupción. Veamos el Diagrama de flujo
para entenderlo mejor:
Prof. Luis Zurita 8 Microcontroladores I
9. Paso 2. Diagrama de Flujo:
INICIO RSI
Declarar Deshabilitar
CONTADOR Interrupciones
Configurar NO
Puerto A y B ¿TOIF=1? SALIR
SI
Configurar
INTCON y OPTION_REG Borramos el
Señalizador TOIF
Inicializamos
CONTADOR y PORTB
¿Contador NO ¿Contador
>20? >40?
Cargamos valor calculado
en el TIMER0 SI
Bascular RB0 CONTADOR=0
Para evitar un reinicio del programa
Limpiamos el Perro Guardián 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
Prof. Luis Zurita 9 Microcontroladores I
10. ;********************************
;***RUTINA DE INTERRUPCIÓN***
;********************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupción es
;desborde del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el señalizador TOIF
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 temporización
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
Prof. Luis Zurita 10 Microcontroladores I
11. clrf PORTB
clrf CONTADOR
bcf PORTB,0
movlw .61 ;Cargamos el valor del TMRO
movwf TMR0 ;Previamente calculado
SINFIN clrwdt
goto SINFIN
end
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
Señal en el osciloscopio del Proteus
Prof. Luis Zurita 11 Microcontroladores I
12. 3. Diseñe un control de nivel para un tanque.
Se tiene un interruptor selector de “MODO”
Si “MODO” es manual, las bombas se activan sin importar el nivel del
tanque subterráneo.
Si “MODO” es automático, la activación de las bombas dependerá de:
Si el nivel del agua está por debajo del nivel mínimo, se activará la
bomba 1 hasta que se alcance el nivel Máximo, y procederá a
apagarse.
Si el nivel del agua está por encima del nivel mínimo, pero por debajo
del nivel máximo, se activará la bomba 2 hasta que se alcance el nivel
Máximo y procederá a apagarse.
Se debe monitorear si ha cambiado el “MODO”.
Importante: Si no hay agua en el tanque subterráneo, se deben
apagar las bombas hasta que el nivel del tanque de trabajo alcance al
sensor de operación
MODO
Manual
Auto
OPERACIÓN
PARADA
SOLUCIÓN:
Paso 1. Enunciado y delimitación 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 quién nos dará la
información.
Como el sensor de parada se va a utilizar por interrupción de cambio de
nivel de RB0, este será configurado como entrada
Prof. Luis Zurita 12 Microcontroladores I
13. Debemos identificar cuales elementos son entrada y cuales salida:
ENTRADA
¿Qué pin SALIDA ¿Qué pin
Asignamos? Asignamos?
Interruptor “INICIO” RA0 Bomba B1 RB3
Sensor Máximo RA1 Bomba B2 RB1
Sensor Mínimo RA2 Indicador RB2
Manual
Sensor Parada RB0 Indicador Auto RB3
Sensor Operación RA3
¿Y si quiero asignar otros pines? Perfecto, queda a libre elección.
VDD
MANUAL
R1 RB4
1k AUTO
RB2
RA0
VSS
MODO
VSS
SENSOR NIVEL ALTO
VDD
NIVEL MÁXIMO
R2
1k
RA1
TANQUE VSS
RB3
RB1
VDD
PRINCIPAL
M1 B1 B2 M2 SENSOR NIVEL BAJO
VDD
VDD
R1B
1k OPERACIÓN
R1A R3
PARADA 1k
1k VSS
VSS RA3
RA2
VSS
RB0
TANQUE SUBTERRÁNEO
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 13 Microcontroladores I
14. 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
Noperación?
¿Nivel NO ¿Nivel NO
M SI
Mínimo? Máximo?
SALIR
SI SI Restaurar entorno
Bomba 1= OFF
Bomba 1= ON INTF=0
Bomba 2= ON
Bomba 2= OFF
Habilitar
Interrupciones
¿Nivel NO
Máximo? retfie
SI
Bomba 1= OFF
Bomba 2= OFF
M
Prof. Luis Zurita 14 Microcontroladores I
15. 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 Interrupción
goto RSI
;*************************************
;***Rutina de servicio de Interrupción***
;*************************************
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 Operación?
goto OPER ;No. Esperamos a que se alcance el
;nivel de operación
PULL movf PBTEMP,0 ;Restauramos el entorno
movwf PORTB
movf STATEMP,0
movwf STATUS
movf WTEMP,0
bcf INTCON,1 ;Borramos el señalizador
bsf INTCON,7 ;Interrupciones habilitadas
retfie ;Salimos de las interrupciones
Prof. Luis Zurita 15 Microcontroladores I
16. ;***********************
;***Programa Principal***
;***********************
INICIO bsf STATUS,5 ;Vamos al banco 1 a configurar
movlw 1FH
movwf TRISA
movlw B'00000001' ;RB0= Entrada, Resto Salidas
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 activación 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 ;MÍNIMO?
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)MÁXIMO?
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)MÁXIMO?
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 16 Microcontroladores I
17. 4. Realice la automatización 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,
reiniciándose 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”.
Nota: Utilice el TMR0 para generar la rutina de 1 segundo.
Prof. Luis Zurita 17 Microcontroladores I
18. MEZCLADORA DE PINTURAS
PINTURA 1 PINTURA 2
B1 B2
Nivel Alto
TANQUE MEZCLADOR
Nivel Bajo
MM
VD
PINTURA PINTURA
LISTA LISTA
MA
Prof. Luis Zurita 18 Microcontroladores I
19. Nomenclaturas:
B1: Bomba 1
B2: Bomba 2
MM: Motor de Mezclado
VD: Válvula de Desagüe
MA: Motor de Avance
Paso 1. Enunciado y delimitación 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 Válvula RB3
Pintura 1
Sensor Nivel Bajo RA3 Válvula RB4
Pintura 2
Sensor “PARE” RB0 Motor RB5
Mezclado
Válvula RB6
Desagüe
Motor RB7
Avance
Prof. Luis Zurita 19 Microcontroladores I
20. El circuito quedaría 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 VÁLVULA DESAGUE
VSS VSS
PINTURA PINTURA
RB7
LISTA LISTA
MOTOR AVANCE
RB7
Prof. Luis Zurita 20 Microcontroladores I
21. 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=Válvula de Desagüe
LMARCHA=ON B1= Válvula de Llenado Pintura 1 LPARE=OFF
LPARE=OFF B2= Válvula 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 Lógica de los sensores=
0=Activado retfie
1= Desactivado
NO ¿NALTO
=0?
SI
B2=OFF
MM=ON
RET1M
MM=OFF
1
Prof. Luis Zurita 21 Microcontroladores I
22. 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 Interrupción***
;***********************************
RSI btfss INTCON,1 ;INTF=1?
goto SALIR ;No. Salimos de la Interrupción
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 señalizador 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
Prof. Luis Zurita 22 Microcontroladores I
23. ;**********************
;***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
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
Prof. Luis Zurita 23 Microcontroladores I
25. goto ESPERA4
decfsz REGAUX1,1
goto RECAR5
decfsz REGAUX2,1
goto RECAR4
return
end ;Fin del programa
Prof. Luis Zurita 25 Microcontroladores I
26. 5. Se desea automatizar una lavadora “CHACACHACA” bajo dos modos de
lavado (uno de Lavado Rápido de 30 minutos de duración y otro de
Lavado Lento de 50 minutos de duración), el sistema constará de un
pulsador de “INICIO” y un interruptor selector de modo de lavado.
Automatice bajo las siguientes condiciones:
Se elige entre lavado rápido ó lento
Se presiona “INICIO” y realiza lo siguiente:
Se llena la CHACACHACA hasta el nivel de agua máximo; lava ó “bate”
por la mitad del tiempo; se detiene; se vacía; se llena otra vez de agua;
lava ó “bate” hasta que falten tres minutos; se detiene; se vacía; se llena
otra vez de agua; lava ó “bate” por el resto del tiempo; se vacía
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 depósito de agua, se detiene el lavado, se cierra la
válvula de llenado y se emite una alarma sonora hasta que se solucione el
problema agregando agua al depósito hasta el nivel mínimo de lavado.
ML: Motor de Lavadora. VD: Válvula de Desagüe. VLL: Válvula de
Llenado.
Nmínimo, Nmáximo, Nmínimo de lavado, Nivel de alarma: Sensores
de nivel.
Prof. Luis Zurita 26 Microcontroladores I
27. Nota: Utilice el TMR0 para generar la rutina de 1 segundo.
Paso 1. Enunciado y delimitación 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” RA0 Motor de RB1
de Lavado Lavadora
Pulsador “INICIO” RA1 Válvula de RB2
Desagüe
Sensor Nivel Mínimo RA2 Válvula de RB3
Llenado
Sensor Nivel Máximo RA3 Led RB4
“INICIO”
Sensor Nivel Mínimo RA4 Led RB5
de lavado “Rápido”
Sensor Nivel de RB0 Led “Lento” RB6
Alarma
ALARMA RB7
Como podemos observar, de manera común, se asignan las entradas al
puerto A y las salidas al puerto B.
Prof. Luis Zurita 27 Microcontroladores I
28. El circuito del hardware a simular quedaría de la siguiente manera:
VDD
RB7
RA4
VSS
ALARMA NMÍNIMO DE LAVADO
VDD
DEPÓSITO
VSS DE AGUA
RB3
RB0
VSS
VÁLVULA DE LLENADO
NIVEL DE ALARMA
PANEL DE CONTROL
VDD
VDD
VSS
ON NIVEL ALTO
RA1
INICIO RB4 LAVADORA RA3
VDD RÁPIDO
RB5
VDD
LENTO
LAVADO RA0
RB6
RB1
NIVEL BAJO
RB2
RA2
MOTOR MZ VÁLVULA DESAGUE
VSS VSS
Prof. Luis Zurita 28 Microcontroladores I
29. Paso 2. Diagramas de Flujo:
INICIO LEYENDA: 1
VD=Válvula de Desagüe
VLL= Válvula de Llenado
Declarar Registros de NMAX= Sensor Nivel Máximo
trabajo NMIN=Sensor Nivel Mínimo VLL=OFF
NMINLAV=Sensor Nivel Mínimo 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?
Lógica de los sensores=
A
0=Activado SI
Limpiar Registros en general 1= Desactivado
y Puerto B VD=OFF
VLL=ON
(Lento) Led Rápido=OFF
NO Led Lento=ON
¿INTLAV?
ContaMed=12 NO
ContaLav=25 ¿NMAX=0?
(Rápido) SI
SI
Led Rápido=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 29 Microcontroladores I
30. 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 30 Microcontroladores I
31. 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 interrupción
PA_TEMP EQU 32H
PB_TEMP EQU 33H
PC_TEMP EQU 34H
CONTA EQU 35H ;Registro contador de comparación
CONTAMED EQU 20H ;Registro que se cargará con el tiempo
;medio de la duración 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 Interrupción***
;***********************************
RUTIN BCF INTCON,7 ;Deshabilitamos las interrupciones
BTFSS INTCON,5
GOTO SALIR
MOVWF W_TEMP ;Salvamos el entorno durante la
SWAPF W_TEMP,1 ;Interrupción 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
Prof. Luis Zurita 31 Microcontroladores I
32. 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
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 RÁPIDO= ON
BCF PORTB,6 ;LENTO OFF
Prof. Luis Zurita 32 Microcontroladores I
33. MOVLW D'12' ;Precargamos los valores
MOVWF CONTAMED ;Para el lavado rápido
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?
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
Prof. Luis Zurita 33 Microcontroladores I
34. 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
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
Prof. Luis Zurita 34 Microcontroladores I
35. ;***************************************
;***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 35 Microcontroladores I