Prof. Luis Zurita 1 Microcontroladores I
GUÍA DE EJERCICIOS RESUELTOS Y
PROPUESTOS
TEMA 4:
TIMER 0 E INTERRUPCIONES
Prof. Luis Zurita
1. Realicemos un programa completo que contenga varias interrupciones.
Si la causa ha sido la activación del pin
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.
analizar y determinar la causa de una interrupción, y ejecutar las tareas
que le correspondan a la interrupción que se ha activado.
Paso 1. Diagrama de Flujo.
2 Microcontroladores I
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
alizar y determinar la causa de una interrupción, y ejecutar las tareas
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:
Microcontroladores I
Realicemos un programa completo que contenga varias interrupciones.
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,
Este ejercicio permite
alizar y determinar la causa de una interrupción, y ejecutar las tareas
que le correspondan a la interrupción que se ha activado.
Es el mismo que se mostró en la clase de teoría:
Prof. Luis Zurita 3 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 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 4 Microcontroladores I
;*** 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 5 Microcontroladores I
2. Genere una señal cuadrada de 200 Hz. Diseño libre.Este ejercicio permite generar una señal cuadrada, con el desborde delTMR0, sea o no por interrupción. Se muestran los dos casos, sin embargose recomienda el manejo por interrupción por ser de mayor efectividad yde 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á laseñal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los cálculos que sehayan realizado para generar el retardo deseado.
Para una frecuencia de 200 Hz, tendremos un período de:
ܨ =1
ݎ ݑݍ =
1
ܨ=
1
200 ݖܪ= 5 ݏ
Como no se ha especificado el ciclo de trabajo, asumiremos el 50 %, por loque 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,asumiremos el estándar de 4 MHz:
ெ ோை =2,5 ݏ
4 ∗ ቀ1
ݖܪܯ4ቁ∗ 64
= 39,0625 ≅ 39
ெ ோை = 256 − ݎ ܯ 0 → ݎ ܯ 0 = 256 − ெ ோை = 256 − 39 = 217
Por lo que el valor a cargar en el TMR0= 217
Prof. Luis Zurita 6 Microcontroladores I
Paso 2. Diagrama de Flujo:
Prof. Luis Zurita 7 Microcontroladores I
Paso 3. Lenguaje ensamblador:
FORMA A. POR EXPLORACIÓN (POLLING) DEL BIT TOIF:
list P=16F84Ainclude P16F84A.inc
org 00Hgoto INICIO
;************************************;***PROGRAMA PRINCIPAL***;************************************INICIO bsf STATUS,5 ;Zona de configuraciones
clrf TRISBmovlw B'00010101' ; Reloj interno (Temporizador) Predivisormovwf OPTION_REG ; asignado a TMR0, valor= 128bcf STATUS,5clrf PORTB ;Inicializamos el Puerto Bnop
Prof. Luis Zurita 8 Microcontroladores I
CICLO bsf PORTB,0 ;Señal a nivel altocall DELAY2_5MS ;Llamamos subrutina 2,5 msbcf PORTB,0 ;Señal a nivel bajocall DELAY2_5MS ;Llamamos subrutina 2,5 msgoto CICLO ;Repetimos ciclo
DELAY2_5MS movlw .217 ;Cargamos TMR0 con valormovwf TMR0 ;calculado previamentebcf INTCON,2 ;Borramos el señalizador
ESPERA btfss INTCON,2 ;Se desbordó el TMR0?goto ESPERA ;No. Seguimos esperamosreturn ;Si, han transcurrido 2,5 msend
FORMA B. POR INTERRUPCIÓNlist P=16F84Ainclude P16F84A.inc
org 00H ;Vector de iniciogoto INICIO ;del programa principalorg 04H ;Vector de inicio degoto 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, Salimosbcf INTCON,2 ;Si, borramos el señalizador TOIFmovlw .01xorwf PORTB,1movlw .217 ;Cargamos el valor del TMR0movwf TMR0 ;Para una nueva temporización
SALIR bsf INTCON,7 ;Habilitamos las interrupcionesretfie
;*************************************;***PROGRAMA PRINCIPAL***;*************************************INICIO bsf STATUS,5
clrf TRISBmovlw B'00010101' ; Reloj interno (Temporizador) Predivisormovwf OPTION_REG ; asignado a TMR0, valor= 128movlw B'10100000' ; Habilitamos las interrupciones
Prof. Luis Zurita 9 Microcontroladores I
movwf INTCON ;Con GIE=1 y TOIE=1bcf STATUS,5clrf PORTB ;Inicializamos el Puerto Bmovlw .217 ;Cargamos el TMR0 con elmovwf TMR0 ;valor previamente calculado
SINFIN clrwdt ;Usamos esta instrucción paragoto 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 modificacionesdentro de la rutina de interrupción, se salva el entorno (Se verán en los ejemplos3, 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á labomba 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 debajodel nivel máximo, se activará la bomba 2 hasta que se alcance el nivelMá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 deoperación
Prof. Luis Zurita 10 Microcontroladores I
SOLUCIÓN:
Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sinembargo debemos delimitar el hardware.
Para lograr esta tarea debemos asignar los pines de control de Entrada y desalida, con la finalidad de saber qué vamos a controlar y quién nos dará lainformación.
Como el sensor de parada se va a utilizar por interrupción de cambio denivel de RB0, este será configurado como entrada
Debemos identificar cuales elementos son entrada y cuales salida:
ENTRADA ¿Qué pinAsignamos?
SALIDA ¿Qué pinAsignamos?
Interruptor “INICIO” RA0 Bomba B1 RB3Sensor Máximo RA1 Bomba B2 RB1
Sensor Mínimo RA2 IndicadorManual
RB2
Sensor Parada RB0 Indicador Auto RB3
Sensor Operación RA3
¿Y si quiero asignar otros pines? Perfecto, queda a libre elección.
MODO
ManualAuto
PARADA
OPERACIÓN
Prof. Luis Zurita 11 Microcontroladores I
R11k
R31k
OSC1/CLKIN16
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
RA017
RA118
RA21
RA32
RA4/T0CKI3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
X1
C1
22p
C2
22p
VDD
VDD
R21k
VDD
VSS
VSSVSS
VSS
VSS
VSS
NIVEL MÁXIMO
VSS
MANUAL
AUTO
RB2
RB2
SENSOR NIVEL ALTO
SENSOR NIVEL BAJO
PARADA
OPERACIÓN
TANQUE
PRINCIPALB1M1 B2 M2
TANQUE SUBTERRÁNEO
MODO
RA0
RA0
RA1
RA1RA2
RA2
RB1
RB
1
RB
3
R1A1k
VDD
VSS
RB0
R1B1k
VDD
VSS
RA3
RB3
RB0
RA3VDD
RB4
RB4
Prof. Luis Zurita 12 Microcontroladores I
Paso 2. Diagrama de Flujo:
INICIO
ConfigurarPuerto A y B
Bomba 1= OFFBomba 2=OFF
¿Manual?Bomba 1= ONBomba 2= ON
¿NivelMínimo?
¿NivelMáximo?
Bomba 1= ONBomba 2= OFF
¿NivelMáximo?
Bomba 1= OFFBomba 2= OFF
Bomba 1= OFFBomba 2= ON
M
M
M
SI
NO
SI
NO
SI
NO
SI
NO
ConfigurarINTCON
RSI
Salvar entorno
¿Llegó aNoperación?
Bomba 1= OFFBomba 2= OFF
SI
NO
DeshabilitarInterrupciones
¿INTF=1?
SI
NOSALIR
Restaurar entorno
SALIR
HabilitarInterrupciones
INTF=0
retfie
Auto
Prof. Luis Zurita 13 Microcontroladores I
Paso 3. Del Diagrama de Flujo al Lenguaje Ensamblador:
list P=16F84Ainclude P16F84A.INC
WTEMP equ 20H ;Declaramos registros paraPBTEMP equ 21H ;Utilizarse para salvar y restaurarSTATEMP equ 22H ;El entorno
org 00H ;Vector de Iniciogoto INICIOorg 04H ;Vector de Interrupcióngoto RSI
;*************************************;***Rutina de servicio de Interrupción***;*************************************RSI bcf INTCON,7 ;Interrupciones deshabilitadasPUSH movwf WTEMP ;Salvamos el entorno
movf STATUS,0movwf STATEMPmovf PORTB,0movwf PBTEMPbtfss INTCON,1 ;INTF=1? Fue por RB0/INT?goto PULL ;No. Salimos de la RSI
SI bcf PORTB,2bcf PORTB,3 ;Bomba 1= OFFbcf 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ónPULL movf PBTEMP,0 ;Restauramos el entorno
movwf PORTBmovf STATEMP,0movwf STATUSmovf WTEMP,0bcf INTCON,1 ;Borramos el señalizadorbsf INTCON,7 ;Interrupciones habilitadasretfie ;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 14 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 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 15 Microcontroladores I
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 sistemaesta en marcha.
Transcurrido este tiempo, se enciende B2. B1, MM, VD, MA, deben estarapagados.
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 mantienenapagados.
MM se mantiene encendido por espacio de 2 minutos. B1, B2, VD, MA semantienen apagados. Una vez transcurrido este tiempo, se detiene MM.
Se activa VD, hasta que se activa el sensor “Nivel bajo”, mediante el cual secierra VD y se activa MA por espacio de 7,5 minutos, reiniciándose elproceso nuevamente.
El sistema cuenta con un pulsador de “PARE”, que al activarse encualquier momento detiene todo el proceso, apagando B1, B2, VD, MM y MA,activando un led rojo y apagando al led verde, indicando que existe unaparada del proceso.
Para reiniciar el proceso nuevamente en donde se quedó al momento dedetenerlo, 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 16 Microcontroladores I
MEZCLADORA DE PINTURAS
TANQUE MEZCLADOR
MM
PINTURA 2PINTURA 1
Nivel Alto
Nivel Bajo
B B
VD
PINTURA
LISTA
MA
PINTURA
LISTA
Prof. Luis Zurita 17 Microcontroladores I
Nomenclaturas:B1: Bomba 1B2: Bomba 2MM: Motor de MezcladoVD: Válvula de DesagüeMA: Motor de Avance
Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sinembargo debemos delimitar el hardware.
Debemos identificar cuales elementos son entrada y cuales salida:
ENTRADA ¿Qué pinAsignamos?
SALIDA ¿Qué pinAsignamos?
Pulsador “MARCHA” RA0 Led Marcha RB1Pulsador “REINICIO” RA1 Led PARE RB2Sensor Nivel Alto RA2 Válvula
Pintura 1RB3
Sensor Nivel Bajo RA3 VálvulaPintura 2
RB4
Sensor “PARE” RB0 MotorMezclado
RB5
VálvulaDesagüe
RB6
MotorAvance
RB7
Prof. Luis Zurita 18 Microcontroladores I
El circuito quedaría de la siguiente manera:
PINTURA 1 PINTURA 2
NIVEL ALTO
NIVEL BAJO
CAJA DE CONTROL
MARCHA
PARE
REINICIO
TANQUE
MEZCLADOR
MOTOR MZ
MOTOR AVANCE
VÁLVULA DESAGUE
VDD
VDD
RA2
RA3
VSS
VSS
RB
3
RB
4
RB
5
VSS
RB6
VSS
RB
7
VSS
VDD
VDD
VDD
RA0
RB0
RA1
RB1
RB2
PINTURA
LISTA
PINTURA
LISTA
RB7
Prof. Luis Zurita 19 Microcontroladores I
Paso 2. Diagramas de Flujo:
INICIO
ConfigurarPuerto A y B
Limpiar Registros en generaly Puerto B
¿MARCHA=0?
B1=ONB2=OFFMM=OFFVD=OFFMA=OFF
LMARCHA=ONLPARE=OFF
SI
NO
ConfigurarINTCON y OPTION_REG
Declarar Registros detrabajo
LEYENDA:VD=Válvula de Desagüe
B1= Válvula de Llenado Pintura 1B2= Válvula de Llenado Pintura 2
LMARCHA= Led MarchaLPARE= Led Pare
NALTO= Sensor Nivel AltoNBAJO=Sensor Nivel Bajo
MM= Motor MezcladoMA= Motor de Avance
MARCHA= Pulsador de inicioPARE= Pulsador de parada
REINICIO= Pulsador de reinicio del procesoLógica de los sensores=
0=Activado1= Desactivado
¿NALTO=0?
NO
SI
B2=OFFMM=ON
VD=ON
¿NBAJO=0?
NO
SI
1
VD=OFFMA=ON
RET7_5S
1
A
RET13SEG
B1=OFFB2=ON
LMARCHA=ONLPARE=OFF
RET1M
MM=OFF
MA=OFF
1
RSI
Salvar entorno
¿REINICIO=0?
SI
NO
DeshabilitarInterrupciones
¿INTF=1?
SI
NOSALIR
Restaurar entorno
SALIR
HabilitarInterrupciones
INTF=0
retfie
LPARE=OFF
B1=OFFB2=OFFMM=OFFVD=OFFMA=OFF
LMARCHA=OFFLPARE=ON
Prof. Luis Zurita 20 Microcontroladores I
Paso 3. Lenguaje Ensamblador:list P=16F84Ainclude p16F84A.inc
W_TEMP equ 20H ;Declaramos los registrosESTADO_TEMP equ 21H ;A utilizar para salvar y restaurarPB_TEMP equ 22H ;El entornoREGAUX1 equ 23H ;Registros para generar retardosREGAUX2 equ 24H ;Por Software
org 00Hgoto INICIOorg 04Hgoto RSI
;***********************************;***Rutina de Servicio de Interrupción***;***********************************RSI btfss INTCON,1 ;INTF=1?
goto SALIR ;No. Salimos de la Interrupciónmovwf W_TEMP ;Salvamos el entornoswapf W_TEMP,1movf STATUS,0movwf ESTADO_TEMPmovf PORTB,0movwf PB_TEMPmovlw b'00000100' ;Si. Todo OFF. LPARE= ONmovwf PORTB ;(ROJO=ON)
REINI btfsc PORTA,1 ;Se pulsó REINICIO?goto REINI ;Esperamosbcf INTCON,1 ;Borramos señalizador INTFmovf PB_TEMP,0 ;Restauramos el entornomovwf PORTBmovf ESTADO_TEMP,0movwf STATUSswapf W_TEMP,0
SALIR bsf INTCON,7 ;Habilitamos las interrupcionesretfie ;Salimos de la RSI
;**********************;***Programa Principal ***;**********************INICIO bsf STATUS,5 ;Configuramos los Puertos
movlw 01FHmovwf TRISA ;PA como entradamovlw b'00000001'movwf TRISB ;PB como entrada/salidamovlw b'01000111' ;Prescaler= 256
Prof. Luis Zurita 21 Microcontroladores I
movwf OPTION_REG ;Y configuramos el flanco de RBO/INT
movlw b'10010000' ;GIE= 1 y INTE=1movwf INTCONbcf STATUS,5clrf PORTB ;Limpiamos el Puerto B
EMPIEZA btfsc PORTA,0 ;Se pulsó “INICIO”goto EMPIEZA ;No. Esperamos
REPITE bsf PORTB,3 ;B1= ONbsf PORTB,1 ;Led Marcha=ON (Verde= ON)bcf PORTB,2 ;Led PARE=OFFbcf PORTB,4 ;B1=OFFbcf PORTB,5 ;MM=OFFbcf PORTB,6 ;VD=OFFbcf PORTB,7 ;MA=OFFcall RET13 ;Llamamos a Subrutina de 13 seg.bcf PORTB,3 ;B1= OFFbsf PORTB,4 ;B2= ON
NAOK btfsc PORTA,2 ;Nivel Alto= 0?goto NAOK ;No. Esperamosbcf PORTB,4 ;B2= OFFbsf PORTB,5 ;MM= ONcall RET1M ;Llamamos subrutina de 1 minuto.bcf PORTB,5 ;MM= OFFbsf PORTB,6 ;VD= ON
NBOK btfsc PORTA,3 ;Nivel Bajo= 0?goto NBOK ;No. Esperamosbcf PORTB,6 ;VD= OFFbsf PORTB,7 ;MA= ONcall RET7_5 ;Subrutina de 7,5 segbcf PORTB,7goto REPITE
;**********************************;***Rutina de 7,5 segundos***;**********************************RET7_5 bcf INTCON,2
movlw d'114'movwf REGAUX1
RECAR75 bcf INTCON,2clrf TMR0
ESPERA1 btfss INTCON,2goto ESPERA1decfsz REGAUX1,1goto RECAR75return
Prof. Luis Zurita 22 Microcontroladores I
;*********************************;***Rutina de 13 segundos***;*********************************RET13 bcf INTCON,2
movlw d'198'movwf REGAUX1
RECAR13 bcf INTCON,2clrf TMR0
ESPERA2 btfss INTCON,2goto ESPERA2decfsz REGAUX1,1goto RECAR13return
;****************************;***Rutina de 1 minuto***;****************************RET1M movlw d'30' ;Original= 60, se cambió para la simulación
movwf REGAUX2RECAR4 movlw d'15'
movwf REGAUX1RECAR5 bcf INTCON,2
clrf TMR0ESPERA4 btfss INTCON,2
goto ESPERA4decfsz REGAUX1,1goto RECAR5decfsz REGAUX2,1goto RECAR4returnend ;Fin del programa
Prof. Luis Zurita 23 Microcontroladores I
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 vezde agua; lava ó “bate” por el resto del tiempo; se vacía nuevamente y emiteuna alarma sonora por espacio de 10 segundos; y se detiene a la espera deun nuevo proceso de lavado.
Si no hay agua en el depósito de agua, se detiene el lavado, se cierra laválvula de llenado y se emite una alarma sonora hasta que se solucione elproblema 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 deLlenado.
Nmínimo, Nmáximo, Nmínimo de lavado, Nivel de alarma: Sensores denivel.
Nota: Utilice el TMR0 para generar la rutina de 1 segundo.
Prof. Luis Zurita 24 Microcontroladores I
Paso 1. Enunciado y delimitación del Hardware: Tenemos el enunciado, sinembargo debemos delimitar el hardware.
Debemos identificar cuales elementos son entrada y cuales salida:
ENTRADA ¿Qué pinAsignamos?
SALIDA ¿Qué pinAsignamos?
Interruptor “MODO” deLavado
RA0 Motor deLavadora
RB1
Pulsador “INICIO” RA1 Válvula deDesagüe
RB2
Sensor Nivel Mínimo RA2 Válvula deLlenado
RB3
Sensor Nivel Máximo RA3 Led“INICIO”
RB4
Sensor Nivel Mínimode lavado
RA4 Led“Rápido”
RB5
Sensor Nivel de Alarma RB0 Led “Lento” RB6ALARMA RB7
Como podemos observar, de manera común, se asignan las entradas alpuerto A y las salidas al puerto B.
Prof. Luis Zurita 25 Microcontroladores I
El circuito del hardware a simular quedaría de la siguiente manera:
NIVEL ALTO
NIVEL BAJO
PANEL DE CONTROL
INICIO
LAVADO
LAVADORA
MOTOR MZ VÁLVULA DESAGUE
VDD
VDD
RA3
RA2
VSS
RB
3
RB
1
VSS
RB2
VSS
VSS
VDD
VDD
VDD
RA1
RB0
RA4
RB4
RB5
VSS
DEPÓSITO
DE AGUA
NIVEL DE ALARMA
NMÍNIMO DE LAVADO
VÁLVULA DE LLENADO
VDD
RA0RB6
ON
RÁPIDO
LENTO
RB
7
VSS
ALARMA
Prof. Luis Zurita 26 Microcontroladores I
Paso 2. Diagramas de Flujo:
INICIO
ConfigurarPuerto A y B
Limpiar Registros en generaly Puerto B
¿INTLAV?
Led Rápido=ONLed Lento=OFFContaMed=22ContaLav=45
¿INICIO?
SI
NO
ConfigurarINTCON y OPTION_REG
(Rápido)
Declarar Registros detrabajo
Led Rápido=OFFLed Lento=ONContaMed=12ContaLav=25
(Lento)
NO
SI
VD=OFFLed Inicio=ON
VLL=ON
LEYENDA:VD=Válvula de DesagüeVLL= Válvula de Llenado
NMAX= Sensor Nivel MáximoNMIN=Sensor Nivel Mínimo
NMINLAV=Sensor Nivel Mínimo de LavadoMotorL= Motor Lavadora
CONTA=Contador de minutosCONTAMEDIO=Contador precargado con la
mitad del tiempoCONTALAV=Contador precargado con el
tiempo total de lavadaLógica de los sensores=
0=Activado1= Desactivado
¿NMAX=0?NO
SI
VLL=OFFMotorL=ON
¿CONTA=CONTAMEDIO?
NO SI
RET1MIN
CONTA=CONTA+1
1
VLL=OFFMotorL=OFF
VD=ON
¿NMIN=0?NO
SI
1
VD=OFFVLL=ON
¿NMAX=0?NO
SI
VLL=OFFMotorL=ON
CONTALAV=CONTALAV-3
¿CONTA=CONTALAV?
NO
SI
RET1MIN
CONTA=CONTA+1
2
VLL=OFFMotorL=OFF
VD=ON
¿NMIN=0?NO
SI
A
Prof. Luis Zurita 27 Microcontroladores I
SI
VD=OFFVLL=ON
¿NMAX=0?NO
SI
VLL=OFFMotorL=ON
RET1MIN
2
RET1MIN
RET1MIN
VLL=OFFMotorL=OFF
VD=ON
¿NMIN=0?NO
SI
RET10SEG
A
Vamos al Iniciodel programa
para una nuevalavada
RSI
Salvar entorno
¿Llegó aNMINLAV?
ALARMA=ONMotorL= OFF
VLL= OFFVD=OFF
SI
NO
DeshabilitarInterrupciones
¿INTF=1?
SI
NOSALIR
Restaurar entorno
SALIR
HabilitarInterrupciones
INTF=0
retfie
ALARMA=OFF
Prof. Luis Zurita 28 Microcontroladores I
Paso 3. Lenguaje Ensamblador:
LIST P=16F84A
INCLUDE P16F84A.INC
;Declaraciones de registros:
RET4 EQU 2DH ;Registros para generarRET5 EQU 2EH ;Rutinas de retardoRET6 EQU 2FHW_TEMP EQU 30H ;Registros para salvar elSTATUS_TEMP EQU 31H ;Entorno durante la interrupciónPA_TEMP EQU 32HPB_TEMP EQU 33HPC_TEMP EQU 34HCONTA EQU 35H ;Registro contador de comparaciónCONTAMED EQU 20H ;Registro que se cargará con el tiempo
;medio de la duración del lavadoCONTALAV EQU 21H ;Registro que posee el tiempo total de
;lavadoCONTASEG EQU 22H ;Registro contador de segundos
ORG 00HGOTO INICIOORG 04HGOTO RUTIN
;***********************************;***Rutina de Servicio de Interrupción***;***********************************RUTIN BCF INTCON,7 ;Deshabilitamos las interrupciones
BTFSS INTCON,5GOTO SALIRMOVWF W_TEMP ;Salvamos el entorno durante laSWAPF W_TEMP,1 ;Interrupción al modificarse el Puerto BMOVF STATUS,0 ;dentro de la RSIMOVWF STATUS_TEMPMOVF PORTA,0MOVWF PA_TEMPMOVF PORTB,0MOVWF PB_TEMP
ESPERA BSF PORTB,7 ;SSONORA=ONBCF PORTB,1 ;ML=OFFBCF PORTB,2 ;VD=OFFBCF PORTB,3 ;VLL=OFFBTFSC PORTA,4 ;NMINLAV?GOTO ESPERABCF PORTB,7 ;SSONORA=OFF
POP MOVF PB_TEMP,0MOVWF PORTB
Prof. Luis Zurita 29 Microcontroladores I
MOVF PA_TEMP,0MOVWF PORTAMOVF STATUS_TEMP,0MOVWF STATUSSWAPF W_TEMP,1MOVF W_TEMP,0BCF INTCON,1 ;INTF=0
SALIR BSF INTCON,7 ;GIE=1RETFIE
;*****************************;***Programa Principal***;*****************************
INICIO BSF STATUS,5 ;Configuramos los Puertos A y BMOVLW 1FHMOVWF TRISAMOVLW B'00000001' ;RB0 como entradaMOVWF TRISBBCF OPTION_REG,6 ;Configuramos el flanco de RB0/INT
MOVLW B'10010000' ;Activamos GIE y INTEMOVWF INTCONBCF STATUS,5
NUEVOLAV CLRF CONTASEG ;Inicializamos los registrosCLRF CONTA ;Y el Puerto BCLRF PORTB
MODO BTFSS PORTA,0 ;¿Qué MODO es?GOTO MODOLENTO ;Ir al modo lentoBSF PORTB,5 ;Modo RÁPIDO= ONBCF PORTB,6 ;LENTO OFFMOVLW D'12' ;Precargamos los valoresMOVWF CONTAMED ;Para el lavado rápidoMOVLW D'25'MOVWF CONTALAVGOTO MARCHA ;Va a preguntar si se pulsó INICIO
MODOLENTO BCF PORTB,5 ;Activamos el MODO lentoBSF PORTB,6MOVLW D'22' ;Y precargamos los valoresMOVWF CONTAMED ;de este modoMOVLW D'45'MOVWF CONTALAVGOTO MARCHA
MARCHA BTFSC PORTA,1 ;¿INICIO?GOTO MODO ;No, vamos a explorar el MODO
ESPLL1 BSF PORTB,4 ;LEDINI=ONBSF PORTB,3 ;VLL ONBTFSC PORTA,3 ;NMAX?
Prof. Luis Zurita 30 Microcontroladores I
GOTO ESPLL1BCF PORTB,3 ;VLL OFFBSF PORTB,1 ;ML ON
SUBEMIN1CALL RET1s ;PARA SIMULACION, ES UN MINUTOINCF CONTA,1MOVF CONTAMED,0SUBWF CONTA,0 ;CONTA=CONTAMED?BTFSS STATUS,2 ;Z=1?GOTO SUBEMIN1
ESPVAC BCF PORTB,3 ;VLL OFFBCF PORTB,1 ;ML OFFBSF PORTB,2 ;VD ONBTFSC PORTA,2 ;NMIN?GOTO ESPVAC
ESPLL2 BCF PORTB,2 ;VD OFFBSF PORTB,3 ;VLL ONBTFSC PORTA,3 ;NMAX=0?GOTO ESPLL2BCF PORTB,3 ;VLL OFFBSF PORTB,1 ;ML ONDECF CONTALAV,1DECF CONTALAV,1DECF CONTALAV,1 ;A FALTA DE 3 MINUTOS
SUBEMIN2 CALL RET1s ;PARA SIMULACION, ES UNMINUTO
INCF CONTA,1MOVF CONTALAV,0SUBWF CONTA,0 ;CONTA=CONTALAV?BTFSS STATUS,2 ;Z=1?GOTO SUBEMIN2
ESPVAC2 BCF PORTB,3 ;VLL OFFBCF PORTB,1 ;ML OFFBSF PORTB,2 ;VD ONBTFSC PORTA,2 ;NMIN?GOTO ESPVAC2
ESPLL3 BCF PORTB,2 ;VD OFFBSF PORTB,3 ;VLL ONBTFSC PORTA,3 ;NMAX?GOTO ESPLL3BCF PORTB,3 ;VLL OFFBSF PORTB,1 ;ML ONCALL RET1sCALL RET1s ;ESPERA 3 MINUTOS FINALESCALL RET1s ;(SE SIMULA CON 1 SEG)
ESPVAC3 BCF PORTB,3 ;VLL OFFBCF PORTB,1 ;ML OFF
Prof. Luis Zurita 31 Microcontroladores I
BSF PORTB,2 ;VD ONBTFSC PORTA,2 ;NMIN?GOTO ESPVAC3BCF PORTB,2 ;VD OFF
PITAZO BSF PORTB,7 ;ALARMA SONORA ONCALL RET1sINCF CONTASEG,1MOVLW D'10'SUBWF CONTASEG,0BTFSS STATUS,2 ;10 SEG?GOTO PITAZOBCF PORTB,7 ;ALARMA SONORA OFFGOTO 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 watchdogdecfsz RET6, 1 ; 1 + (1) es el tiempo 0 ? (A)goto PLoop2 ; 2 no, loopdecfsz RET5, 1 ; 1 + (1) es el tiempo 0 ? (B)goto PLoop1 ; 2 no, loopdecfsz RET4, 1 ; 1 + (1) es el tiempo 0 ? (C)goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delayPDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
Prof. Luis Zurita 32 Microcontroladores I
6. PROGRAMA PARA GENERAR UN CONTADOR DE 00-99 mediante interrupción delTMR0
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 cantidadde estados que se muestra en los displays de 7 segmentos conectados directamente alPUERTO B. Como se van a mostrar todos los estados, es decir del 00 al 99, se utilizan dosregistros (UNIDAD y DECENA) sin tener que utilizar la rutina de binario a bcd. Porsimplicidad se colocó en el diagrama de flujo un solo registro contador que va aincrementarse, pero que en realidad incrementa un contador clásico de 00 a 99. Esteprograma muestra el uso de un registro auxiliar para obtener retardos mayores a losque se pueden obtener directamente con el TMR0. Adicional a esto realiza un contadorcon el uso de la interrupción del TMR0, permitiendo utilizar el programa principal paratareas de automatización.
Paso 2. Diagrama de Flujo
INICIO
ConfigurarOPTION_REG E INTCON
InicializamosPORTA Y B, CONTADORES
ConfigurarPuerto A y B
¿van 20desbordes?
SI
NO
RETFIE
Borramos elSeñalizador TOIF
¿CONTADOR=100?
SI
NO
Decf CONTAVECES
Programa Principal
Rutina de Interrupción
Cargamos valor calculadoen el TIMER0
CONTAVECES=20
incf CONTADOR
CONTADOR=0
Cargamos valorcalculado en el TIMER0
REGISTRO AUXILIARHABILITAMOS TOIE=1
RSI TMR0 (50ms)
¿ARRANCAR?
MOSTRAR
NO
SI
¿CONTADOR=100?
NO
SI
MOSTRAR
Prof. Luis Zurita 33 Microcontroladores I
Paso3. Lenguaje Ensamblador:
LIST P=16F84A ;TIPO DE PROCESADORINCLUDE P16F84A.INC ;DEFINICIONES DE REGISTROS INTERNOS
;*******************************;****ZONA DE DECLARACIONES******;*******************************UNIDAD EQU 20H ;UNIDADDECENA EQU 21H ;DECENACONTAVECES EQU 22H ;REGISTRO AUXILIAR, CONTADOR DE 20 DESBORDESCONTADOR EQU 23H ;CONTADOR GLOBAL DE 100 ESTADOSPDEL00 EQU 24H ;REGISTRO DE TIEMPO DEL PICDELPDEL11 EQU 25H ;REGISTRO DE TIEMPO DEL PICDEL
ORG 00H ;VECTOR DE RESETGOTO INICIOORG 04H ;VECTOR DE INTERRUPCIÓNGOTO RUTIN ;VA A RUTINA DE INTERRUPCIÓN
;*****************************;****SUBRUTINA DE INTERRUPCIÓN****;*****************************RUTIN BCF INTCON,T0IF ;REPONE FLAG DEL TMR0
DECFSZ CONTAVECES,F ;DECREMENTA EL CONTADORGOTO COMUNMOVLW .20 ;SI HAN OCURRIDO 20 DESBORDES (1000 MS) SE INCREMENTA
;EL CONTADOR EN EL DISPLAYMOVWF CONTAVECES ;REPONE EL CONTADOR DE DESBORDE DEL TMR0
SUBE MOVF UNIDAD,0SUBLW .9BTFSS STATUS,Z ;ES 9?GOTO SUBEUNI ;NO. VA A INCREMENTAR UNIDADCLRF UNIDAD ;SI. VA A SUBIR DECENAINCF CONTADOR,1MOVF DECENA,0SUBLW .9BTFSS STATUS,Z ;ES 9?GOTO SUBEDEC ;NO. VA A INCREMENTAR DECENACLRF DECENA ;SI. REINICIA EL CONTADOR
SUBEUNI INCF CONTADOR,1INCF UNIDAD,1GOTO COMUN
SUBEDEC INCF DECENA,1GOTO COMUN
COMUN MOVLW .61MOVWF TMR0 ;REPONE EL TMR0 CON 61 PARA NUEVO DESBORDERETFIE ;RETORNO DE INTERRUPCIÓN
Prof. Luis Zurita 34 Microcontroladores I
;********************************;****ZONA DE CONFIGURACIONES****;********************************INICIO CLRF PORTB ; BORRA LOS SEGMENTOS DE SALIDA
BSF STATUS,5 ; SELECCIONA BANCO 1MOVLW B'00000100' ;RA0 Y RA1 SALIDAS Y RA2 ENTRADAMOVWF TRISA ; PORTA SE CONFIGURACLRF TRISB ; PORTB SE CONFIGURA COMO SALIDAMOVLW 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ÁNCLRF DECENA ;EN EL DISPLAYCLRF 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 TMR0CARGA MOVLW .20 ;SI. CARGA EL REGISTRO AUXILIAR CON
MOVWF CONTAVECES ;EL Nº DE VECES DE DESBORDE DEL TMR0MOVLW .61 ;CARGA EL VALOR DEL PRIMER DESBORDEMOVWF TMR0 ;CARGA EL TMR0 CON 61BSF 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,0SUBLW .101BTFSS STATUS,2 ;UNIDAD=0?GOTO CICLO2 ;NO.CONTADOR LLEGÓ A 100 ESTADOS? ESPERAGOTO 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 OFFMOVF UNIDAD,WCALL TABLA ; CONVIERTE BCD A 7 SEGMENTOSMOVWF PORTB ; VISUALIZA EL VALOR DE LA UNIDADCALL DELAY5MS
Prof. Luis Zurita 35 Microcontroladores I
BCF PORTA,0 ;DISPLAY UNI OFFBSF PORTA,1 ;DISPLAY DEC ONMOVF DECENA,WCALL TABLA ; CONVIERTE BCD A 7 SEGMENTOSMOVWF PORTB ; VISUALIZA EL VALOR DE LA UNIDADCALL DELAY5MSRETURN
;************************************************;****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. WTABLA ADDWFPCL,1 ;PUNTERO O ENCABEZADO DE LA TABLA
RETLW B'11000000' ;0. VALOR 0RETLW B'11111001' ;1. VALOR 1RETLW B'10100100' ;2. VALOR 2RETLW B'10110000' ;3. VALOR 3RETLW B'10011001' ;4. VALOR 4RETLW B'10010010' ;5. VALOR 5RETLW B'10000011' ;6. VALOR 6RETLW B'11111000' ;7. VALOR 7RETLW B'10000000' ;8. VALOR 8RETLW 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, loopdecfsz PDel00, 1 ; 1 + (1) es el tiempo 0 ? (B)goto PLoop11 ; 2 no, loop
PDelL11 goto PDelL22 ; 2 ciclos delayPDelL22 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.END ;FIN DEL PROGRAMA
Prof. Luis Zurita 36 Microcontroladores I
7. Generar la siguiente señal. (Use Timer 0 e interrupción) (Este tipo deseñal es utilizada como señal patrón para algunas pruebas que realizanlos estudiantes de Ingeniería en Electrónica) (no aplica para losestudiantes de Ingeniería en Instrumentación y Control)
Paso 1. Enunciado y delimitación del problema:
Como no se ha especificado por cual pin del microcontrolador saldrá laseñal, asumiremos RB0.
Cuando se trabaja con el Timer 0, se deben incluir los cálculos que sehayan realizado para generar el retardo deseado.
En la gráfica, podemos extraer el período de la señal cuadrada cuyo valores de 100 ms, y asumiendo un ciclo de trabajo del 50 %, tendremos que la señal
100 ms
2 segundos
Prof. Luis Zurita 37 Microcontroladores I
en alto es igual a la señal en bajo, por lo tanto su duración o período será de 50ms.
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),asumiremos el estándar de 4 MHz:
ெ ோை =50 ݏ
4 ∗ ቀ1
ݖܪܯ4ቁ∗ 256
= 195,31 ≅ 195
ெ ோை = 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 teoría, recordaremos que el valor del Timer 0 acargar no podrá exceder bajo ningún concepto 256. Si colocamos otro predivisordel 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 genera10 veces, dando un tiempo de 1 segundo, si la señal entera, antes de que serepita el ciclo nuevamente, es de 2 segundos, vale decir que durante 10 veces eltiempo de 100 ms, la señal no bascula u oscila, por lo que podemos utilizar uncontador de temporización para determinar si la señal oscilará o no.
Durante las primeras 20 temporizaciones de 50 ms, la señal de salidaoscilará, durante las siguientes 20 temporizaciones de 50 ms, la señal de salida nooscilará, 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 desbordedel Timer0 para los 50 ms calculados, por lo tanto el contador se utilizará dentrode la rutina de servicio de la interrupción. Veamos el Diagrama de flujo paraentenderlo mejor:
Paso 2. Diagrama de Flujo:
Prof. Luis Zurita 38 Microcontroladores I
Paso 3. Lenguaje ensamblador:
list P=16F84Ainclude P16F84A.inc
CONTADOR equ 20H ;Declaramos el registro
org 00Hgoto INICIOorg 04Hgoto 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, Salimosbcf INTCON,2 ;Si, borramos el señalizador TOIF
INICIO
ConfigurarINTCON y OPTION_REG
InicializamosCONTADOR y PORTB
ConfigurarPuerto A y B
DeclararCONTADOR
Cargamos valor calculadoen el TIMER0
Para evitar un reinicio del programaLimpiamos el Perro Guardián
RSI
¿Contador>20?
Borramos elSeñalizador TOIF
SI
NO
DeshabilitarInterrupciones
¿TOIF=1?
SI
NOSALIR
Bascular RB0
SALIR
HabilitarInterrupciones
retfie
CONTADOR=CONTADOR+1
¿Contador>40?
CONTADOR=0
SUBE
SI
NO
SUBE
Prof. Luis Zurita 39 Microcontroladores I
movlw .20subwf CONTADOR,0 ;Contador-20.btfsc STATUS,0 ;C=0? ó Contador < 20?goto NOBASCULA ;No.
BASCULA movlw .01 ;Si.xorwf PORTB,1 ;Basculamos (Toggle) RB0goto SUBECONT
NOBASCULA movlw .40subwf CONTADOR,0 ;Contador-40. Contador>40?btfsc STATUS,0 ;C=0?goto LIMPIAR
SUBECONT incf CONTADOR,1 ;Contador=Contador+1movlw .61 ;Cargamos el valor del TMR0movwf TMR0 ;Para una nueva temporizaciónbsf INTCON,7 ;Habilitamos las interrupcionesretfie ;Salimos de la RSI
LIMPIAR clrf CONTADOR ;Limpiamos el contadorSALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI
;***************************;***PROGRAMA PRINCIPAL***;***************************INICIO bsf STATUS,5 ;Zona de configuraciones
clrf TRISBmovlw B'00010111' ;Predivisor=256movwf OPTION_REGmovlw B'10100000' ;Habilitamos las interrupcionesmovwf INTCON ;Con GIE=1 y TOIE=1bcf STATUS,5clrf PORTBclrf CONTADORbcf PORTB,0movlw .61 ;Cargamos el valor del TMROmovwf TMR0 ;Previamente calculado
SINFIN clrwdtgoto SINFINend
Prof. Luis Zurita 40 Microcontroladores I
Señal en el osciloscopio del Proteus
R1
330R
X1CRYSTAL
D1LED-GREEN
OSC1/CLKIN16
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
RA017
RA118
RA21
RA32
RA4/T0CKI3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
C1
22p
C2
22p
VDD
VSS
VSS
A
B
C
D
Recommended