Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO N°2
2021 – II
UNIVERSIDAD NACIONAL DE INGENIERÍA
Facultad de Ingeniería Mecánica - FIM
INTRODUCCIÓN
Una interrupción consiste en una detención del programa en curso para realizar
una determinada rutina que atienda la causa que ha provocado la interrupción.
INDICE
1. OBJETIVOS
2. PROBLEMA
3. DIAGRAMA DE FLUJO
4. CÓDIGO ASSEMBLER
5. SIMULACIÓN
6. CONCLUSIONES
1. OBJETIVOS
Implementar un circuito con interrupción TMR0 habilitado.
Implementar un circuito con interrupción RB0 habilitado.
Implementar un circuito con interrupción RBI (4-7) habilitado.
Aprender sobre interrupciones en el microcontrolador PIC16F877A.
2. FUNDAMENTOS TEÓRICOS
3. PROBLEMA
4. DIAGRAMA DE FLUJO
INICIO
Configuración:
Puerto D: OUT
Puerto C: OUT
Puerto B: INT
Registro OPTION_REG
Registro INCON
Variables:
digito
cnt1
cnt2
PUERTO_B
VERIF
REF
display
FIN
Rut_interrupcion
T0IF=0 Int_TMR0
INTF=0 Int_RB0
RBIF=0 Int_RBI
T0IF=0
INTF=0
RBIF=0
Salir_interrupcion
Int_TMR0
Int_RB0
Registro TMR0 = .60
RD1=1 RD2=1
Int_RBI
PUERTO_B=PORTB
VERIF=XOR(PUERTO_B,REF)
REF=PUERTO_B
RD4=0
RD5=0
RD6=0
RD7=0
Salir Int_RBI
5. CÓDIGO ASSEMBLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Configuracion inicial ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
list p=16f877A
#include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF &
_PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Definicion de variables ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Vector predefinido ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x00
nop
goto main
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Vector interrupcion ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x04
;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
bsf STATUS,RP0 ; Banco1
clrf TRISD ; PORTD output
clrf TRISC ; PORTC output
movlw 0xFF
movwf TRISB ; PORTB input
movlw b'01000111'
movwf OPTION_REG
movlw b'11111000'
movwf INTCON
movlw d'60'
movwf TMR0
display:
movf digit,w
call tabla
movwf PORTC
call delay_1s
btfsc PORTB,0
goto DESC
goto ASC
DESC:
movlw 0x00
xorwf digit,w
btfsc STATUS,Z
goto digit_9
decf digit,F
goto display
digit_9:
movlw 0x09
movwf digit
goto display
ASC:
movlw 0x09
xorwf digit,w
btfsc STATUS,Z
goto digit_0
incf digit,F
goto display
digit_0:
clrf digit
goto display
delay_25ms:
movlw d'166'
movwf cnt1
loop1:
movlw d'251'
movwf cnt2
loop2:
decfsz cnt2,F
goto loop2
decfsz cnt1,F
goto loop1
return
delay_100ms:
call delay_25ms
call delay_25ms
call delay_25ms
call delay_25ms
return
delay_200ms_D0:
bsf PORTD,0
call delay_100ms
bcf PORTD,0
call delay_100ms
return
delay_1s:
call delay_200ms_D0
call delay_200ms_D0
call delay_200ms_D0
call delay_200ms_D0
call delay_200ms_D0
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Rutina Interrupcion ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Rut_Interrupcion:
btfsc INTCON,T0IF
goto Int_TMR0
btfsc INTCON,INTF
;Interrupción TMR0
Int_TMR0:
movlw d'60'
movwf TMR0
btfss PORTD,1
goto D1_0
goto D1_1
D1_0:
bsf PORTD,1
goto Salir_rut
D1_1:
bcf PORTD,1
goto Salir_rut
;Interrupción RB0
Int_RB0:
btfss PORTD,2
goto D2_0
goto D2_1
D2_0:
bsf PORTD,2
goto Salir_rut
D2_1:
bcf PORTD,2
goto Salir_rut
;Interrupcion RB4
B_RB4:
btfsc PUERTO_B,4
goto B_RD4
goto VERIF_5
B_RD4:
btfss PORTD,4
goto RD4_0
goto RD4_1
RD4_0:
bsf PORTD,4
goto VERIF_5
RD4_1:
bcf PORTD,4
goto VERIF_5
;Interrupcion RB5
B_RB5:
btfss PUERTO_B,5
goto B_RD5
goto VERIF_6
B_RD5:
btfss PORTD,5
goto RD5_0
goto RD5_1
RD5_0:
bsf PORTD,5
goto VERIF_6
RD5_1:
bcf PORTD,5
goto VERIF_6
;Interrupcion RB6
B_RB6:
btfss PUERTO_B,6
goto B_RD6
goto VERIF_7
B_RD6:
btfss PORTD,6
goto RD6_0
goto RD6_1
RD6_0:
bsf PORTD,6
goto VERIF_7
RD6_1:
bcf PORTD,6
goto VERIF_7
;Interrupcion RB7
B_RB7:
btfsc PUERTO_B,7
goto B_RD7
goto Salir_rut
B_RD7:
;Restauración de Flags
Salir_rut:
bcf INTCON,T0IF
bcf INTCON,INTF
bcf INTCON,RBIF
goto Salir_Interrupcion
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Final del programa ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
6. SIMULACIÓN
sucederá nada en RD2, pero si sucede el cambio por flanco de subida, ED2
cambiará de estado.
Ahora veremos la interrupción por RBI (RB4-RB7):
La siguiente tabla nos permite captar los cambios que permiten la interrupción.
Cambio de Flanco Cambio de Estado
RB4 bajada RD4
RB5 subida RD5
RB6 Bajada RD6
RB7 Subida RD7
Se mostrarán los cambios que se dan por sus respectivos flancos. Solo
activaremos y desactivaremos una entrada para cada caso.
7. CONCLUSIONES
Para resolver el problema de leer simultáneamente las cuatro entradas RB
del 4 al 7, se utilizó la operación lógica XOR entre el valor actual y con un
valor guardado.