; *************************************************************************** ; copyright : (C) 2024 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** ; *************************************************************************** ; defines .equ SK6812_PATTERN_NUM = 3 ; *************************************************************************** ; data .dseg sk6812DataBegin: sk6812NumLeds: .byte 1 sk6812Pattern: .byte 5*SK6812_PATTERN_NUM ; 1 byte num leds, 4 bytes colour (RGBW) sk6812DataEnd: ; *************************************************************************** ; code .cseg SK6812_BEGIN: ; --------------------------------------------------------------------------- ; SK6812_Init ; ; IN: ; - nothing ; OUT: ; - CFLAG: set if okay, clear on error ; USED: SK6812_Init: ; 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) sec ret SK6812_Init_error: clc ret ; --------------------------------------------------------------------------- ; SK6812_Fini ; ; IN: ; - nothing ; OUT: ; - CFLAG: set if okay, clear on error ; USED: SK6812_Fini: sec ret ; --------------------------------------------------------------------------- ; @routine SK6812_SetAllColor @global ; ; Set all LEDs to same colour. ; ; @param r18 red value ; @param r19 green value ; @param r20 blue value ; @param r21 white value ; @clobbers r23 (r16, r17) SK6812_SetAllColor: push r15 in r15, SREG cli lds r23, sk6812NumLeds SK6812_SetAllColor_loop: rcall sk6812SendQuadruple ; (r16, r17) dec r23 brne SK6812_SetAllColor_loop out SREG, r15 pop r15 ret ; @end ; --------------------------------------------------------------------------- ; @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 ; ; Sends GRBW ; @param r18 red value ; @param r19 green value ; @param r20 blue value ; @param r21 white value ; @clobbers r16 (r17) sk6812SendQuadruple: mov r16, r19 ; G rcall sk6812SendByte ; (r16, r17, r24, r25) mov r16, r18 ; R rcall sk6812SendByte ; (r16, r17, r24, r25) mov r16, r20 ; B rcall sk6812SendByte ; (r16, r17, r24, r25) mov r16, r21 ; W rcall sk6812SendByte ; (r16, r17, r24, r25) ret ; @end ; --------------------------------------------------------------------------- ; @routine sk6812SendByte ; ; @param r16 value ; @clobbers r16, r17, r24, r25 sk6812SendByte: ldi r17, 8 ; +1 ldi r24, (1<