1
0
Fork 0

Fix incorrect delay when setting WS2812 (and similar) leds (#9302)

* Fix incorrect delay when setting WS2812 (and similar) leds

* Add documentation for WS2812_DELAY_MICROSECONDS

* Remove improper cast to uint8_t

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Remove unneeded cast to uint8_t and correct math

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* microseconds -> µs

Co-authored-by: Ryan <fauxpark@gmail.com>

* Make documentation better match the spec sheet.

Co-authored-by: Ryan <fauxpark@gmail.com>

* Rename macro to match spec sheet

* Further correction to the delay maths for the SPI case.

Co-authored-by: Joel Challis <git@zvecr.com>

* Move ws2812_common.h to the drivers directory

* Revert "Further correction to the delay maths for the SPI case."

This reverts commit e61b56a2cfc7dfec9992a7a3af92afa50e5b8ec0.

* Remove ws2812_setleds_pin(); consolidate ws2812.h

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
This commit is contained in:
Joshua Diamond 2020-06-19 22:59:28 -04:00 committed by GitHub
parent c785148445
commit 18e561b82c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 29 additions and 47 deletions

View file

@ -36,25 +36,15 @@
static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi);
// Setleds for standard RGB
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
// wrap up usage of RGB_DI_PIN
ws2812_setleds_pin(ledarray, number_of_leds, RGB_DI_PIN);
}
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
DDRx_ADDRESS(RGB_DI_PIN) |= pinmask(RGB_DI_PIN);
void ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pin) {
DDRx_ADDRESS(RGB_DI_PIN) |= pinmask(pin);
uint8_t masklo = ~(pinmask(pin)) & PORTx_ADDRESS(pin);
uint8_t maskhi = pinmask(pin) | PORTx_ADDRESS(pin);
uint8_t masklo = ~(pinmask(RGB_DI_PIN)) & PORTx_ADDRESS(RGB_DI_PIN);
uint8_t maskhi = pinmask(RGB_DI_PIN) | PORTx_ADDRESS(RGB_DI_PIN);
ws2812_sendarray_mask((uint8_t *)ledarray, number_of_leds * sizeof(LED_TYPE), masklo, maskhi);
#ifdef RGBW
_delay_us(80);
#else
_delay_us(50);
#endif
_delay_us(WS2812_TRST_US);
}
/*