12F629 Wakes only once


Closed Thread
Results 1 to 15 of 15
  1. #1

    Default 12F629 Wakes only once

    I thought I understood this interrupt thing, but NO! The following program will wake from SLEEP with GPIO.2 going high the first time, but not with subsequent highs. What am I doing wrong? (The last three lines never get executed.) Thank you for any help.

    CMCON = 7
    TRISIO = %001100
    OPTION_REG = %01000000
    GPIO = 0
    T1CON = 0
    @ DEVICE MCLR_OFF, INTRC_OSC_NOCLKOUT, WDT_OFF, BOD_OFF, PWRT_ON, PROTECT_ON

    'GPIO.0 =
    'GPIO.1 = LED HIGH OUT
    'GPIO.2 = SWITCH HIGH INPUT
    'GPIO.3 = MCLR TIED HIGH
    'GPIO.4 =
    'GPIO.5 =

    Main:

    HIGH GPIO.1
    PAUSE 1000
    LOW GPIO.1

    INTCON.1 = 0
    INTCON.4 = 1
    FLAGS = 0
    @ SLEEP
    @ NOP

    INTCON.1 = 0
    HIGH GPIO.1
    PAUSE 100
    LOW GPIO.1

    INTCON.1 = 0
    INTCON.4 = 1
    FLAGS = 0
    @ SLEEP
    @ NOP
    HIGH GPIO.1
    PAUSE 1000
    END

  2. #2
    Join Date
    Jul 2003
    Location
    USA - Arizona
    Posts
    156


    Did you find this post helpful? Yes | No

    Default

    I believe you may have a mismatch condition on the ports.

    Try changing the following:
    Code:
    INTCON.1 = 0
    HIGH GPIO.1
    PAUSE 100
    LOW GPIO.1
    to:
    Code:
    temp = GPIO.2'read to dummy variable to clear mismatch condition of port (see s3.2.2 of datasheet)
    INTCON.1 = 0
    HIGH GPIO.1
    PAUSE 100
    LOW GPIO.1

  3. #3


    Did you find this post helpful? Yes | No

    Default

    Hi Languer- Thanks for trying, but no cigar! Adding the line you suggested resulted in a syntax error, so I added INTCON.0 = 0 instead (To clear GPIF). I get the same result. Strange.

  4. #4
    Join Date
    Aug 2008
    Posts
    66


    Did you find this post helpful? Yes | No

    Default

    Please put a pull down resistor 10K to GND from GPIO.2

  5. #5


    Did you find this post helpful? Yes | No

    Default

    I currently have a 3k resistor there.

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


    Did you find this post helpful? Yes | No

    Default

    Place GOTO Main after your last PAUSE 1000. You should see a quick 100mS pulse on the
    LED after the 1st wake-up, and a 2 second LED on time after the 2nd wake-up.

    Using the internal oscillator you might also want to include DEFINE OSCCAL_1K 1 to make
    sure it's calibrated.
    Regards,

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

  7. #7


    Did you find this post helpful? Yes | No

    Default

    Sorry Bruce, I made both changes, and the results are the same. I get one long pulse on the LED, LED goes off until button is pressed, then short pulse and then off again. Next press of button does nothing.

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


    Did you find this post helpful? Yes | No

    Default

    Strange. This works precisely as expected. No matter how many times I press/release the
    switch.
    Code:
    @ DEVICE MCLR_OFF, INTRC_OSC_NOCLKOUT, WDT_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
    DEFINE OSCCAL_1K 1
    
    CMCON = 7
    TRISIO = %001100
    OPTION_REG = %01000000
    GPIO = 0
    T1CON = 0
    
    'GPIO.0 =
    'GPIO.1 = LED HIGH OUT
    'GPIO.2 = SWITCH HIGH INPUT
    'GPIO.3 = MCLR TIED HIGH
    'GPIO.4 =
    'GPIO.5 =
    
    Main:
        HIGH GPIO.1 
        PAUSE 1000
        LOW GPIO.1 
        
        INTCON.1 = 0
        INTCON.4 = 1
        FLAGS = 0
        @ SLEEP
        @ NOP
        
        INTCON.1 = 0
        HIGH GPIO.1
        PAUSE 100
        LOW GPIO.1
        
        INTCON.1 = 0
        INTCON.4 = 1
        FLAGS = 0
        @ SLEEP
        @ NOP
        HIGH GPIO.1
        PAUSE 1000
        GOTO Main
        
        END
    10K pull-down to ground on GPIO.2 with switch pulling it to Vcc on press.
    Regards,

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

  9. #9


    Did you find this post helpful? Yes | No

    Default

    Strange indeed. I programmed my part with your program using cut & paste, and my results are the same as they were, no second operation! It must be some sort of hardware anomaly. I will chase it with my scope later.

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


    Did you find this post helpful? Yes | No

    Default

    Try setting bit 7 in OPTION_REG to disable internal pull-ups. WPU powers-up with all internal
    pull-ups enabled, and with OPTION_REG = %01000000 you'll have internal pull-ups ON.

    I suspect it works on mine due to a slight difference in the internal pull-up. That should cure
    it unless you have a problem with your switch circuit.
    Regards,

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

  11. #11


    Did you find this post helpful? Yes | No

    Default

    trying to use "temp = GPIO.2" without declaring the temp variable is probably your syntax error.

    "temp var byte" (word whatever) near/at the beginning would solve that.

  12. #12


    Did you find this post helpful? Yes | No

    Default

    Thanks for your help, guys! OPTION_REG = %1100000 solves the problem. But why does it work the first time, and not the second time????

  13. #13
    Join Date
    Aug 2008
    Posts
    66


    Did you find this post helpful? Yes | No

    Default

    Sounds weird to me, have you tried using another chip, is it the same result too?

  14. #14


    Did you find this post helpful? Yes | No

    Default

    Mystery solved: My homemade development board has 3 other PIC sockets, 2 of which are occupied with 2 different PICs, running different programs. All of these parts share the same switch. This switch has a 5K resistor to ground, and pulls to +5V. The 16F688 has it's external interrupt pin connected to the switch, and also had it's internal pullups enabled. With only the 12F629 attached (internal pullups enabled), the voltage on the INT pins was +1V. With both PICS attached, the voltage rises to +2V. The external interrupt pins are Schmitt trigger inputs. The data sheet says the minimum voltage for "a 1, or a high" is 0.8V.
    So the 12F629 was seeing a high when it should have been a low. I have the software set to trigger on the rising edge of the switch, so it went HIGHER, LOWER, and then HIGHER. With both PICS having their internal pullups disabled, the voltage is now +2mv, and all is well. So much for "weak" pullups! As usual, I learned a lesson. Thanks to everyone for your help.

  15. #15
    Join Date
    Aug 2008
    Posts
    66


    Did you find this post helpful? Yes | No

    Default

    You're welcome. Glad that your problem is finally solved.

Similar Threads

  1. 12F629 LDR - Light Dependant Resistor
    By Dennis in forum Schematics
    Replies: 15
    Last Post: - 18th February 2010, 22:33
  2. Basic help for 12F629
    By Gene Choin in forum mel PIC BASIC
    Replies: 5
    Last Post: - 22nd September 2009, 04:06
  3. sleep on 12f629
    By sirvo in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 8th February 2007, 14:08
  4. Servo control with 12F629
    By achilles03 in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 23rd June 2005, 23:34
  5. 12F629 I2C problems
    By AIW128ProGuy in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 11th November 2004, 23:41

Members who have read this thread : 1

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