sk6812: minor reorganizing. works now with newer BTF LED stripes.

This commit is contained in:
Martin Preuss
2026-03-26 21:07:22 +01:00
parent 02a43398a9
commit 66bc71b2bd
4 changed files with 261 additions and 175 deletions

View File

@@ -11,121 +11,6 @@
sk6812JumpTableSendByte:
rjmp sk6812SendByte0
rjmp sk6812SendByte1
; ***************************************************************************
; type 0
.macro SK6812_SENDBIT0
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
; ---------------------------------------------------------------------------
; @routine sk6812SendByte0
;
; Sends a byte to the LED strip
; @param r16 byte
; @clobbers r16 (r24, r25)
sk6812SendByte0:
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
ret
; @end
; ***************************************************************************
; type 1
.macro SK6812_SENDBIT1
lsl r16 ; +1
brcs l_sendOne ; +1 if false, +2 if branch taken
; send ZERO
nop ; +1
out SK6812_PORT, r25 ; +1 HIGH
nop ; +1
nop ; +1
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
; ---------------------------------------------------------------------------
; @routine sk6812SendByte1
;
; Sends a byte to the LED strip
; @param r16 byte
; @clobbers r16, r24, r25
sk6812SendByte1:
ldi r24, 0
ldi r25, (1<<SK6812_PINNUM)
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
ret
; @end
rjmp sk6812SetAllColor0 ; new BTF 1m and 5m stripes
; rjmp sk6812SetAllColor1 ; old BTF 1m and 5m stripes

118
avr/modules/sk6812/io0.asm Normal file
View File

@@ -0,0 +1,118 @@
; ***************************************************************************
; copyright : (C) 2026 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; type 0
.macro SK6812_SENDBIT0 ; 0 1
rol r16 ; +1 +1
brcs l_send1 ; +1 +2
; send 0
nop ; +1
sbi SK6812_PORT, SK6812_PINNUM ; +2
; nop ; +1
nop ; +1
cbi SK6812_PORT, SK6812_PINNUM ; +2
rjmp l_end ; +2
l_send1:
; send 1
sbi SK6812_PORT, SK6812_PINNUM ; +2
nop ; +1
nop ; +1
nop ; +1
cbi SK6812_PORT, SK6812_PINNUM ; +2
nop ; +1
l_end:
; nop ; +1 +1
.endmacro ; 12 12
.macro SK6812_SENDBYTE0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
SK6812_SENDBIT0
.endmacro
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
.macro SK6812_SENDQUADRUPEL0
mov r16, r19 ; G + 1
SK6812_SENDBYTE0 ; +12
mov r16, r18 ; R + 1
SK6812_SENDBYTE0 ; +12
mov r16, r20 ; B + 1
SK6812_SENDBYTE0 ; +12
mov r16, r21 ; W + 1
SK6812_SENDBYTE0
.endmacro
; ---------------------------------------------------------------------------
; @routine sk6812SetAllColor0
;
; Set all LEDs to same colour.
;
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @clobbers r16, r23
sk6812SetAllColor0:
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM
push r15
in r15, SREG
cli
lds r23, sk6812NumLeds
sk6812SetAllColor0_loop:
SK6812_SENDQUADRUPEL0
dec r23 ; +1
breq sk6812SetAllColor0_loopEnd ; +1
rjmp sk6812SetAllColor0_loop ; +2
sk6812SetAllColor0_loopEnd:
; reset
cbi SK6812_PORT, SK6812_PINNUM
Utils_WaitNanoSecs 80000, 0, r23 ; wait for 80us
; sbi SK6812_PORT, SK6812_PINNUM
out SREG, r15
pop r15
ret
; @end

135
avr/modules/sk6812/io1.asm Normal file
View File

@@ -0,0 +1,135 @@
; ***************************************************************************
; copyright : (C) 2026 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#if 0 ; disabled for now
; ***************************************************************************
; type 1
.macro SK6812_SENDBIT1
lsl r16 ; +1
brcs l_sendOne ; +1 if false, +2 if branch taken
; send ZERO
nop ; +1
out SK6812_PORT, r25 ; +1 HIGH
nop ; +1
nop ; +1
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
; ---------------------------------------------------------------------------
; @routine sk6812SendByte1
;
; Sends a byte to the LED strip
; @param r16 byte
; @clobbers r16, r24, r25
sk6812SendByte1:
ldi r24, 0
ldi r25, (1<<SK6812_PINNUM)
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
SK6812_SENDBIT1
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SendQuadruple1
;
; Sends GRBW
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @param Z pointer to jumptable entry for SendByte function (called by ijmp)
; @clobbers r16 (r17, r24, r25)
sk6812SendQuadruple1:
mov r16, r19 ; G
rcall sk6812SendByte1 ; (r16, r17, r24, r25)
mov r16, r18 ; R
rcall sk6812SendByte1 ; (r16, r17, r24, r25)
mov r16, r20 ; B
rcall sk6812SendByte1 ; (r16, r17, r24, r25)
mov r16, r21 ; W
rcall sk6812SendByte1 ; (r16, r17, r24, r25)
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SetAllColor1
;
; 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)
sk6812SetAllColor1:
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
sk6812SetAllColor1_loop:
rcall sk6812SendQuadruple1 ; (r16, r17, r24, r25, Z)
dec r23
brne sk6812SetAllColor1_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
sk6812SetAllColor1_done:
ret
; @end
#endif

View File

@@ -19,7 +19,7 @@
.equ SK6812_MODE_AUTO = 2
.equ SK6812_TYPE_BTF_NEW = 0
.equ SK6812_TYPE_BTF_TYPE1 = 0 ; new BTF stripes
.equ SK6812_TYPE_NUM = 1
.equ SK6812_DEFAULT_ONTIME = 300 ; 30secs
@@ -295,6 +295,7 @@ sk6812SetState_off:
#if 0
; ---------------------------------------------------------------------------
; @routine sk6812SendPattern
;
@@ -323,6 +324,7 @@ sk6812SendPattern_loop2:
brne sk6812SendPattern_loop1
ret
; @end
#endif
@@ -335,35 +337,14 @@ sk6812SendPattern_loop2:
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @clobbers r23 (r16, r17, r24, r25)
; @clobbers r23 (r16)
sk6812SetAllColor:
push zl
push zh
rcall sk6812GetJumpTableEntryForCurrentType
brcc sk6812SetAllColor_done
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, Z)
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
icall
sk6812SetAllColor_done:
pop zh
pop zl
@@ -390,39 +371,6 @@ sk6812GetJumpTableEntryForCurrentType_ret:
; ---------------------------------------------------------------------------
; @routine sk6812SendQuadruple
;
; Sends GRBW
; @param r18 red value
; @param r19 green value
; @param r20 blue value
; @param r21 white value
; @param Z pointer to jumptable entry for SendByte function (called by ijmp)
; @clobbers r16 (r17, r24, r25)
sk6812SendQuadruple:
mov r16, r19 ; G
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r18 ; R
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r20 ; B
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r21 ; W
rcall sk6812SendByte ; (r16, r17, r24, r25)
ret
; @end
sk6812SendByte:
ijmp
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812WriteConfToEeprom
;