diff --git a/avr/modules/sk6812/main.asm b/avr/modules/sk6812/main.asm index 219b05b..c2cbc7d 100644 --- a/avr/modules/sk6812/main.asm +++ b/avr/modules/sk6812/main.asm @@ -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