Information
2010 Microchip Technology Inc. DS80496C-page 5
PIC18F2480/2580/4480/4580
6. Module: Interrupts
If an interrupt occurs during a two-cycle instruc-
tion that modifies the STATUS, BSR or WREG
register, the unmodified value of the register will
be saved to the corresponding Fast Return
(Shadow) register. Upon a fast return from the
interrupt, the unmodified value will be restored
to the STATUS, BSR or WREG register.
For example, if a high-priority interrupt occurs
during the instruction, MOVFF TEMP, WREG, the
MOVFF instruction will be completed and WREG
will be loaded with the value of TEMP before
branching to the ISR. However, the previous
value of WREG will be saved to the Fast Return
register during ISR branching. Upon return from
the interrupt with a fast return, the previous
value of WREG in the Fast Return register will
be written to WREG.
This results in WREG containing the value it had
before execution of MOVFF TEMP, WREG.
Affected instructions are:
Work around
1. Assembly Language Programming:
If any two-cycle instruction is used to modify
the WREG, BSR or STATUS register, do not
use the RETFIE FAST instruction to return
from the interrupt. Instead, save and then
restore WREG, BSR and STATUS via soft-
ware, as shown in Example 8-1 in the Device
Data Sheet.
Alternatively, in the case of MOVFF, use the
MOVF instruction to write to WREG instead. For
example:
As another alternative, the work around in
Example 1 can be used. This example over-
writes the Fast Return register by making a
dummy call to Foo with the fast option in the
high-priority service routine.
EXAMPLE 1: ASSEMBLY LANGUAGE INTERRUPT SERVICE
MOVFF Fs, Fd
Where Fd is WREG, BSR or STATUS
MOVSF Zs, Fd
Where Fd is WREG, BSR or STATUS
MOVSS [Zs], [Zd]
Where the destination is WREG, BSR or STATUS
Use
MOVF TEMP, W
MOVWF BSR
Instead of
MOVFF TEMP, BSR
ISR @ 0x0008
CALL Foo, FAST ; store current value of WREG, BSR, STATUS for a second time
Foo:
POP ; clears return address of Foo call
: ; insert high priority ISR code here
:
RETFIE FAST