ULPWU & PLVD on 12F635 & 16F684


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Posts
    98

    Default ULPWU & PLVD on 12F635 & 16F684

    Hi all
    anyone one have any experience using the ULPWU (ultra low power wake up) module on the PIC12F635 ?
    it seems to have started life in the PIC16F684
    looking for any tips or code snips using PBP

    i need to also use the PLVD (programmable low voltage detect) module but at 20+ uA i don't have the power budget to leave it on all the time for low battery warning indication

    so my thought is to use the ULPWU (if i can figure it out) and wake up once in a while and enable the PLVD to sniff the battery

    at first read it looks like the ULPWU will interrupt and wake up the unit roughly every 30ms using a 1000pf cap
    this way too often for me, guess i could keep a counter or something

    but using PBP it is not clear to me how to proceed
    make the pin an output, set HI briefly, turn it back to an input and go to sleep?
    something like that ?

    TIA
    ds

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


    Did you find this post helpful? Yes | No

    Default

    Well, that was interesting. I've never used ULPWU or PLVD yet, but I have used the 12F635
    in a ton of applications.

    Out of curiosity, I put this together to tinker with today, and it works just like the book says.

    You'll probably want to experiment with the series resistor & cap value. As voltage drops, the
    wake up frequency increases, so you'll need to find some happy medium there to work in your
    own application. I used a 200ohm series resistor with 1kpF cap.
    Code:
    @ DEVICE PIC12F635,MCLR_OFF,INTRC_OSC_NOCLKOUT,WDT_OFF,BOD_OFF
    @ DEVICE PWRT_ON,FCMEN_OFF,IESO_OFF,WUREN_OFF,PROTECT_OFF
    
        SYMBOL PROBE = GPIO.1  ' scope probe indicates wakeup from sleep
        SYMBOL PLVD_LED = GPIO.2
        
        OSCCON = %01100000 ' Internal 4MHz select
        OPTION_REG = 128   ' internal pull-ups off 
        CMCON0 = 7         ' disable comparator
        VRCON = 0          ' disable internal Vref
            
        GPIO = %00000000   ' LED off on boot
        TRISIO = %00000001 ' GPIO.0 = input, rest outputs
        PIR1 = 0           ' clear peripheral int flags
        PCON.5 = 1         ' ultra low power wakeup enabled
        
    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}
    
    TestVolts:
        INTCON.6 = 1       ' peripheral ints enabled
        LVDCON = %00010101 ' enable PLVD. set trip point to 4.0V
        
        ' enable PLVD interrupt only when PLVD internal Vref is stable
        IF LVDCON.5 = 1 THEN PIE1.6 = 1 ' if stable, enable
        
        IF PIR1.6 = 1 THEN ' voltage <= 4.0V?
           HIGH PLVD_LED   ' yes. indicate voltage is <= 4.0V
           PIR1.6 = 0      ' clear int flag
        ELSE
           LOW PLVD_LED    ' else, indicate voltage is > 4.0V
        ENDIF
        LVDCON = 0         ' PLVD disabled before returning to sleep
        INTCON.6 = 0       ' peripheral ints disabled
        PIE1 = %00000000   ' low voltage detect int disabled
        RETURN
        
        END
    At 5 volts it wakes up around every 30mS, and trips PLVD at <= 4.0 V.
    Regards,

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

  3. #3
    Join Date
    Nov 2003
    Posts
    98


    Did you find this post helpful? Yes | No

    Default

    wow that's great Bruce, thanks a lot
    you got farther along than i did, but this was pretty much what i was thinking about
    doing

    i think i will go to a 0.1mf cap for about 3 seconds

    question
    do you see a way to distinguish this ULPWU interrupt from some other pin that may have caused wake up from SLEEP ?
    i don't

    also
    in your example code PROBE is for your scope and not directly related to the ULPWU pin, when you
    TOGGLE PROBE
    your comment says 'clear mismatch register'
    does this mean that writing to any pin will clear the mismatch ?
    i thought there was a mismatch bit for each pin ?

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


    Did you find this post helpful? Yes | No

    Default

    question
    do you see a way to distinguish this ULPWU interrupt from some other pin that may have
    caused wake up from SLEEP ? i don't
    If you had int on change enabled for more pins, you would need to read the port & look for
    a change immediately on wake up. Other interrupts would set the flag bit associated with
    that interrupt. I don't see any specific flag bit for ULPWU alone.

    also
    in your example code PROBE is for your scope and not directly related to the ULPWU pin, when
    you TOGGLE PROBE
    Yes. I just used this pin for the scope to see the timing when using different cap and resistor
    values.
    your comment says 'clear mismatch register' does this mean that writing to any pin will clear
    the mismatch ?
    A normal wake up on change requires you to read or write to the port to clear the
    mismatch condition. Then clear the interrupt flag bit.
    i thought there was a mismatch bit for each pin
    The only pin that affects wake up on change is the one that has this feature enabled, and
    is an input. There aren't any mismatch bits, but there are individual interrupt on change
    enable and disable bits in IOCA.

    You can remove the TOGGLE PROBE & INTCON.0 = 0 after. This gets taken care of before
    the sleep instruction.
    Last edited by Bruce; - 21st August 2007 at 10:49.
    Regards,

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

  5. #5
    Join Date
    Nov 2003
    Posts
    98


    Did you find this post helpful? Yes | No

    Default

    thanks again Bruce,

    I have one main input pin which needs to wake up the unit

    so what you are saying is that if it is NOT that pin when it comes out of SLEEP then by elimination it must be the ULPWU pin ?

    so then i would check the state of that pin, i.e. there is no bit that says which specific pin caused the wake up ? (i know there is not for the ULPWU)

    also sorry if i am being dense here but can you explain the mismatch deal some more?
    so if i read or write to *any* pin it will clear that mismatch?

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


    Did you find this post helpful? Yes | No

    Default

    I have one main input pin which needs to wake up the unit

    so what you are saying is that if it is NOT that pin when it comes out of SLEEP then by elimination it must be the ULPWU pin?
    Yes. Assuming you don't have anything else enabled that could cause the wake up from
    sleep.

    so then i would check the state of that pin, i.e. there is no bit that says which specific pin caused the wake up ? (i know there is not for the ULPWU)
    Yes.

    also sorry if i am being dense here but can you explain the mismatch deal some more?
    Sure. Say you have GPIO.1 configured for wake up. It's normally held high.

    When a switch or other external device pulls this pin low, you want the PIC to wake up.
    Wait for GPIO.1 to go high (by reading the port pin). Normally it will be held high by an
    external or internal pull-up.

    Once it's in the high state, enable wake up on change, then put the PIC to sleep.

    Once it goes low, there's a mismatch, and it wakes up. Wait for the pin to return high, and
    go through the process again. If the PIC enters sleep mode again, before the port pin was
    returned high, then it will wake up again once the pin returns high.

    so if i read or write to *any* pin it will clear that mismatch?
    Yep. As long as it's a pin on that port, but I normally read the whole port into a variable,
    then test for the bit in question.

    Testing several bits in a row leaves too much time for another one to change.
    Regards,

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

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