Charles,
I'm pretty sure you're using DT_INTS with the 18F, so here's a macro that should do the same thing that RESUME LABEL does with ON Interrupt and 16F's.
I DO NOT recommend actually using it. It's just BAD programming practice. And it will cause more problems than it will alleviate. However, being the capable programmer that you are, you may be able to make some use of it.
It can be used in place of INT_RETURN.
With the format ... @ INT_RESUME _Label, IntsEnabled
Code:
@ INT_RESUME _Main, 1
The line above would "resume" at the Main: label, with interrupts enabled.
Changing IntsEnabled to 0, will leave the interrupts DISABLED. In case they need to be setup again from the new "Starting point".
All previous GOSUB's and Interrupts will be discarded, and the command that was interrupted will NOT be completed. Stopping a PBP command in the middle can cause unexpected results. In particular, the I2C and LCD commands, may be left in the incorrect state. Clearing the Flags register, will correct those two, but other problems can arise.
The label that is resumed to, MUST be a GOTO Loop, just like the Main loop. It CAN NOT be a subroutine with a RETURN at the end.
And since it is exiting the interrupt handler without the assistance of DT_INTS, you have to make sure the IF (interrupt flag) bits are cleared before resuming.
18F's ONLY
Code:
ASM
#define Reg(PBPreg, PBPbit) PBPreg ; Returns the register for a PBP BIT var
INT_RESUME macro Label, IntsEnabled
local PopLoop
PopLoop ; Remove everything from the stack
pop
movf STKPTR, W
bnz PopLoop
ifdef ReEnterHPused ; let Instant Interrupts know we are
if (ReEnterHPused == 1) ; done with the System variables
banksel Reg(_VarsSaved_H) ; that were saved during the
bcf _VarsSaved_H ; High Priority interrupt.
endif
endif
ifdef ReEnterLPused ; And, we're done with the variables
if (ReEnterLPused == 1) ; saved on a Low Priority INT.
banksel Reg(_VarsSaved_L)
bcf _VarsSaved_L
endif
endif
ifdef USE_LOWPRIORITY ; If Low Priority INTs are being used,
if (USE_LOWPRIORITY == 1)
if (IntsEnabled == 1) ; and the user specified IntsEnabled
bsf INTCON, GIEL ; then enable Low Priority Interrupts
else ; if not,
bcf INTCON, GIEL ; disable LP INTs
endif
endif
endif
if (IntsEnabled == 1) ; If the user specified IntsEnabled,
bsf INTCON, GIEH ; enable High Priority Interrupts
else ; if not,
bcf INTCON, GIEH ; disable HP INTs
endif
clrf BSR ; reset to Bank0
goto Label ; resume from the users Label
endm
ENDASM
HTH,
Bookmarks