How to blink 8 LEDs at different rates- concurrently?


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    Join Date
    May 2007
    Posts
    604


    Did you find this post helpful? Yes | No

    Default

    mack, the LEDs need to blink all at the same time, so that will not work.

    Mel, use arrays and a for-next loop - along these lines?
    Code:
    Loop:
    for x = 0 to 7
      If LoopLED[x] = 0 then
        LoopLED[x] = LoopCON[x]
        Toggle PORTB.x
      else
        LoopLED[x] = LoopLED[x]-1
      endif  
    next x
    Pause 10
    Goto Loop

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


    Did you find this post helpful? Yes | No

    Default

    Yes, pretty much, but I don't think PortB.x will work, so...

    Code:
    	ShadowPortB=0
    Loop:
    	for x = 0 to 7
    		If LoopLED[x] = 0 then
    			LoopLED[x] = LoopCON[x]
    			ShadowPortB.0(x)=ShadowPortB.0(x)^1
    			else
    			LoopLED[x] = LoopLED[x]-1
    			endif  
    		next x
    	PortB=ShadowPortB
    	Pause 10
    	Goto Loop
    Where ShadowPort is a BYTE.

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Just to be different ...
    And because she said "less than 8 Lines of Code" ...

    Code:
    TRISB = 0
    Main:
        x = (x + 1) // 8
        PORTB.0(x) = !(LoopLED(x) < LoopCON(x))
        LoopLED(x) = (LoopLED(x) + 1) // (LoopCON(x) << 1)
        if x=7 THEN PAUSE 10
    GOTO Main
    DT

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    OUCH!

    After running my loop in the SIM.
    I realized the timing was Waaaayyyyy OFF.
    Fortunately, the other examples were "OFF" too ... just not as far.

    I've always said PAUSE is the worst statement in the BASIC language.
    It got me again.

    Here's a version that should compensate ...
    It uses the CCP module in "Compare" mode to create a precise 10mS interval.
    So when you give a delay value of 50, it actually takes 500mS, on the nose.

    Sorry, it's more than 8 lines now.
    Code:
    DEFINE OSC 4
    DEFINE BLINKYFREQ 100  ; 10mS periods
    
    DATA 50,22,38,75,17,40,62,13  ; default periods for each Output
    ;----------------------------------------------------------------
    CCPR1val  CON EXT      : @CCPR1val = (OSC*1000000/4)/ BLINKYFREQ
    CCPR1     VAR WORD EXT : @CCPR1 = CCPR1L
    Timer1    VAR WORD EXT : @Timer1 = TMR1L
    CCPIF     VAR PIR1.2
    
    LoopLED   VAR BYTE[8]
    LoopCON   VAR BYTE[8]
    x         VAR BYTE
    
    ;----[Initialize]------------------------------------------------
    FOR x = 0 to 7         ; load the periods from EEPROM
        READ x, LoopCON(x)
    NEXT X
    ;-- setup CCP1 and Start Timer1 --
    CCPR1   = CCPR1val     ; set compare value
    CCP1CON = %00001011    ; compare mode, special event 
    Timer1  = 0            ; clear Timer1
    T1CON.0 = 1            ; start Timer1
    
    TRISB = 0              ; PORTB all OUTPUT
    
    ;----[Main Program Loop]----------------------------------------
    Main: 
        x = (x + 1) // 8
        PORTB.0(x) = !(LoopLED(x) < LoopCON(x))
        LoopLED(x) = (LoopLED(x) + 1) // (LoopCON(x) << 1)
        IF x != 7 THEN Main
      Waiting: IF !CCPIF THEN Waiting
        CCPIF = 0
    GOTO Main
    Cheers,
    Last edited by Darrel Taylor; - 26th April 2010 at 03:59. Reason: Minor modifications
    DT

  5. #5
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    Darrel, that algorithm is slick!

    Does PBP allow assignments in expressions like C? For example;

    Code:
    while(1)
    { x = (x+1)&7;
      portb ^= ((!(LoopLED[x]=(LoopLED[x]+1)%LoopCON[x])) << x);
      delay_us(2500);
    }

  6. #6
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Thanks Mike.
    Quote Originally Posted by Mike, K8LH View Post
    Does PBP allow assignments in expressions like C? ...
    Nope, not even a +=

    However, your x = (x+1)&7 takes much less time than my x = (x + 1) // 8 (Modulus) approach.
    What was I thinking?

    Cool, thanks!
    DT

  7. #7
    Join Date
    Feb 2003
    Posts
    432


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    Thanks Mike.

    Nope, not even a +=

    However, your x = (x+1)&7 takes much less time than my x = (x + 1) // 8 (Modulus) approach.
    What was I thinking?

    Cool, thanks!
    DOH!!! The problem with working with so many different languages is that you can misread code. I took " //8 " to be a comment (Javascript style) that you were going to do it 8 times LOL
    Keith

    www.diyha.co.uk
    www.kat5.tv

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


    Did you find this post helpful? Yes | No

    Default

    Personally, I'd have reduced PAUSE by a couple of clicks *smiles*

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