avr: add MODE variable to sk6812 module.

this allows for better control over led strips.

Modes:
- AUTO: allow other modules to switch LED strip
- OFF:  force LED strip off
- ON:   force LED strip on
This commit is contained in:
Martin Preuss
2025-10-01 23:24:50 +02:00
parent dafe32792a
commit 81e9078b80
6 changed files with 89 additions and 24 deletions

View File

@@ -14,6 +14,11 @@
.equ SK6812_PATTERN_NUM = 3
.equ SK6812_MODE_OFF = 0
.equ SK6812_MODE_ON = 1
.equ SK6812_MODE_AUTO = 2
; ***************************************************************************
; data
@@ -24,6 +29,7 @@ sk6812DataBegin:
sk6812NumLeds: .byte 1
sk6812Pattern: .byte 5*SK6812_PATTERN_NUM ; 1 byte num leds, 4 bytes colour (RGBW)
sk6812RGBW: .byte 4 ; current RGBW value
sk6812Mode: .byte 1
sk6812DataEnd:
@@ -47,6 +53,9 @@ SK6812_Init:
ldi r17, (sk6812DataEnd-sk6812DataBegin)
rcall Utils_FillSram
ldi r16, SK6812_MODE_AUTO
sts sk6812Mode, r16
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM ; set LOW
ldi r16, 150
@@ -119,20 +128,35 @@ sk6812SetAllColor_loop:
; @clobbers r18, r19, r20, r21, (r16, r17, r23, r24, r25)
SK6812_SetState:
tst r18
lds r16, sk6812Mode
cpi r16, SK6812_MODE_AUTO
brne SK6812_SetState_end
rjmp sk6812SetState
SK6812_SetState_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine SK6812_SetMode @global
;
; @param r18 mode (SK6812_MODE_OFF, SK6812_MODE_ON, SK6812_MODE_AUTO)
; @clobbers r18, (r16, r17, r19, r20, r21, r23, r24, r25)
SK6812_SetMode:
sts sk6812Mode, r18
cpi r18, SK6812_MODE_OFF
breq SK6812_SetState_off
lds r18, sk6812RGBW
lds r19, sk6812RGBW+1
lds r20, sk6812RGBW+2
lds r22, sk6812RGBW+3
rjmp SK6812_SetState_haveValue
cpi r18, SK6812_MODE_ON
breq SK6812_SetState_on
ret
SK6812_SetState_off:
clr r18
clr r19
clr r20
clr r21
SK6812_SetState_haveValue:
rjmp sk6812SetAllColor ; (r16, r17, r23, r24, r25)
rjmp sk6812SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
SK6812_SetState_on:
ldi r18, 1
rjmp sk6812SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
; @end
@@ -165,6 +189,33 @@ SK6812_SetRGBW:
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SetState
;
; Set all LEDs to same colour according to state.
;
; @param r18 0: all LEDs off, otherwise all LEDs color stored in sk6812RGBW
; @clobbers r18, r19, r20, r21, (r16, r17, r23, r24, r25)
sk6812SetState:
tst r18
breq sk6812SetState_off
lds r18, sk6812RGBW
lds r19, sk6812RGBW+1
lds r20, sk6812RGBW+2
lds r21, sk6812RGBW+3
rjmp sk6812SetState_haveValue
sk6812SetState_off:
clr r18
clr r19
clr r20
clr r21
sk6812SetState_haveValue:
rjmp sk6812SetAllColor ; (r16, r17, r23, r24, r25)
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SendPattern
;

View File

@@ -30,6 +30,8 @@ SK6812_OnPacketReceived_set:
breq SK6812_OnPacketReceived_setNumLeds
cpi r17, VALUE_ID_LED_STATE
breq SK6812_OnPacketReceived_setState
cpi r17, VALUE_ID_LED_MODE
breq SK6812_OnPacketReceived_setMode
clc
ret
SK6812_OnPacketReceived_setRGBW:
@@ -50,7 +52,15 @@ SK6812_OnPacketReceived_setState:
pop r24
pop r17
rjmp SK6812_OnPacketReceived_sendAck
SK6812_OnPacketReceived_setMode:
push r17
push r24
push r25
rcall SK6812_SetMode ; value is in R18 (r16, r17, r18, r19, r20, r21, r23, r24, r25)
pop r25
pop r24
pop r17
rjmp SK6812_OnPacketReceived_sendAck
SK6812_OnPacketReceived_setNumLeds:
sts sk6812NumLeds, r18
SK6812_OnPacketReceived_sendAck: