diff --git a/avr/modules/sk6812/main.asm b/avr/modules/sk6812/main.asm index 53953f8..b2b44c0 100644 --- a/avr/modules/sk6812/main.asm +++ b/avr/modules/sk6812/main.asm @@ -95,11 +95,15 @@ SK6812_SetAllColor: push r15 in r15, SREG cli + ; reset + cbi SK6812_PORT, SK6812_PINNUM + Utils_WaitNanoSecs 80000, 0, r22 ; wait for 80us lds r23, sk6812NumLeds SK6812_SetAllColor_loop: rcall sk6812SendQuadruple ; (r16, r17, r24, r25) dec r23 brne SK6812_SetAllColor_loop + sbi SK6812_PORT, SK6812_PINNUM out SREG, r15 pop r15 ret @@ -150,13 +154,13 @@ sk6812SendPattern_loop2: sk6812SendQuadruple: mov r16, r19 ; G - rcall sk6812SendByte ; (r16, r17, r24, r25) + rcall sk6812SendByte2 ; (r16, r17, r24, r25) mov r16, r18 ; R - rcall sk6812SendByte ; (r16, r17, r24, r25) + rcall sk6812SendByte2 ; (r16, r17, r24, r25) mov r16, r20 ; B - rcall sk6812SendByte ; (r16, r17, r24, r25) + rcall sk6812SendByte2 ; (r16, r17, r24, r25) mov r16, r21 ; W - rcall sk6812SendByte ; (r16, r17, r24, r25) + rcall sk6812SendByte2 ; (r16, r17, r24, r25) ret ; @end @@ -165,6 +169,10 @@ sk6812SendQuadruple: ; --------------------------------------------------------------------------- ; @routine sk6812SendByte ; +; reset: 80microsecs +; 0: 300ns high, 900ns low (+/- 150ns) +; 1: 600ns high, 600ns low (+/- 150ns) +; ; @param r16 value ; @clobbers r16, r17, r24, r25 @@ -198,3 +206,40 @@ sk6812SendByte_sendOne: +; --------------------------------------------------------------------------- +; @routine sk6812SendByte2 +; +; reset: 80microsecs +; 0: 300ns high, 900ns low (+/- 150ns) +; 1: 600ns high, 600ns low (+/- 150ns) +; +; @param r16 value +; @clobbers r16, r17, r24, r25 + +sk6812SendByte2: + ldi r17, 8 ; +1 +sk6812SendByte2_loop: + lsl r16 ; +1 + brcs sk6812SendByte2_sendOne ; +1 if false, +2 if branch taken + nop ; +1 + ; send ZERO + sbi SK6812_PORT, SK6812_PINNUM ; +2 set HIGH + nop ; +1 (125ns) + cbi SK6812_PORT, SK6812_PINNUM ; +2 set LOW (250ns) + dec r17 ; +1 (125ns) + brne sk6812SendByte2_loop ; +1 if false, +2 if branch taken + ret ; +4 + +sk6812SendByte2_sendOne: + sbi SK6812_PORT, SK6812_PINNUM ; +2 set HIGH + nop ; +1 (125ns) + nop ; +1 (125ns) + nop ; +1 (125ns) + cbi SK6812_PORT, SK6812_PINNUM ; +2 set LOW + dec r17 ; +1 + brne sk6812SendByte2_loop ; +1 if false, +2 if branch taken + ret ; +4 +; @end + + +