Button help


Closed Thread
Results 1 to 22 of 22

Thread: Button help

  1. #1
    darklight's Avatar
    darklight Guest

    Default Button help

    Hey people.

    I'm new to microcontrolers and picbasic.
    I was just wondering if anyone could help me with switchs.
    I can already output leds from portB.

    PIC = 16F627

    I'm using a programmer / test board (VELLEMAN VM111) to test buttons and leds.

    The leds = 6 on portB
    Buttons = 4 on portA

    Thanks for any help.

  2. #2
    blainecf's Avatar
    blainecf Guest


    Did you find this post helpful? Yes | No

    Default Checklist for buttons

    Make sure:

    1. ADCON1 = 7 so that your PORTA pins are digital

    2. Set the appropriate TRISA.x = %1 for Digital Input

    3. Wire a pull-up resistor (10K from V+ to each pin that will sense the switch)

    4. Wire each switch, one side ground, the other to the pin from step #3

    5. Set up a loop for polling the ports; High (%1) will be normal, and Low (%0) will show when the switch is held closed.

    If you're not used to digital signals, it seems weird to ground out a resistor thats hooked to V+, but just accept it.

    Regards,

  3. #3
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default MIIIP something's wrong :)

    ADCON1=7 have nothing usefull to do with the 16F627 but compilation error. There's no ADCs in the PIC16F627, just analog comparator.

    CMCON=7
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  4. #4
    homebrewer's Avatar
    homebrewer Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by mister_e
    ADCON1=7 have nothing usefull to do with the 16F627 but compilation error. There's no ADCs in the PIC16F627, just analog comparator.

    CMCON=7
    I'm a beginner too. I had also problems to query PORTA. The tip with CMON=7 was the solution. Steve, thank you very much!
    _______________
    Regards
    Johann
    Last edited by homebrewer; - 22nd August 2006 at 00:00.

  5. #5
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default Meeee Tooo

    Attention fellow newbies:
    Here's what I learned the hard way, twice!
    When your button code calls a LABEL,
    put that labeled code in the very next line after your button code,
    or you get nasty error codes assuring you that it is not really a label.

    I ran into this in a program with several sub routines and several buttons
    and the only way it would compile was if I put the subs directly after the button.

  6. #6
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default

    I can't make it work with the BUTTON command.

    So I tried the other way and use the simple IF..THEN command.

    But again, I have the same unexpected result. The Led starts to blink when I press the button. As I release the button, it never "toggles" as I want it to do.

    Since this program behavior is the same in both cases (BUTTON and IF..THEN commands), I assume something is wrong with some register settings.

    I was thinking about a bouncing problem, but I'm not sure about that.

    Here is my code; where do I miss something?

    'PIC 16F88
    'Button is on PORTB.3 (Pin 9) Pressed = 0V
    'Led is on PORTB.4 (Pin 10)

    OSCCON = %01100000 'Internal RC set to 4MHZ
    TRISB = %00001000 'RB3 is an Input, all others are Outputs
    '----------------------------------------------------------------

    ' IF..THEN
    MAIN:
    IF PORTB.3 = 0 then SWITCH_LED
    goto main

    SWITCH_LED:
    pause 100 'Debounce
    toggle PORTB.4
    goto main

    end

    '----------------------------------------------------------------
    ' BUTTON

    'BVar var byte
    'BVar = 0
    '
    'MAIN:
    ' BUTTON 9, 0, 255, 255, BVar, 0, SWITCH_LED
    ' goto main
    '
    'SWITCH_LED:
    ' pause 100 'Debounce
    ' toggle PORTB.4
    ' goto main

    END
    Roger

  7. #7
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    MAIN:
    IF PORTB.3 = 0 then SWITCH_LED
    goto main

    SWITCH_LED:
    pause 100 'Debounce
    toggle PORTB.4
    goto main

    So what happens above when you keep your finger pressed on the button for longer than 100mS? Your LED will keep toggling every 100mS...

    Try this...

    MAIN:
    IF PORTB.3 = 0 then SWITCH_LED
    goto main

    SWITCH_LED:
    pause 100 'Debounce
    toggle PORTB.4
    While PortB.3=0:Wend ' Wait here for Button to be released
    goto main

  8. #8
    homebrewer's Avatar
    homebrewer Guest


    Did you find this post helpful? Yes | No

    Default

    ' Try CMCON=7 as mister_e has stated in reply#3
    ' now you can query input pins
    ' from this point it's up to you, how your led should work

    CMCON=7

    MAIN:
    IF PORTB.3 = 0 then SWITCH_LED
    goto main

    SWITCH_LED:
    pause 100 'Debounce
    toggle PORTB.4
    goto main

    end


    ' Regards
    ' Johann

  9. #9
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    CMCON has no effect on PortB on this PIC.

  10. #10
    homebrewer's Avatar
    homebrewer Guest


    Did you find this post helpful? Yes | No

    Default

    Hello Melanie,
    you are very right. I have looked into the datasheet after my reply.
    I was too overhasty - sorry!

  11. #11
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    Appologies are unnescessary.

    flotulopex reported that his LED blinks when he pushes the button, that's because there's only a 100mS Pause in the loop and you toggle the LED-ON, and with your finger still on the button, 100mS later you toggle it OFF, and with your finger still on the button, the LED toggles again 100mS later... etc etc until the end of time.

    You need to ensure that once the LED toggles, it doesn't do so again until the Button is pressed anew. There are MANY, MANY ways of doing this. The example I posted simply waits for the user to remove his finger from the button before proceeding further.

  12. #12
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default

    Thank you Melanie,

    Actually, it still doesn't work.

    Each time I press the button, the Led lights up and as soon as I release the button, the Led switches off. At least, it doesn't blink anymore while the button is pressed.

    It just doesn't want to toggle!

    To make sure my button is correctly connected, is this schematic okay?
    > Vdd-R10k-PORTB.3 and the button (normally open) is derived from PORTB.3 to Vss.

    Since I can't make it work with this simple program, my last guess would be that my PIC is defect. I tried with other ports but there is no change. I shall receive another PIC tomorrow.

    By the way, is there any utility tool to check the PIC's health?
    Roger

  13. #13
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    MyButton var PortB.3
    LED var PortB.4

    TRISB = %00001000

    Loop:
    If MyButton=0 then
    Toggle LED
    While MyButton=0:Pause 100:Wend
    endif
    Goto Loop

    End

    Try the above and report back what the result is...

  14. #14
    Join Date
    Mar 2006
    Location
    INDIA
    Posts
    89


    Did you find this post helpful? Yes | No

    Default

    'PIC 16F84A
    DEFINE OSC 4
    TRISA = %000001
    TRISB = %11111100
    I VAR BYTE
    PAUSE 200

    MAIN:
    IF PORTA.0 = 1 then SWITCH_LED
    goto main

    SWITCH_LED: IF PORTA.0 = 0 THEN SWITCH_LED_INSTANT
    FOR I = 0 TO 10
    IF I < 10 AND PORTA.0 = 0 THEN SWITCH_LED_INSTANT
    PAUSE 100
    NEXT I
    IF PORTA.0 = 1 THEN SWITCH_LED_DELAY
    goto main

    SWITCH_LED_DELAY: TOGGLE PORTB.0
    PAUSE 10

    AVOID_LED_BLINK: IF PORTA.0 = 1 THEN AVOID_LED_BLINK
    PAUSE 10
    GOTO MAIN


    SWITCH_LED_INSTANT: TOGGLE PORTB.1
    PAUSE 10
    GOTO MAIN

  15. #15
    JARI NETWORKS's Avatar
    JARI NETWORKS Guest


    Did you find this post helpful? Yes | No

    Default

    I'm also a new one with de pic chips, can I use this also for a 16F628A chip??

    grz Jan

  16. #16
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default Melanie, I tested your piece of code

    Hello Melanie,

    Your piece of code didn't work until I... grounded PORTB.2.

    So I tried my code and it worked well too.

    I didn't expect this component to be so sensible to the electric field around the pins.

    I won't forget this lesson, for sure ;-)
    Roger

  17. #17
    JARI NETWORKS's Avatar
    JARI NETWORKS Guest


    Did you find this post helpful? Yes | No

    Default

    so many viewers, and nobody can give me an answer??

  18. #18
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by JARI NETWORKS
    I'm also a new one with de pic chips, can I use this also for a 16F628A chip??

    grz Jan
    If you are meaning "can you use the button command with the 16f628a chip, then the answer is yes

  19. #19
    JARI NETWORKS's Avatar
    JARI NETWORKS Guest


    Did you find this post helpful? Yes | No

    Default

    ok thanks,that was all I want to know at this moment

  20. #20
    Join Date
    Jan 2008
    Location
    lincoln uk
    Posts
    20


    Did you find this post helpful? Yes | No

    Default polling portb

    On the side, could you tell me the correct syntax to poll portb in a for..next loop?
    viz
    FOR i = 0 to 7
    IF portb.[i]=0 THEN GOSUB alarm
    NEXT i
    This doesn't work and I can't find the answer in the book


    Quote Originally Posted by blainecf View Post
    Make sure:

    1. ADCON1 = 7 so that your PORTA pins are digital

    2. Set the appropriate TRISA.x = %1 for Digital Input

    3. Wire a pull-up resistor (10K from V+ to each pin that will sense the switch)

    4. Wire each switch, one side ground, the other to the pin from step #3

    5. Set up a loop for polling the ports; High (%1) will be normal, and Low (%0) will show when the switch is held closed.

    If you're not used to digital signals, it seems weird to ground out a resistor thats hooked to V+, but just accept it.

    Regards,

  21. #21
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by med2007 View Post
    On the side, could you tell me the correct syntax to poll portb in a for..next loop?
    viz
    FOR i = 0 to 7
    IF portb.[i]=0 THEN GOSUB alarm
    NEXT i
    This doesn't work and I can't find the answer in the book
    http://www.picbasic.co.uk/forum/showthread.php?t=544

  22. #22
    Join Date
    Jan 2008
    Location
    lincoln uk
    Posts
    20


    Did you find this post helpful? Yes | No

    Default polling portb

    Thanks for the link...so my syntax should be?

    FOR i = 0 to 7
    IF portb.0(i) = 0 THEN GOSUB alarm
    NEXT i

    I'll give it a whirl.
    Rgds
    MED2007

Similar Threads

  1. Sony SIRC IR Issue
    By Ryan7777 in forum mel PIC BASIC Pro
    Replies: 10
    Last Post: - 8th August 2015, 08:10
  2. 3 HPWM channels
    By docwisdom in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 4th April 2006, 02:43
  3. Code check -- button not working
    By docwisdom in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 2nd March 2006, 22:43
  4. Button Push within 3 second Window
    By Tissy in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 22nd December 2005, 10:06
  5. Button subfunction 16F628
    By Jųan in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 19th August 2005, 16:44

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