Jump to content

  • Log In with Google      Sign In   
  • Create Account

Posted ImageA Warm Welcome to MakerFaire Guests!


Photo

WS2811 LED controller driver


  • Please log in to reply
11 replies to this topic

#1 oPossum

oPossum

    Poke me with a Stick

  • Members
  • 756 posts
  • LocationMichigan, USA


Posted 13 November 2012 - 08:42 PM

Assembly code for driving WS2811 LED controllers at low or high speed on any pin of PORT1 (could be modified for other ports). Requires 16 MHz MCU clock and interrupts must be disabled. Timing is from WS2811 spec sheet and is as precise as possible.

Attached File  WS2811 timing.PNG   17.42K   145 downloads

Attached Files


  • bluehash, GeekDoc, jsolarski and 2 others like this

#2 oPossum

oPossum

    Poke me with a Stick

  • Members
  • 756 posts
  • LocationMichigan, USA


Posted 15 November 2012 - 06:50 PM

High speed mode has now been tested.

Rickta59 discovered that they will run at high speed!
  • spirilis likes this
Sent from a bunker in an undisclosed location deep beneath a mountain.

#3 RobG

RobG

    Level 5

  • Members
  • 2,269 posts
  • LocationCary, NC, US


Posted 15 November 2012 - 07:41 PM

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.

#4 oPossum

oPossum

    Poke me with a Stick

  • Members
  • 756 posts
  • LocationMichigan, USA


Posted 15 November 2012 - 08:08 PM

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).
Sent from a bunker in an undisclosed location deep beneath a mountain.

#5 Rickta59

Rickta59

    Level 3

  • Global Moderators
  • 533 posts
  • LocationEastern NC


Posted 15 November 2012 - 08:17 PM

Here is a port of the asm routines so you can use this code with msp430-gcc.


Attached File  ws2811_hs.zip   1.45K   27 downloads

-rick
  • oPossum and spirilis like this

#6 RobG

RobG

    Level 5

  • Members
  • 2,269 posts
  • LocationCary, NC, US


Posted 15 November 2012 - 08:18 PM

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

#7 oPossum

oPossum

    Poke me with a Stick

  • Members
  • 756 posts
  • LocationMichigan, USA


Posted 16 November 2012 - 01:09 AM

I used timing from WS2811 spec sheet.

Timing table added to first post.
Sent from a bunker in an undisclosed location deep beneath a mountain.

#8 spirilis

spirilis

    Level 4

  • Members
  • 754 posts


Posted 16 December 2012 - 03:18 AM

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) - Attached File  ws2811_hs_one.zip   1.5K   25 downloads

 

Pic: Attached File  dsc_4902.sm.jpg   68.55K   74 downloads



#9 GeekDoc

GeekDoc

    Level 4

  • Administrators
  • 1,303 posts
  • LocationO'Fallon, Illinois (St. Louis Metro area)
  • Sparkfun Wishlist


Posted 03 January 2013 - 01:06 AM

Have you guys seen this?

 

http://www.instructa...h-an-AVR-thing/


Public Service Announcement: I am a microcontroller / electronics noob! I should usually be quietly ignored or patiently instructed.
http://blog.DocsTech.net

#10 oPossum

oPossum

    Poke me with a Stick

  • Members
  • 756 posts
  • LocationMichigan, USA


Posted 03 January 2013 - 01:14 AM

Saw it.

 

Probably shouldn't comment.  ;-)


Sent from a bunker in an undisclosed location deep beneath a mountain.

#11 GeekDoc

GeekDoc

    Level 4

  • Administrators
  • 1,303 posts
  • LocationO'Fallon, Illinois (St. Louis Metro area)
  • Sparkfun Wishlist


Posted 03 January 2013 - 02:21 AM

Saw it.

 

Probably shouldn't comment.  ;-)

 

'nuff said. :grin:


Public Service Announcement: I am a microcontroller / electronics noob! I should usually be quietly ignored or patiently instructed.
http://blog.DocsTech.net

#12 vinietje

vinietje

    Noob Class

  • Members
  • 1 posts

Posted 09 April 2013 - 08:39 PM

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..

Attached Files


Edited by vinietje, 09 April 2013 - 08:40 PM.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users