ULPWU & PLVD on 12F635 & 16F684


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Exclamation Little clarification please

    Hi, I may be too late to ask this as this thread is few years old, but I will take my chances.
    I am trying to understand internal pull up on/off along with making sure pins are low before going to sleep.
    If I wish the pins to be low when the program starts is it ok to use the statement: OPTION_REG=0 : GPIO=0
    Since I am trying to understand internal pull up on/off so I will ask if there is any significance of OPTION_REG=128 over what I wrote above.

    Secondly,
    In the following code
    Code:
    Main:
        GPIO.0 = 1         ' set data latch on GPIO.0
        TRISIO.0 = 0       ' GPIO.0 = output (charging cap)
        PAUSEUS 24         ' charge cap for 24uS
        TRISIO.0 = 1       ' GPIO.0 = input to discharge cap
        IOCA.0 = 1         ' int on change enabled for GPIO.0
        INTCON = %00001000 ' global ints disabled, int on change enabled
        @ SLEEP            ' put PIC to sleep
        TOGGLE PROBE       ' indicate ULPWU wake up from sleep & clear mismatch
        INTCON.0 = 0       ' clear wake up on change int flag
        GOSUB TestVolts    ' go test for under voltage condition
        GOTO Main          ' not sure what this does...;o}
    Suppose my port (Lets say sensor attached to GPIO.1) is held low and I want PIC to wake up once it goes high, does what its suppose to do, and when it again goes low PIC goes to sleep.
    At what position in the code should I check to make sure port is LOW before PIC goes to sleep.

    As lets say I put "WHILE gpio.1:wend" before capacitor is charged in the main loop, I fear that port could go high again while capacitor is getting charged and pic will go to sleep with the port being high.

    If I put it after the capacitor charge statement, I fear the capacitor getting discharged while waiting for the port to go low which may take 1-2 seconds.

    Hope I can have some help over the two issues. Thanks a lot

  2. #2
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    If I wish the pins to be low when the program starts is it ok to use the statement: OPTION_REG=0 : GPIO=0
    Yes, but you might want to clear TRIS registers for any pin you want to be an output, and properly setup the
    WDA and WPUDA registers first.
    Since I am trying to understand internal pull up on/off so I will ask if there is any significance of
    OPTION_REG=128 over what I wrote above.
    Yes. Bit 7 in OPTION_REG enables or disables internal pull-ups/pull-downs. 1=disabled 0=enabled.

    The 12F635 has pull-ups or pull-downs. You write to WDA to select pull-ups or pull-downs, and WPUDA to
    enable or disable each one indidually.

    Secondly,
    In the following code
    Code:
    Code:
    Main:
        GPIO.0 = 1         ' set data latch on GPIO.0
        TRISIO.0 = 0       ' GPIO.0 = output (charging cap)
        PAUSEUS 24         ' charge cap for 24uS
        TRISIO.0 = 1       ' GPIO.0 = input to discharge cap
        IOCA.0 = 1         ' int on change enabled for GPIO.0
        INTCON = %00001000 ' global ints disabled, int on change enabled
        @ SLEEP            ' put PIC to sleep
        TOGGLE PROBE       ' indicate ULPWU wake up from sleep & clear mismatch
        INTCON.0 = 0       ' clear wake up on change int flag
        GOSUB TestVolts    ' go test for under voltage condition
        GOTO Main          ' not sure what this does...;o}
    Suppose my port (Lets say sensor attached to GPIO.1) is held low and I want PIC to wake up once it goes high,
    does what its suppose to do, and when it again goes low PIC goes to sleep. At what position in the code should
    I check to make sure port is LOW before PIC goes to sleep.
    Wait for the pin to go low, clear the interrupt flag bit, then SLEEP.

    As lets say I put "WHILE gpio.1:wend" before capacitor is charged in the main loop, I fear that port could go
    high again while capacitor is getting charged and pic will go to sleep with the port being high.

    If I put it after the capacitor charge statement, I fear the capacitor getting discharged while waiting for the
    port to go low which may take 1-2 seconds.
    If all you need is to wake-up on pin change with low power sleep, I wouldn't use internal pull-ups or pull-downs
    or the pin-change timed wake-up with ULPWU. If your sensor holds the pin low during idle periods, I would just
    let the sensor hold GPIO.1 low with interrupt-on-change enabled only for GPIO.1.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  3. #3


    Did you find this post helpful? Yes | No

    Question

    Hi Bruce, thanks for replying. This is how I am doing now:

    @ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _BOD_OFF & _CPD_ON & _IESO_OFF & _FCMEN_ON & _WUREN_OFF

    OSCCON = %01100000 ' Internal 4MHz select
    OPTION_REG = 0 ' internal pull-ups on/off according to value written on port
    CMCON0 = 7 ' disable comparator
    VRCON = 0 ' disable internal Vref
    GPIO = %00000000 ' LED off on boot
    TRISIO = %011001 ' GPIO.0 / 3,4= input, rest outputs
    PIR1 = 0 ' clear peripheral int flags
    PCON.5 = 1 ' ultra low power wakeup enabled
    Include "modedefs.bas"

    Main:
    GPIO.0= 1 ' set data latch on GPIO.0
    TRISIO.0= 0 ' GPIO.0 = output (charging cap)
    PAUSEUS 100 ' charge cap for 1
    TRISIO.0= 1 ' GPIO.0 = input to discharge cap
    IOCA.0= 1 ' int on change enabled for GPIO.0
    IOCA.4=1 ' int on change enabled for sensor @ GPIO.4
    while gpio.4 : wend
    INTCON= %00001000 ' global ints disabled, int on change enabled
    @ SLEEP ' put PIC to sleep
    GOSUB Test ' go test for under voltage condition AND send data if pin is made high by sensor
    GOTO Main

    Though the code is working fine for now, I would still like an opinion if the above way of doing this is the reliable way in long term.
    Thanks again

  4. #4
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    What exactly is it you're trying to do?
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  5. #5


    Did you find this post helpful? Yes | No

    Post

    I am trying to build an PIR sensor with PIC attached. My aim is to make PIC sleep and wake up like every few seconds or minutes (Which I know will be based on Res/Cap value on GPIO.0) and check for voltage OR wake up if the sensor makes its pin go high.

  6. #6
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    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
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  7. #7


    Did you find this post helpful? Yes | No

    Post Thanks a lot

    Thanks Bruce. I am going to take your advice as it exactly was my aim towards increasing battery life. Thanks again

Similar Threads

  1. 16F684 Basic Functionality
    By munromh in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 30th September 2009, 20:28
  2. ICSP and 16F684
    By onaclov2000 in forum Schematics
    Replies: 4
    Last Post: - 5th March 2009, 17:31
  3. help with HPWM on 16f684
    By kimvellore in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 23rd May 2006, 08:05

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts