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