Te pongo un ejemplo que no es la interupción por B0, pero puede ser gráfico para que lo aprendas.
Es un led que se apaga y enciende y luego una interrupción por B4 (cambio de estado en el nible alto del port B).
"***************************************
"* FUSIBLES *
"***************************************
CONFIG HS_OSC , WDT_OFF , PWRTE_ON , BODEN_ON , LVP_OFF , WRT_HALF , CPD_ON , DEBUG_OFF
" Oscilador en alta frecuencia (20MHz)
" Watchdog Timer desconectado
" Power-On Timer conectado
" Brown-Out Detect conectado
" Low Voltage Programming desconectado
" Data Memory Code Protect la mitd
" Flash Program Memory Protect activado
" In Circuit Debuger desactivado
" Program Code Protection activado
"** FIN DE FUSIBLES
"*****************************
"* DEFINE *
"*****************************
DEVICE 16F877A
ON_INTERRUPT INT_tecla "Interrupcion hardware si se pulsa una tecla
DECLARE XTAL 20 "Frecuencia del reloj 20MHz
DECLARE WATCHDOG OFF "Wachdog desconectado
DECLARE BOOTLOADER ON "Bootloader conectado
DECLARE HBUS_BITRATE 100 "Reloj bus I2C a 100KHz
" DECLARE HSERIAL_BAUD 9600 " Velocidad puerta serie a 9600
" DECLARE HSERIAL_RCSTA %10010000 " Recepcion del puerto serie continua
" DECLARE HSERIAL_TXSTA %00100000 " Transmision modo asincrono habilitada
" DECLARE HSERIAL_CLEAR ON " Limpieza bufer antes de la recepcion
DECLARE RSOUT_PIN PORTC.6
DECLARE RSOUT_MODE TRUE
DECLARE SERIAL_BAUD 9600
DECLARE RSOUT_PACE 100
" DECLARE LCD_TYPE 0 "LCD tipo alfanumerico
" DECLARE LCD_DTPIN PORTD.0 "Data pin en puerto D con 8 bits
" DECLARE LCD_ENPIN PORTA.0 "bit Enable en puerto A bit 0
" DECLARE LCD_RSPIN PORTA.2 "Linea RS esta en puerto A bit 2
" DECLARE LCD_INTERFACE 8 "Bus de datos de 8 bit
" DECLARE LCD_LINES 2 "Display de dos lineas
" DECLARE SDA_PIN PORTC.4
" DECLARE SCL_PIN PORTC.3
" DECLARE SLOW_BUS ON
"** FIN DE DEFINE
"DEFINICION DE CONSTANTES
SYMBOL transmito 1 "constante usada para conmutar la transmision/recepcion
SYMBOL recibo 0 " " "
SYMBOL apagado 0 "constante para apagar los led
SYMBOL encendido 1 "constante para encender los led
"symbol SDA = ORTC.4 "Data I2C
"symbol SCL = PORTC.3 "Clock I2C
SYMBOL LED = PORTC.5 "Led rojo
SYMBOL RELOJ = PORTD.1
SYMBOL NOT_RBPU = OPTION_REG.7 " PORTB Pull-up Enable
SYMBOL RBIF = INTCON.0 " Flag de interrupcion del puerto B
SYMBOL RBIE = INTCON.3 " RB Port Change Interrupt Enable
SYMBOL GIE = INTCON.7 " Global Interrupt Enable
"DEFINICION DE VARIABLES
DIM tempo8 AS BYTE "Variable temporal tipo byte
DIM tempo16 AS WORD "Variable temporal tipo Word
DIM direccion AS BYTE
DIM dato AS BYTE
"DEFINICION DE LOS PINES DE ENTRADA/SALIDA.
ADCON1 = 7 "PORTA y PORTE como I/O digitales
TRISA=%00000000 "Los pin PORTA son salidas
TRISB=%00010000 "Los pin (PORTB.4) son entradas.
TRISC=%10000000 "Los pin son SALIDAS.
TRISD=%00000000 "Los pin son SALIDAS.
"eeprom 0,[0,0,0,0,255,4,3,1,0,1,0] "Configuración activa
"Posicion 0,1,2,3,4 --> 4 bytes para serializar cada micro
"Posicion 4-----------> Direccion logica, del 128 al 254 (255 es broadcast)
"Posicion 5-----------> Distancia umbral, por defecto 4 (2 metros)
"Posicion 6-----------> Veces seguidas que la sonda debe medir para considerar
"un cambio de estado en la medicion. Por defecto 3 veces
"Posicion 7,8,9 ------> Version del firmware
"Posicion 10----------> 7 6 5 4 3 2 1 0 Byte en el que guardo varias cosas:
" En el Bit 0 -->variable apagada, por defecto 0 (que significa encendida)
" En el Bit 1 -->bit que indica bloqueo, por defecto 0
" En el Bit 2 -->bit que indica el tipo de bloqueo: 1->bloqueo verde, 0->bloqueo rojo. Por defecto 0
" En el Bit 3 -->bit de límite de tiempo sobrepasado. 1->sobrepasado,0->no sobrepasado
" En el Bit 4 -->bit de control de salida auxiliar 1. Por defecto 0 (apagado)
" En el Bit 5 -->No usado, por defecto 0
" En el Bit 6 -->No usado, por defecto 0
" En el Bit 7 -->No usado, por defecto 0
"eeprom 48,[0,0,0,0,255,4,3,1,0,1,0] "Guardo la configuración de fábrica
"GAMBOA FIRMWARE identificacion
EWRITE 240,[255,71,65,77,66,79,65,32,70,73,82,77,87,65,82,69]
GOTO main "Me voy al comienzo del programa
"Activo la interrupción del PortB
"INTCON = $88 " habilito interrupcion global y cambio en Port B
"ON INTERRUPT GOTO int_tecla
INT_tecla: "Rutina de servicio de interrupción
GIE = 0 " Deshabilito la interrupción global
INC dato
direccion= %01110010
tempo8=dato
HBUSOUT direccion, [tempo8]
WHILE 1=1
IF PORTB.4=1 THEN BREAK "espero a que la tecla se deje de pulsar
WEND
RBIF = 0 " Borro Flag de interrupcion del puerto B
GIE = 1 " Habilito la interrupción global
CONTEXT RESTORE
main: "Prohrama principal
NOT_RBPU=0 "Activo las resistencias internas de pullup puerto B
RBIF = 0 " Borro Flag de interrupcion del puerto B
RBIE = 1 " Habilito la interrupcion local del puerto B
GIE = 1 " Habilito la interrupción global
tempo8=0
direccion=0
dato=0
RSOUT "GAMBOA FIRMWARE"
direccion= %01110010 "Apago los led
tempo8=%11111111
GOSUB escribir_PCF
" ** PROGRAMA PRINCIPAL **
WHILE 1=1
LED=~LED
FOR tempo16=1 TO 500
DELAYMS 1
RELOJ=~RELOJ
NEXT tempo16
direccion=%01110001
GOSUB leer_PCF
RSOUT BIN8 tempo8,10,13
IF tempo8.0=0 THEN
" INC dato
" direccion= %01110010
" tempo8=dato
" GOSUB escribir_PCF
ELSE
" direccion= %01110010
" tempo8=%11111111
" GOSUB escribir_PCF
ENDIF
WEND
"*************************************************************************
"** SUBRUTINA: leer_PCF
"** lee uno de los expansores de bus
"*************************************************************************
leer_PCF:
HBUSIN direccion, [tempo8]
RETURN
"** FIN SUBRUTINA: leer_PCF
"*************************************************************************
"** SUBRUTINA: escribir_PCF
"** lee uno de los expansores de bus
"*************************************************************************
escribir_PCF:
"tempo8=$00
HBUSOUT direccion, [tempo8]
" BSTART
" BUSOUT %01110000
" BUSOUT tempo8
" BSTOP
RETURN
"** FIN SUBRUTINA: escribir_PCF
""*************************************************************************
""** SUBRUTINA: int_tecla
""** Rutina de manejo de interrupción
""*************************************************************************
"DISABLE "desactivo la interupción, durante la gestion.
"int_tecla:
" FOR tempo8=1 TO 10
" LED= encendido
" FOR tempo16=1 TO 50
" pause 1
" NEXT tempo16
" LED= apagado
" FOR tempo16=1 TO 50
" pause 1
" NEXT tempo16
" NEXT tempo8
" i2cread SDA, SCL,%01110001, [tempo8]
" INTCON.0=0 "limpio el flag de la interrupción
" RESUME
""** FIN SUBRUTINA: int_tecla
END
Espero que te sirva de pauta.
Para la interrupción externa tienes el registro INTCON y los bits de ese registro INTF, e INTE. Esto para un 877. Para un 84 es el mismo registro, aunque pueden cambiar la posición de los bits. Eso lo puedes confirmar en el data SHEET
Saludos
Ricky
Madrid-España