我有1MHz时钟的ATTiny。我正在尝试点亮一些ws2812b led灯条。我选择了没有电阻和电容的所有东西。我认为一切都应该工作,但不是:)
我正在使用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_ */

最佳答案

我认为1Mhz太慢了,无法生成WS2812B所需的信号。

最时序关键的WS2812B信号-TH0脉冲-必须小于500ns宽,并且在1Mhz时,每个MCU周期为1000ns。

有关WS2812B时序约束的更多信息,请参见此处。

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

关于c - ATTiny85上的ws2812b,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59114513/

10-12 07:36