oPossum

WS2811 LED controller driver

25 posts in this topic

How is that possible? WS2811 doesn't have any speed auto-detect feature, does it?

Is it possible that the low speed timing you are using is on the max side of allowed timing and the high speed on the min side?

 

I couldn't find any information about WS2811's internals, but I think there must be 2 one shot monostable multivibrators inside, one re-triggerable for reset and one for data. At slow speed, it is probably set at ~1us and is triggered by the DI, after 1us, it clocks the shift register and shifts in the state of DI. Because SET pin must be left floating for high speed, I assume it is connected to a simple RC timing circuit.

 

For example, if the internal timer is set at 0.95us, 0.9us/2us and 0.5us/1us would work and they would appear to be two different speeds.

Share this post


Link to post
Share on other sites

Nothing in the docs I have seen. I suspect it compares total bit time (rising edge to rising edge) to on time using a RC integrator and a comparator. So it looks at pulse width as a percentage of bit time.

 

All I know for sure is that it works if the timing is good. (20% / 48% pulse width).

Share this post


Link to post
Share on other sites

Looks like Ray included more information and it appears that those are wired for high speed

TH + TL = 1.26us +/-600ns

T0H 0.35us +/-150ns

T1H 0.7us

T0L 0.8us

T1L 0.6us

There is also a reference to WS2821, but this could be a typo...

 

The timing I am using:

TH + TL = 2us +~0-1us

T0H 0.5us

T1H 1.0us

T0L 1.5us +~0-1us

T1L 0.5us +~0-1us

Share this post


Link to post
Share on other sites

Minor variation of Rickta's version of oPossum's code, it ditches the reset procedure (reset_hs just pop R11 and ret) so you can continually bang this code in a C loop.  Works great, got a prototype "poinsettia mood lighting" strip I'm working on... did a toner-transfer PCB with dip socketed G2553 (see underneath the LP, I used a hobby paint marker to apply a faux red soldermask), just waiting on an SMD USB connector for it:

 

Code (ASM routine) - ws2811_hs_one.zip

 

Pic: post-15991-0-05257400-1355627797_thumb.jpg

Share this post


Link to post
Share on other sites

Hi guys,

 

Ik tried all the above assembly code, but I cannot to get my led to give some form of output. 

 

I've looked at the scope at the output pin, and there is a nice square wave coming out of it.  I'm kinda lost on how to get these leds shining.

 

Presently i've connected the bare led with 5v on the VCC, VDD and 3.3V straight out of the launchpad to the DI (data in). But it won't work, 

 

There is NO capacitor on the VCC.

 

Any thoughts would be very welcome!

 

cheers

 

ps. For good measure, ive included my stuff, (a make file, Main.c and the assembly by you guys. NOTE THAT THIS DOES NOT WORK ON MY SETUP), altough output seems oke..

ws2811-broken.zip

Edited by vinietje

Share this post


Link to post
Share on other sites

I tried the code in the first post in this thread last night on some of these, and the correct number of LEDs became active. The first LED in the chain cycled through the colours perfectly, but the rest of the lit LEDs flickered and didn't cycle the colours as expected.

 

The chain works Ok with the "mini 3keys smart pixel controller" which I got with it, so it looks like a timing issue from the MSP430.

 

It's a shame the seller doesn't provide a link to the data sheet....

 

Do you have any pointers for how best to tweak the timing for these WS2811's, or is there some later code I should try?

 

Thanks in advance

Share this post


Link to post
Share on other sites

Thank you. Yes - that works very nicely - but only after a change:

 

from

 

    UCB0BR0 |= 0x04; // 1:4 - 16MHz/4 = 0.25us

 

to

 

    UCB0BR0 |= 0x03; // 1:3 - 16MHz/3 = 0.1875us

 

I guess this is because these WS2811 LEDs need it a little faster.

 

Hmmm. I've never used SPI before. I'm still very new to this and have only done bit-banging in C using the timers. I've got some reading to do.

 

 

My next challenge is to be able to put these LEDs into a particular state depending on time of day, while keeping accurate time using an external 32768Hz crystal. If this code needs 16MHz clock, and the clock part needs the 32768Hz crystal as clock am I stuck?  I just don't know enough.

Share this post


Link to post
Share on other sites

WS2811 has 2 speeds of operation, 400kHz and 800kHz. However, 5050/WS2811 or WS2812, is set to work at high speed only.

Also, WS2811 does not use SPI protocol. SPI hardware is used to output 1 wire protocol required by WS2811.

Share this post


Link to post
Share on other sites

To use the high speed protocol just change write_ws2811() to write_ws2811_hs(). That will give you the most precise timing possible and allow use of any pin on port 1. SPI/IIC remains free for other uses.

 

Here is some code for RTC: http://forum.43oh.com/topic/1957-software-real-time-clock-rtc-two-methods/

 

The 32 kHz crystal is used just for the RTC - the MSP430 can still run at 16 MHz.

GeekDoc likes this

Share this post


Link to post
Share on other sites

This library is awesome. 

 

I'm trying to integrate it into my existing firmware. My MSP430G2553 is running at DCO 1MHz.. 

 

How can I adjust the timings, or any other trick to make this code calculated for 16MHz cycle run on my existing firmware (@1MHz) ?

 

Share this post


Link to post
Share on other sites

Thank you for responding RobG. 

 

I'm still trying to avoid bit banging assembly and use timer interrupts to generate PWM with 20% & 50% duty cycle for 0 & 1 respectively. If you have tried already, can you suggest if it's possible with WS2811 ? I read your very first question in this forum and OPossum thinks it's duty cycle that chip looks for. I wonder if you did any further discovery into it ?

 

Yes, I changed my MCLK to run at 8MHz now (& may further update it to 16 MHz). With that, I can have width of 0 bit pulse to like 25 uS. Roughly running at 20 kHz frequency. Datasheet mentioned only about 400 & 800kHz, but can it run at 10 ~ 20 kHz as well ? Eagerly looking forward for your answer.

 

Thanks,

Share this post


Link to post
Share on other sites

In my code, I don't use assembly, C only. I use bit banging or hardware SPI module.

WS2811 requires very precise timing and using interrupts is not an option (11 clock cycles just to get in and out of the interrupt.)

Your MCU has to run @16MHz to meet WS2811's timing requirements, especially WS2812's, which is hardwired for 800kHz clock.

Adi likes this

Share this post


Link to post
Share on other sites

Also, your shared code would greatly help. I see you have used pin 1.2 on msp430g2553, set as SPI master. Can I use any other pin on the board ? like 1.7 ? I already have another board communicating over UART using pin 1.2. I wonder, how well can I sync both UART & SPI on same controller, especially with tight timing  for WS2811. I imagine, I will have to go really low on FPS, about 20 fps with limited number of LEDs, like a strip of 30 and manage my UART activities only during reset pulse time on LED chip. Correct me if I'm wrong. 

Share this post


Link to post
Share on other sites

how to program ws2811 using msp4302253 to passage of Red and while and how to set timing to change

Share this post


Link to post
Share on other sites

Just what I was looking for nice and simple ws281x call.

Anyway to pass the &PxOUT as variable to assembly?

 

Adding it to the prototype is easy enough, but I can figure out the asm. :huh:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now