Shop OBEX P1 Docs P2 Docs Learn Events
Multiple loops running independently? — Parallax Forums

Multiple loops running independently?

ZanZan Posts: 6
edited 2010-07-23 18:01 in Learn with BlocklyProp
Hey guys!

I recently received the BASIC Stamp Activity Kit from Parallax.

I've been following through the tutorials in the book. Going back to the basic ones of flipping an LED on and off, I started to experiment a little.

I want to be able to have my first LED pulse at a certain rate and another LED pulse at another rate. Using the simple code, I could do something like this:

DO
HIGH 15
PAUSE 100
LOW 15
HIGH 14
PAUSE 250
Low 14
LOOP

Of course, when I do this, the pauses that affect the 14 LED also affect the cycle of the 15 LED.

What I want to be able to do is have one LED flash and the other flash, and the pauses in between flashes of one LED do not affect the flashes of the other LED. Is there a way to go about doing this?

Thank you for your time!

Comments

  • sylvie369sylvie369 Posts: 1,622
    edited 2010-07-23 15:37
    The way to do that is to use a Propeller instead of a Stamp.

    A Stamp is only capable of doing one thing at a time, and you've come up to the limitations that puts on what you can do. You'll find the same limitations with almost any other microprocessor you try to use (e.g., the Arduino's Atmel processor, the PIC processors, etc.). However, the Parallax Propeller is capable of doing 8 different things at a time, and in fact getting LEDs to blink independently at different rates is the first parallel processing activity in the manual. When I had that working, I jumped for joy. It sounds simple, but it's a whole new ball game as far as programming goes.

    If you really need to do this (blink LEDs at different rates), learn what you can from the Stamps (they'll teach you plenty!), and then move up to the Propeller.

    Don't be discouraged by this. You're at a very important point in learning about these devices.
    ================
    Alternatively, if you REALLY needed to get LEDs blinking at different rates using a Stamp, you could connect the Stamp I/O pins to digital potentiometer chips, and use those to vary the resistor value in a 555 timer circuit to change the rates of LED blinking. There may be other ways as well, using external circuits.

    Post Edited (sylvie369) : 7/23/2010 3:42:43 PM GMT
  • Mike GreenMike Green Posts: 23,101
    edited 2010-07-23 15:52
    It's possible to use a Stamp to flash two LEDs at unrelated rates because the Stamp is much faster than the blink rates you want. It makes the programming more complex though. Essentially you write one single loop that uses a PAUSE statement to set the timing say at 10ms, like
    DO
      PAUSE 10
      ''' Stuff
    LOOP
    


    You have as many counters (variables) as you have LEDs and, each time through the loop, you increment all the counters and do a wraparound (to zero) when each counter reaches its limit. If you want an LED to cycle once a second, it would wraparound at 100 (because there are 100 x 10ms in one second). This would look like:
    IF counter1 = 100 THEN counter1 = 0
    


    Assuming you want a 50% on / 50% off LED cycle, you'd then test for this with:
    IF counter1 = 50 THEN TOGGLE LED1pin
    


    If you have a lot of LEDs, all these tests will take quite a bit of time and you may want to reduce the PAUSE time to 9 to allow for that. You'll have to experiment.
  • Tracy AllenTracy Allen Posts: 6,664
    edited 2010-07-23 16:30
    Another way to do this is to make two counters advance at different rates, and couple the flash of the LED to the most significant bit. On the Stamp:

    counterA VAR Word
    counterB VAR Word
    freqA CON 65        ' adjust freqA and freqB for LED flash rate.
    freqB CON 130     ' they set how long it takes for the counter to advance one full cycle
    LEDA PIN 0
    LEDB PIN 1
    
    LOW LEDA   ' make LED pins output
    LOW LEDB
    DO
      counterA = counterA+freqA
      counterB = counterB+freqB
      LEDA = counterA.bit15
      LEDB = counterB.bit15
    LOOP
    



    I'm figuring that the above loop will execute in something like 1 to 2 milliseconds, so the 16 bit counters will run a full cycle in on the order of 1 second. If you add additional code to the loop, you will have to adjust the freqX values to compensate for the extra loop time.

    This is the principle of a numerically controlled oscillator, or direct digital synthesis--The propeller has lots of capability in that direction.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Tracy Allen
    www.emesystems.com

    Post Edited (Tracy Allen) : 7/23/2010 4:36:01 PM GMT
  • sylvie369sylvie369 Posts: 1,622
    edited 2010-07-23 17:32
    I read too much into the question - of course you can do it through programming, as Mike and Tracy pointed out.
    In some sense that's not truly "multiple loops running independently", but it will probably accomplish what you're after. Sorry about that.
  • ZanZan Posts: 6
    edited 2010-07-23 17:51
    Thanks Mike!

    I tried using a counter, and it works great!
  • Mike GreenMike Green Posts: 23,101
    edited 2010-07-23 18:01
    I just realized that what I told you won't get you a 50% on / 50% off cycle. You also need to toggle the LED when the count wraps around. You could do this with:

    IF counter1 = 100 THEN counter1 = 0 : TOGGLE LEDpinNo

    instead of just setting the counter to zero
Sign In or Register to comment.