I see. If it's battery powered, then you don't want to waste current with internal pull-ups,
and you don't want one on GPIO.0 connected to the internal ULPWU current sink.
You want GPIO.0 to charge the cap through the series resistor, go to input, and let the cap
discharge through the internal current sink. Kind of defeats the purpose if you have the pin
held high via the internal pull-up.
And, if your sensor outputs logic 1 when active, you should probably avoid the while GPIO.4
since it's detecting something when GPIO.4 = 1.
A better approach might be to read the port immediately on wake-up, find out which pin
caused the interrupt on change wake up, then jump to a routine to handle it.
Maybe something like this?
Code:@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BOD_OFF & _CPD_ON & _IESO_OFF & _FCMEN_ON & _WUREN_OFF Include "modedefs.bas" OSCCON = %01100000 ' Internal 4MHz select OPTION_REG.7 = 1 ' turn off current hog internal pull-ups CMCON0 = 7 ' disable comparator VRCON = 0 ' disable internal Vref GPIO = %00000000 ' LED off on boot TRISIO = %011000 ' GPIO.0 / 3,4= input, rest outputs PIR1 = 0 ' clear peripheral int flags IOCA.0= 1 ' int on change enabled for GPIO.0 IOCA.4=1 ' int on change enabled for sensor @ GPIO.4 Main: IF GPIO.4 THEN HandlePIR ' goto PIR detect routine GPIO.0= 1 ' set data latch on GPIO.0 TRISIO.0= 0 ' GPIO.0 = output (charging cap) PAUSEUS 100 ' charge cap for 1 PCON.5 = 1 ' ultra low power wakeup enabled TRISIO.0= 1 ' GPIO.0 = input to discharge cap INTCON= %00001000 ' globals disabled, int on change enabled, clear wake up int flag bit @ SLEEP ' put PIC to sleep IF GPIO.4 THEN PCON.5 = 0 ' disable current sink on ultra low power wakeup GOTO HandlePIR ' if PIR sensor woke us up, handle it ELSE GOSUB Test ' go test for under voltage condition AND send data if pin is made high by ENDIF GOTO Main




Bookmarks