Here's some code from when I needed a 16f886 to sleep until PORTB.0 went low. You should be able to adapt it. I should mention that I am self-taught at BASIC so there's probably a better way to do this:
Code:
#CONFIG __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
#ENDCONFIG
DEFINE NO_CLEARWDT 1 'NO WATCHDOG TIMER
DEFINE OSC 8 'LETS PBP KNOW THE OSCILLATOR IS RUNNING AT 8MHz
OSCCON = %01110001 '8 MHz INTERNAL OSCILLATOR, INTERNAL OSCILLATOR IS USED FOR SYSTEM CLOCK
DISABLE 'NO INTERRUPTS, NO DEBUG COMMENT THIS OUT FOR INTERRUPTS
ANSEL = 0 'PORTA ALL DIGITAL
ANSELH = 0 'PORTB ALL DIGITAL
OPTION_REG = 0 'PORT B PULLUPS ENABLED
WPUB = %01111111 'PULL UPS ENABLED ON PORTB 0-6
INTCON = 0 'INTERRUPTS DISABLED
IOCB = %00000001 'PORTB.0 INTERRUPT ON CHANGE ENABLED
TRISA = 0 'PORTA ALL OUTPUTS
TRISB = %01111111 'B7 OUTPUT, ALL THE OTHERS INPUTS
TRISC = 0 'PORTC ALL OUTPUTS
DUMMY VAR BYTE
<irrelevant code here>
INTCON = %00001000 'PORTB CHANGE INTERRUPT ENABLED GIE *NOT* ENABLED
NAP 0 'NAP (ENTER VERY LOW POWER MODE) FOR ABOUT 18mS. SINCE THE WATCHDOG TIMER IS NOT ENABLED,
'THE PROCESSOR WOULD NAP FOREVER, EXCEPT FOR THE FACT THAT THE 'INTERRUPT-ON-STATE-CHANGE'
'BIT FOR PORTB.0 (MASTER SWITCH) IS ENABLED. THIS MEANS THAT A CHANGE ON THE MASTER SWITCH
'(OFF TO ON) WILL GENERATE AN INTERRUPT. HOWEVER, THE GLOBAL INTERRUPT ENABLE BIT IS *NOT*
'SET. THIS MEANS A *REAL* INTERRUPT WILL NOT BE GENERATED. THE PROCESSOR WILL NOT JUMP TO THE INTERRUPT
'ROUTINE, AND WILL, INSTEAD, EXECUTE THE NEXT INSTRUCTION AFTER THE NAP - IN OTHER WORDS, CONTINUE
'THE MAIN LOOP WHERE THE NEW STATE OF THE MASTER SWITCH WILL BE CAUGHT BY THE IF STATEMENT. THIS
'HAS THE EFFECT OF SHUTTING THE PROCESSOR DOWN (ESSENTIALLY) UNTIL THE MASTER SWITCH IS TURNED ON
'AGAIN - SAVING THE VEHICLE'S BATTERY IF THE MAIN POWER SWITCH IS ACCIDENTALLY LEFT ON. OPERATION
'OF ANY OF THE OTHER SWITCHES WILL NOT CAUSE THE ABOVE TO HAPPEN AS THEIR ENABLE BITS IN THE IOCB
'REGISTER HAVE NOT BEEN SET.
DUMMY = PORTB 'READ PORTB TO CLEAR THE MISMATCH THAT GENERATED THE INTERRUPT
INTCON = 0 'INTERRUPTS OFF AGAIN
Bookmarks