From 5ca1fd4275021590b4293c74c415b0780d004716 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Wed, 18 Sep 2024 20:21:55 +0200 Subject: [PATCH] avr: added module for sk6812 LED controllers. --- avr/modules/0BUILD | 1 + avr/modules/sk6812/0BUILD | 11 +++ avr/modules/sk6812/main.asm | 178 ++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 avr/modules/sk6812/0BUILD create mode 100644 avr/modules/sk6812/main.asm diff --git a/avr/modules/0BUILD b/avr/modules/0BUILD index 4ee28d5..caebd42 100644 --- a/avr/modules/0BUILD +++ b/avr/modules/0BUILD @@ -19,6 +19,7 @@ twimaster owimaster ds18b20 + sk6812 diff --git a/avr/modules/sk6812/0BUILD b/avr/modules/sk6812/0BUILD new file mode 100644 index 0000000..febd367 --- /dev/null +++ b/avr/modules/sk6812/0BUILD @@ -0,0 +1,11 @@ + + + + + + main.asm + + + + + diff --git a/avr/modules/sk6812/main.asm b/avr/modules/sk6812/main.asm new file mode 100644 index 0000000..219b05b --- /dev/null +++ b/avr/modules/sk6812/main.asm @@ -0,0 +1,178 @@ +; *************************************************************************** +; 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 + + + +; *************************************************************************** +; data + +.dseg + +sk6812DataBegin: + sk6812NumLeds: .byte 1 +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 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 + mov r16, r18 ; R + rcall sk6812SendByte + mov r16, r20 ; B + rcall sk6812SendByte + mov r16, r21 ; W + rcall sk6812SendByte + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine sk6812SendByte +; +; @param r16 value +; @clobbers r16, r17, r24, r25 + + + +sk6812SendByte: + ldi r17, 8 ; +1 + ldi r24, (1<