Using Interrupts with the ByteCraft C Compiler

If you're trying to use interrupts with the ByteCraft C compiler, here is some code from Kenneth Furge which may be helpful.
Date: Mon, 16 Dec 1996 09:38:30 -0500
From: Kenneth Furge <kennethf@ehusa.com>
Organization: Endress+Hauser
To: eric@brouhaha.com
Subject: Quick addendum to your PIC interrupt page....

Great job on the PIC interrupt page!  After fighting with an ISR using
the ByteCraft compiler, I found your page and it had some very useful
pointers.  I have a possible addition to the page (a potential 3b).  It
turns out that the compiler switches register banks within the ISR. 
Therefore, after saving the w register and the status, you must also
save the register bank where you came from.  Otherwise when you go to
restore w and status, you have a 50/50 shot of restoring them from the
wrong window!  It's pretty obvious now (as most bugs are) but it would
be a good addition to your PIC ISR FAQ.  The follwing wrapper will allow
you to use both window 0 and 1 variables within your ISR and not corrupt
anything in the process.  Here's a code segment to help illustrate the
point.  "stat" is just misc status bits used within the program, temp_w
and temp_stat are self explanatory.

void __INT(void)
{
#asm
	movwf		temp_w		; "Push" important registers
	swapf		STATUS,W
	movwf		temp_stat
	btfsc		STATUS,5	; Are we in file bank 1?
	goto		win1h
win0h
	bcf		stat,1		; Remember where we came from win 0
	goto		end_isr_head
win1h
	bcf		STATUS,5	; Switch to win 0 where "stat" is
	bsf		stat,1		; Set bit to indicate we came from win 1
end_isr_head
#endasm

/* PUT ISR C CODE IN HERE */

#asm
	bcf		STATUS,5
	btfsc		stat,1		; did we come from bank 1?
	bsf		STATUS,5
win1t
	swapf		temp_stat,W	; "Pop" important registers
	movwf		STATUS
	swapf		temp_w,F
	swapf		temp_w,W
#endasm
}


- K.C. Furge

Back to my PIC interrupt page
Back to my PIC Projects page
Back to my home page

Last updated December 16, 1996

eric@brouhaha.com