Hola chicos
Me gustaría pediros que echárais un ojo a este código que he preparado para controlar el parpadeo de una lámpara. Estoy usando el enano capullito 12F629, que está dando una guerra.... 
Se debe iniciar una secuencia de parpadeo cuando entra un flanco de bajada en la entrada "activar", y se debe interrumpir el parpadeo en cuanto entre un flanco de bajada en la entrada "desactivar".
Yo por más que miro y miro ... no veo nada erróneo... compila bien... pero no hace nada! 
a ver qué opináis los gurús del basic este de marras...
Muchas gracias!!
Codigo:
"****************************************************************
"* Name : lampara-flash.BAS *
"* Author : Elena *
"* : All Rights Reserved.... pozzi *
"* *
"* ENTRADAS: activar y desactivar: señal de radiofrecuencia *
"* que entran al PIC por flanco de bajada *
"* SALIDA : señal a un relé para encender o *
"* : apagar la lamparita *
"* : *
"****************************************************************
@ DEVICE pic12F629, 0x1FC4 "palabra de configuración: PWRT y BOREN enables
" Programo el enano este con Osc_Interno,
" pero con Mclr_externo!! según me ha dicho Sispic, 
@ ID 0x0012
OPTION_REG = %01111111 "resistencias de pullup
WPU = %00110011 "despertar resistencias
TRISIO=%001100 "entradas: GP4 y GP5. Salida: GP2
CMCON=%00000111 " Deshabilitar Comparatores. No lo uso para nada.
INTCON = %10001000 "registro de interrupciones
" 7=GIE, 6=PEIE, 5=TMR0IE, 4=INTE, 3=GPIE, 2=TMR0IF, 1=INTF, 0=GPIF
" GIE = 1"global interrupt enable
" INTE = 0"GP2 interrupt enable
" GPIE = 1"GPIO interrupt enable: interrupción por cambio de estado
" INTF = 0" Clear GP2 INT Flag
" GPIF = 0" Clear GPIO INT Flag
IOC.4 = 1" habilitar interrupción por cambio en GP4
IOC.5 = 1" habilitar interrupción por cambio en GP5
" Variables y alias
GPIF VAR INTCON.0
rele VAR GPIO.2
activar VAR GPIO.5
desactivar VAR GPIO.4
mode VAR BIT
i VAR WORD
ON INTERRUPT GOTO MyInter
"rutina de interrupción
Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
"Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
IF GPIF then
GPIF = 0"borrar flag de interrupción
if !activar then"cuando lea el puerto, borraré el flag de interrupción
mode = 1
gosub activaRele
endif
if !desactivar then"cuando lea el puerto, borraré el flag de interrupción
LOW rele
endif
ENDIF
Resume
Enable
"rutina principal
MAIN:
IF mode THEN
mode = 0
" Primer parpadeo
HIGH rele
PAUSE 10000
LOW rele
" Segundo parpadeo
FOR i = 1 TO 30
HIGH rele
PAUSE 100
LOW rele
PAUSE 100
NEXT i
" Tercer parpadeo
loop:
HIGH rele
PAUSE 100
LOW rele
PAUSE 1100
Goto loop
ENDIF
GOTO MAIN
activaRele:
HIGH rele
return
End
Codigo:
"rutina de interrupción
Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
"Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
IF GPIF=1 then
if activar = 1 then"cuando lea el puerto, borraré el flag de interrupción
mode = 1
high rele
endif
if desactivar = 1 then"cuando lea el puerto, borraré el flag de interrupción
mode = 0
LOW rele
endif
ENDIF
GPIF = 0"borrar flag de interrupción
Resume
Enable
"rutina principal
MAIN:
IF mode = 1 THEN
mode = 0
" Primer parpadeo
HIGH rele
PAUSE 10000
LOW rele
pause 100
" Segundo parpadeo
FOR i = 1 TO 30
HIGH rele
PAUSE 100
LOW rele
PAUSE 100
NEXT i
" Tercer parpadeo
loop:
HIGH rele
PAUSE 100
LOW rele
PAUSE 1100
Goto loop
ENDIF
GOTO MAIN
End
He puesto asteriscos en donde parece que hay cosas raras ************** y esta corregido pero no provado
Codigo:
"****************************************************************
"* Name : lampara-flash.BAS *
"* Author : Elena *
"* : All Rights Reserved.... pozzi *
"* *
"* ENTRADAS: activar y desactivar: señal de radiofrecuencia *
"* que entran al PIC por flanco de bajada *
"* SALIDA : señal a un relé para encender o *
"* : apagar la lamparita *
"* : *
"****************************************************************
@ DEVICE pic12F629, 0x1FC4 "palabra de configuración: PWRT y BOREN enables
" Programo el enano este con Osc_Interno,
" pero con Mclr_externo!! según me ha dicho Sispic,
@ ID 0x0012
OPTION_REG = %01111111 "resistencias de pullup
WPU = %00110011 "despertar resistencias
TRISIO=%001100 "entradas: GP4 y GP5. Salida: GP2
CMCON=%00000111 " Deshabilitar Comparatores. No lo uso para nada.
INTCON = %10001000 "registro de interrupciones
" 7=GIE, 6=PEIE, 5=TMR0IE, 4=INTE, 3=GPIE, 2=TMR0IF, 1=INTF, 0=GPIF
" GIE = 1"global interrupt enable
" INTE = 0"GP2 interrupt enable
" GPIE = 1"GPIO interrupt enable: interrupción por cambio de estado
" INTF = 0" Clear GP2 INT Flag
" GPIF = 0" Clear GPIO INT Flag
IOC.4 = 1" habilitar interrupción por cambio en GP4
IOC.5 = 1" habilitar interrupción por cambio en GP5
" Variables y alias
GPIF VAR INTCON.0
rele VAR GPIO.2
activar VAR GPIO.5
desactivar VAR GPIO.4
mode VAR BIT
i VAR WORD
ON INTERRUPT GOTO MyInter
mode = 0 "" *****************
Goto MAIN ""*************** saltar el hadler de interrupciom es mejor *********************
"rutina de interrupción
Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
Disable "********************
"Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
" ************ IF GPIF then - esto no funciona bien con pbp , no se por que usa IF GPIF=1 then
IF GPIF = 1 then " ************ es absurdo comprovar la causa si solo ella esta activada ,, pero no pasa nada
GPIF = 0"borrar flag de interrupción
if activar = 0 then" if activar ******** cuando lea el puerto, borraré el flag de interrupción
mode = 1
gosub activaRele
endif
if desactivar = 0 then" if desactivar ****** cuando lea el puerto, borraré el flag de interrupción
LOW rele
endif
ENDIF
Resume
Enable
"rutina principal
MAIN:
IF mode = 1 THEN " ************
mode = 0
" Primer parpadeo
HIGH rele
PAUSE 10000
LOW rele
" Segundo parpadeo
FOR i = 1 TO 30
HIGH rele
PAUSE 100
LOW rele
PAUSE 100
NEXT i
" Tercer parpadeo
loop: """ *** Abago tiene razon con lo que dice , de aqui no saldras nunca
HIGH rele """ solo cuando atienda a la interrupcion , pero regresa otra vez al encontrar RESUME
PAUSE 100
LOW rele
PAUSE 1100
if mode = 0 then Goto loop """ ******** sales asi por ejemplo
ENDIF
GOTO MAIN
activaRele:
HIGH rele
return
End
tu sistema de salir del loop no funcionara por que al poner al final de la llamada de interrupcion RESUME es como añadir retfie.
Si seguramente no se activa la interrupción. (ni idea)
una forma sin usarlas puede ser asi
Codigo:
@ DEVICE pic12F629, 0x1FC4 "palabra de configuración: PWRT y BOREN enables
@ ID 0x0012
OPTION_REG = %01111111 "resistencias de pullup
WPU = %00110011 "despertar resistencias
TRISIO=%001100 "entradas: GP4 y GP5. Salida: GP2
CMCON=%00000111 " Deshabilitar Comparatores. No lo uso para nada.
Activa con 2 : Desactiva con 1 : NoPulsados con 3
Ms var word
Pulsadores var byte : pulsadores = NoPulsados
rele VAR GPIO.2 : low rele
Mode var bit : Mode = 0
I var byte
Main:
if Pulsadores = Activa then
mode = 1
gosub activaRele
endif else
if Pulsadores = Desactiva then
LOW rele
endif
"rutina principal
MImain:
IF mode = 1 THEN " ************
mode = 0
" Primer parpadeo
HIGH rele " mas rapido rele = 1
Ms = 10000 : gosub Pausa
LOW rele " mas rapido rele = 0
" Segundo parpadeo
FOR i = 1 TO 30
HIGH rele
Ms = 100 : gosub Pausa
LOW rele
Ms = 100 : gosub Pausa
NEXT i
" Tercer parpadeo
loop:
HIGH rele
Ms = 100 : gosub Pausa
LOW rele
Ms = 1100 : gosub Pausa
ENDIF
GOTO MAIN
activaRele:
HIGH rele
return
pausa:
for Ms=Ms to 0 step-1
Pulsadores = (GPIO >> 4 )& %00000011
if Pulsadores <> Nopulsados then Main " si se ha pulsado alguno ,,, regresa al main
pause 1 " hacemos pausas de 1 ms para ir verificando los pulsadores
next ms
return
End
Hola chicos!
Qué trabajosos habéis estado el finde, 
Os pongo a continuación mi versión del programita sin interrupciones, y funciona bien. Lo único que he visto al probarlo con el hadrware, es que se cuelan ruidos y activan el relé cuando no debe, así que voy a meter una validación de las entradas por software. Y otra cosa, a veces no se activan las resistencias de pull-up. ??
Bueno, este es el código:
Codigo:
@ DEVICE pic12F629, 0x1FC4 "palabra de configuración PWRT y BOREN enables
asm
ID 0x0012
endasm
TRISIO = %00111011
OPTION_REG = %01111111 "resistencias de pullup
WPU = %00110011
rele VAR GPIO.2 "pin 5 del micro
activar VAR GPIO.4 "pin 3 del micro
desactivar VAR GPIO.5 "pin 2 del micro
i VAR WORD " para los bucles
PAUSE 200
" el circuito está vivo?
high rele
pause 1000
" Esperamos a que entre un cero en activar
main:
while activar
low rele
WEND
" parpadeo
" Iniciamos la secuencia de parpadeo con un encendido prolongado de 3 segundos
for i=1 to 30
HIGH rele
if !desactivar then
goto main
ENDIF
PAUSE 100
next i
" Iniciamos una secuencia de parpadeos rápidos durante 2 segundos
FOR i = 1 TO 20
HIGH rele
pause 50
LOW rele
PAUSE 50
if !desactivar then
goto main
ENDIF
NEXT i
" Iniciamos una secuencia de parpadeos a modo de baliza
loop:
HIGH rele
PAUSE 100
LOW rele
FOR i = 1 to 90
PAUSE 10
if !desactivar then
goto main
ENDIF
NEXT i
if desactivar then
Goto loop
else
goto main
ENDIF
END
Voy a probar el tuyo, Sisco, graciassssssss! 
Si me animo a intentar las interrupciones, ya os diré, pero de momento voy aver si termino la dichosa lamparita, que me llegan las vacaciones y tengo todo manga por hombro y sin terminar.