Odpověď na názor

Odpovídáte na názor ke článku Řízení diodové matice na Arduino UNO R4 Wifi (jinak).

  • 6. 11. 2024 11:15

    Ondřej Novák

    Děkuji. Z komentáře to tak neznělo, ale tohoto si cením

    Ještě bych se ale vrátil k některým bodům, protože včera jsem reagoval na mobilu a tam není moc prostoru napsat víc. Teď sedím u PC

    Ad 1) použití kódu C a makrer - ona to byla taková řečnická otázka. Já jako programátor co dost intenzivně evolvoval z C na C++ musíte to brát tak, že se na Céčkaře dívám trochu skrz prsty. Jako kdybych se díval na svou batolecí minulost. Něco co už mám za sebou. Ale chápu, proč se to dělá a jsem sám s názorem proti celému světu. Každopádně bych rozdělil kategorie kódu na několik úrovní.
    a) kód psaný v C
    b) kód psaný v C++
    c) kód psaný v C++ programátorem, který umí C (C with classes)
    d) kód psaný v C nezkušeným programátorem
    e) kód psaný v C++ nezkušeným programátorem v C

    Jako C++ fundamentalista dokážu přežít kód v C, je li dobře napsaný, pak mi nic z toho nevadí, ale typicky si jej wrapnu do tříd a udělám to tak, aby definice z C neprosakovaly do C++ kódu skrze headery (pokud to jde). Takto jsem to nakonec udělal i v DotMatrix, kdy "silové funkce" (tedy ty interagují s HW) jsem přesunul do samostatné implementace. Ano, jsem si vědom toho, že to má nevýhodu v roztrhání optimalizačních cest (vyjma globálních optimalizací). Vždycky je to něco za něco.

    Tenhle blog je hlavně o C++ a tak se nezlobte, že budu kritizovat a dělat si srandu z kategorií c) a d) a vyloženě mne bude vytáčet kategorie e)

    ad 2) statický buffer - ano, tady jsem to asi špatně napsal, statický jsem myslel jako `static`. Opět to souvisí s pohledem skrze třídy. Prostě objektový programátor nemá rád globální proměnné. Co když budu chtít udělat nějaké stránkování a mít třeba dva buffery. Můj rolovací text je udělán tím, že posouvám virtuální okno, tedy nedochází ke kopírování dat

    ad 3) Dobrý programátor makra nepoužívá - samozřejmě myšleno v C++. V jazyce C je to asi nutnost a Linus se nechal slyšet, že C++ v jádře nechce (ačkoliv jsem nikdy nepochopil proč)

    ad 4) 10000 - chyba v textu, chybí mi tam 10000 krát za sekundu. Asi se mi po klávesnici prošla naše mainská kočka Majda

    ad 5) 104 Hz - vycházím z vlastní zkušenosti, kdy jsem schopen vidět blikání různých velkoplošných LED panelů a rozhodně tam nebude velký frame rate, a i volba frekvence tady je v zásadě na subjektivním vnímání založena. 104 je zbytečně moc, hry na tom hrát nebudu

    ad 6) Proudy diod. Tam v té matici je trochu problém, že když zapnu 3 diody, tak mají 1x source a 3x drain. Na source je 330ohm a na pak jsou tam 3x 330ohm paralelně. Pokles jasu je zde podle mne způsoben tím, že to funguje jako dělič, čímž dochází k poklesu proudu každou diodou. Nic tady přepálit nemohu, protože nejhorší případ je, když svítí jedna souvislé. Tady bych mohl diodu odpálit, pokud je připravená na blikání, a to bylo první co jsem vyzkoušel. Ale nic se nestalo, dioda to přežila dost dlouho. Si myslím, že vývojová deska relativně blbuvzdorná proti takové jednoduché myšlence. S větším množstvím diod zapojených paralelně pak roste proud, jenže roste i úbytek napětí na tom jednom odporu u H a tím zase klesá proud, někde se to vyrovná, Za normálního provozu to není znát, všiml jsem si toho jen když mi půlka svítila a druhá půlka blikala (v sec intervalech) tak ta svítivá půlka reagovala změnou jasu ve frekvenci blikání. Nic víc. Asi kompromisní řešení by bylo budit to po max 5 diodách a zvýšit takt 2x (z 500Hz na 1000hz)

    Jinak chci ještě zkusit nějaké další kombinace, třeba počet svítících diod roste s (počet H)x(počet L). Ovšem blbě se rozhoduje, co z toho bude svítit a je to nedeterministické. Tak jsem to zatím nezkoušel

    ad 7) LSB a MSB - tady úplně nesouhlasím a nějak nechápu, co tím chcete říct. To že si autoři očíslovali diody od 0 do 95 v landscape režimu, tedy mají 12 diod na řádce, to je čistě jejich rozhodnutí. Způsob, jak jsou diody zadrátované s tím naprosto nekoresponduje. Já, když jsem si to procházel, tak jsem prvně uvažoval o adresování po sloupcích, kdy budu mít 8 bitů jeden sloupec, tedy jeden bajt, celkem 12 bajtů, 12 sloupců. Nakonec ale mě napadlo, že bych to mohl udělat volitelné, protože ten způsob řízení se neliší od toho, v jakém pořadí jsou diody očíslované, proto v DotMatrix mám možnost u driveru určit orientaci. To že je to pak constexpr způsobí, že překladač patřičné mapování čísel na kombinace signálů přepočítá během překladu a vygeneruje a optimalizuje kód odpovídající zvolené orientaci. Ve svém projektu mám orientovanou matici na výšku, protože budu board montovat na DIN lištu s vývodem na napájení nahoře. Samozřejmě frame buffer má 12 bajtů 8x12

    Celá tahle část byla čistě kritika toho, že autor si něco zvolí, pak mu to nevyhovuje, a provádí bitové tanečky místo aby změnil tu počáteční volbu. Spíš to ukazuje na práci vícero lidí, kteří spolu nekomunikovali.

    ad 8) kopírování v IRQ - ano kopíruje se do FB. Místo toho, aby se změnila adresa FB, jak to dělám já v demu zde: https://github.com/ondra-novak/arduino_r4_dot_matrix/blob/master/examples/original_intro/original_intro.ino#L375

    Ještě k budoucímu rozšíření na jiná MCU. Vycházím ze zdrojáků, které mají ve větvi `Renesas` v podvětvi `libraries`. Ve stejném adresáři mají adresář `variants` kde je mnoho definic pro různé varianty toho čipu. Pokud tedy dojde k nové variantě v rámci Renesas, zřejmě se ani jejich knihovna měnit nebude. Pokud vyjde nové MCU, nebo zapojení boardu, budou jak oni, tak já, měnit zdrojový kód pro nový stav.

    ad 9) Přiřazení portů a vodičům - jsem posléze zjistil, že logické číslování 0-10 je relativní vůči nějaké tabulce v jejich hlavičkách k danému MCU, kde mají přiřazené k číslům ty porty. Z tohoto pohledu je naprosto nekompatibilní použití PCNTR, kde jsou ty porty vidět natvrdo - takže se buď nesmí změnit přiřazení portů ani ta tabulka, jinak se jim to rozsype. Kdyby to bylo na mě, tak bych tu tabulku samozřejmě měl constexpr a překladač by namísto lookup do tabulky vyšvihl přímo instrukce na zápis do daného portu

    Ad 10) 11 port chybí - úsměvný vtip. Hotelový pokoj s číslem 212 není 212. pokoj v hotelu, je to 12. pokoj v druhém patře (téměř vždycky). A pozor, nemusí to být 12. pokoj, protože dveře s číslem 11. je úklidová místnost. Abyste si nechodil na recepci stěžovat. Ne, celý to bylo jen vypíchnout že organizace číslování je stejná jako v hotelu.

    Ad 11) `No takže sám sobě odpovídáte, že to nejsou proměnné (nezabírají místo v paměti)` - No mně je to v zásadě jedno, chová se to jako globální proměnná a C++ programátor se nemusí v prostředí globálních proměnných cítit konformně, o tom to celé bylo

    Ad 12) IOPORT_CFG_POR­T_DIRECTION_IN­PUT - myslím, že jsem ho zkoušel a nefungoval. Nevím jak je to s pullup/down rezistorem

    Ad 13) jas - proto jsem přiložil i animaci. Sice nejde o nic světoborného, ale bylo to točeno ve dne.