Pánové, potřeboval bych poradit (jak začít) s programováním obvodu WS2811 pro RGB pásky. Z manuálu WS2811 jsem se toho moc nedozvěděl, ani jakou komunikaci použít - jestli ASART nebo SPI, jaké povely obvod příjíma atd. Bude mi stačit ATTINY2313?. Jednoduchý příkládek by byl OK.
Díky
To nemá normální sběrnici - to má 3 datové symboly kódované pomocí PWM
Logická 0 trvá (H0.5+L2.0)=2.5 us
Logická 1 trvá (H1.2+L1.3)=2.5 us.
Takže seš schopen/povinen posílat data do obvodu rychlostí 400Kb.
Restart-nový řádek trvá >50us.
Možná by na to šlo znasilnit SPI rozhraní, ale vhodnější bude CC modul od nějakého časovače. Ideálně s DMA
Na co to potřebuješ? Budeš jich řídit víc, nebo jen jeden?
Chtěl bych řídit RGB pásek s cca 10 WS2811. Jediné co jsem s dokumentace pochopil je časování pulsů. Údajně stačí na jakémkoliv výstupním pinu MCU přivést sérii n x 24 pulsů a ukončit ji 50us pulsem. Což se lehko řekne, ale tězce vyrobí, tedy mně. Sice jakžtakž vím co je PWM, ale vyrábět pomocí PWM jednotlivé pulsy - to si nedovedu představit. Bohužel ani CC modul mi nic neříká. Jediné co mě napadlo je vÿrábět pulsy pomocí fce DELAY(), ale to asi nebude moc přesné a hlavně náročné na paměť. Asi nejjednoduší by bylo použít nějaké knihovny, ale našel jsem pouze pro módní Arduino a pro Atmel nic.
Takže pokud bys o něčem věděl, díky za tip.
Nejjednoduší bude použít hlavu.
Jinak CC (Capture & Compare) je přesně ta část některých časovačů co umí generovat PWM. Generovat serii různých impulsů pomocí PWM jde naopak velmi snadno, stačí se pověsit na přerušení od daného časovače a pokaždé nastavit jinou hodnotu PWM registru.
Pokud Delay() dokáže produkovat zpoždění s krokem 0.1us tak na otestování stačí. Podmínka je aby si měl po celou dobu kdy posíláš data do obvodu zakázané přerušení. Nevím proč by měla být náročná na poměť. Potřebuješ jen 4 zpodění, která pak jen opakovaně (24x na jeden obvod) voláš. Na pásek 10 obvodů zavoláš 10x tu předchozí funkci. Jak prosté Watsone.
Zkus poptat autora zde: s-o.webnode.cz/vu-metr/vu-metr-s-neopixel/
Určitě Ti poradí. Je to opravdu dobrý a slušný člověk
Na tohle nepořebuješ ani nijak složitě vymýšlet časovače. Stačí si uvědomit, jak dlouho trvá instrukce na AVRku (viz. datasheet) a máš časování bitů hotové. Kromě toho víš, že důležitá je jenom délka H pulzu a že mezera mezi H pulzy nesmí být kratší, než 2us, ani delší, než 50us. Z toho plyne, že kritická je doba pouze na H pulz a pak máš relativně dost času (max 50us) na to, aby sis připravil data pro další bit. Dá se tedy říci, že nahodíš pin do H, počkáš 0,5 nebo 1,2 us a pin shodíš. V tuhle chvíli víš, že na přípravu dalšího bitu máš minimálně 2 us čas.
1 bit vypadá následovně :
sbi port, pin
nějaké NOPy do 0,5 nebo 1,2 us
cbi port, pin
nějaké NOPy do 2,0 nebo 1,3 us - tady ani nějaké NOPy nemusíš řešit, pokud víš, že se na začátek dalšího bitu dříve, než za 2us nedostaneš.
Pro přehled - jak dlouho trvá 1 jednotaktová instrukce :
1 MHz = 1 us
- tak tady nemáš šanci dostat se na 0,5 us
2 Mhz = 0,5us
- 0,5us = 1 instrukce, 2us = 4 instrukce
- tady nejsi schopný dát přesně 1,2 a 1,3 us - musel bys vyzkoušet, jestli by LED zkously 1,5+1,5 us
4 MHz = 0,25us
- 0,5us = 2 instrukce, 2us = 8 instrukcí
- časování 1,2 a 1,3 us je opět nepřesné, ale dostaneš se na 1,25 a 1,5 us - to už je blíž, ale pořád to může být málo přesné.
8 MHz = 0,125us
- 0,5us = 4 instrukce, 2us = 16 instrukcí
- časování 1,2 a 1,3 už je hodně blízko, už je to 1,25 a 1,375 - tohle už by LEDky mohly zvládnout.
ATtiny13 má trochu netypické hodiny 4,8 a 9,6 MHz
4,8MHz = 0,2083us
- 0,5us => 0,417 nebo 0,625 (2,4 instrukce), 2us => 1,875 nebo 2,083 us ( 9,6 instrukce )
- 1,2us => 1,0417 nebo 1,25us (5,7 instrukce), 1,3us => 1,25us nebo 1,458us (6,24 instrukce)
9,6MHz = 0,1042us
- 0,5us => 0,417 nebo 0,521 (4,8 instrukce), 2us => 1,979 nebo 2,083 us ( 19,2 instrukce )
- 1,2us => 1,1458 nebo 1,25us (11,5 instrukce), 1,3us => 1,25us nebo 1,354us (12,48 instrukce)
Při použití krystalu pro vyšší frekvence, než umí interní oscilátor :
12MHz = 0,083us
- 0,5us => 6 instrukcí, 2us => 24 instrukcí - přesně
- 1,2us => 1,167 nebo 1,25us (14,4 instrukce), 1,3us => 1,25us nebo 1,33us (15,6 instrukce)
16MHz = 0,0625us
- 0,5us => 8 instrukcí, 2us => 32 instrukcí - přesně
- 1,2us => 1,1875 nebo 1,25us (19,2 instrukce), 1,3us => 1,25us nebo 1,3125us (20,8 instrukce)
18MHz = 0,0556us
- 0,5us => 9 instrukcí, 2us => 36 instrukcí - přesně
- 1,2us => 1,167 nebo 1,22us (21,6 instrukce), 1,3us => 1,28us nebo 1,33us (23,4 instrukce)
20MHz = 0,05us
- 0,5us => 10 instrukcí, 2us => 40 instrukcí - přesně
- 1,2us => 24 instrukcí, 1,3us => 26 instrukcí - přesně
Pokud to bylo na mě, tak jsem to myslel obecně (s AVR nedělám). Pokud to nemá zabít procesor (chceš stíhat dělat i něco jinýho), tak časovač (PWM) + IRQ se hodí. Jinak je to buřt.
Pánové, vzal jsem si všechny vaše rady k srdci a přes víkend se mi podařilo spatlat pomocí NOPů prográmek, který posílá na WS2811 serii pulsů přesně podle předpisu (kontrolováno oscilem), tzn.
t0H=0,5us; t0L=2,0us; t1H=1,2us; t1L=1,3us. Kupodivu dva WS2811 zareagovali, ale blbě! Všechno přečetli jako log.jedničku. Trochu jsem pozměnil časování - prodloužil mezery a zkrátil čas t0H, ale marně, všechny diody svítí naplno, i když by některé měly být zhasnuté. Zkusím ještě čas t0H zkrátit na 0,3us a uvidím.
Pokud by byly ještě nějaké rady, netýkající se zrovna mé hlavy, tak sem s nimi.
Díky
Tak jsem zkrátil časy t0H na cca 0,3us , mezery na 2,5us a reset signál prodloužil na 60us. A světe div se, ono to funguje. Dokonce na TINY 4313 s 8MHz lze jednotlivé pulzy volat coby proceduru.
Já ž jsem na vývoj líný
forum.pololu.com/t/led-rgb-strips-and-library/18356
No, a pak že nerostou )