The example is for 16F877A.
In the example, yes, there is only one LED at a time.
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
(Post removed at user's request in next post)
Last edited by Demon; - 28th December 2011 at 17:13. Reason: Solution found.
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
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;This is the modified code:
- 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.
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 ;-- 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
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.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
I can't figure it out
Mike
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.
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
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 terminalif your son is still into programming he must be an expert by now!![]()
Dave
Always wear safety glasses while programming.
Bookmarks