Problemas con codigo

Recurro a ustedes por lo siguiente... tengo problemas con este codigo....

;*******************************************
;* Este programa invierte el estado del pin*
;* RA0 cada vez que se modifica el estado *
;* de alguno de los pines RB4, RB5, RB6 o *
;* RB7. Para ello habilita la interrupción *
;* por cambio de RB4-RB7 *
;*******************************************


#INCLUDE<P16F84.INC>

ACUM EQU 0CH
STAT EQU 0DH

F EQU 1
w EQU 0

#DEFINE BANCO0 BCF STATUS,5
#DEFINE BANCO1 BSF STATUS,5



ORG 00H
GOTO INICIO ;ponemos este GOTO al principio para poder poner
;el subprograma de las interrupciones a partir de
;la dirección 04h

;Comienza la interrupción:
;=========================

ORG 04H ;El pic salta a esta dirección cuando se produce
BANCO0 ;una interrupción
BCF INTCON,0

;bit que indica un cambio en RB4-RB7, recuerda que
;hay que ponerlo a "0" por programa, este es el
;momento

;comenzamos guardando el contenido del acumulador
;y del STATUS para restaurarlos antes de salir de
;la interrupción (es recomendable hacer esto
;siempre que se usen interrupciones)

MOVWF ACUM ;Copia el acumulador al registro ACUM
MOVF STATUS,w ;Guarda STATUS en el acumulador
BANCO0 ;Por si acaso, nunca se sabe en que parte de
;programa principal salta la interrupción
MOVWF STAT ;Copia el acumulador al registro STAT

;Invertimos el estado de RA0:
;============================

BTFSC PORTA,0 ;si RA0 es "0" salta la siguiente instrucción
GOTO ESUNO ;vete a ESUNO
BSF PORTA,0 ;Pon a "1" RA0 (porque era "0")
GOTO HECHO ;ya está invertido RA0, vete a HECHO

ESUNO BCF PORTA,0 ;Pon a "0" RA0 (Porque era "1")

;Ya se ha invertido el estado de RA0
;===================================

;ahora hay que restaurar los valores del STATUS y
;del acumulador antes de salir de la interrupción:

HECHO
BCF INTCON,0
MOVF STAT,w ;Guarda el contenido de STAT en el acumulador
MOVWF STATUS ;Restaura el STATUS
SWAPF ACUM,F ;Da la vuelta al registro ACUM
SWAPF ACUM,w ;Vuelve a dar la vuelta al registro ACUM y restaura
;el acumulador (Con la instruccion SWAPF para no
;alterar el STATUS, la instrucción MOVF altera el
;bit 2 del STATUS)
RETFIE ;fin de la interrupción

;Fin de la interrupción
;======================


INICIO BANCO1 ;Pasamos al banco 1
MOVLW 0FFH ;Todos los bits del acumulador a "1"
MOVWF TRISB ;configuramos todo el puerto B como entradas
BCF TRISA,0 ;RA0 como salida
BANCO0 ;Volvemos al banco 0

;Configuración de las interrupciones:
;====================================

BSF INTCON,7 ;Habilita las interrupciones globalmente
BSF INTCON,3 ;Habilita la interrupción por cambio de puerto B

;====================================
;ya están configuradas las interrupciones, a
;partir de ahora cuando haya un cambio en RB4-RB7
;saltará la interrupción (a la dirección 04h de
;programa)

NADA GOTO NADA ;En este ejemplo no se hace nada en el programa
;principal, simplemente se espera a que salte la
;interrupción. La verdadera utilidad de las
;interrupciones es que se pueden hacer "cosas"
;mientras sin preocuparse de la interrupción


END

El problema esta en la seccion en rojo... no se borra el bit 0 del INTCON y por lo tanto vuelve a entrar a la interrupcion.
Estoy compliando con MPLAB 8.43 .......alguien podra ayudarmeee....
 
Me auto respondo...ya que encontré la solución... no se borra el bit 0 de INTCON porque aun esta en 1 la entrada en el puerto B .. después de borrar esta entrada el Bit de INTCON se borra sin problemas.
 
Atrás
Arriba