avr/sk6812: improved protocol implementation.
still doesn't work with new 5m LED strips from BTF-Lighting (1m strips do work, as do older 5m stripes).
This commit is contained in:
@@ -154,92 +154,73 @@ sk6812SendPattern_loop2:
|
|||||||
|
|
||||||
sk6812SendQuadruple:
|
sk6812SendQuadruple:
|
||||||
mov r16, r19 ; G
|
mov r16, r19 ; G
|
||||||
rcall sk6812SendByte2 ; (r16, r17, r24, r25)
|
rcall sk6812SendByte4 ; (r16, r17, r24, r25)
|
||||||
mov r16, r18 ; R
|
mov r16, r18 ; R
|
||||||
rcall sk6812SendByte2 ; (r16, r17, r24, r25)
|
rcall sk6812SendByte4 ; (r16, r17, r24, r25)
|
||||||
mov r16, r20 ; B
|
mov r16, r20 ; B
|
||||||
rcall sk6812SendByte2 ; (r16, r17, r24, r25)
|
rcall sk6812SendByte4 ; (r16, r17, r24, r25)
|
||||||
mov r16, r21 ; W
|
mov r16, r21 ; W
|
||||||
rcall sk6812SendByte2 ; (r16, r17, r24, r25)
|
rcall sk6812SendByte4 ; (r16, r17, r24, r25)
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine sk6812SendByte
|
; @macro M_SK6812_HANDLEBIT
|
||||||
|
|
||||||
|
.macro M_SK6812_HANDLEBIT
|
||||||
|
lsl r16 ; +1
|
||||||
|
brcs l_sendOne ; +1 if false, +2 if branch taken
|
||||||
|
; send ZERO
|
||||||
|
nop ; +1
|
||||||
|
out SK6812_PORT, r25 ; +1 HIGH
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
out SK6812_PORT, r24 ; +1
|
||||||
|
nop ; +1
|
||||||
|
rjmp l_end ; +2
|
||||||
|
l_sendOne:
|
||||||
|
out SK6812_PORT, r25 ; +1 HIGH
|
||||||
|
nop ; +1
|
||||||
|
nop ; +1
|
||||||
|
nop ; +1
|
||||||
|
nop ; +1
|
||||||
|
nop ; +1
|
||||||
|
out SK6812_PORT, r24 ; +1
|
||||||
|
nop ; +1
|
||||||
|
l_end:
|
||||||
|
.endmacro
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine sk6812SendByte4
|
||||||
;
|
;
|
||||||
; reset: 80microsecs
|
; reset: 80microsecs
|
||||||
; 0: 300ns high, 900ns low (+/- 150ns)
|
; 0: 500ns high, 750ns low (+/- 150ns)
|
||||||
; 1: 600ns high, 600ns low (+/- 150ns)
|
; 1: 750ns high, 500ns low (+/- 150ns)
|
||||||
|
; 8 ticks per cycle
|
||||||
;
|
;
|
||||||
; @param r16 value
|
; @param r16 value
|
||||||
; @clobbers r16, r17, r24, r25
|
; @clobbers r16, r17, r24, r25
|
||||||
|
|
||||||
sk6812SendByte:
|
sk6812SendByte4:
|
||||||
ldi r17, 8 ; +1
|
ldi r24, 0
|
||||||
ldi r24, (1<<SK6812_PINNUM)
|
ldi r25, (1<<SK6812_PINNUM)
|
||||||
clr r25
|
|
||||||
sk6812SendByte_loop:
|
|
||||||
lsl r16 ; +1
|
|
||||||
brcs sk6812SendByte_sendOne ; +1 if false, +2 if branch taken
|
|
||||||
nop ; +1
|
|
||||||
; send ZERO
|
|
||||||
out SK6812_PORT, r24 ; +1 set HIGH
|
|
||||||
nop ; +1
|
|
||||||
out SK6812_PORT, r25 ; +1 set LOW
|
|
||||||
dec r17 ; +1
|
|
||||||
brne sk6812SendByte_loop ; +1 if false, +2 if branch taken
|
|
||||||
ret ; 4
|
|
||||||
|
|
||||||
sk6812SendByte_sendOne:
|
|
||||||
out SK6812_PORT, r24 ; +1 set HIGH
|
|
||||||
nop ; +1
|
|
||||||
nop ; +1
|
|
||||||
nop ; +1
|
|
||||||
nop ; +1
|
|
||||||
out SK6812_PORT, r25 ; +1 set LOW
|
|
||||||
dec r17 ; +1
|
|
||||||
brne sk6812SendByte_loop ; +2
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
M_SK6812_HANDLEBIT
|
||||||
|
M_SK6812_HANDLEBIT
|
||||||
|
M_SK6812_HANDLEBIT
|
||||||
|
M_SK6812_HANDLEBIT
|
||||||
|
|
||||||
|
M_SK6812_HANDLEBIT
|
||||||
; ---------------------------------------------------------------------------
|
M_SK6812_HANDLEBIT
|
||||||
; @routine sk6812SendByte2
|
M_SK6812_HANDLEBIT
|
||||||
;
|
M_SK6812_HANDLEBIT
|
||||||
; reset: 80microsecs
|
|
||||||
; 0: 300ns high, 900ns low (+/- 150ns)
|
|
||||||
; 1: 600ns high, 600ns low (+/- 150ns)
|
|
||||||
;
|
|
||||||
; @param r16 value
|
|
||||||
; @clobbers r16, r17
|
|
||||||
|
|
||||||
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
|
ret ; +4
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user