PDA

View Full Version : How many times the loop turns for Darrel's "Kylon" LED chaser?



CuriousOne
- 13th November 2021, 17:52
Hello.

I want to use this code for my christmas light:

http://www.picbasic.co.uk/forum/showthread.php?t=10564

I've modified it for 5 leds and it works fine. However, I want it to not spin forever, but change some values, like speed and trails after several runs.

All the magic is done via this code as I can guess:




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 LoopCount = LoopCount + 1GOTO MainIt all works fine, besides that I can't find, how many times it loops for complete cycle? - I mean, single run from left to right and back, with all fades.Any ideas?

CuriousOne
- 14th November 2021, 07:51
Copy-paste screwed up the code, here it is:



Speed CON 24 ; Smaller=Faster
TracerSpeed CON 15 ; Smaller=Faster Left/Right
Brightness CON 255 ; Tracers DutyCycle
DrainSpeed CON 30 ; Smaller=Shorter Trail
BAM_COUNT = 5


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
LoopCount = LoopCount + 1
GOTO Main

mpgmike
- 14th November 2021, 08:33
To make it adjustable, change the CON values to VAR values. You will have to initialize them to some value (try starting with Daryl's CON values), then somewhere change them as you see fit. First play with different values in Daryl's code for the CONs and see how it affects the display. On a separate note, BAM_COUNT should have been Declared:


BAM_COUNT VAR BYTE
BAM_COUNT = 5

CuriousOne
- 14th November 2021, 11:59
The values of these settings in my example provide the effect I need.
I just need to enclose that loop into FOR-NEXT, to be able to have control over it.
And the issue is, I can't count, how many times loop turns around, to do single cycle (from left to right and back)

mpgmike
- 14th November 2021, 12:40
Ok, try adding a few lines:



Speed CON 24 ; Smaller=Faster
TracerSpeed CON 15 ; Smaller=Faster
Left/RightBrightness CON 255 ; Tracers
DutyCycleDrainSpeed CON 30 ; Smaller=Shorter
TrailBAM_COUNT = 5
Cycle VAR BYTE ;Count Full Cycles

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
Cycle = Cycle + 1
IF Cycle = xx THEN
Do Something
Cycle = 0
ENDIF
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
LoopCount = LoopCount + 1
GOTO Main


This should increment your Cycle variable after a full left swing.

CuriousOne
- 14th November 2021, 15:52
Thanks! will give it a try - currently have no monitoring capabilities connected to the PIC. Only way to interact is to write data to EEPROM and check the value via pickit 3 standalone programmer. Will try to add write routine to your code...

This circuit will be used to upgrade old Christmas tree decoration, shaped like a red star :)

9102

CuriousOne
- 19th November 2021, 08:26
I had to gave up with that code, because on a larger physical size, discrete steps were quite visible.
So I did another code instead, which works fine. Here's example.

https://www.youtube.com/watch?v=xXH2AHqZ3IU


But I have a question. What if I use faster PIC, something from 18F series, running at 64mhz.
Maybe it is possible to mod this code to have at least 10 bit resolution, instead of 8 ?