Making a flying star effect with LEDs


Closed Thread
Results 1 to 23 of 23

Hybrid View

  1. #1
    Join Date
    Jan 2006
    Location
    Istanbul
    Posts
    1,185


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    The example is for 16F877A.
    In the example, yes, there is only one LED at a time.
    "If the Earth were a single state, Istanbul would be its capital." Napoleon Bonaparte

  2. #2
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    (Post removed at user's request in next post)
    Last edited by Demon; - 28th December 2011 at 17:13. Reason: Solution found.

  3. #3
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    I would have liked to delete thread #18 because that issue was resolved, I was missing some piece of code for MIBAM.
    Anyways, I started off using Sayzer's code, then I was able to bypass the POT and make the LEDs scan automaticly.
    I then added the MIBAM code (with no apparent difference) and I am still back to square one; I am not able to have about 20 LEDs on at the same time (or appear to be) to produce an effect similar as the video in thread #11
    I am obviously not getting it and I would appreciate some guidance.
    Below is the code I have so far, it is turning on then off LED1 to LED64 at the right speed but I am trying to turn on LED1, LED2...LED20 and from there when LED21 turns on the LED1 will turn off, LED22 on - LED2 off and so on.
    Code:
    @ __config _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CP_OFF
    
    CLEAR
    DEFINE OSC 20
    BAM_COUNT CON 8
    INCLUDE "MIBAM.pbp"
    ;____[ For 12F/16F only - Interrupt Context save locations]_________________
    wsave  var byte    $20     SYSTEM  ' location for W if in bank0
    ;wsave  var byte    $70     SYSTEM  ' Alternate save location for W 
                                        ' if using $70, comment out wsave1-3
    ;       Comment them out to fix the problem ----
    ; -- The chip being used determines which variables are needed -------------
    wsave1 VAR BYTE    $A0     SYSTEM      ' location for W if in bank1
    wsave2 VAR BYTE    $120    SYSTEM      ' location for W if in bank2
    wsave3 VAR BYTE    $1A0    SYSTEM      ' location for W if in bank3
    ;---DO NOT change these-----------------------------------------------------
    ssave  VAR BYTE    BANK0   SYSTEM      ' location for STATUS register
    psave  VAR BYTE    BANK0   SYSTEM      ' location for PCLATH register
    
    DEFINE LCD_DREG PORTD
    DEFINE LCD_DBIT 0
    DEFINE LCD_RSREG PORTD
    DEFINE LCD_RSBIT 5
    DEFINE LCD_EREG PORTD
    DEFINE LCD_EBIT 4
    DEFINE LCD_BITS 4
    DEFINE LCD_LINES 2
    DEFINE LCD_COMMANDUS 2000
    DEFINE LCD_DATAUS 50
    
    DEFINE ADC_BITS 8      ' Set number of bits in result
    DEFINE ADC_CLOCK 3     ' Set clock source (rc = 3)
    DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds 
    
    CM1CON0 = 0 
    CM2CON0 = 0
    pauseus 10
    ADCON1 = 0
    ADCON0 = 0              ' All analog, we just need RA0.
    TRISA = 255             ' PORTA all input. Others output.
    TRISB = 0
    TRISC = 0
    TRISD = 0
    test var byte
    X var PORTB
    Y var PORTC
    x = 0   ; make sure all LEDs are off 
    y = 0   ; when powr is applied
    
    I var byte
    Index var byte
    Index2 var byte
    OldVal var byte
    Pause 10
    
    ASM
    BAM_LIST  macro           ; Define PIN's to use for BAM
     BAM_PIN (PORTB,0, X)     ;   and the associated Duty variables
     BAM_PIN (PORTB,1, X)
     BAM_PIN (PORTB,2, X)
     BAM_PIN (PORTB,3, X)
     BAM_PIN (PORTB,4, X)
     BAM_PIN (PORTB,5, X)
     BAM_PIN (PORTB,6, X)
     BAM_PIN (PORTB,7, X)
    
     endm
     BAM_INIT  BAM_LIST        ; Initialize the Pins
    ENDASM                 ' Mirror Image BAM module 
    
    Begin:
        pause 500
        ;lcdout $fe,1,"Matrix Test"
        ;PAUSE 500
        
        X = 0               
        Y = 255
        
        index = 0
        oldval = 255
    
    Start:
    ;    adcin 0, index      ' Index = max 255.
    
    for i = 0 to 255
        index = i / 4   ' To get index values between 0 to 63.
        ;if oldval <> index then ' Act only when the number changes.
            index2 = index/8    ' X scans 8 bits.
            x = 0               ' turn it Off.
            x.0[index2] = 1     ' Set the bit in line.
            
            y = 255             ' turn all pins on (output is off).
            lookup index2,[7,15,23,31,39,47,55,63],index2   ' Get matrix line.
            y.0[index2-index] = 0                           ' Clear the bit in line (output is on)
        
            ;lcdout $fe,$c0,dec3 index , " ",dec3 index2 
            ;pause 10   
            oldval = index
        ;endif  
         pause 1
     next i 
     pause 100
        goto start
    
    end

  4. #4
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    I am still struggling with this, however I am a few steps further (I hope)

    First off I played with Darrel's Cylon/Kitt code
    and slightly modified it to scan one way but I have 2 issues;
    • Since I have 64 LEDs connected like Sayzer indicated I get 8 LEDs turned on and slowly drained at the same time.
    • After each scan I could not pause until the last LEDs fully extinguish and have an extra 2 seconds before the next scan starts.
    This is the modified code:
    Code:
    CLEAR
    ;-- 16F887 Internal OSC @ 8Mhz ------
    ;@  __config _CONFIG1, _INTOSCIO & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
    @ __config _CONFIG1,  _INTOSCIO & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BOREN_OFF
    ANSEL = 0
    ANSELH = 0
    OSCCON = %01110001
    DEFINE OSC 8
    
    TRISC = 0       ; I needed to clear PORTC
    Y var PORTC
    y = 0
    
    ;____[ For 12F/16F only - Interrupt Context save locations]_________________
    wsave       var byte    $20     SYSTEM  ' location for W if in bank0
    ;wsave       var byte    $70     SYSTEM  ' Alternate save location for W 
                                            ' if using $70, comment out wsave1-3
    ' --- IF any of these next three lines cause an error ?? -------------------
    '       Comment them out to fix the problem ----
    ' -- The chip being used determines which variables are needed -------------
    wsave1      VAR BYTE    $A0     SYSTEM      ' location for W if in bank1
    wsave2      VAR BYTE    $120    SYSTEM      ' location for W if in bank2
    wsave3      VAR BYTE    $1A0    SYSTEM      ' location for W if in bank3
    '---DO NOT change these-----------------------------------------------------
    ssave       VAR BYTE    BANK0   SYSTEM      ' location for STATUS register
    psave       VAR BYTE    BANK0   SYSTEM      ' location for PCLATH register
    
    
    ;----[ MIBAM Setup ]--------------------------------------------------------
    ;BAM_FREQ  CON 100                   ; Desired Refresh rate Limit
    ;ScopeSync VAR PORTB.0               ; if declared, generates sync for OScope
    ;DEFINE BAM_INFO 1                   ; use to display MIBAM results
    
    BAM_COUNT CON 8                     ; How many BAM Pins are used?
    INCLUDE "MIBAM.pbp"                 ; Bit Angle Modulation module
    
    BAM_DUTY  VAR BYTE[BAM_COUNT]
      LED1    VAR BAM_DUTY[0]           ; group them in an array for easy access
      LED2    VAR BAM_DUTY[1]           ; with FOR loops etc.
      LED3    VAR BAM_DUTY[2] 
      LED4    VAR BAM_DUTY[3] 
      LED5    VAR BAM_DUTY[4] 
      LED6    VAR BAM_DUTY[5] 
      LED7    VAR BAM_DUTY[6] 
      LED8    VAR BAM_DUTY[7] 
    
    ASM
    BAM_LIST  macro                     ; Define PIN's to use for BAM
         BAM_PIN (PORTB,0, LED1)        ;   and the associated Duty variables
         BAM_PIN (PORTB,1, LED2)
         BAM_PIN (PORTB,2, LED3)
         BAM_PIN (PORTB,3, LED4)
         BAM_PIN (PORTB,4, LED5)
         BAM_PIN (PORTB,5, LED6)
         BAM_PIN (PORTB,6, LED7)
         BAM_PIN (PORTB,7, LED8)
      endm
      BAM_INIT  BAM_LIST                ; Initialize the Pins
    ENDASM
    
    ;_________________________________________________
    Speed       CON 5         ; Smaller = Faster
    TracerSpeed CON 20        ; Smaller = Faster Left/Right
    Brightness  CON 200       ; Tracers DutyCycle
    DrainSpeed  CON 40        ; Smaller = Shorter Trail
    
    Idx         VAR BYTE
    LoopCount   VAR BYTE
    NextLED     VAR BYTE
    TraceDIR    VAR BIT
    
      TraceDIR  = 0
      LoopCount = 0
      NextLED   = 0
        
    Main:
        if LoopCount = TracerSpeed then             ; __[ Cylon/Kitt Scanner ]__
          LoopCount = 0
          BAM_DUTY(NextLED) = Brightness
      ;    if TraceDIR then                          ; if scanning left
      ;      NextLED = NextLED - 1
      ;      if NextLED = 0 then TraceDIR = 0
      ;    else                                      ; else scanning right
            NextLED = NextLED + 1
      ;      if NextLED = BAM_COUNT-1 then TraceDIR = 1
      ;    endif
        endif
        
        FOR Idx = 0 to BAM_COUNT - 1                ; Drain all dutycycles
           IF BAM_DUTY(Idx) > 0 then
               BAM_DUTY(Idx) = BAM_DUTY(Idx)*DrainSpeed/(DrainSpeed+1)
           ENDIF
        NEXT Idx
        pause Speed
        if NextLED = BAM_COUNT then NextLED = 0     ; Added this line
        LoopCount = LoopCount + 1
    GOTO Main
    Also looking at Sayzer's code example, I removed the ADC, the LCD and modified based on my understanding and came up with this result which is scanning at the proper rate and the pause between scans.
    Code:
    CLEAR
    @ __config _CONFIG1,  _INTOSCIO & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BOREN_OFF
    ANSEL = 0
    ANSELH = 0
    OSCCON = %01110001
    DEFINE OSC 8
    
    TRISB = 0
    TRISC = 0
    TRISD = 0
    X       var PORTB
    Y       var PORTC
    xCOL    var byte
    yROW    VAR BYTE
    Speed   var word
    
    Pause 10
    
    Begin:
        X = 0              
        Y = 255
        speed = 30
    Start:
        for xcol = 0 to 7
            x = 0  
            x.0[xcol] = 1
            for yrow =7 to 0 step -1
                y = 255
                y.0[yrow] = 0
                pause speed
            Next yrow
        next xcol
        y = 255         ; turn off (and drain all LEDs)
        PAUSE 2000      ; wait before starting over    
    goto start
    END
    Last but not least I am trying to find a way to add a trail of 20 to 30 LEDs with the same effect as Darrel's code using MIBAM.
    I can't figure it out

    Mike

  5. #5
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    I can not help with MIBAM, but if you are willing to do a hardware change it can be done this way.
    http://www.picbasic.co.uk/forum/show...7151#post67151
    Dave
    Always wear safety glasses while programming.

  6. #6
    Join Date
    May 2009
    Location
    Montreal, QC, Canada
    Posts
    118


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    Thanks Dave for the suggestion but that is a little too much hardware changes.
    My project consists in a stream of LEDs lined up in a tube and I am trying to keep the hardware to the minimum.
    I figured at the most I would add 8 transistors but I haven't added them yet and it's been running for about a week now and nothing is getting hot or warm.
    It is running with the code listed in post #20 (top) using MIBAM with a trail of 32 LEDs. I still have the LEDs turn ON and DIM in sets of 8 but I am starting to understand and I believe I will resolve this shortly.

    But thanks and by the way the code coming by a 7 years old that's impressive, if your son is still into programming he must be an expert by now!

    Mike

  7. #7
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default Re: Matrix LED example 64 LED.

    if your son is still into programming he must be an expert by now!
    He went a different direction, he is into graphics now. But there is still hope that he will do some code. He is using Blender on a Linux box and is not afraid of using a terminal
    Dave
    Always wear safety glasses while programming.

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