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

@@ -10,13 +10,14 @@
<value name="RGBWSTATE" id="0x81" type="actor" dataType="uint16" />
<value name="NUMLEDS" id="0x82" type="actor" dataType="int" />
<value name="RGBWVALUE" id="0x83" type="actor" dataType="dword" />
<value name="RGBWMODE" id="0x8b" type="actor" dataType="int" modality="onOff" />
<value name="MALONTIME" id="0x85" type="actor" dataType="uint16" />
<value name="MALSOURCE1" id="0x86" type="actor" dataType="uint16" />
<value name="MALSOURCE2" id="0x87" type="actor" dataType="uint16" />
<value name="MALSOURCEB" id="0x89" type="actor" dataType="uint16" />
<value name="MALVALUEB" id="0x8a" type="actor" dataType="uint16" />
<value name="MALSTATE" id="0x07" type="sensor" dataType="uint16" modality="onOff" />
<value name="MALSTATE" id="0x07" type="sensor" dataType="uint16" modality="onOff" />
<value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" />
</values>

View File

@@ -88,6 +88,7 @@
.equ VALUE_ID_MAL_SOURCE2 = 0x87
.equ VALUE_ID_MAL_BSOURCE = 0x89
.equ VALUE_ID_MAL_BVALUE = 0x8a
.equ VALUE_ID_LED_MODE = 0x8b
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88

View File

@@ -5,20 +5,21 @@
<deviceversion>25</deviceversion>
<values>
<value name="DS18B20_TEMP" id="0x06" type="sensor" dataType="rational" modality="temperature" units="C" denom="16" />
<value name="DS18B20_TEMP" id="0x06" type="sensor" dataType="rational" modality="temperature" units="C" denom="16" />
<value name="RGBWSTATE" id="0x81" type="actor" dataType="uint16" />
<value name="NUMLEDS" id="0x82" type="actor" dataType="int" />
<value name="RGBWVALUE" id="0x83" type="actor" dataType="dword" />
<value name="RGBWSTATE" id="0x81" type="actor" dataType="uint16" />
<value name="NUMLEDS" id="0x82" type="actor" dataType="int" />
<value name="RGBWVALUE" id="0x83" type="actor" dataType="dword" />
<value name="RGBWMODE" id="0x8b" type="actor" dataType="int" modality="onOff" />
<value name="MALONTIME" id="0x85" type="actor" dataType="uint16" />
<value name="MALSOURCE1" id="0x86" type="actor" dataType="uint16" />
<value name="MALSOURCE2" id="0x87" type="actor" dataType="uint16" />
<value name="MALSOURCEB" id="0x89" type="actor" dataType="uint16" />
<value name="MALVALUEB" id="0x8a" type="actor" dataType="uint16" />
<value name="MALSTATE" id="0x07" type="sensor" dataType="uint16" modality="onOff" />
<value name="MALONTIME" id="0x85" type="actor" dataType="uint16" />
<value name="MALSOURCE1" id="0x86" type="actor" dataType="uint16" />
<value name="MALSOURCE2" id="0x87" type="actor" dataType="uint16" />
<value name="MALSOURCEB" id="0x89" type="actor" dataType="uint16" />
<value name="MALVALUEB" id="0x8a" type="actor" dataType="uint16" />
<value name="MALSTATE" id="0x07" type="sensor" dataType="uint16" modality="onOff" />
<value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" />
<value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" />
</values>
</device>

View File

@@ -90,6 +90,7 @@
.equ VALUE_ID_MAL_SOURCE2 = 0x87
.equ VALUE_ID_MAL_BSOURCE = 0x89
.equ VALUE_ID_MAL_BVALUE = 0x8a
.equ VALUE_ID_LED_MODE = 0x8b
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88

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: