Добрый день. Пытаюсь сделать прерывания по изменению GP0. Ставлю GP0 на вход, разрешаю прерывания по изменению GPIO, разрешаю глобальные прерывания, ставлю бит IOC0 в 1. Но при изменении GP0 прерывание не срабатывает. Прерывание по переполнению таймера срабатывает отлично. Что я делаю не так? Прикладываю код программы. Если этого недостаточно, чтобы понять проблему, приложил полный код программы файлом.
list p=12f683
#include "p12f683.inc"
__config 0x3FF4
W_TEMP EQU 0x40
STATUS_TEMP EQU 0x41
flag EQU 0x42
org 0
goto start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0x04
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;программа обработки прерываний
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
retfie
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start clrf GPIO
movlw 0x07
movwf CMCON0
bsf STATUS,RP0 ;1 bank
movlw b'00001001'
movwf TRISIO
movlw b'10000001'
movwf OPTION_REG
bcf INTCON,T0IF
bsf INTCON,T0IE
movf GPIO,w
bcf INTCON,GPIF
bsf INTCON,GPIE
bsf INTCON,GIE
movlw b'00000001'
movwf IOC
bcf STATUS,RP0 ;0 bank
movlw .0
movwf TMR0
ask btfss flag,4 ;данный бит устанавливается в программе обработки прерываний
goto ask
bcf flag,4
call indicate ;подпрограмма indicate выводит значение, полученное в результате
;обработки прерывания, на индикаторы
goto ask
reciever1.asm