sk6812: fixed timing issues (works again with BTF-Lighting LED strips).
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user