Professional Documents
Culture Documents
PROPUESTOS
TEMA 4:
TIMER 0 E INTERRUPCIONES
LIST P=16F84A
INCLUDE P16F84A.INC
org 00H
goto INICIO
org 04H ; Se coloca el vector interrupcin para que se
goto RUTINTERR ; Ejecute la rutina de interrupcin
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
;*****************************************
;***RUTINA DE INTERRUPCIN***
;*****************************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupcin es desborde
;del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el sealizador TOIF
movlw .01
xorwf PORTB,1
movlw .217 ;Cargamos el valor del TMR0
movwf TMR0 ;Para una nueva temporizacin
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie
;*************************************
;***PROGRAMA PRINCIPAL***
;*************************************
INICIO bsf STATUS,5
clrf TRISB
movlw B'00010101' ; Reloj interno (Temporizador) Predivisor
movwf OPTION_REG ; asignado a TMR0, valor= 128
movlw B'10100000' ; Habilitamos las interrupciones
OPERACIN
PARADA
SOLUCIN:
MANUAL
R1 RB4
1k AUTO
RB2
RA0
VSS
MODO
VSS
NIVEL MXIMO
R2
1k
RA1
TANQUE VSS
RB3
RB1
VDD
PRINCIPAL
M1 B1 B2 M2 SENSOR NIVEL BAJO
VDD
VDD
R1B
1k OPERACIN
R1A R3
PARADA 1k
1k VSS
VSS RA3
RA2
VSS
RB0
TANQUE SUBTERRNEO
VSS
VSS
C1
22p U1
X1 16
OSC1/CLKIN RA0
17
RA0
15 18
C2 OSC2/CLKOUT RA1 RA1
1
RA2 RA2
4 2
MCLR RA3 RA3
3
VSS VDD RA4/T0CKI
22p
6
RB0/INT RB0
7
RB1 RB1
8
RB2 RB2
9
RB3 RB3
10
RB4 RB4
11
RB5
12
RB6
13
RB7
PIC16F84A
INICIO RSI
Configurar Deshabilitar
INTCON Interrupciones
Salvar entorno
Configurar
Puerto A y B
NO
Bomba 1= OFF INTF=1? SALIR
Bomba 2=OFF
SI
M
Bomba 1= OFF
SI Bomba 1= ON Bomba 2= OFF
Manual?
Bomba 2= ON
Auto NO NO
Lleg a
Noperacin?
Nivel NO Nivel NO
M SI
Mnimo? Mximo?
SALIR
SI SI Restaurar entorno
Bomba 1= OFF
Bomba 1= ON INTF=0
Bomba 2= ON
Bomba 2= OFF
Habilitar
Interrupciones
Nivel NO
Mximo? retfie
SI
Bomba 1= OFF
Bomba 2= OFF
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
;***********************
;***Programa Principal***
;***********************
INICIO bsf STATUS,5 ;Vamos al banco 1 a configurar
movlw 1FH
movwf TRISA
movlw B'00000001' ;RB0= Entrada, Resto Salidas
Nota: Utilice el TMR0 para generar la rutina de 1 segundo. (no se realiza por
interrupcin sino por polling, puede ser sustituida por una rutina de 1
segundo generada por el PICDEL)
TANQUE MEZCLADOR
Nivel Bajo
MM
VD
PINTURA PINTURA
LISTA LISTA
MA
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
VSS VSS
PINTURA PINTURA
RB7
LISTA LISTA
MOTOR AVANCE
RB7
A
VD=OFF SI
Limpiar Registros en general MA=ON
B1=OFF
y Puerto B B2=OFF
MM=OFF
RET7_5S VD=OFF
MA=OFF
NO LMARCHA=OFF
MARCHA MA=OFF LPARE=ON
=0?
SI
1
B1=ON REINICIO NO
B2=OFF =0?
MM=OFF
VD=OFF LEYENDA: SI
MA=OFF VD=Vlvula de Desage
LMARCHA=ON B1= Vlvula de Llenado Pintura 1 LPARE=OFF
LPARE=OFF B2= Vlvula de Llenado Pintura 2
LMARCHA= Led Marcha
LPARE= Led Pare Restaurar entorno
NALTO= Sensor Nivel Alto
RET13SEG NBAJO=Sensor Nivel Bajo
INTF=0
MM= Motor Mezclado
MA= Motor de Avance SALIR
B1=OFF MARCHA= Pulsador de inicio
B2=ON Habilitar
PARE= Pulsador de parada
LMARCHA=ON Interrupciones
REINICIO= Pulsador de reinicio del proceso
LPARE=OFF Lgica de los sensores=
0=Activado retfie
1= Desactivado
NO NALTO
=0?
SI
B2=OFF
MM=ON
RET1M
MM=OFF
org 00H
goto INICIO
org 04H
goto RSI
;***********************************
;***Rutina de Servicio de Interrupcin***
;***********************************
RSI btfss INTCON,1 ;INTF=1?
goto SALIR ;No. Salimos de la Interrupcin
movwf W_TEMP ;Salvamos el entorno
swapf W_TEMP,1
movf STATUS,0
movwf ESTADO_TEMP
movf PORTB,0
movwf PB_TEMP
movlw b'00000100' ;Si. Todo OFF. LPARE= ON
movwf PORTB ;(ROJO=ON)
REINI btfsc PORTA,1 ;Se puls REINICIO?
goto REINI ;Esperamos
bcf INTCON,1 ;Borramos sealizador INTF
movf PB_TEMP,0 ;Restauramos el entorno
movwf PORTB
movf ESTADO_TEMP,0
movwf STATUS
swapf W_TEMP,0
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI
;**********************
;***Programa Principal ***
;**********************
INICIO bsf STATUS,5 ;Configuramos los Puertos
movlw 01FH
movwf TRISA ;PA como entrada
movlw b'00000001'
movwf TRISB ;PB como entrada/salida
movlw b'01000111' ;Prescaler= 256
VDD
RB7
RA4
VSS
RB3
RB0
VSS
VLVULA DE LLENADO
NIVEL DE ALARMA
PANEL DE CONTROL
VDD
VDD
VSS
ON NIVEL ALTO
RA1
INICIO RB4 LAVADORA RA3
VDD RPIDO
RB5
VDD
LENTO
LAVADORA0 RB6
RB1
NIVEL BAJO
RB2
RA2
VSS VSS
INICIO LEYENDA: 1
VD=Vlvula de Desage
VLL= Vlvula de Llenado
Declarar Registros de NMAX= Sensor Nivel Mximo
trabajo NMIN=Sensor Nivel Mnimo VLL=OFF
NMINLAV=Sensor Nivel Mnimo de Lavado MotorL=OFF
MotorL= Motor Lavadora VD=ON
Configurar
CONTA=Contador de minutos
INTCON y OPTION_REG
CONTAMEDIO=Contador precargado con la
mitad del tiempo
Configurar CONTALAV=Contador precargado con el NO
Puerto A y B tiempo total de lavada NMIN=0?
Lgica de los sensores=
A
0=Activado SI
Limpiar Registros en general 1= Desactivado
y Puerto B VD=OFF
VLL=ON
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?
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
Habilitar
NO Interrupciones
NMIN=0?
SI retfie
RET10SEG
Vamos al Inicio
del programa
para una nueva
A lavada
ORG 00H
GOTO INICIO
ORG 04H
GOTO RUTIN
;***********************************
;***Rutina de Servicio de Interrupcin***
;***********************************
RUTIN BCF INTCON,7 ;Deshabilitamos las interrupciones
BTFSS INTCON,5
GOTO SALIR
MOVWF W_TEMP ;Salvamos el entorno durante la
SWAPF W_TEMP,1 ;Interrupcin al modificarse el Puerto B
MOVF STATUS,0 ;dentro de la RSI
MOVWF STATUS_TEMP
MOVF PORTA,0
MOVWF PA_TEMP
MOVF PORTB,0
MOVWF PB_TEMP
ESPERA BSF PORTB,7 ;SSONORA=ON
BCF PORTB,1 ;ML=OFF
BCF PORTB,2 ;VD=OFF
BCF PORTB,3 ;VLL=OFF
BTFSC PORTA,4 ;NMINLAV?
GOTO ESPERA
BCF PORTB,7 ;SSONORA=OFF
POP MOVF PB_TEMP,0
MOVWF PORTB
;*****************************
;***Programa Principal***
;*****************************
;*********************************************************
;***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
INICIO
RSI TMR0 (50ms)
Configurar
Puerto A y B Borramos el
Sealizador TOIF
Configurar
OPTION_REG E INTCON
Decf CONTAVECES
Inicializamos
PORTA Y B, CONTADORES NO van 20
desbordes?
MOSTRAR SI
CONTAVECES=20
NO
ARRANCAR?
CONTADOR NO
incf CONTADOR
SI =100?
SI
Cargamos valor
calculado en el TIMER0
REGISTRO AUXILIAR CONTADOR=0
HABILITAMOS TOIE=1
NO RETFIE
CONTADOR
=100? Rutina de Interrupcin
SI
Programa Principal
;************************************************
;****TABLA DE CONVERSIN DE BCD A 7 SEGMENTOS****
;************************************************
;TABLA: ESTA RUTINA CONVIERTE EL CDIGO BCD PRESENTE EN LOS 4 BITS DE MENOS PESO
;DEL REG. W EN SU EQUIVALENTE A 7 SEGMENTOS. EL CDIGO 7 SEGMENTOS RETORNA TAMBIN
;EN EL REG. W
TABLA ADDWFPCL,1 ;PUNTERO O ENCABEZADO DE LA TABLA
RETLW B'11000000' ;0. VALOR 0
RETLW B'11111001' ;1. VALOR 1
RETLW B'10100100' ;2. VALOR 2
RETLW B'10110000' ;3. VALOR 3
RETLW B'10011001' ;4. VALOR 4
RETLW B'10010010' ;5. VALOR 5
RETLW B'10000011' ;6. VALOR 6
RETLW B'11111000' ;7. VALOR 7
RETLW B'10000000' ;8. VALOR 8
RETLW B'10011000' ;9. VALOR 9
;***************************RUTINA DE 5mS******************************
;**********************GENERADA POR EL PICDEL**************************
;***************************RUTINA DE 5mS******************************
DELAY5MS movlw .6 ; 1 set numero de repeticion (B)
movwf PDel00 ;1|
PLoop11 movlw .207 ; 1 set numero de repeticion (A)
movwf PDel11 ;1|
PLoop22 clrwdt ; 1 clear watchdog
decfsz PDel11, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop22 ; 2 no, loop
decfsz PDel00, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
PDelL11 goto PDelL22 ; 2 ciclos delay
PDelL22 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END ;FIN DEL PROGRAMA
100 ms
2 segundos
Declarar Deshabilitar
CONTADOR Interrupciones
Configurar NO
Puerto A y B TOIF=1? SALIR
SI
Configurar
SUBE
INTCON y OPTION_REG Borramos el
Sealizador TOIF
Inicializamos NO
CONTADOR y PORTB
Contador NO Contador
>20? >40?
Cargamos valor calculado
en el TIMER0 SI SI
Bascular RB0 CONTADOR=0
SUBE
Para evitar un reinicio del programa
Limpiamos el Perro Guardin CONTADOR=CONTADOR+1
SALIR
Habilitar
Interrupciones
retfie
org 00H
goto INICIO
org 04H
goto RSI
;********************************
;***RUTINA DE INTERRUPCIN***
;********************************
RSI bcf INTCON,7 ;Deshabilitamos las interrupciones
btfss INTCON,2 ;La causa de la interrupcin es
;desborde del TIMER0 TOIF=1?
goto SALIR ;No, Salimos
bcf INTCON,2 ;Si, borramos el sealizador TOIF
Prof. Luis Zurita 38 Microcontroladores I
movlw .20
subwf CONTADOR,0 ;Contador-20.
btfsc STATUS,0 ;C=0? Contador < 20?
goto NOBASCULA ;No.
BASCULA movlw .01 ;Si.
xorwf PORTB,1 ;Basculamos (Toggle) RB0
goto SUBECONT
NOBASCULA movlw .40
subwf CONTADOR,0 ;Contador-40. Contador>40?
btfsc STATUS,0 ;C=0?
goto LIMPIAR
SUBECONT incf CONTADOR,1 ;Contador=Contador+1
movlw .61 ;Cargamos el valor del TMR0
movwf TMR0 ;Para una nueva temporizacin
bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI
LIMPIAR clrf CONTADOR ;Limpiamos el contador
SALIR bsf INTCON,7 ;Habilitamos las interrupciones
retfie ;Salimos de la RSI
;***************************
;***PROGRAMA PRINCIPAL***
;***************************
INICIO bsf STATUS,5 ;Zona de configuraciones
clrf TRISB
movlw B'00010111' ;Predivisor=256
movwf OPTION_REG
movlw B'10100000' ;Habilitamos las interrupciones
movwf INTCON ;Con GIE=1 y TOIE=1
bcf STATUS,5
clrf PORTB
clrf CONTADOR
bcf PORTB,0
movlw .61 ;Cargamos el valor del TMRO
movwf TMR0 ;Previamente calculado
SINFIN clrwdt
goto SINFIN
end
VSS