switches & LEDs ... my first attempt


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    yankee's Avatar
    yankee Guest

    Default switches & LEDs ... my first attempt

    Hi, a newbie to digital here. I'm having trouble getting a PIC16f628A to do more than one function at once with switches.

    I have two switches and two LEDs. One switch operates one LED, the other switch operates the second LED.

    I need each LED to operate independently of one another and together when their respective switches are activated. Right now, one switch interupts the others function. Here is my code:

    Swstb var Porta.0 ' switchstb is on porta.0
    Switchleft VAR PORTA.3 ' switchleft is on portb.0

    LTS VAR PORTB.0 ' left portb.0
    STB VAR PORTB.5 ' STB

    TRISA.0 = 1 ' porta.0 is now an input
    TRISA.3 = 1 ' Porta.3 is now an input
    TRISB.0 = 0 ' Portb.0 is left
    TRISB.5 = 0 ' Portb.5 is STB


    Main:
    IF Switchleft = 0 THEN left 'Pressing switch lights left led
    if switchstb = 0 then strobe 'Pressing switch stobes led

    Lts = 0 ' If switch is pressed, light the LED otherwise turn it OFF
    stb = 0 ' If switch is pressed, strobe the LED otherwise turn it OFF

    pause 83

    GOTO Main

    left:
    LTS = 1 'Turn ON LTS
    Pause 333 'Wait .333 seconds
    LTS = 0 'Turn OFF LTS
    Pause 333 'Wait .333 seconds
    GOTO Main

    strobe:
    stb = 1 'Turn on strobe
    pause 100 'wait for .1 seconds
    stb = 0 'Turn off strobe
    pause 100 'wait for .1 seconds
    goto main

    GOTO Main

    Any help on this is greatly appreciated.

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


    Did you find this post helpful? Yes | No

    Default

    Code:
    	Switchstb var Porta.0 	' switchstb is on porta.0
    	Switchleft VAR PORTA.3	' switchleft is on portb.0
    
    	LTS VAR PORTB.0		' left portb.0
    	STB VAR PORTB.5 	' STB
    
    	TRISA.0 = 1 		' porta.0 is now an input
    	TRISA.3 = 1 		' Porta.3 is now an input
    	TRISB.0 = 0 		' Portb.0 is left
    	TRISB.5 = 0 		' Portb.5 is STB
    
    	CMCON=%00000111		' ensures PortA is in Digital Mode
    
    Main:
    	IF Switchleft = 0 THEN 	' Pressing switch lights left led
    		High LTS
    		else
    		low LTS
    		endif
    	if Switchstb = 0 then 	' Pressing switch strobes led
    		High stb
    		pause 100
    		low stb
    		pause 100
    		endif
    	Goto Main
    
    	end

  3. #3
    yankee's Avatar
    yankee Guest


    Did you find this post helpful? Yes | No

    Default

    Wow, thanks! Now, that works to make one LED on steady and the other blinking. Is it possible to make them both blink at different rates and still operate independently of one another? I tried to modify that code with no success. I don't understand the comparisons well enough yet.

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


    Did you find this post helpful? Yes | No

    Default

    So the requirement is as long as the switch is closed you want the respective LED to blink, but they blink at different rates?

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


    Did you find this post helpful? Yes | No

    Default

    Your request is slightly more complex than you first imagine, because if the PIC is busy timing one LED, it can't really be attending to the other. So we have to do a bit of magic...

    Here I've changed the Labels to make association between Switches, LED's, Constants and Variables more readable.

    Like Clint Eastwood said in the Dirty Harry films... "Every man has to know his limitations". Now this applies equally to PICs and programs as well. Here, in our example program, the limitation I've set, is that everything happens in multiples of 10mS... but the flip side is that with this method you can add as many LED's and Switches as you have pins on your PIC and each can have different timing rates...

    Code:
    	SwitchA var PORTA.0 	' switch on porta.0
    	SwitchB var PORTA.3	' switch on portb.0
    
    	LedA VAR PORTB.0	' LED on portb.0
    	LedB VAR PORTB.5 	' LED on PortB.5
    
    	TRISA.0 = 1 		' porta.0 is now an input
    	TRISA.3 = 1 		' Porta.3 is now an input
    	TRISB.0 = 0 		' Portb.0 is left
    	TRISB.5 = 0 		' Portb.5 is STB
    
    	CMCON=%00000111		' ensures PortA is in Digital Mode
    
    	LedABlinkRate con 10	' Blink Rate in Steps of 10mS (10=100mS)
    	LedBBlinkRate con 33	' Blink Rate in Steps of 10mS (33=330mS)
    
    	LedACounter var BYTE	' Counter for LedA
    	LedBCounter var BYTE	' Counter for LedB
    
    	Low LedA		' Startup with all LEDs OFF
    	Low LedB
    	LedACounter=0		' Startup with all Counters OFF
    	LedBCounter=0
    
    Main:
    	If SwitchA=0 THEN 	' Closing SwitchA blinks LedA
    		If LedACounter=0 then
    			Toggle LedA
    			LedACounter=LedABlinkRate
    			else
    			If LedACounter>0 then LedACounter=LedACounter-1
    			endif
    		else
    		LedACounter=0
    		low LedA
    		endif
    
    	If SwitchB=0 THEN 	' Closing SwitchB blinks LedB
    		If LedBCounter=0 then
    			Toggle LedB
    			LedBCounter=LedBBlinkRate
    			else
    			If LedBCounter>0 then LedBCounter=LedBCounter-1
    			endif
    		else
    		LedBCounter=0
    		low LedB
    		endif
    
    	Pause 10
    	Goto Main
    
    	end
    Just added a minor change (zeroing LedACounter and LedBCounter in the main loop), so if you missed it first time, copy the code again.

  6. #6


    Did you find this post helpful? Yes | No

    Lightbulb

    Hello,

    I generally use a fairly tight loop with small delays and counters.

    For the LEDs I use flash-pattern words.
    I start at bit 0 of the flash-pattern word and, if it's a ONE, I turn the LED ON.
    If it's a ZERO I turn the LED OFF.

    Each time I pass through the loop I increment the flash-pattern word's bit counter by one and do the check again.
    When the bit counter reaches 16 I reset it to 0 again (a word variable's bits are numbered 0 to 15).

    Currently, I have a project with 5 switches and 5 LEDs.
    Each LED has a flash-pattern word variable associated with it.

    It works well, the flashing is smooth, and does not require interrupts.

    If I want an LED to flash on and off quickly (50% duty-cycle), I load it's flash-pattern word variable with %0101010101010101. If I want the LED to flash on and off slowly (but also with a 50% duty-cycle), I load %0000000011111111. If I want it ON all of the time I load it with all ones. If I want it off all of the time I load the variable with all zeros. Basically, you have 65536 different flash-patterns to choose from and all you have to do is load one variable.

    The beauty of this is that each LED "seems" to be operating independently with a mind of it's own. Other LEDs' flash-patterns are unaffected when one LED's pattern changes. Also, you can define flash-patterns for different modes as constants. This makes your code much more readable.

    For instance...

    Main:
    If Button1 = 0 Then
    LED1Pattern = OPERATING_MODE
    Else
    LED1Pattern = STANDBY_MODE
    EndIf

    Pause 10

    Gosub UpdateLEDState

    Goto Main


    In the above example, "Button1" is the aliias for a switch input pin (active low). "Led1Pattern" is a word-sized variable the holds the flash pattern for LED #1. OPERATING_MODE and STANDYBY_MODE are 16-bit constants declared at the beginning of your program. And finally, "UpdateLEDState" is a subroutine (not shown above) that increments the flash-pattern bit-counter and then turns LED #1 on or off, depending on whether the current bit in "LED1Pattern" is a ONE or a ZERO. You could have as many LED flash-pattern words being "updated" in this routine as your RAM allows. I generally use arrays for my flash-patterns and then use a loop.

    Anyway, have fun and welcome to PIC programming!

    Last edited by picnaut; - 24th August 2005 at 17:12.
    ---> picnaut

  7. #7
    yankee's Avatar
    yankee Guest


    Did you find this post helpful? Yes | No

    Default

    I just love it when someone quotes Clint!

    Well, it looks like it's going to be a rough transition to digital after 25 years of analog. I tried your code Melanie, but I couldn't get it to work either LED. I must have gone wrong somewhere. I'll have to double & triple check things on my end.

    picnaut is talking WAY above my head, but I'm going to try and figure that one out too, eventually. I can understand all zeros for "off" all of the time and all ones for "on" all of the time, but the rest of it baffles me, so far.

    What I need is a picbasic pro for idiots book. Does anything like that exist?

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


    Did you find this post helpful? Yes | No

    Default

    I posted the code as an example without testing... hmmm.... I'll go check...

  9. #9


    Did you find this post helpful? Yes | No

    Red face

    Quote Originally Posted by yankee
    picnaut is talking WAY above my head, but I'm going to try and figure that one out too
    Sorry about that.

    I'm not at a computer that has Pic Basic Pro installed on it.
    Also, I haven't programmed using PBP for a while, so I didn't want to type a bunch of code with a bunch of syntax errors.
    That would just confuse you more.
    That's why I tried to keep it to mostly theory.

    Maybe I can take a look at it tonight and whip something up.
    It's a lot easier than my description sounds at first.

    How much do you know about binary and hexadecimal number systems?
    It would help to know what your background is so that I know where to start.

    Anyway, you're going to love programming PICs with basic.
    It's a great way to start.
    Especially, if you've been working with strictly analogue for a quarter century.



    Cheers.
    ---> picnaut

  10. #10
    jessey's Avatar
    jessey Guest


    Did you find this post helpful? Yes | No

    Default Sounds like a cool program................

    Quote Originally Posted by picnaut
    Hello,

    Each time I pass through the loop I increment the flash-pattern word's bit counter by one and do the check again.
    When the bit counter reaches 16 I reset it to 0 again (a word variable's bits are numbered 0 to 15).

    For instance...

    Main:
    If Button1 = 0 Then
    LED1Pattern = OPERATING_MODE
    Else
    LED1Pattern = STANDBY_MODE
    EndIf

    Pause 10

    Gosub UpdateLEDState

    Goto Main

    Hello picnaut,

    I just found this post and I find it really interesting. I'd love to see your complete program if you could post it with all the defines and variables declared as I've never played with led's the way you explained it here but it sure sounds cool. I think I could learn a lot if I could take it apart and play with it.

    Thanks
    jessey

Similar Threads

  1. Run a string of LEDs from the mains
    By The Master in forum Off Topic
    Replies: 30
    Last Post: - 1st October 2009, 18:55
  2. Using LEDs as light sensors
    By skimask in forum Code Examples
    Replies: 3
    Last Post: - 30th December 2006, 22:19
  3. arrays LEDs Switches
    By ilteris in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 22nd October 2005, 03:05
  4. controlling leds with the switches
    By ilteris in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 12th October 2005, 21:02
  5. Can anyone help a beginner in a struggle?
    By douglasjam in forum mel PIC BASIC
    Replies: 1
    Last Post: - 5th May 2005, 23:29

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