sk6812: send RESET to led strip at start.

This commit is contained in:
Martin Preuss
2025-05-04 22:42:42 +02:00
parent dc62f1fe05
commit f31567e785

View File

@@ -95,11 +95,15 @@ SK6812_SetAllColor:
push r15 push r15
in r15, SREG in r15, SREG
cli cli
; reset
cbi SK6812_PORT, SK6812_PINNUM
Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us
lds r23, sk6812NumLeds lds r23, sk6812NumLeds
SK6812_SetAllColor_loop: SK6812_SetAllColor_loop:
rcall sk6812SendQuadruple ; (r16, r17, r24, r25) rcall sk6812SendQuadruple ; (r16, r17, r24, r25)
dec r23 dec r23
brne SK6812_SetAllColor_loop brne SK6812_SetAllColor_loop
sbi SK6812_PORT, SK6812_PINNUM
out SREG, r15 out SREG, r15
pop r15 pop r15
ret ret
@@ -150,13 +154,13 @@ sk6812SendPattern_loop2:
sk6812SendQuadruple: sk6812SendQuadruple:
mov r16, r19 ; G mov r16, r19 ; G
rcall sk6812SendByte ; (r16, r17, r24, r25) rcall sk6812SendByte2 ; (r16, r17, r24, r25)
mov r16, r18 ; R mov r16, r18 ; R
rcall sk6812SendByte ; (r16, r17, r24, r25) rcall sk6812SendByte2 ; (r16, r17, r24, r25)
mov r16, r20 ; B mov r16, r20 ; B
rcall sk6812SendByte ; (r16, r17, r24, r25) rcall sk6812SendByte2 ; (r16, r17, r24, r25)
mov r16, r21 ; W mov r16, r21 ; W
rcall sk6812SendByte ; (r16, r17, r24, r25) rcall sk6812SendByte2 ; (r16, r17, r24, r25)
ret ret
; @end ; @end
@@ -165,6 +169,10 @@ sk6812SendQuadruple:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine sk6812SendByte ; @routine sk6812SendByte
; ;
; reset: 80microsecs
; 0: 300ns high, 900ns low (+/- 150ns)
; 1: 600ns high, 600ns low (+/- 150ns)
;
; @param r16 value ; @param r16 value
; @clobbers r16, r17, r24, r25 ; @clobbers r16, r17, r24, r25
@@ -198,3 +206,40 @@ sk6812SendByte_sendOne:
; ---------------------------------------------------------------------------
; @routine sk6812SendByte2
;
; reset: 80microsecs
; 0: 300ns high, 900ns low (+/- 150ns)
; 1: 600ns high, 600ns low (+/- 150ns)
;
; @param r16 value
; @clobbers r16, r17, r24, r25
sk6812SendByte2:
ldi r17, 8 ; +1
sk6812SendByte2_loop:
lsl r16 ; +1
brcs sk6812SendByte2_sendOne ; +1 if false, +2 if branch taken
nop ; +1
; send ZERO
sbi SK6812_PORT, SK6812_PINNUM ; +2 set HIGH
nop ; +1 (125ns)
cbi SK6812_PORT, SK6812_PINNUM ; +2 set LOW (250ns)
dec r17 ; +1 (125ns)
brne sk6812SendByte2_loop ; +1 if false, +2 if branch taken
ret ; +4
sk6812SendByte2_sendOne:
sbi SK6812_PORT, SK6812_PINNUM ; +2 set HIGH
nop ; +1 (125ns)
nop ; +1 (125ns)
nop ; +1 (125ns)
cbi SK6812_PORT, SK6812_PINNUM ; +2 set LOW
dec r17 ; +1
brne sk6812SendByte2_loop ; +1 if false, +2 if branch taken
ret ; +4
; @end