ws2812b на ATTiny85

У меня ATTiny с тактовой частотой 1 МГц. Пытаюсь зажечь какую-то светодиодную ленту ws2812b. Подключил все без резисторов и конденсаторов. Думаю, все должно работать, но это не так :) Я использую библиотеку light_ws2812 https://github.com/cpldcpu/light_ws2812. Ниже приведен пример кода. Я повесил только частоту F_CPU, количество выходных контактов и время сброса в файле конфигурации. Не могли бы вы помочь мне найти проблему и посоветовать, как ее исправить?

ГЛАВНАЯ

#define F_CPU 1000000

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "ws2812_config.h"
#include "light_ws2812.h"

struct cRGB led[2];

int main(void)
{

    uint8_t pos=0;
    uint8_t direction=1;
    uint8_t i;

    #ifdef __AVR_ATtiny10__
    CCP=0xD8;       // configuration change protection, write signature
    CLKPSR=0;       // set cpu clock prescaler =1 (8Mhz) (attiny 4/5/9/10)
    #endif

    led[0].r=255;led[0].g=00;led[0].b=00;       // LED 0 is red
    led[1].r=255;led[1].g=16;led[1].b=16;       // LED 1 is White

    while(1)
    {

        for (i=0; i<pos; i++)
        ws2812_sendarray((uint8_t *)&led[0],3);         // Repeatedly send "red" to the led string.
        // No more than 1-2µs should pass between calls
        // to avoid issuing a reset condition.
        for (i=0; i<(16-pos); i++)
        ws2812_sendarray((uint8_t *)&led[1],3);         // white

        _delay_ms(50);                                      // Issue reset and wait for 50 ms.

        pos+=direction;
        if ((pos==16)||(pos==0)) direction=-direction;
    }

}

КОНФИГУРАЦИЯ

/*
 * light_ws2812_config.h
 *
 * v2.4 - Nov 27, 2016
 *
 * User Configuration file for the light_ws2812_lib
 *
 */ 


#ifndef WS2812_CONFIG_H_
#define WS2812_CONFIG_H_

///////////////////////////////////////////////////////////////////////
// Define Reset time in µs. 
//
// This is the time the library spends waiting after writing the data.
//
// WS2813 needs 300 µs reset time
// WS2812 and clones only need 50 µs
//
///////////////////////////////////////////////////////////////////////

#define ws2812_resettime  50

///////////////////////////////////////////////////////////////////////
// Define I/O pin
///////////////////////////////////////////////////////////////////////


#define ws2812_port B     // Data port 
#define ws2812_pin  3     // Data out pin

#endif /* WS2812_CONFIG_H_ */

person Adam    schedule 30.11.2019    source источник


Ответы (4)


Я думаю, что 1 МГц - это слишком медленно, чтобы генерировать сигналы, необходимые для WS2812B.

Наиболее критичный по времени сигнал WS2812B - импульс TH0 - должен иметь ширину менее 500 нс, а на частоте 1 МГц каждый цикл MCU составляет 1000 нс.

Подробнее о временных ограничениях WS2812B здесь ...

https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/

person bigjosh    schedule 30.11.2019
comment
Вот это да. Спасибо вам за эту статью. Я увеличу частоту до 8 МГц. Надеюсь я буду работать - person Adam; 01.12.2019
comment
К сожалению, после замены предохранителей и F_CPU на 8 МГц все еще не работает :( - person Adam; 01.12.2019
comment
Ok. Я обнаружил проблему. Я опубликую решение позже - person Adam; 01.12.2019
comment
@Adam Вы должны передать свой F_CPU с помощью параметров командной строки во все скомпилированные исходные файлы. Менять его внутри main бессмысленно, и ничто другое этого не знает. Также вам нужно заменить предохранители, чтобы переключиться на внутреннюю частоту 8 МГц без ckdiv8, потому что F_CPU фактически не изменяет реальную частоту процессора. - person KIIV; 03.12.2019

Последовательные резисторы и параллельные конденсаторы действительно помогают уменьшить шум, который вызывает необъяснимое поведение. Но вы правы, это не должно останавливать работу WS2812bs полностью.

Я предлагаю вам попробовать еще одну булавку на своем аттини. Контакт 3 используется для связи по USB. Если вы запитаете свой attiny через USB-кабель, подключенный к вашему компьютеру, это вызовет проблемы. Попробуйте, например, контакты 5 и 6.

Вы можете попробовать библиотеку Adafruit_NeoPixel. Я попробовал, и он скомпилирован для attiny85 без изменений. На самом деле я не пробовал запускать его, так как у меня не валяется аттини.

Кроме того, некоторые из более дешевых светодиодных лент WS2812b, которые можно найти на ebay, получили замену этикеток Din и Dout. Это означает, что вы должны подключить штифт Dout к вашему аттини. Это действительно однажды случилось со мной.

Я не знаю о длине импульса в WS2812bs, но если проблема не в этом, я почти уверен, что это одна из трех, о которых я упоминал выше.

Надеюсь, это поможет.

person Anteino    schedule 30.11.2019
comment
Спасибо за ответ. Я запитываю его только проводами, подключенными к 5В. Я пробовал использовать другой вывод, но это не сработало. Я не могу использовать Adafruit_NeoPixel, потому что я не использую Arduino IDE :) Я также пробовал подключать dout к своему MCU, но все равно ничего. Но попробую добавить конденсаторы. Спасибо еще раз - person Adam; 01.12.2019

[Решение]

Согласно README, я включил файл конфигурации перед заголовком в свой ГЛАВНЫЙ файл исходного кода. Это была ошибка, потому что два файла являются частью разных единиц компиляции, и файлы DEFINE не используются совместно между ними. Это приводит к тому, что мои настройки конфигурации были проигнорированы, и программа использовала настройки по умолчанию (не правильные в моем случае).

Чтобы исправить эту ошибку, вы должны включить ваш ws2812_config.h в light_ws2812.h

person Adam    schedule 04.12.2019

Вы должны использовать библиотеку FASTLED, вы можете загрузить ее на arduino ide. С помощью этой библиотеки очень легко зажечь WS2812 с помощью ATTINY85.

person lANCHUAN    schedule 19.05.2020