Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Configuración de la Interrupciones
Las interrupciones, como su nombre lo indica, interrumpen el flujo normal de las operaciones en un
programa, primero se deben configurar. Cuando ocurre una interrupción, el valor de PC se guarda
en una pila y se detiene el funcionamiento (se guardan los valores de determinados registros en sus
registros sombra), enseguida, el programa se carga con la dirección 04h, que es el vector de
interrupción, una vez allí el programador puede definir una rutina que dependerá de la prioridad
que tenga cada interrupción, una vez finalizada, se deben limpiar las banderas de interrupción y salir
de la misma; cuando esto ocurre, el PC se carga nuevamente con el valor guardado y se reestablecen
los registros determinados.
INICIO
Inicio de interrupciones
Cambiar a página 2
SI SI PORTC=“ ”
INT Externa RB0? RB0=1?
NO NO
NO
Por cambio de nivel?
SI
SI PORTC=“ ”
IOCIE RB4? RB4=1?
SI
NO
NO
SI PORTC=“ ”
IOCIE RB5? RB5=1?
SI
NO NO
SI PORTC=“ ”
IOCIE RB6? RB6=0?
SI
NO NO
SI PORTC=“ ”
IOCIE RB7? RB7=0?
SI
NO NO
NOTA: dentro de la ISR se trabaja
con la página 2. Cuando se retorna
Limpiar banderas Salir con “RETFIE” el PCLATH se
de INTF e IOCIF (RETFIE) carga nuevamente con la página 0
Simulación en PROTEUS
Inicialmente se muestra “P”
U1
2 15 1 16
P1 INTE
- Frangelys
RA0 RC0
- Orlando- Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
U1
2 15 1 16
P1 INTE
Frangelys
RA0 RC0
Orlando- -Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k
14
RA5 Laboratorio22- -Orlando RC5
25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
U1
2 15 1 16
P1 INTE RA0 RC0
Frangelys
Orlando- -Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- -Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
- Frangelys
RA0 RC0
- Orlando- Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
U1
2 15 1 16
P1 INTE RA0 RC0
Frangelys
Orlando- -Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- -Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
U1
2 15 1 16
P1 INTE
- Frangelys
RA0 RC0
- Orlando- Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
Para este mismo caso, si se presiona otro pulsador, la bandera correspondiente se activa, pero no
ocurre interrupción puesto que GIE está deshabilitado.
U1
2 15 1 16
P1 INTE
Frangelys
RA0 RC0
Orlando- -Frangelys
3 16 2 15
RA1 RC1
4 17 3 14
RA2 RC2
5 18 4 13
RA3 RC3
6 23 5 12
RA4 RC4
7 24 6 11
P2 IOCIE 10k RA5 RC5
Laboratorio22- -Orlando
14 25 7 10
RA6 RC6
13 26 8 9
RA7 RC7
33 19
RB0 RD0
10k 34 20
RB1 RD1
Laboratorio
35 21
RB2 RD2
36 22
RB3 RD3
37 27
P3 IOCIE
38
RB4 RD4
28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
10k 8
RE0
9
P4 IOCIE RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
P5 IOCIE
Algoritmo
list p=16f1787
include<p16f1787.inc>
ORG 0X00
GOTO INICIO ;salvamos el vector de interrupción
ORG 0X04
VERIF_INTF
BANKSEL INTCON
BTFSS INTCON,INTF ;hubo interrupción en INTF?
GOTO VERIF_IOCIF ;verificamos las siguientes INT
CICLO_RB0 ;mostramos "0"
BANKSEL PORTB
BTFSS PORTB, 0 ;se soltó el pulsador? verificamos sig INT
GOTO VERIF_IOCIF
MOVLW 0X3F
MOVWF PORTC
GOTO CICLO_RB0
VERIF_IOCIF
BANKSEL INTCON
BTFSS INTCON,IOCIF ;hubo interrupción por cambio de nivel (IOCIE)?
GOTO SALIR ;salimos
VERIF_RB4
BANKSEL IOCBF
BTFSS IOCBF, 4 ;interrupción por RB4?
GOTO VERIF_RB5 ;verificamos sig IOCIE
CICLO_RB4 ;mostramos "4"
BANKSEL PORTB
BTFSS PORTB, 4 ;se soltó el pulsador?
GOTO VERIF_RB5 ;verificamos sig IOCIE
MOVLW 0X66
MOVWF PORTC
GOTO CICLO_RB4
VERIF_RB5
BANKSEL IOCBF
BTFSS IOCBF, 5 ;interrupción por RB5?
GOTO VERIF_RB6 ;verificamos sig IOCIE
CICLO_RB5 ;mostramos "5"
BANKSEL PORTB
BTFSS PORTB, 5 ;se soltó el pulsador?
GOTO VERIF_RB6 ;verificamos sig IOCIE
MOVLW 0X6D
MOVWF PORTC
GOTO CICLO_RB5
VERIF_RB6
BANKSEL IOCBF
BTFSS IOCBF, 6 ;interrupción por RB6?
GOTO VERIF_RB7 ;verificamos sig IOCIE
CICLO_RB6 ;mostramos "6"
BANKSEL PORTB
BTFSC PORTB, 6 ;se soltó el pulsador?
GOTO VERIF_RB7 ;verificamos sig IOCIE
MOVLW 0X7D
MOVWF PORTC
GOTO CICLO_RB6
VERIF_RB7
BANKSEL IOCBF
BTFSS IOCBF, 7 ;interrupción por RB7?
GOTO SALIR ;salimos
CICLO_RB7 ;mostramos "6"
BANKSEL PORTB
BTFSC PORTB, 7 ;se soltó el pulsador?
GOTO SALIR ;salimos
MOVLW 0X07
MOVWF PORTC
GOTO CICLO_RB7
SALIR
BANKSEL INTCON
BCF INTCON, INTF ;limpiamos bandera de interrupcion por INTE
BCF INTCON, IOCIF ;limpiamos bandera de interrupcion por IOCIE
BANKSEL IOCBF
CLRF IOCBF ;limpiamos banderas individuales de IOCIE
ORG 0X07
INICIO
END
Montaje N° 2
Para el siguiente hardware realice un programa que lea el dip-switch conectado al puerto C. El valor
se ingresa en binario (0- 15) muestre el valor leído en el display (cátodo común) y utilice un diodo
red en el pin RB7 para indicar las decenas (10- 15). Utilice resistencias Pull-Up. Utilice interrupciones
para el puerto C.
INICIO
Ciclo infinito
Rutina de interrupciones
Inicio de interrupciones
NO Convertir
Es BCD? a 7seg
SI
Salir
(RETFIE)
Simulación en PROTEUS
Inicialmente, muestra el cero sin importar el estado de las entradas
U1
15 2
RC0 16
RC0 RA0
3
Para cualquier interrupción por cambio de nivel, sea por flanco de subida o de bajada, muestra el
valor existente en las entradas
U1
15 2
RC0 16
RC0 RA0
3
Laboratorio 2 - Orlando - Frangelys
RC1 RA1
17 4
RC1 18
RC2 RA2
5
RC3 RA3
23 6
RC2 24
RC4 RA4
7
RC5 RA5
RC3 25
26
RC6
RC7
RA6
RA7
14
13 BCD
Bin 19
20
21
RD0
RD1
RB0
RB1
33
34
35
1
2
3
16
15
14
RD2 RB2
22 36 4 13
RD3 RB3
27 37 5 12
RD4 RB4
28 38 6 11
RD5 RB5
29 39 7 10
RD6 RB6/ICSPCLK
30 40 8 9
RD7 RB7/ICSPDAT
8
RE0
9
10
RE1 DEC
RE2
1
RE3/MCLR/Vpp
PIC16F1787
U1
15 2
RC0 16
RC0 RA0
3
Laboratorio 2 - Orlando - Frangelys
RC1 RA1
17 4
RC1 18
RC2 RA2
5
RC3 RA3
23 6
RC2 24
RC4 RA4
7
RC5 RA5
RC3 25
26
RC6
RC7
RA6
RA7
14
13 BCD
Bin 19
20
21
RD0
RD1
RB0
RB1
33
34
35
1
2
3
16
15
14
RD2 RB2
22 36 4 13
RD3 RB3
27 37 5 12
RD4 RB4
28 38 6 11
RD5 RB5
29 39 7 10
RD6 RB6/ICSPCLK
30 40 8 9
RD7 RB7/ICSPDAT
8
RE0
9
10
RE1 DEC
RE2
1
RE3/MCLR/Vpp
PIC16F1787
U1
15 2
RC0 16
RC0 RA0
3
U1
15 2
RC0 16
RC0 RA0
3
Laboratorio 2 - Orlando - Frangelys
RC1 RA1
17 4
RC1 18
RC2 RA2
5
RC3 RA3
23 6
RC2 24
RC4 RA4
7
RC5 RA5
RC3 25
26
RC6
RC7
RA6
RA7
14
13 BCD
Bin 19
20
21
RD0
RD1
RB0
RB1
33
34
35
1
2
3
16
15
14
RD2 RB2
22 36 4 13
RD3 RB3
27 37 5 12
RD4 RB4
28 38 6 11
RD5 RB5
29 39 7 10
RD6 RB6/ICSPCLK
30 40 8 9
RD7 RB7/ICSPDAT
8
RE0
9
10
RE1 DEC
RE2
1
RE3/MCLR/Vpp
PIC16F1787
Algoritmo
list p=16f1787
include <P16F1787.inc>
ORG 0X00
GOTO INICIO ;salvamos el vector de interrupción
ORG 0X04
BCD
MOVF 0X070, W
CALL CONV_NUMERO ;convertimos a 7seg
MOVWF 0X070
MOVWF PORTB ;mostramos el numero actual de PORTC, <0:3> en 7seg
SALIR
BANKSEL IOCCF
MOVLW 0XFF
XORWF IOCCF,W ;limpiamos las banderas individuales de IOCIE
ANDWF IOCCF,F
BANKSEL INTCON
BCF INTCON,IOCIF ;limpiamos la bandera de IOCIE
RETFIE ;salimos de la ISR
NO_BCD
CALL CONV_NUMERO ;convertimos a 7seg
MOVWF 0X070
BSF 0X070, 7
MOVF 0X070, W
MOVWF PORTB ;mostramos el valor convertido a bcd y luego a 7seg
GOTO SALIR
CONV_NUMERO
BRW
RETLW 0X3F ;cero
RETLW 0X06 ;uno
RETLW 0X5B ;dos
RETLW 0X4F ;tres
RETLW 0X66 ;cuatro
RETLW 0X6D ;cinco
RETLW 0X7D ;seis
RETLW 0X07 ;siete
RETLW 0X7F ;ocho
RETLW 0X6F ;nueve
RETURN
INICIO
BANKSEL OSCCON ;configuramos el reloj interno a 4MHz
MOVLW 0X6F
MOVWF OSCCON
BANKSEL TRISB ;puerto B como salida y C como entrada
CLRF TRISB
MOVLW 0XFF
MOVWF TRISC
BANKSEL OPTION_REG
MOVLW 0X00
MOVWF OPTION_REG
BANKSEL PORTA
MOVLW B'00111111'
MOVWF PORTB
END