Help with Timers on PIC18F in C18 (what the 2004-2008 RCs had)

I’m having trouble with this piece of code.


   	if(sManualUp == 0 && oldManualUp == 1){
		mZEnable = 0;
		mZSleep = 0;
		mXSleep = 1;
		mXEnable = 1;
		mDirection = 1;
		OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1 );
		INTCON2bits.TMR0IP = 1;
		INTCONbits.TMR0IE = 1;
		INTCONbits.GIE = 1;
		INTCONbits.PEIE = 1;
		WriteTimer0(45535);

	}else if(sManualUp == 1 && oldManualUp == 0){
		INTCONbits.GIE = 0;
		INTCONbits.PEIE = 0;
		INTCONbits.TMR0IE = 0;	
		
	}
	oldManualUp = sManualUp;

If I replace the else if with a while(sManualUp == 0){} it works. As soon as I do this, my code runs away. Any ideas? This is on a PIC18F4550, it IS using the USB interface on it.

Are you sure oldManualUp is intialized? Did you check for nulls? Neither will be true if oldManualUp is uninitialized. sManualUp must be initialized since evaluating it to zero works. Remember that:

variable == Value (any value in cluding zero) will only work if variable is intialized to a value and is non-null.

Yeah, thats definitely not the issue, it seems that its somehow running away with the interrupts and jumping to strange spots in the code that it manifestly shouldn’t be. Its like the program counter (which gets stored when the interrupt service routine is called) is getting corrupted, and then when it goes to exit the interrupt, it jumps to some invalid location.