aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/avr/ws2812.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/avr/ws2812.c b/drivers/avr/ws2812.c
index dd2ef8991..77c492cd4 100644
--- a/drivers/avr/ws2812.c
+++ b/drivers/avr/ws2812.c
@@ -67,19 +67,27 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
67#define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000) 67#define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000)
68#define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000) 68#define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000)
69 69
70// w1 - nops between rising edge and falling edge - low 70// w1_nops - nops between rising edge and falling edge - low
71#define w1 (w_zerocycles - w_fixedlow) 71#if w_zerocycles >= w_fixedlow
72// w2 nops between fe low and fe high 72# define w1_nops (w_zerocycles - w_fixedlow)
73#define w2 (w_onecycles - w_fixedhigh - w1)
74// w3 nops to complete loop
75#define w3 (w_totalcycles - w_fixedtotal - w1 - w2)
76
77#if w1 > 0
78# define w1_nops w1
79#else 73#else
80# define w1_nops 0 74# define w1_nops 0
81#endif 75#endif
82 76
77// w2_nops - nops between fe low and fe high
78#if w_onecycles >= (w_fixedhigh + w1_nops)
79# define w2_nops (w_onecycles - w_fixedhigh - w1_nops)
80#else
81# define w2_nops 0
82#endif
83
84// w3_nops - nops to complete loop
85#if w_totalcycles >= (w_fixedtotal + w1_nops + w2_nops)
86# define w3_nops (w_totalcycles - w_fixedtotal - w1_nops - w2_nops)
87#else
88# define w3_nops 0
89#endif
90
83// The only critical timing parameter is the minimum pulse length of the "0" 91// The only critical timing parameter is the minimum pulse length of the "0"
84// Warn or throw error if this timing can not be met with current F_CPU settings. 92// Warn or throw error if this timing can not be met with current F_CPU settings.
85#define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000) 93#define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000)
@@ -90,18 +98,6 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
90# warning "Please consider a higher clockspeed, if possible" 98# warning "Please consider a higher clockspeed, if possible"
91#endif 99#endif
92 100
93#if w2 > 0
94# define w2_nops w2
95#else
96# define w2_nops 0
97#endif
98
99#if w3 > 0
100# define w3_nops w3
101#else
102# define w3_nops 0
103#endif
104
105#define w_nop1 "nop \n\t" 101#define w_nop1 "nop \n\t"
106#define w_nop2 "rjmp .+0 \n\t" 102#define w_nop2 "rjmp .+0 \n\t"
107#define w_nop4 w_nop2 w_nop2 103#define w_nop4 w_nop2 w_nop2