Lo que mencione sobre las interrupciones en el CCS es porque al parecer uno no necesita guardar los registros importantes, lo hace el mismo código al atender la interrupción (eso es lo que leí en la página de CCS).
Como uno ha estado con los de la serie 16FXXX, uno debe guardar los registros (W,STATUS,PCLATH,etc.); aún no me he metido de lleno con los de la serie 18 (en cuestión de interrupciones), se que existen interrupciones prioritarias y que los registros de importancia los almacena solo.
En cuanto al retardo en la utilización de las interrupciones en BASIC (o en cualquier otro lenguaje), como se comenta en el foro, es poco práctico si la aplicación está basada en uno o varios eventos que son prioritarios para el sistema, por eso se comentó que las interrupciones (por lo menos en mi caso y por experiencia propia) se realizan en ensamblador.
A mi también me sucedio algo muy similar a lo que se comenta sobre el carrito, debía dar vuelta pero si escuchaba algo (un comparador al PORTB.0) se pararía y haría sonar un buzzer.
Lo único diferente es que lo hice en ensamblador (aún no adquiría el PBP) pero de todas maneras necesitaba estar preguntando por ese sonido, fue entonces donde me decidí optar por la interrupción (que le batalle un mucho para que funcionara y después para sensibilizar el comparador).
Un claro ejemplo es una aplicación que unos compañeros del área de biomédica en la escuela querian: un espirómetro digital.
Como el sensor era algo complicado (no se contaba con hoja de especificaciones), se observó el comportamiento y se determinó que era posible utilizar una interrupción para ver cuántas veces pasaba de alto a bajo el estado del sensor (dependía de la intensidad de la respiración) y con eso, en base a una ecuación plantearon las respiraciones por minuto y están en proceso de determinar el volumen (densidad) de la respiración (esto es de biomédica, ellos saben de eso, yo soy de comunicaciones, solo se les ayudó en la programación).
La parte que me tocó desarrollar es la siguiente: está basada en la interrupción en el puerto B e incrementa una fila cada vez que la interrupción surge (cada vez que pasa de bajo a alto y viceversa).
@ DEVICE XT_OSC,LVP_OFF,WDT_OFF,PROTECT_OFF
led VAR PORTB.1
reg VAR BYTE $40 system
wsave VAR BYTE $20 system
wsave1 VAR BYTE $A0 system
ssave VAR BYTE bank0 system
psave VAR BYTE bank0 system
DEFINE INTHAND ISR
"***** Rutina de Interrupción *****
Asm
; Salvando W, STATUS y PCLATH
ISR bcf INTCON,GIE ; desabilitando las interrupciones
btfsc INTCON,GIE ; asegurando la desactivación
GoTo ISR
movwf wsave ; salvando W
swapf STATUS,W ; STATUS->W
clrf STATUS ; regresando al banco cero
movwf ssave ; salvando STATUS
movf PCLATH ; PCLATH->W
movwf psave ; salvando PCLATH
clrf PCLATH ; regresando a la página 0
EndAsm
"aqui pones lo que quieras
led = 1
led = 0
led = 1
"en basic
Asm
;*** Regresando W, STATUS y PCLATH (originales) ***
fInt movf psave,W ; PCLATH (original)->W
movwf PCLATH ; W->PCLATH
swapf ssave,W ; STATUS (original)->W
movwf STATUS ; W->STATUS
swapf wsave,F ; Regresando W original
swapf wsave,W ; antes de la interrupción
bcf intcon,intf ; borrando la(s) bandera(s) de interrución
incf reg
RETFIE ; Reactiva las interrupciones
EndAsm
inicio:
TRISB = $01
reg = 0
INTCON = %10010000 "habilitando las interrupciones
option_reg = %01000000 "habilitando interrupción en flanco positivo
primera:
IF reg == 1 Then segunda
led=0 "lo que sea
IF reg == 0 Then primera
segunda:
IF reg == 2 Then tercera
led=0 "lo que sea
IF reg == 1 Then segunda
tercera:
IF reg == 3 Then final
led=0 "lo que sea
IF reg == 2 Then tercera
final:
PORTB.7= 1
pause 2000
End
Quizá no les dé una idea clara ya que se tuvo que hacer que el TMR0 se inundara y con ese tiempo comparar el registro reg y otras cosas mas que me pidieron mis compañeros, este es solo un ejemplo sobre las interrupciones (aunque al parecer, está demás porque creo que ya lo saben).
Con la información que se ha adquirido creo que lo mejor será seguir con el PBP hasta que considere que lo domine y después cambiarme.
Les agradezco su tiempo para explicarme las diferencias entre compiladores.
¿Cómo le hago para cerrar este espacio?
(para que alguien mas lo ocupe)
Nota: el programa fue hecho para el µicro 16F872.
Gracias
Mario