WS2811 and WS2812 One-Wire Communication Assembly Help
Hi all,
I'm working on a project with the WS2812B LED lights. The PIC needs to send 24 bits for every LED that is connected in series. The 1st byte being for the green, the 2nd byte being for the red, and the 3rd byte being for the blue component. The 24 bits for the first LED look like this,
Code:
'###### WS2812 HIGH BIT (1 CODE) ######
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T1H #######
ASM
nop ; ~97 nSecs
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T1L #######
ASM
nop
nop
nop
ENDASM
'#####################################
'###### WS2812 LOW BIT (0 CODE) ######
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
'#####################################
'###### WS2812 LOW BIT (0 CODE) ######
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
PORTD.0 = 1 'WS2812 DRIVE LINE
'####### T0H #######
ASM
nop ; 97 nSecs
nop
nop
ENDASM
PORTD.0 = 0 'WS2812 DRIVE LINE
'####### T0L #######
ASM
nop
nop
nop
nop
nop
nop
nop
nop
ENDASM
'#####################################
Here, I'm sending [255,0,0] for a pure green output. As you can see this code is not the most effective one. Specially, when you need to send data to 100+ WS2812B LEDs. If you add any FOR..NEXT, or IF...ENDIF loops, the precise timing of the HIGH and LOW bits is messed up. Actually, I think that any PICBasic command wouldn't help with the timing. Any help to implement this code in assembly would be appreciated. I'm using a PIC18F4550 at 48MHz.
Thank you,
Robert
"No one is completely worthless. They can always serve as a bad example."
Anonymous
Bookmarks