Code Help please!

xtech007

Senior Member
Hi All!
while waiting for a String of WS2801 LED Strip to Arrive from China, decided to tackle the code.
Thanks to MR. Westaus55's guide http://www.picaxeforum.co.uk/showthread.php?22713
I was able to understand the way to communicate the data to the WS2801 IC's. also started to modify the code a bit to drive all 32 WS2801 with a Picaxe 28X1 with an external resonator of 20MHz.
for example this is a piece of the original code:
Code:
Main:
                Intensity = 100
  		ptr = 0
  		MemAddr = Black  : GOSUB FetchColour ; first WS2801/RGB LED data 
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
   		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour ; sixth WS2801/RGB LED data
		 GOSUB SendData
   		PAUSE LongDelay
   		 ptr = 0
  		MemAddr = White  : GOSUB FetchColour
  		MemAddr = White  : GOSUB FetchColour
  		MemAddr = White  : GOSUB FetchColour
  		MemAddr = White  : GOSUB FetchColour
  		 MemAddr = White  : GOSUB FetchColour
  		 MemAddr = White  : GOSUB FetchColour
		 GOSUB SendData
  		 PAUSE LongDelay
   		ptr = 0
   		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour
 		GOSUB SendData
  		 PAUSE LongDelay
  		ptr = 0
  		 MemAddr = Red    : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
   		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
		 GOSUB SendData
  		PAUSE LongDelay
  		ptr = 0
  		MemAddr = Yellow : GOSUB FetchColour
  		MemAddr = Red    : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		 MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
		GOSUB SendData
  		PAUSE LongDelay
   		ptr = 0
  		MemAddr = Green : GOSUB FetchColour
  		MemAddr = Yellow : GOSUB FetchColour
  		MemAddr = Red   : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
		GOSUB SendData
  		PAUSE LongDelay 
   		ptr = 0
  		MemAddr = Cyan  : GOSUB FetchColour
  		MemAddr = Green : GOSUB FetchColour
  		MemAddr = Yellow : GOSUB FetchColour
   		MemAddr = Red   : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
		GOSUB SendData
  		PAUSE LongDelay		
   		ptr = 0
  		MemAddr = Blue  : GOSUB FetchColour
   		MemAddr = Cyan  : GOSUB FetchColour
  		MemAddr = Green : GOSUB FetchColour
  		MemAddr = Yellow : GOSUB FetchColour
   		MemAddr = Red   : GOSUB FetchColour
  		MemAddr = Black : GOSUB FetchColour
  		GOSUB SendData
  		PAUSE LongDelay
    		ptr = 0
  		MemAddr = Magenta : GOSUB FetchColour
  		MemAddr = Blue  : GOSUB FetchColour
   		MemAddr = Cyan  : GOSUB FetchColour
  		MemAddr = Green : GOSUB FetchColour
  		MemAddr = Yellow : GOSUB FetchColour
   		MemAddr = Red   : GOSUB FetchColour
  		GOSUB SendData
    		PAUSE LongDelay
  		ptr = 0
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
  		MemAddr = Black  : GOSUB FetchColour
		GOSUB SendData
  		PAUSE LongDelay
loop
My Mods Trying to move FWD red led at a time:
Code:
Main:
        Intensity = 100 		
        gosub clear_strip  'clear all LED's, used this gosub so data is in place instead of having to fetch.
	ptr = 0
        For colour= 0 to 1
      	LOOKUP Colour, (RED,Black), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color
      
      
      	ptr = 0
      	For colour= 0 to 1
      	LOOKUP Colour, (Black,RED), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color
      
      	ptr = 0
      	For colour= 0 to 2
      	LOOKUP Colour, (Black,Black,RED), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color
      	
      	ptr = 0
      	For colour= 0 to 3
      	LOOKUP Colour, (Black,Black,Black,RED), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color
      	
      	ptr = 0
      	For colour= 0 to 4
      	LOOKUP Colour, (Black,Black,Black,Black,RED), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color
      	
      	ptr = 0
      	For colour= 0 to 5
      	LOOKUP Colour, (Black,Black,Black,Black,Black,RED), Memaddr : GOSUB FetchColour	  
      	next colour
      	GOSUB SendData
      	pause 100
      	gosub New_color

   '''And so forth to reach 0 to 32, LOTS OF DATA TO WRITE.
        
clear_strip:      'Clear all WS2801's
    Ptr = 0
   SHIFTOUT SClock,SData,MSBFirst_L,  ($00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00)
return
Questions:
Is there a better way to write this part of the code?
I wrote the entire code for all 32 WS2801 with just one motion and 1 color at time (red moving FWD till the 32nd spot,)
Memory used = 2442 bytes out of 4096.

also the shiftout looks like this:
SendData:
Ptr = 0
SHIFTOUT SClock,SData,MSBFirst_L,(@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc)'@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@Ptr)
SHIFTOUT SClock,SData,MSBFirst_L,(@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@PtrInc,@Ptr)
returnn

Any help is Appreciated!
Thanks!
 

xtech007

Senior Member
still do not Undetand.

Thanks for the reply!
I do not undetand the response, a sample of code of how you would have done it will be great!

I'm learning as we go along, takes me a bit to understand most of the time.
But when study the code makes more sense to me .
 

hippy

Technical Support
Staff member
One thing to be aware of is that in making code more elegant, simpler, shorter, or using less memory, it can involve a trade-off with speed.

I would imagine the above code was written with speed in mind, to maximise the rate the data set is transferred; a long command with multiple @ptrinc will run faster than a FOR-NEXT with a single @ptrinc transmission within that.
 

xtech007

Senior Member
Mr. Hippy you are right!

Thanks for the time and replies!
I had tought of doing just what you had suggested of replacing the "lookup" for stright to mutiples shiftout comands!

Will give it a go soon I get home today!
Here is a video of my setup and how the "lookup" code reacts.
Also notice how after the 13th to 32nd RGB speed slows down!

http://www.youtube.com/watch?v=84ZLiB6MxRs

Also Color of moving segment can be changed on the fly!
 

premelec

Senior Member
Long code lines in editor troubles

Inspired by this post to try a SEROUT...(@bptrinc,......178 times..... @bptr) for a 14M2 - I found not only is it hard to get the editor to accept such a long line [with or without wrap] but simulate doesn't like it and if you try put b1=bptr at the end to show how many have been in the SEROUTs it doesn't show anything for b1.... I found the work around for constructing the long line was to copy and paste a working section many times... I haven't tried compiling it yet but syntax check works ok... Is there some way to make unseen characters show in editor 5.5.6 [I noticed editor 6 has little curved arrows shown for wrapped long lines...]? In addition is there a way to show pointer values in simulate?
 

xtech007

Senior Member
Premelec Welcome to the post!

Good question!
Just for curiosity why would you want to see (in my case ) the @printc position?
Seems to me that it would take memory and slowdow the process.
Maybe add a variable and every time a new byte is shifted increase that variable and print that variable to screen or sertxd.
 

Goeytex

Senior Member
Inspired by this post to try a SEROUT...(@bptrinc,......178 times..... @bptr) for a 14M2 - I found not only is it hard to get the editor to accept such a long line----
Use the line extension character _ to break up long lines. (Use 22 lines for 176 bytes, instead of 5).

As far as the terminal goes, the PE5 terminal is not up to the task. Use a different terminal program that can display non ascii characters

Code:
[color=Green]' Write data to ram[/color]
[color=Blue]let [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]1[/color]
[color=Blue]for [/color][color=Purple]b0 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]40
 [/color][color=Purple]@bptrinc [/color][color=DarkCyan]= [/color][color=Purple]b0[/color]
[color=Blue]next  

Let [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]0[/color]

[color=Blue]Serout C.2[/color][color=Black],[/color][color=Blue]N9600_8[/color][color=Black], _[/color]
[color=Blue]([/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black], _[/color]
[color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black], _[/color]
[color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black], _[/color]
[color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black], _[/color]
[color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptrinc[/color][color=Black],[/color][color=Purple]@bptr[/color][color=Blue])

sertxd ([/color][color=Black]#[/color][color=Purple]bptr[/color][color=Blue])[/color]
 

premelec

Senior Member
I think the simulate error message was something about precompile error... syntax ok - Thanks for the _ tip!
 
Top