Dúvida sobre interrupção

Olá a todos.
Bem, fiz um pequeno programa em picbasic para poder entender o funcionamento da interrupção externa no pino "RB0/INT", só que algo estranho ocorreu.
O programa funciona da seguinte maneira:
Há uma chave pushpull em RB0 (ao ser acionada ocorrerá uma interrupção), um LED conectado em RB3 que sempre fica ligado indicando o funcionamento do programa, um LED conectado em RB2 que é acionado somente quando pressiono a chave que está em RB0 (o que indica que ocorreu uma interrupção) sendo que depois que solto a tecla este LED desliga; e mais um display conectado na PORTA. Bem, até aqui tudo OK; só que resolvi fazer uma pequena modificação no programa, ou seja, acrescentei uma instrução para mostrar uma contagem em um display sendo que ficou assim:
Trecho original:
...
Inicio:
LED_executa=1
LED_interrupcao=0
goto Inicio
Disable
...
Após modificação:
...
Inicio:
LED_executa=1
LED_interrupcao=0
for i = 0 to 40
LCDOut $fe,1,#i
pause 300
next i
goto Inicio
Disable
...
Depois que executei o programa com esta modificação, quando pressiono a chave em RB0 o LED que indica que ocorreu a interrupção só desliga quando a contagem no display termina!!! Funcionou totalmente ao contrário do programa original.
Pergunto: Depois que tirasse o dedo da chave (RB0) o LED que indica a interrupção não teria que desligar independente da contagem no display terminar ou não?
O que eu fiz de errado? Alguém poderia me ajudar?
O programa original é este aqui:
'********************************************************
'* Nome : Interrupção externa no pino RB0/INT *
'********************************************************
DEFINE OSC 4
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
symbol LED_executa = PORTB.3 ' Indica que o programa está sendo executado
symbol LED_interrupcao = PORTB.2 ' Indica que houve uma interrupção
i var byte
OPTION_REG.7 = 0
TRISB = %00000011
CMCON = %00000111
On Interrupt Goto ISR
INTCON = %10010000 ' Habilita interrupção RB0
Inicio:
LED_executa=1
LED_interrupcao=0
for i = 0 to 40
LCDOut $fe,1,#i
pause 300
next i
goto Inicio
Disable ' Desabilita interrupções
ISR:
if INTCON.1 = 1 then INTF 'Uma interrupção externa foi acionada pelo pino RB0/INT
INTF:
LED_interrupcao=1 'Aciona LED, indicando que ocorreu uma interrupção
Pause 500
INTCON.1 = 0 ' Flag de interrupção INTF é resetado
goto Exit_ISR
Exit_ISR:
Resume 'Retorna ao programa principal
Enable 'Habilita interrupções
End
******************************************
Se alguém precisar do arquivo que simulei no Proteus posso enviar.
Desde já agradeço.
Bem, fiz um pequeno programa em picbasic para poder entender o funcionamento da interrupção externa no pino "RB0/INT", só que algo estranho ocorreu.
O programa funciona da seguinte maneira:
Há uma chave pushpull em RB0 (ao ser acionada ocorrerá uma interrupção), um LED conectado em RB3 que sempre fica ligado indicando o funcionamento do programa, um LED conectado em RB2 que é acionado somente quando pressiono a chave que está em RB0 (o que indica que ocorreu uma interrupção) sendo que depois que solto a tecla este LED desliga; e mais um display conectado na PORTA. Bem, até aqui tudo OK; só que resolvi fazer uma pequena modificação no programa, ou seja, acrescentei uma instrução para mostrar uma contagem em um display sendo que ficou assim:
Trecho original:
...
Inicio:
LED_executa=1
LED_interrupcao=0
goto Inicio
Disable
...
Após modificação:
...
Inicio:
LED_executa=1
LED_interrupcao=0
for i = 0 to 40
LCDOut $fe,1,#i
pause 300
next i
goto Inicio
Disable
...
Depois que executei o programa com esta modificação, quando pressiono a chave em RB0 o LED que indica que ocorreu a interrupção só desliga quando a contagem no display termina!!! Funcionou totalmente ao contrário do programa original.
Pergunto: Depois que tirasse o dedo da chave (RB0) o LED que indica a interrupção não teria que desligar independente da contagem no display terminar ou não?
O que eu fiz de errado? Alguém poderia me ajudar?
O programa original é este aqui:
'********************************************************
'* Nome : Interrupção externa no pino RB0/INT *
'********************************************************
DEFINE OSC 4
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
symbol LED_executa = PORTB.3 ' Indica que o programa está sendo executado
symbol LED_interrupcao = PORTB.2 ' Indica que houve uma interrupção
i var byte
OPTION_REG.7 = 0
TRISB = %00000011
CMCON = %00000111
On Interrupt Goto ISR
INTCON = %10010000 ' Habilita interrupção RB0
Inicio:
LED_executa=1
LED_interrupcao=0
for i = 0 to 40
LCDOut $fe,1,#i
pause 300
next i
goto Inicio
Disable ' Desabilita interrupções
ISR:
if INTCON.1 = 1 then INTF 'Uma interrupção externa foi acionada pelo pino RB0/INT
INTF:
LED_interrupcao=1 'Aciona LED, indicando que ocorreu uma interrupção
Pause 500
INTCON.1 = 0 ' Flag de interrupção INTF é resetado
goto Exit_ISR
Exit_ISR:
Resume 'Retorna ao programa principal
Enable 'Habilita interrupções
End
******************************************
Se alguém precisar do arquivo que simulei no Proteus posso enviar.
Desde já agradeço.