Перейти к содержанию

WS2812b первый светодиод в кольце горит зеленым


-=FISHER=-

Рекомендуемые сообщения

Приветствую всех!

Недавно собрал себе контроллер (на Atmega8) для управления светодиодным колечком из 16 штук WS2812b. В процессе отладки использовал готовое кольцо, заказанное в Китае, однако под мои нужды внутренний диаметр кольца нужен немного больше, поэтому заказал (опять таки в Китае) платы-колечки, сами же светодиоды купил в наличии у себя в городе. Однако после сборки я заметил, что после первого включения и вместе с первой отправкой данных  на кольцо, на нем кратковременно мигает зелёным цветом первый светодиод (после этого кольцо ведет себя согласно программе, пока не скинуть питание никаких глюков больше нет). Я стал разбираться и пришел к выводу, что даже если отправить на ленту посылку из 24 байт (набора данных для включения только первого светодиода) для включения чисто синего цвета или чисто красного, то к его цвету в ~50% случаях примешивается зелёный, но бывает что и чисто синий удается зажечь..

Самое интересное: я подключаю старое колечко и на нем этого глюка не отображается! Справедливости ради стоит сказать, что чип в светодиодах "китайских" и тех что я купил в наличии отличается, китайский меньше, но при этом ведет себя правильнее. Я знаю что есть некие WS2812b-v3 и WS2812b-v5 и у них с просто WS2812b отличаются тайминги, но в Чип Дип я выбрал именно обычные, фото для сравнения:

Скрытый текст

834721654_WhatsAppImage2020-12-10at22_24_42.jpeg.6c292f758180008155f1b3d7c44612ef.jpeg

Приведу код инициализации аппаратного SPI в Atmega8, а так же функции для отправки данных на WS2812b:

Скрытый текст

#include "SPI.h"

#define LED_COUNT 16 //количество светодиодов

#define WS2812_BIT_0 0b11000000 // Константа для формирования импульса "0" для WS2812

#define WS2812_BIT_1 0b11111100 // Константа для формирования импульса "1" для WS2812  
  
/// Структура, описывающая один пиксель
typedef struct pixel_t
{
	uint8_t		g;			///< зеленая составляющая цвета
	uint8_t		r;			///< красная составляющая цвета
	uint8_t		b;			///< синяя составляющая цвета
} pixel_t;

pixel_t pixels[LED_COUNT]; // массив пикселей

#define SS _BV(PB2) //ножка SS (Chip Select) (1<<PB2)
#define MOSI _BV(PB3) //ножка MOSI (1<<PB3)
#define SCK _BV(PB5) //ножка SCK (1<<PB5)
#define SPI_pins (SS|MOSI|SCK) //комбинация ножек интерфейса SPI
#define SPI_DDR DDRB //порт интерфейса SPI выбран порт B

void SPI_ini(void) //ФУНКЦИЯ ИНИЦИАЛИЗАЦИИ SPI
{
	SPI_DDR|=SPI_pins; //ножки SPI на выход
	PORTB&=~((1<<2)|(1<<3)|(1<<5)); //низкий уровень
	SPCR|=(1<<SPE)|(1<<MSTR)|(1<<CPHA); //включим шину, объявим ведущим
	SPSR|=(1<<SPI2X); //частота SPI 16/2 = 8 МГц
	SPDR=0;
}

void SPI_SendByte(uint8_t byte) //ФУНКЦИЯ ОТПРАВКИ БАЙТА ПО SPI
{
	for(uint8_t mask=0x80; mask; mask >>=1)
	{	
		SPDR = byte & mask ? WS2812_BIT_1 : WS2812_BIT_0;
	}
	while (!(SPSR & (1 << SPIF)));
}

void ws2812_show(void)
{
	cli();
	for(uint8_t i=0; i < LED_COUNT; i++)
	{
		// для чипа WS2812 порядок цветовых составляющих должен быть таким:
 		SPI_SendByte(pixels[i].g);	// сначала ЗЕЛЕНЫЙ
 		SPI_SendByte(pixels[i].r);	// затем КРАСНЫЙ
 		SPI_SendByte(pixels[i].b);	// в конце - СИНИЙ
	}
	while (!(SPSR & (1 << SPIF))); // ждем завершения передачи последнего бита
	sei();
}

 

Помогите пожалуйста разобраться, где собака зарыта?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Проблему решил, подтянув линию данных со стороны МК к земле через 10к. Тему можно закрывать...

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...