avr: added module for sk6812 LED controllers.

This commit is contained in:
Martin Preuss
2024-09-18 20:21:55 +02:00
parent 7590aa3717
commit 5ca1fd4275
3 changed files with 190 additions and 0 deletions

View File

@@ -19,6 +19,7 @@
twimaster
owimaster
ds18b20
sk6812
</subdirs>
</gwbuild>

11
avr/modules/sk6812/0BUILD Normal file
View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
main.asm
</extradist>
</gwbuild>

178
avr/modules/sk6812/main.asm Normal file
View File

@@ -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<<SK6812_PINNUM)
clr r25
sk6812SendByte_loop:
lsl r16 ; +1
brcs sk6812SendByte_sendOne ; +1 if false, +2 if branch taken
nop ; +1
; send ZERO
out SK6812_PORT, r24 ; +1 set HIGH
nop ; +1
out SK6812_PORT, r25 ; +1 set LOW
dec r17 ; +1
brne sk6812SendByte_loop ; +1 if false, +2 if branch taken
ret ; 4
sk6812SendByte_sendOne:
out SK6812_PORT, r24 ; +1 set HIGH
nop ; +1
nop ; +1
nop ; +1
nop ; +1
out SK6812_PORT, r25 ; +1 set LOW
dec r17 ; +1
brne sk6812SendByte_loop ; +2
ret
; @end
SK6812_END:
.equ MODULE_SIZE_SK6812 = SK6812_END-SK6812_BEGIN