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,
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.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 '#####################################
Thank you,
Robert
Bookmarks