Светодиоды c пиксельной адресацией WS2812B

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 15607
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Просто я посчитал, что при таких параметрах что программное, что аппаратное формирование практически по времени идентичны - даже при аппаратном есть риск "наскочить" на следующий цикл (пропустив флаг при ожидании), а лезть в более высокую частоту без внешнего кварца экономически нерентабельно.
В то же время программная реализация анализатора по каждому биту на обычной системе - хоть по флагу С, хоть по каждому биту имеет резброс величин от байта к байту (ибо данные разнятся, а исполнение условных переходов " 1-нет/2-да" остается в силе).
Посему и сделана была версия векторно-условных переходов хотя и с большими затратами ОЗУ (2 фрагмента/варианта исполнения в зависимости 1 или 0 текущего бита и вторая пара с анализатором продвижки указателя адреса массива размещенные по фиксированным адресам ПЗУ).
Правда при соблюдении суммарного времени на каждый слот соотношение интервалов 1 и 0 несколько "покалечено" в пределах допуска даташита.
8)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Да, данная реализация (я про ШИМ) никакого преимущества по ресурсам МК не дает, Вы правы. МК полностью занят передачей всего пакета и ни на что отвлечься все равно не может. Кроме того еще занимает таймер. SPI может в этом случае поможет, даст вздохнуть МК, не знаю.

Думаю что накопления суммарной ошибки боятся тоже нечего. Странно было бы, если светодиод не синхронизировался на каждый фронт сигнала. По-любому фронт запускает внутренний счетчик счетчик с нуля, значение счетчика во время спада формирует принятый бит (0 или 1), переполнение счетчика формирует сброс и обновления яркости светодиода. Я бы так сделал. Ну и еще один счетчик принятых бит, чтобы знать принимать их или слать дальше.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Z_h_e писал(а):Странно было бы, если светодиод не синхронизировался на каждый фронт сигнала. По-любому фронт запускает внутренний счетчик счетчик с нуля, значение счетчика во время спада формирует принятый бит (0 или 1),
Где-то в нете видел картинку, как паренек с ленты снимал логическим анализатором данные. Там так было, он подавал затянутые фронты, точнее высокий уровень чуть более 400 нс. А следующий светодиод уже пересылал тот, который нужен, и даже короче по длительности... И картинка была. не помню где, хоть убей.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 15607
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Светик действительно должен несколько нормировать пропускаемый через себя поток данных.
Только вот "в разумных пределах".
8)
Касательно SPI - в том варианте надо передаваемый байт предварительно "дробить" - овчинка не стоит выделки, хотя такой способ является основным, пирменяемым в работе с ws2812 (судя по анализу публикаций).
:roll:
Спасибки Z_h_e "за идейный пинок" - хош появились мысли на продвижку решений по прожкам.
:beer:
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

У меня вполне сносно работает на SPI, мега8 на 16МГц, можно и на тиньке 2313а, программа на СИ. мой пример
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Попробовал сделать на UART. tny2313. Выход PD4. 20МГц. Сигнал надо инвертировать. Проверить не могу даже в Протеуссе. :beer: , птница, туплю уже совсем. Как будто бы робит. Прерывание возникает тактов через 100,, т.е. вроде МК уже разгружен несколько. Попробуйте. Тайминги нескько хуже вроде. Не знаю что плоучисль.
Спойлер

Код: Выделить всё

.equ eMaskData=~0x24
//---------------------------------------
.def zero=R1

.def buf=R16

.def MaskData =R17	//флаг что надо передавать старшую половину байта
.def DataSend=R18   //текущие отправляемые данные
.def RegSum=R19



//---------------------

 .org 0

rjmp RESET ; Reset Handler
	reti// rjmp INT0 ; External Interrupt0 Handler
	reti// rjmp INT1 ; External Interrupt1 Handler
	reti// rjmp TIM1_CAPT ; Timer1 Capture Handler
	reti// rjmp TIM1_COMPA ; Timer1 CompareA Handler
	reti// rjmp TIM1_OVF ; Timer1 Overflow Handler
	reti// rjmp TIM0_OVF ; Timer0 Overflow Handler
	reti// rjmp USART0_RXC ; USART0 RX Complete Handler
rjmp USART0_DRE ; USART0,UDR Empty Handler
	reti// rjmp USART0_TXC ; USART0 TX Complete Handler
	reti// rjmp ANA_COMP ; Analog Comparator Handler
	reti// rjmp PCINT0 ; PCINT0 Handler
	reti// rjmp TIMER1_COMPB ; Timer1 Compare B Handler
	reti// rjmp TIMER0_COMPA ; Timer0 Compare A Handler
	reti// rjmp TIMER0_COMPB ; Timer0 Compare B Handler
	reti// rjmp USI_START ; USI Start Handler
	reti// rjmp USI_OVERFLOW ; USI Overflow Handler
	reti// rjmp EE_READY ; EEPROM Ready Handler
	reti// rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
	reti// rjmp PCINT1 ; PCINT1 Handler
	reti// rjmp PCINT2 ; PCINT2 Handler
//*************************************************************************
//--------------------------------------------
USART0_DRE:



clr RegSum



//--------	
	brts HiData 
	lpm DataSend,Z//+
	swap DataSend
	set
	rjmp mask
HiData:
	lpm DataSend,Z
	clt 
	
mask:
	ldi MaskData,eMaskData 

	rol DataSend
	BrCc PC+3
	andi MaskData,~(1<<0)
	inc RegSum
	
	rol DataSend
	BrCC PC+3
	andi MaskData,~(1<<3)
	inc RegSum

	rol DataSend
	BrCC PC+3
	andi MaskData,~(1<<6)
	inc RegSum
	
	sbrc DataSend,7
	inc RegSum

	sbrc RegSum,0
	ldi buf,(1<<UPM1)|(1<<UPM0)|(1<<UCSZ1)|(1<<UCSZ0)  // (1<<UPM0) нечетность
	sbrs RegSum,0
	ldi buf,(1<<UPM1)|(0<<UPM0)|(1<<UCSZ1)|(1<<UCSZ0)  // (0<<UPM0) четность

	out UCSRC,buf
	
	//ldi MaskData,0xFF	
	out UDR,MaskData


	sbiw X,1
	brne pc+3

	ldi buf,(0<<UDRIE)|(1<<TXEN)|(1<<UCSZ2)    //запррешить прерывания пустого буфера
	out UCSRB,buf

reti 

//------------------------

//***************************************************************************
RESET:  //
ldi buf,low(RAMEND)
out SPL, buf
//ldi buf,High(RAMEND)
//out SPH,buf

//настройка UART

ldi buf,1<<U2X
out UCSRA,buf

ldi buf,(0<<UDRIE)|(1<<TXEN)|(1<<UCSZ2)|(1<<TXB8)   
out UCSRB,buf

ldi buf,(1<<UPM1)|(1<<UCSZ1)|(1<<UCSZ0)   
out UCSRC,buf


sei

//*****************************************************
//Запуск передачи
ldi Zl,Low(Data*2) //откуда
ldi Zh,high(Data*2)

ldi Xl,Low(4)   //сколько
ldi Xh,high(4)

ldi buf,0x00
out UBRRL,buf

SET

ldi buf,(1<<UDRIE)|(1<<TXEN)|(1<<UCSZ2)    //разрешить прерывания пустого буфера
out UCSRB,buf
//****************************************************
loop:

	rjmp loop
//*********************8
Data: 
.db 0x50,0x50,0x50,0x50


Я тут писал что вектора в предыдущем коде от Атмеги8 оставил, походу они даже от тиньки13.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

СКАЗОЧНИК писал(а):Где-то в нете видел картинку, как паренек с ленты снимал логическим анализатором данные.
оно? https://cpldcpu.wordpress.com/2014/01/1 ... he-ws2812/
до кучи
https://www.youtube.com/watch?v=N8wAr3D9qBM
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Не оно, :) я плохо по английски понимать. Но видел где-то почти тоже самое на русском.
А вот эту статейку кто бы перевел, было бы круто. )))
Станислав
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Что то не уловил смысл про 400нс, и про следующий диод.... можно поподробнее?
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Да, там было про то, что с МК можно отправлять какой угодно кривой сигнал (ну в приделах разумного, конечно), первый же светодиод, захавав свои 3 байта будет передавать следующему остальные, но не напрямую с МК, а через свои цепи... В этих цепях он его и скорректирует до нормально. ))))) Типа того. в итоге остальные получат свои байты уже ровненько и без ошибок.
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СКАЗОЧНИК, не пробовали мой кода на уарт?
СКАЗОЧНИК писал(а):Да, там было про то, что с МК можно отправлять какой угодно кривой сигнал (ну в приделах разумного, конечно), первый же светодиод, захавав свои 3 байта будет передавать следующему остальные, но не напрямую с МК, а через свои цепи..
Вроде как не должно быть такого.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Z_h_e писал(а):Вроде как не должно быть такого.
Может мне и показалось. )))) Но вроде было. Хотя, тот паренек тоже мог ошибаться.
Z_h_e писал(а):пробовали мой кода на уарт?
Нет.... Просто надо сделать думаю сначала побольше массив светодиодов, а у меня затык с ультафиолетовой лампой и с пленкой... (
Да и сами говорите, что надо инверсию делать. А это надо чего-нибдуь припаивать к МК еще.. :dont_know:
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СКАЗОЧНИК писал(а):А это надо чего-нибдуь припаивать к МК еще..
один транзистор

Код может и не рабочий. Спросил из любопытства
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

)) И я думал, транзистор или какой-нибудь элемент НЕ. )
Все равно уже не сегодня. На днях проверю, если никто до меня не успеет... :?

Добавлено after 1 hour 12 minutes 6 seconds:
oleg110592 писал(а):https://cpldcpu.wordpress.com/2014/01/1 ... he-ws2812/
Читаю эту статеку, как могу, где сам, где с переводчиком. Однако, очень интересно.
И действительно в даташите на них написано вранье. )))))) И действительно вторая часть периода им не важна, важна только первая. И та с большиииими допусками. :facepalm:
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ну зато логично. Единица или ноль, получается передается длительностью положительного импульса. и главное не попасть в зону "резет".
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Про зону ресета совершенно верно, но есть одно но, такое управление сгодиться только на небольшое количество диодов
Друг Кота
Аватара пользователя
Сообщения: 15607
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вряд-ли при изготовлении деталюшек будут заморачиваться серьёзным аппаратно-программным ключом-нормировщиком...
Скорее всего будет устанавливаться обычный ключ по завершении приема собственного пакета.
Возможно с каким-нибудь вариантом одновибратора в комплекте...
Как альтернатива - должен быть предварительный анализ данных "и кито пришел?" 1 или 0 - а такой анализ обязательно внесет задержку минимум в один уровень единицы для слота 0 (откуда светику знать что там на линию данных выдается) между входом и выходом данных на каждом светике.
:dont_know:
Кстати... при некоторой доработке счетчика длина пакета может достигать 21845 светиков (21845*3=65535байт массива данных)...
:roll:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Программа на UART чёто не пошла. Зациклил и все равно на PD1/TxD высокий уровень. Проверяю на макете tiny2313+кварц 20МГц. Поскольку мне интересен режим FAST PWM 1111 таймера 1 для своих целей вернулся к программе таймера. Ну и до кучи программа на этот GRB светик. Правда, работает при периоде 1,5мкс.
Спойлер

Код: Выделить всё

	.include "tn2313def.inc"

.equ	Fo=20000000

.equ eTOP=150*Fo/100000000-1;0x1E //предел счетчика для 20МГц
.equ eBit1=80*Fo/100000000-1;0xF //длительность единичного импулься для лог1
.equ eBit0=45*Fo/100000000-1;x08

;.def Chislo=R20

;*************************************************
.org $00
	LDI R16,LOW(RAMEND)
	out SPL,R16

	RJMP START
.org $04
TIM1_COMPA:
	RETI
;*************************************************
;*************************************************
;*************************************************
START:
	SBI	DDRB,4
	SBI	PORTB,4	; PB4/OC1B

	SBI	DDRB,7
	SBI	PORTB,7	; конец синхроимпульса

	CLR	ZH

	LDI	R16,1<<SE
	OUT	MCUCR,R16

	LDI R16,eTOP
	OUT	OCR1AH,ZH
	OUT	OCR1AL,R16

	LDI	R24,0

	LDI	ZL,LOW(DATA*2)
	LPM R20, Z+
	LPM R21, Z+
	LPM R22, Z+

	LDI	R16,1<<OCIE1A
	OUT	TIMSK,R16
	OUT	TIFR,R16

	LDI R16,1<<WGM11|1<<WGM10|1<<COM1B1|0<<COM1B0
	OUT TCCR1A,R16
	LDI R16,1<<WGM13|1<<WGM12|1<<CS10
	OUT TCCR1B,R16

	SEI	
WAIT:
	SLEEP
	CBI	PORTB,7	; начало синхроимпульса

	LDI	R16,eBit0
	SBRC	R20,7
	LDI	R16,eBit1
	OUT	OCR1BH,ZH
	OUT	OCR1BL,R16

	LSL	R22
	ROL	R21
	ROL	R20

	INC	R24
	CPI	R24,25
	BRLO	WAIT
FRAME_OUT:
;	LDI	R24,0

;	LPM R20, Z+
;	LPM R21, Z+
;	LPM R22, Z+
;	CPI	ZL,(DATA_END*2+1)
;	BRLO	WAIT
	OUT	TCCR1B,ZH
	OUT	TCCR1A,ZH
	OUT	TCNT1H,ZH
	OUT	TCNT1L,ZH


	RJMP	START

;--- ВЫВОД НА СВЕТОДИОДЫ ---
DATA:
	.db 0b10010101, 0b10000001, 0b00110011, 0b00000001, 0b11111111, 0b11000011   ; 1,2
DATA_END:
;.db 0b00000000, 0b00000000, 0b11111111, 0b00000000, 0b11111111, 0b00000000   ; 3,4
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 5,6
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 7,8
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 9,10
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 11,12
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 13,14
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 15,16
;.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000   ; 17,18
.EXIT      
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

А инвертор поставили?

Добавлено after 27 minutes 39 seconds:
So, what did we learn from this?

A reset is issued as early as at 9 µs, contrary to the 50 µs mentioned in the data sheet. Longer delays between transmissions should be avoided.
The cycle time of a bit should be at least 1.25 µs, the value given in the data sheet, and at most ~9 µs, the shortest time for a reset.
A “0” can be encoded with a pulse as short as 62.5 ns, but should not be longer than ~500 ns (maximum on WS2812).
A “1” can be encoded with pulses almost as long as the total cycle time, but it should not be shorter than ~625 ns (minimum on WS2812B).


Вот, что там написано. )))
1. Сброс наступает примерно с 9 мкс. В даташите написано, что с 50 мкс. Но уже реально после 10 мкс будет сброс на линии и светодиоды выведут то, что на них отправили.
2. Период сигнала должен быть от того, как написано в даташите 1,25 мкс и до почти сброса, т.е. 9 мкс. Т.е. период может быть длинным и они это нормально жрут.
3. Ноль кодируется уже от 62,5 нс нормально и до почти 500 нс. Короче, ноль должен быть не более того, как написано в даташите. )
4. Единица может длиться почти полный период, т.е. 1,25 мкс, но чуть меньше, чтобы успеть еще ноль отправить, но не короче 625 нс, если применять светодиоды с индексом В. ( В даташите написано, что 800 нс должно быть. Реально же от 625 до пчти 1250 нс.)

Все это он снял обычным логическим анализатором, который у меня дома тоже валяется, но смысла повторять ту же процедуру не вижу. )
Станислав
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Нет. Разбираться не стал, переключился на свою прогу. У FAST PWM есть буфер. В принципе нормальная вещь, позволяет загружать следующее значение в любой момент времени, не дожидаясь окончания текущего периода.
Ответить

Вернуться в «Периферия»