avr: added routine sk6812SendPattern

This commit is contained in:
Martin Preuss
2024-10-31 22:23:08 +01:00
parent 57bbefdf38
commit e4a0e8557a

View File

@@ -12,6 +12,7 @@
; ***************************************************************************
; defines
.equ SK6812_PATTERN_NUM = 3
; ***************************************************************************
@@ -21,6 +22,7 @@
sk6812DataBegin:
sk6812NumLeds: .byte 1
sk6812Pattern: .byte 5*SK6812_PATTERN_NUM ; 1 byte num leds, 4 bytes colour (RGBW)
sk6812DataEnd:
@@ -110,6 +112,37 @@ SK6812_SetAllColor_loop:
; ---------------------------------------------------------------------------
; @routine sk6812SendPattern
;
; Send given pattern to LEDs.
;
; @param R22 number of 5-byte subpatterns
; @param X pointer to pattern (numleds, R, G, B, W)*SK6812_PATTERN_NUM
; @clobbers R18, R19, R20, R21, R22, R23, X (R16, R17)
sk6812SendPattern:
sk6812SendPattern_loop1:
ld r23, X+ ; num leds
tst r23
brne sk6812SendPattern_readandset
ret ; no leds, done
sk6812SendPattern_readandset:
ld r18, X+ ; R
ld r19, X+ ; G
ld r20, X+ ; B
ld r21, X+ ; W
sk6812SendPattern_loop2:
rcall sk6812SendQuadruple ; (r16, r17)
dec r23
brne sk6812SendPattern_loop2
dec r22
brne sk6812SendPattern_loop1
ret
; @end
; ---------------------------------------------------------------------------
; @routine sk6812SendQuadruple
;
@@ -122,13 +155,13 @@ SK6812_SetAllColor_loop:
sk6812SendQuadruple:
mov r16, r19 ; G
rcall sk6812SendByte
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r18 ; R
rcall sk6812SendByte
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r20 ; B
rcall sk6812SendByte
rcall sk6812SendByte ; (r16, r17, r24, r25)
mov r16, r21 ; W
rcall sk6812SendByte
rcall sk6812SendByte ; (r16, r17, r24, r25)
ret
; @end