View Full Version : LED Strips
gavo
- 4th September 2014, 19:09
Hi All,
Has anyone tried to make a Controller for LED Strips?, the crazy part is most of the Controlling Chip Datasheets are all in Chinese and not easy to make out any useful information. So Far I can gather they use +5V/0V/DATA/CLK, so I assume you can control them via the Shift Out Command. I have tried some code but to none avail I can't seem to get the strip running or flash, can anyone give me some suggestions?, I have out some code below
define OSC 32
Define LOADER_USED 1
Define LCD_DREG PORTB ' Define LCD connections
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
led1 var portc.0
led2 var portc.1
B0 VAR BYTE
B1 VAR BYTE
B2 VAR byte
B3 VAR byte
B4 VAR byte
B5 VAR byte
B6 VAR byte
B7 VAR BYTE
B8 VAR BYTE
B9 VAR BYTE
B10 VAR byte
B11 VAR BYTE
B12 VAR byte
B13 VAR byte
B14 VAR byte
B15 VAR byte
B16 VAR byte
B17 VAR BYTE
B18 VAR BYTE
B19 VAR BYTE
B20 VAR byte
ADCON1 = 15 ' PORTA and E digital
pause 100
Lcdout $fe, 1,"DMX "
Lcdout $fe,$C0,"CONTROLLER "
goto startup
STARTUP:
Lcdout $fe, 1,"SHIFTOUT "
Lcdout $fe,$C0,"ROUTINE "
for b0 = 1 to 64
shiftout led1, led2, 0, [%00000000/8]
pause 500
shiftout led1, led2, 0, [%10000000/8]
pause 500
shiftout led1, led2, 0, [%11000000/8]
pause 500
shiftout led1, led2, 0, [%11100000/8]
pause 500
shiftout led1, led2, 0, [%11110000/8]
pause 500
shiftout led1, led2, 0, [%11111000/8]
pause 500
shiftout led1, led2, 0, [%11111100/8]
pause 500
shiftout led1, led2, 0, [%11111110/8]
pause 500
shiftout led1, led2, 0, [%11111111/8]
pause 500
shiftout led1, led2, 0, [%11111111/8]
pause 500
Next
goto startup
END
Demon
- 5th September 2014, 00:55
What LED part number? PBP version? PIC model? CONFIGS?
Robert
Edit: is port C digital?
(Search AllDigital)
gavo
- 5th September 2014, 10:47
I am using 18F8722,
I have also tried PORT E as well,
Please see attached details of the LED and the DMX Chip
Demon
- 5th September 2014, 14:39
Can you blink a normal LED on the ports?
Robert
gavo
- 5th September 2014, 16:47
Hi Robert,
Good question I will try that...and advise,
-Gavo
gavo
- 8th September 2014, 09:17
Hi Rob,
Yes it does, I had to change the code a little, please see below:
Include "MODEDEFS.BAS" ' Include Shiftin/out modes
define OSC 32
Define LOADER_USED 1
Define LCD_DREG PORTB ' Define LCD connections
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
led1 var porte.0
led2 var porte.1
B0 VAR BYTE
B1 VAR BYTE
B2 VAR byte
B3 VAR byte
B4 VAR byte
B5 VAR byte
B6 VAR byte
B7 VAR BYTE
B8 VAR BYTE
B9 VAR BYTE
B10 VAR byte
B11 VAR BYTE
B12 VAR byte
B13 VAR byte
B14 VAR byte
B15 VAR byte
B16 VAR byte
B17 VAR BYTE
B18 VAR BYTE
B19 VAR BYTE
B20 VAR byte
ADCON1 = 15 ' PORTA and E digital
pause 100
Lcdout $fe, 1,"DMX "
Lcdout $fe,$C0,"CONTROLLER "
pause 2500
goto startup
STARTUP:
Lcdout $fe, 1,"SHIFTOUT "
Lcdout $fe,$C0,"ROUTINE "
for b0 = 1 to 64
shiftout led1, led2, 0, [%00000000]
pause 500
;shiftout led1, led2, 0, [%11111111]
;pause 500
Next B0
goto startup
END
Ryan7777
- 9th September 2014, 19:43
I have a bunch of experience with the WS2801 based strips, which you can run using shiftout pretty easy. You basically shift in your bits on the data line with each pulse of the clock line if i remember correctly something like this for the WS2801 Strips (my favorite):
noLEDs CON 32 ' Change this number to number of LEDs in your strip
shftMode CON 1 ' Shift data out highest bit first. Clock idles low
LEDsDAT VAR PORTE.0 ' Shift out data port, change as needed
LEDsCLK VAR PORTE.1 ' Shift out clock port, change as needed
i VAR Byte ' Loop variable
Main:
FOR i TO noLEDs ' We have to either shift allllllllll the data bits out at once to all LEDs in one SHIFTOUT or for one RGB LED at a time in a loop, much easier this way!, lots of ways to do this.
SHIFTOUT LEDsDAT, LEDsCLK, shftMode, [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 'Shift out 24 bits to one RGB LED at a time - should be all LEDS ON (can be varibles too)
NEXT i ' Loop till all LEDs loaded
i = 0 ' Please be kind, rewind.
PAUSE 1000 ' For human eyes to be able to see that them LEDs are ON
FOR i TO noLEDs ' Rinse, Repeat - but turn them all off this time
SHIFTOUT LEDsDAT, LEDsCLK, shftMode, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 'Shift out 24 bits - should be all LEDS OFF (can be varibles too)
NEXT i ' A little loopy
PAUSE 1000 ' For human eyes to be able to see that them LEDs are OFF (ever wonder if the fridge light is still on when you close the door?)
GOTO Main ' Do it till the cows come home!
END ' My only friend, The end... (fridge door, The Doors, whatever)
The problem is a lot of newer strips use weirder data protocols which are very timing sensitive. You can make them work, but your PIC is probably going to be dedicated to that, with another pic telling it what to do without a lot of work with interrupts and assembly. Thats why I try to stick to WS2801s
ALSO! if you are driving a bunch of LEDs on your strips, like 32/M in my example, you have to have enough current to drive your strips!!! you also may need to buffer the data and clock lines to be able to drive a bunch of LED controller chips too!!!
-Ryan
gavo
- 10th September 2014, 14:21
Hi Ryan,
Thanks for the reply, I am sure I have one of those obscure ones, the crazy part is it flashes no problems without the 5V PSU Connected to it, the only problem is there is not enough current so it is really dim. The Minute we connect the 5V the strips stays on very bright, for the exception of 1 led with flashes on/off
See the connection below,
Regards,
Gavin
Ryan7777
- 11th September 2014, 10:35
After reading what I could of the datasheet, this looks like a variant of the WS2801 to me.
Also looking closer at your code, you may need to set your TRIS to output and input on the proper pins. Something I neglect to do all the time, and sometimes stuff will work without it. But most of the time it's the one thing biting me when my code doesn't work.
I don't know about the pic you're using and don't have the time at the moment to look, but if it has capture and compare modules, those may need switched off too. And again, sometimes simple things like flashing an LED on a pin works great, but try to do anything more demanding and the CCPs and whatever else, ADCs etc. trip me up. So just because you got an LED to blink doesn't always mean everything else is working. Believe me, I know! If there is some unthought of register that needs set, I'll probably forget it and be scratching my head for hours as a result :confused:
I have cooked one strip of WS2801 LEDs before by getting some wires crossed. But they are really fairly robust. It's probably only one chip that failed too, so it may just need cut off the string, finding it is another matter. And getting wires crossed is pretty easy as blue is +V and Red is like data or clock, I forget. Black is Vss I'm pretty sure.
At this point I'd get your LCD going and maybe take every pin and set it up as an input and display something like PortB.3 = 1 when you connect an input. For each pin. And do the opposite as well, hookup an LED to every available pin and have them run back in forth like the whole nightrider thing. In other words, make sure your PIC is working first!!!
-Ryan
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.