PIC Micro Controller

Interrupt Service Routine Register State Maintenance

Tony Nixon quotes the Microchip datasheet for the 16f8xx (and Robert Rolf added comments):

movwf w_temp	;given multiple banks, and no global memory 
		;you need to make a w_temp in each because you cannot change status prior to saving it.
swapf status,w 	;The swapf instruction, unlike the movf, affects NO status bits, which is why it is used here.
clrf status	;point to bank 0 and clear all the flags
movwf status_temp
movf pclath,w	;save PCLath
movwf pclath_temp
clrf pclath	;assume that this ISR is in page 0
;bcf status,irp	;This bcf is redundant & unnecessary unless the clrf status (above) is removed
movf fsr,w
movwf fsr_temp

; ISR

;The example fails to restore FSR here.
;One should

movf fsr_temp,w
movwf fsr

;to complete the restore sequence.

movf pclath_temp,w
movwf pclath
swapf status_temp,w
movwf status
swapf w_temp
swapf w_temp,w

Tom Handley says:

...one of the nice things about the 16C76/77 and 16F876/877 devices is that the upper 16 Bytes are aliased to Bank 0. This is a good place to keep a copy of W, STATUS, PCLATH, FSR, etc, during an ISR routine.

Timer tutorial (incl prescalers) by Andrew Warren

David A Cary of Motorguide Pinpoint Says:

Up: PIC Micro Controller Interrupt Routine Library http://piclist.com/techref/microchip/ints.htm

Questions: