Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Guía de ejercicios resueltos y propuestos tema 4
1. GUÍA DE EJERCICIOS RESUELTOS Y
PROPUESTOS
TEMA 4:
TIMER 0 E INTERRUPCIONES
Prof. Luis Zurita 1 Microcontroladores I
2. 1. Realicemos un programa completo que contenga varias interrupciones.
Si la causa ha sido la activación 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 y determinar la causa de una interrupción, y ejecutar las tareas
alizar
que le correspondan a la interrupción que se ha activado.
Paso 1. Diagrama de Flujo. Es el mismo que se mostró en la clase de teoría:
Prof. Luis Zurita 2 Microcontroladores I
3. 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 interrupción para que se
goto RUTINTERR ; Ejecute la rutina de interrupción
RUTINTERR movwf W_TEMP ; Se inicia a la rutina de servicio de
swapf W_TEMP,1 ; interrupción (RSI)
movf STATUS,0
movwf ESTADO_TEMP
btfsc INTCON,0 ; Se empieza exploración de causa de
goto INTERRB47 ; interrupción. 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 interrupción
SALIRINT bsf INTCON,7 ; Se habilita GIE, para permitir de nuevo otra
movf ESTADO_TEMP,0 ; Interrupción y se restaura el entorno
movwf STATUS
swapf W_TEMP,0
retfie ; El uso de return o retlw k, puede producir
; errores en la ejecución 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
señalizador de esta
goto SALIRINT ; Interrupción
Prof. Luis Zurita 3 Microcontroladores I
4. ;*** Subrutina de tratamiento de activación de INT/RB0 ***
INTERRB0 movlw 02H
movwf PORTA
bcf INTCON,1 ; Se borra por software el señalizador
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 señalizador
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: ¿Cómo 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 interrupción, internamente el procesador lee el nibble
;alto del puerto B y hace una copia; la interrupción se genera cuando la lectura del
;nibble alto del puerto B difiere de la ;copia. Dentro de la ejecución de esta rutina
;de interrupción, 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
5. 2. Genere una señal cuadrada de 200 Hz. Diseño libre.
Este ejercicio permite generar una señal cuadrada, con el desborde del
TMR0, sea o no por interrupción. Se muestran los dos casos, sin embargo
se recomienda el manejo por interrupción por ser de mayor efectividad y
de aprovechamiento de recursos disponibles en los PIC’s.
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∗ቀ ቁ∗ 64
4ݖܪ ܯ
்ܸெ ோை = 256 − ܸ݈ܽ
݈ܸܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ
்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎெ ோை = 256 − 39 = 217
Por lo que el valor a cargar en el TMR0= 217
Prof. Luis Zurita 5 Microcontroladores I
6. Paso 2. Diagrama de Flujo:
Prof. Luis Zurita 6 Microcontroladores I
7. 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' ; 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
8. 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 ;Vector de inicio
goto INICIO ;del programa principal
org 04H ;Vector de inicio de
goto RSI ;la subrutina de interrupción
;*****************************************
;***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
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' ; Reloj interno (Temporizador) Predivisor
movwf OPTION_REG ; asignado a TMR0, valor= 128
movlw B'10100000' ; Habilitamos las interrupciones
Prof. Luis Zurita 8 Microcontroladores I
9. 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.
3. Diseñe un control de nivel para un tanque.
Este ejercicio muestra el uso de un botón, pulsador o sensor de
emergencia, que debe detener todo el proceso de manera automática,
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 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
Prof. Luis Zurita 9 Microcontroladores I
10. 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
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.
Prof. Luis Zurita 10 Microcontroladores I
12. 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 12 Microcontroladores I
13. 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
;***********************
;***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
14. 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 14 Microcontroladores I
15. 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”.
Este ejercicio muestra el uso de un botón, pulsador o sensor de
emergencia, que debe detener todo el proceso de manera automática,
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
interrupción sino por polling, puede ser sustituida por una rutina de 1
segundo generada por el PICDEL)
Prof. Luis Zurita 15 Microcontroladores I
16. 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
17. 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 17 Microcontroladores I
18. 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 18 Microcontroladores I
19. 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 19 Microcontroladores I
20. 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
;**********************
;***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
21. 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
22. ;*********************************
;***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 simulación
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
23. 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:
Este ejercicio muestra el uso de un botón, pulsador o sensor de emergencia,
que debe detener todo el proceso de manera automática, protegiendo al
operador o a los equipos. Se introduce el concepto de “Salvar/Restaurar el
entorno”.
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.
Nota: Utilice el TMR0 para generar la rutina de 1 segundo.
Prof. Luis Zurita 23 Microcontroladores I
24. 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” de RA0 Motor de RB1
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 Alarma RB0 Led “Lento” RB6
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 24 Microcontroladores I
25. 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
LAVADORA0
RB6
RB1
NIVEL BAJO
RB2
RA2
MOTOR MZ VÁLVULA DESAGUE
VSS VSS
Prof. Luis Zurita 25 Microcontroladores I
26. 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 26 Microcontroladores I
27. 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
28. 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
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
29. 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
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?
Prof. Luis Zurita 29 Microcontroladores I
30. 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
31. 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
32. 6. PROGRAMA PARA GENERAR UN CONTADOR DE 00-99 mediante interrupción 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 clásico 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 interrupción del TMR0, permitiendo utilizar el programa principal para
tareas de automatización.
Paso 2. Diagrama de Flujo
INICIO
RSI TMR0 (50ms)
Configurar
Puerto A y B Borramos el
Señalizador 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 Interrupción
SI
Programa Principal
Prof. Luis Zurita 32 Microcontroladores I
33. 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 INTERRUPCIÓN
GOTO RUTIN ;VA A RUTINA DE INTERRUPCIÓN
;*****************************
;****SUBRUTINA DE INTERRUPCIÓN****
;*****************************
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 INTERRUPCIÓN
Prof. Luis Zurita 33 Microcontroladores I
34. ;********************************
;****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 INTERRUPCIÓN GLOBAL GIE=1.
CLRF UNIDAD ;PUESTA A 0 DE UNIDAD Y DECENA QUE SE MOSTRARÁN
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 NÚMERO 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 INTERRUPCIÓN DE TMR0. TOIE=1
;***SE QUEDA MOSTRANDO UNIDAD Y DECENA EN DISPLAY
;HASTA QUE SE CUENTEN 100 ESTADOS (FUNCIÓN 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
35. 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 CONVERSIÓN DE BCD A 7 SEGMENTOS****
;************************************************
;TABLA: ESTA RUTINA CONVIERTE EL CÓDIGO BCD PRESENTE EN LOS 4 BITS DE MENOS PESO
;DEL REG. W EN SU EQUIVALENTE A 7 SEGMENTOS. EL CÓDIGO 7 SEGMENTOS RETORNA TAMBIÉN
;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
36. 7. Generar la siguiente señal. (Use Timer 0 e interrupción) (Este tipo de
señal es utilizada como señal patrón para algunas pruebas que realizan
los estudiantes de Ingeniería en Electrónica) (no aplica para los
estudiantes de Ingeniería en Instrumentación y Control)
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
Prof. Luis Zurita 36 Microcontroladores I
37. 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∗ቀ ቁ∗ 256
4ݖܪ ܯ
்ܸெ ோை = 256 − ܸ݈݈ܸܽܽ → 0ܴ ܯ݈ܴܶܽ݁ݎ
்ܸ − 652 = 0ܴ ܯ݈ܴܶܽ݁ݎெ ோை = 256 − 195
= 61
Por lo que el valor a cargar en el TMR0= 61
¿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:
Paso 2. Diagrama de Flujo:
Prof. Luis Zurita 37 Microcontroladores I
38. INICIO RSI
Declarar Deshabilitar
CONTADOR Interrupciones
Configurar NO
Puerto A y B ¿TOIF=1? SALIR
SI
Configurar
SUBE
INTCON y OPTION_REG Borramos el
Señalizador 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 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
;********************************
;***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
Prof. Luis Zurita 38 Microcontroladores I
39. 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
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
40. 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 40 Microcontroladores I