sk6812: fixed timing issues (works again with BTF-Lighting LED strips).

This commit is contained in:
Martin Preuss
2026-03-20 22:30:41 +01:00
parent d877508e85
commit a0e73d5788

View File

@@ -58,11 +58,12 @@ SK6812_Init:
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM ; set LOW
ldi r16, 150
ldi r16, 144
sts sk6812NumLeds, r16
rcall sk6812ReadConfFromEeprom
ldi r18, 1 ; ON
ldi r18, 1 ; ON (DEBUG)
rcall SK6812_SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
sec
@@ -87,37 +88,6 @@ SK6812_Fini:
; ---------------------------------------------------------------------------
; @routine sk6812SetAllColor
;
; Set all LEDs to same colour.
;
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @clobbers r23 (r16, r17, r24, r25)
sk6812SetAllColor:
push r15
in r15, SREG
cli
; reset
cbi SK6812_PORT, SK6812_PINNUM
Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us
lds r23, sk6812NumLeds
sk6812SetAllColor_loop:
rcall sk6812SendQuadruple ; (r16, r17, r24, r25)
dec r23
brne sk6812SetAllColor_loop
; sbi SK6812_PORT, SK6812_PINNUM
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine SK6812_SetState @global
@@ -249,6 +219,45 @@ sk6812SendPattern_loop2:
; ---------------------------------------------------------------------------
; @routine sk6812SetAllColor
;
; Set all LEDs to same colour.
;
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @clobbers r23 (r16, r17, r24, r25)
sk6812SetAllColor:
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM
push r15
in r15, SREG
cli
; Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us
nop
nop
lds r23, sk6812NumLeds
sk6812SetAllColor_loop:
rcall sk6812SendQuadruple ; (r16, r17, r24, r25)
dec r23
brne sk6812SetAllColor_loop
; reset
cbi SK6812_PORT, SK6812_PINNUM
Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us
; sbi SK6812_PORT, SK6812_PINNUM
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SendQuadruple
;
@@ -283,8 +292,8 @@ sk6812SendQuadruple:
; send ZERO
nop ; +1
out SK6812_PORT, r25 ; +1 HIGH
nop
nop
nop ; +1
nop ; +1
nop
out SK6812_PORT, r24 ; +1
nop ; +1
@@ -303,35 +312,104 @@ l_end:
; @end
.macro SK6812_SENDBIT1
sk6812SendBit: ; 1 0 1 0
rol r16 ; +1 +1 125 125
sbi SK6812_PORT, SK6812_PINNUM ; +2 +2 375 375
brcs sk6812SendBit_l1 ; +2 +1 625 500
cbi SK6812_PORT, SK6812_PINNUM ; +2 875
sk6812SendBit_l1:
nop ; +1 +1 1000 625
nop ; +1 +1 1125 750
brcc sk6812SendBit_l2 ; +1 +2 1250 1000
cbi SK6812_PORT, SK6812_PINNUM ; +2 1250
sk6812SendBit_l2: ; 10 10 1250 1250
.endmacro
.macro SK6812_SENDBIT
sk6812SendBit: ; 0 1
rol r16 ; +1 +1
brcs sk6812SendBit_send1 ; +1 +2
; send 0
nop ; +1
sbi SK6812_PORT, SK6812_PINNUM ; +2
nop ; +1
nop ; +1
cbi SK6812_PORT, SK6812_PINNUM ; +2
; nop ; +1
nop ; +1
rjmp sk6812SendBit_end ; +2
sk6812SendBit_send1:
; send 1
sbi SK6812_PORT, SK6812_PINNUM ; +2
nop ; +1
nop ; +1
nop ; +1
cbi SK6812_PORT, SK6812_PINNUM ; +2
nop ; +1
nop ; +1
nop ; +1
sk6812SendBit_end: ; 13 13
.endmacro
sk6812SendByte4:
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
SK6812_SENDBIT
ret
; @end
#if 0
; ---------------------------------------------------------------------------
; @routine sk6812SendByte4
;
; reset: 80microsecs
; 0: 500ns high, 750ns low (+/- 150ns)
; 1: 750ns high, 500ns low (+/- 150ns)
; 8 ticks per cycle
;
; @param r16 value
; @clobbers r16, r17, r24, r25
sk6812SendByte4:
ldi r24, 0
ldi r25, (1<<SK6812_PINNUM)
rcall sk6812SendBit
rcall sk6812SendBit
rcall sk6812SendBit
rcall sk6812SendBit
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
M_SK6812_HANDLEBIT
ret ; +4
rcall sk6812SendBit
rcall sk6812SendBit
rcall sk6812SendBit
rcall sk6812SendBit
ret
; @end
; @param: r16=current value
sk6812SendBit: ; 1 0
rol r16 ; +1 +1
sbi SK6812_PORT, SK6812_PINNUM ; +2
brcs sk6812SendBit_l1 ; +2 +1
cbi SK6812_PORT, SK6812_PINNUM ; +2
sk6812SendBit_l1:
nop ; +1 +1
nop ; +1 +1
brcc sk6812SendBit_l2 ; +1 +2
cbi SK6812_PORT, SK6812_PINNUM ; +2
sk6812SendBit_l2:
ret
; @end
#endif
; ---------------------------------------------------------------------------