diff --git a/avr/modules/sk6812/main.asm b/avr/modules/sk6812/main.asm index c267d94..a501b16 100644 --- a/avr/modules/sk6812/main.asm +++ b/avr/modules/sk6812/main.asm @@ -58,11 +58,12 @@ SK6812_Init: sbi SK6812_DDR, SK6812_PINNUM ; set to output cbi SK6812_PORT, SK6812_PINNUM ; set LOW - ldi r16, 150 + ldi r16, 144 sts sk6812NumLeds, r16 rcall sk6812ReadConfFromEeprom - ldi r18, 1 ; ON + + ldi r18, 1 ; ON (DEBUG) rcall SK6812_SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25) sec @@ -87,37 +88,6 @@ SK6812_Fini: -; --------------------------------------------------------------------------- -; @routine sk6812SetAllColor -; -; 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, r24, r25) - -sk6812SetAllColor: - push r15 - in r15, SREG - cli - ; reset - cbi SK6812_PORT, SK6812_PINNUM - Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us - lds r23, sk6812NumLeds -sk6812SetAllColor_loop: - rcall sk6812SendQuadruple ; (r16, r17, r24, r25) - dec r23 - brne sk6812SetAllColor_loop -; sbi SK6812_PORT, SK6812_PINNUM - out SREG, r15 - pop r15 - ret -; @end - - - ; --------------------------------------------------------------------------- ; @routine SK6812_SetState @global @@ -249,6 +219,45 @@ sk6812SendPattern_loop2: +; --------------------------------------------------------------------------- +; @routine sk6812SetAllColor +; +; 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, r24, r25) + +sk6812SetAllColor: + sbi SK6812_DDR, SK6812_PINNUM ; set to output + cbi SK6812_PORT, SK6812_PINNUM + push r15 + in r15, SREG + cli +; Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us + nop + nop + lds r23, sk6812NumLeds +sk6812SetAllColor_loop: + rcall sk6812SendQuadruple ; (r16, r17, r24, r25) + dec r23 + brne sk6812SetAllColor_loop + + ; reset + cbi SK6812_PORT, SK6812_PINNUM + Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us + +; sbi SK6812_PORT, SK6812_PINNUM + + out SREG, r15 + pop r15 + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine sk6812SendQuadruple ; @@ -283,8 +292,8 @@ sk6812SendQuadruple: ; send ZERO nop ; +1 out SK6812_PORT, r25 ; +1 HIGH - nop - nop + nop ; +1 + nop ; +1 nop out SK6812_PORT, r24 ; +1 nop ; +1 @@ -303,35 +312,104 @@ l_end: ; @end +.macro SK6812_SENDBIT1 +sk6812SendBit: ; 1 0 1 0 + rol r16 ; +1 +1 125 125 + sbi SK6812_PORT, SK6812_PINNUM ; +2 +2 375 375 + brcs sk6812SendBit_l1 ; +2 +1 625 500 + cbi SK6812_PORT, SK6812_PINNUM ; +2 875 +sk6812SendBit_l1: + nop ; +1 +1 1000 625 + nop ; +1 +1 1125 750 + brcc sk6812SendBit_l2 ; +1 +2 1250 1000 + cbi SK6812_PORT, SK6812_PINNUM ; +2 1250 +sk6812SendBit_l2: ; 10 10 1250 1250 +.endmacro + + +.macro SK6812_SENDBIT +sk6812SendBit: ; 0 1 + rol r16 ; +1 +1 + brcs sk6812SendBit_send1 ; +1 +2 + ; send 0 + nop ; +1 + sbi SK6812_PORT, SK6812_PINNUM ; +2 + nop ; +1 + nop ; +1 + cbi SK6812_PORT, SK6812_PINNUM ; +2 +; nop ; +1 + nop ; +1 + rjmp sk6812SendBit_end ; +2 +sk6812SendBit_send1: + ; send 1 + sbi SK6812_PORT, SK6812_PINNUM ; +2 + nop ; +1 + nop ; +1 + nop ; +1 + cbi SK6812_PORT, SK6812_PINNUM ; +2 + nop ; +1 + nop ; +1 + nop ; +1 +sk6812SendBit_end: ; 13 13 +.endmacro + + +sk6812SendByte4: + SK6812_SENDBIT + SK6812_SENDBIT + SK6812_SENDBIT + SK6812_SENDBIT + + SK6812_SENDBIT + SK6812_SENDBIT + SK6812_SENDBIT + SK6812_SENDBIT + + ret +; @end + + +#if 0 ; --------------------------------------------------------------------------- ; @routine sk6812SendByte4 ; ; reset: 80microsecs ; 0: 500ns high, 750ns low (+/- 150ns) ; 1: 750ns high, 500ns low (+/- 150ns) -; 8 ticks per cycle ; ; @param r16 value ; @clobbers r16, r17, r24, r25 sk6812SendByte4: - ldi r24, 0 - ldi r25, (1<