avr: improved module SK6812 and app MA_LIGHT.

- RGBW values are now only set by SK6812
- MA_LIGHT can now also take into account a brightness value reported
  by any node to switch on light only after dawn
This commit is contained in:
Martin Preuss
2025-09-22 15:09:45 +02:00
parent 42e477098c
commit 666e7690a6
15 changed files with 354 additions and 78 deletions

View File

@@ -23,6 +23,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
sk6812DataEnd:
@@ -35,36 +36,33 @@ sk6812DataEnd:
; ---------------------------------------------------------------------------
; SK6812_Init
; @routine SK6812_Init
;
; IN:
; - nothing
; OUT:
; - CFLAG: set if okay, clear on error
; USED:
; @return CFLAG set if okay, clear on error
SK6812_Init:
; ldi xh, HIGH(sk6812DataBegin)
; ldi xl, LOW(sk6812DataBegin)
; clr r16
; ldi r17, (sk6812DataEnd-sk6812DataBegin)
; rcall Utils_FillSram
ldi xh, HIGH(sk6812DataBegin)
ldi xl, LOW(sk6812DataBegin)
clr r16
ldi r17, (sk6812DataEnd-sk6812DataBegin)
rcall Utils_FillSram
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM ; set LOW
ldi r16, 150
sts sk6812NumLeds, r16
ldi r18, 255 ; R
ldi r19, 69 ; G
ldi r20, 0 ; B
ldi r21, 0 ; W
rcall SK6812_SetAllColor ; r23 (r16, r17)
rcall sk6812ReadConfFromEeprom
ldi r18, 1 ; ON
rcall SK6812_SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
sec
ret
SK6812_Init_error:
clc
ret
; @end
; ---------------------------------------------------------------------------
@@ -81,7 +79,7 @@ SK6812_Fini:
; ---------------------------------------------------------------------------
; @routine SK6812_SetAllColor @global
; @routine sk6812SetAllColor
;
; Set all LEDs to same colour.
;
@@ -91,7 +89,7 @@ SK6812_Fini:
; @param r21 white value
; @clobbers r23 (r16, r17, r24, r25)
SK6812_SetAllColor:
sk6812SetAllColor:
push r15
in r15, SREG
cli
@@ -99,10 +97,10 @@ SK6812_SetAllColor:
cbi SK6812_PORT, SK6812_PINNUM
Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us
lds r23, sk6812NumLeds
SK6812_SetAllColor_loop:
sk6812SetAllColor_loop:
rcall sk6812SendQuadruple ; (r16, r17, r24, r25)
dec r23
brne SK6812_SetAllColor_loop
brne sk6812SetAllColor_loop
; sbi SK6812_PORT, SK6812_PINNUM
out SREG, r15
pop r15
@@ -111,6 +109,62 @@ SK6812_SetAllColor_loop:
; ---------------------------------------------------------------------------
; @routine SK6812_SetState @global
;
; 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)
SK6812_SetState:
tst r18
breq SK6812_SetState_off
lds r18, sk6812RGBW
lds r19, sk6812RGBW+1
lds r20, sk6812RGBW+2
lds r22, sk6812RGBW+3
rjmp SK6812_SetState_haveValue
SK6812_SetState_off:
clr r18
clr r19
clr r20
clr r21
SK6812_SetState_haveValue:
rjmp sk6812SetAllColor ; (r16, r17, r23, r24, r25)
; @end
; ---------------------------------------------------------------------------
; @routine SK6812_SetRGBW @global
;
; Store new color for all LEDs.
;
; @param r18 red value
; @param r19 green value
; @param r20 blue color
; @param r21 white color
; @clobbers (r16, r17, r18, r19, r20, r21, r23, r24, r25, X)
SK6812_SetRGBW:
push r15
in r15, SREG
cli
sts sk6812RGBW, r18
sts sk6812RGBW+1, r19
sts sk6812RGBW+2, r20
sts sk6812RGBW+3, r21
rcall sk6812WriteConfToEeprom ; (R16, R17, X)
ldi r18, 1 ; ON
rcall SK6812_SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SendPattern
;
@@ -226,3 +280,87 @@ sk6812SendByte4:
; ---------------------------------------------------------------------------
; @routine sk6812WriteConfToEeprom
;
; @clobbers r16, r17, X
sk6812WriteConfToEeprom:
push r15
in r15, SREG
cli
ldi xl, LOW(EEPROM_OFFS_SK6812_RGBW)
ldi xh, HIGH(EEPROM_OFFS_SK6812_RGBW)
lds r16, sk6812RGBW
rcall Eeprom_WriteByteIfChanged ; (R17)
adiw xh:xl, 1
lds r16, sk6812RGBW+1
rcall Eeprom_WriteByteIfChanged ; (R17)
adiw xh:xl, 1
lds r16, sk6812RGBW+2
rcall Eeprom_WriteByteIfChanged ; (R17)
adiw xh:xl, 1
lds r16, sk6812RGBW+3
rcall Eeprom_WriteByteIfChanged ; (R17)
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812ReadConfFromEeprom
;
; @clobbers r16, r17, X
sk6812ReadConfFromEeprom:
push r15
in r15, SREG
cli
ldi xl, LOW(EEPROM_OFFS_SK6812_RGBW)
ldi xh, HIGH(EEPROM_OFFS_SK6812_RGBW)
rcall Eeprom_ReadByte
brcc sk6812ReadConfFromEeprom_default
mov r18, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte
brcc sk6812ReadConfFromEeprom_default
mov r19, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte
brcc sk6812ReadConfFromEeprom_default
mov r20, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte
brcc sk6812ReadConfFromEeprom_default
mov r21, r16
mov r16, r18
and r16, r19
and r16, r20
and r16, r21
inc r16
brne sk6812ReadConfFromEeprom_storeColor
; fall through if value from EEPROM is 0xffffffff
sk6812ReadConfFromEeprom_default:
ldi r18, 128 ; R
ldi r19, 69 ; G
ldi r20, 0 ; B
ldi r21, 0 ; W
sk6812ReadConfFromEeprom_storeColor:
sts sk6812RGBW, r18
sts sk6812RGBW+1, r19
sts sk6812RGBW+2, r20
sts sk6812RGBW+3, r21
sk6812ReadConfFromEeprom_end:
out SREG, r15
pop r15
ret
; @end

View File

@@ -28,17 +28,29 @@ SK6812_OnPacketReceived_set:
breq SK6812_OnPacketReceived_setRGBW
cpi r17, VALUE_ID_LED_NUMLEDS
breq SK6812_OnPacketReceived_setNumLeds
cpi r17, VALUE_ID_LED_STATE
breq SK6812_OnPacketReceived_setState
clc
ret
SK6812_OnPacketReceived_setRGBW:
push r17
push r24
push r25
rcall SK6812_SetAllColor ; value is in R18-R21 (r16, r17, r23, r24, r25)
rcall SK6812_SetRGBW ; value is in R18-R21 (R16, R17, X)
pop r25
pop r24
pop r17
rjmp SK6812_OnPacketReceived_sendAck
SK6812_OnPacketReceived_setState:
push r17
push r24
push r25
rcall SK6812_SetState ; 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: