Jess

Zpátky ke kořenům! Včera v noci jsem se konečně dokopal k tomu, abych dodělal desku plošných spojů pro svůj nový starý počítač. Kódové označení Jess.

Hlavně teda přišly paměti SRAM, co pracují na 3.3V. Těch pětivoltových mám, že bych jimi mohl vydláždit podlahu v koupelně, ale centrem toho všeho je FPGA, a ta jede na 3.3V, nazdar bazar éljen!

Já bych to klidně implementoval celé ve FPGA, ale ten můj kousek (EP2C5) nemá dost RAMky na nějaké větší prostocviky, tak jsem zvolil externí. Nakonec to bude AS6C1008 nebo AS6C4008 – plošňák je připravený na obojí. Jako vstup mám klávesnici na PS/2, výstup je VGA s šesti bitama (tedy 64 barevných odstínů). K tomu tam je jedna sériová FLASH na SPI (SMD nebo DIL) a jeden slot na další FLASH (SD karta ne, ta přijde později). No a sestavu periferií uzavírají dva sériové porty.

Displej bude nejprve textový se semigrafikou, to nacpu do interních paměťových bloků. Ve verzi 2 budu chtít vyzkoušet použití té externí paměti. Budu řešit to, co řešili všichni v 80. letech, totiž jak to zařídit, aby do paměti lezl procesor i videoobvod a nepomlátili se. Někteří to řešili tak, že procesor zastavovali nebo zpomalovali, jiní na to měli speciální hardware a vyhraženou paměť, no a pár šílenců použilo metodu „sudá – lichá“, tedy že se procesor a video v přístupech střídali. Procesor lezl v lichých půltaktech, video v sudých atd. Zkusmo jsem to počítal, a mám hraniční frekvenci někde okolo 10 MHz. To už by mohlo jít – minimálně těch 256×192 dám určitě 😉 Ale uvidíme, a jak říkám: fáze 2!

K té klávesnici: herdek, fakt není možné sehnat dobrou maticovou klávesnici s tlačítkama! Buď si udělat membránovou, nebo si ji poskládat z mechanických tlačítek, a upřímně – tak či onak to znamená leptat poměrně velký kus PCB a spoustu piplavé práce. Možná to někdy v budoucnu udělám, možná sáhnu k tomu, že vezmu třeba náhradní klávesnici z C64, kterých je všude dost. Uvidíme. Verze 1 je zatím PS/2.

Uvnitř toho všeho bude… chvíle napětí… ano, bude tam nejspíš 6809 jako soft core. Ve FPGA dostane k ruce zhruba půlkilo bootloaderu v paměti. Ten bude mít jedinou starost – totiž vzít obsah ze sériové flash (AT25Lněco) a natáhnout ji do RAMky. Pak odpojí interní paměť, a jede se!

Protože je RAMky víc než dost, udělám ji nejprve tak, že bude možnost mapovat stránky do adresního prostoru. Ve verzi 2, možná 3, bych rád udělal takový hack, totiž plnou MMU s překládáním adres, s možností ochrany paměti a s takovým jednoduchým přepínáním privilegovaného a uživatelského módu – to sice procesor neumí, ale externě to půjde „dobastlit“.

A jako software asi přijde nejdřív jednoduchý monitor, a pak se uvidí. Nechci začínat s ambiciózním plánem na portaci OS9 nebo něčeho podobného…

Rubriky: Hardware | Štítky: , , | 2 komentáře

Jak dál s workshopem Arduino 101?

Arduino 101 je workshop, který jsme se Štěpánem Bechynským připravili a úspěšně s ním jezdili po republice. Prošlo jím asi 400 lidí, kteří si minimálně zkusili, že elektronika není nic tajemného a magického a že „blikat ledkou“ zvládnou taky. Přišli o bezdůvodný strach a udělali nejtěžší krok k elektronice – totiž ten první.

Se Štěpánem jsme celou koncepci přes rok ladili a vylepšovali. Výsledkem našich debat bylo, mimo jiné, i to, že jsme se rozhodli navrhnout vlastní výukový shield. Jeho výroby se ujal CZ.NIC, a už máme v ruce první předprodukční kousky.

20160817_134818_HDR
EDUSHIELD (díky CZ.NIC)

Logicky jsme si kladli otázku: Co dál? Představa, že budeme dál objíždět republiku o víkendech a ukazovat lidem, jak si hrát s Arduinem, naráží na mnoho problémů, jmenovitě čas a síly. Ale zase by byla škoda potenciál nevyužít – zájem je stále obrovský. Nakonec jsme dospěli k následujícímu: Vyškolíme školitele!

14037726_10154355278422954_25623615_o
Zájem o Arduino workshop je pořád obrovský

Zcela vážně. Napadlo nás, že najdeme třeba deset, patnáct, dvacet lidí, kteří mají zájem a chuť Arduino učit. Těm dáme k dispozici výukové materiály a veškeré know-how, co jsme díky Arduino 101 získali. Měli byste zájem?

Obchodní model je velmi jednoduchý: Budete mít k dispozici výukové shieldy od CZ.NIC. Můžete je nakoupit, a třeba prodávat frekventantům vašich workshopů. Nebo uděláte workshopy placené a Arduino + shield budou v ceně. Od nás získáte metodické materiály a určitou podporu. To, jestli budete vy provozovat workshopy neziskově, nebo ziskově, jestli s nimi budete objíždět republiku, nebo zakotvíte u vás ve městě, jestli je budete dělat pravidelně, nebo „podle zájmu“, to už je na vás.

Pokud máte chuť něco takového dělat, ozvěte se nám. Dle zájmu bychom připravili nějakou akci „train the trainer“, zhruba v září / říjnu. Lektor by měl umět pracovat s elektronikou a musí umět programovat.

Rubriky: Hardware | 4 komentáře

Soutěž v programování mikrořadičů

O víkendu proběhlo celorepublikové kolo soutěže mládeže v programování. Se Štěpánem Bechynským jsme byli porotci kategorie „mikrořadiče“.

Účastníci dostali Arduino a výukový kit, který používáne na workshopu Arduino101. Na vypracování úlohy měli čtyři hodiny… Chcete s nimi zmřit síly?

Zadání úlohy pro celostátní kolo kategorie mikrořadiče

Univerzální hlídač lednice

Nové lednice mají velmi často zabudovaný teploměr, takže víte, jestli fungují správně, a když necháte dveře dlouho otevřené, tak začnou pískat. Co ale udělat s lednicí, která takto vybavená není? To je úkol pro Univerzální hlídač lednice (UHL). Vaším úkolem je takovéto zařízení vytvořit. Hardware dostanete připravený a vaším úkolem bude vše naprogramovat.

Funkce UHL je následující: 1. Pokud je lednice otevřená déle než 30 vteřin, tak začne UHL přerušovaně (5 Hz) pískat. Otevření lednice detekujte pomocí fotorezistoru.

2. Při otevření lednice zobrazuje UHL teplotu ve stupních Celsia nebo Fahrenheita, podle toho, co si uživatel naposled zvolil, viz bod 3. Teplota je zaokrouhlena na celé číslo a za teplotou se na displeji zobrazí jednotky, tedy znak C nebo F.

3. Pokud je lednice zavřena, tak se na displeji nic nezobrazuje, aby se šetřila energie.

4. Tlačítkem Menu UHL přepíná mezi zobrazením teploty ve stupních Celsia, Fahrenheita.

5. UHL ukládá maximální a minimální naměřenou teplotu. Tyto hodnoty zůstanou uloženy, i když UHL přijde o napájení, např. při výměně baterie.

6. Ke každému extrému se zároveň uloží i datum a čas. Nezapomeňte proto správně nastavit hodiny.

7. Pomocí tlačítka Up zobrazí UHL maximální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

8. Pomocí tlačítka Down zobrazí UHL minimální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

9. UHL umí hlídat překročení mezních hodnot teploty. Při překročení minimální nebo maximální teploty se rozblikají všechny LED a na displeji začne blikat hodnota teploty, která je mimo rozsah. Frekvence blikání diod je 10 Hz, frekvence blikání displeje je 1 Hz. Nastavení minimální a maximální teploty se provádí přes sériovou linku. Tyto hodnoty se uchovávají i při odpojení napájení.

10. Po připojení UHL k počítači si mohu některé informace zobrazit nebo nastavit pomocí následujících příkazů přes sériovou linku:

 

Příkaz (nezáleží na velikosti písmen) Funkce Ukázka výstupu
Maxc Maximální hodnota ve °C 2016-01-14 10:32:14 10C
Maxf Maximální hodnota ve °F 2016-01-14 10:32:14 50F
Minc Minimální hodnota ve °C 2016-01-14 12:02:14 7C
Minf Minimální hodnota ve °F 2016-01-14 12:02:14 44F
Delete Smaže uložené informace OK nebo ERROR
Allc Zobrazí minimální a maximální teplotu ve °C 2016-01-14 12:02:14 7C
2016-01-14 10:32:14 10C
Allf Zobrazí minimální a maximální teplotu ve °F 2016-01-14 12:02:14 44F
2016-01-14 10:32:14 50F
Setlimitmaxc <hodnota> Nastaví poplach při překročení maximální teploty OK nebo ERROR
Setlimitminc <hodnota> Nastaví poplach při překročení minumální teploty OK nebo ERROR
Deletelimitmaxc Vypne hlídání maximální teploty OK nebo ERROR
Deletelimitminc Vypne hlídání minimální teploty OK nebo ERROR

11. Pokud uživatel provede neplatnou operaci, třeba zadá nesmyslnou hodnotu, tak se na displeji objeví text ERROR, který bude po dobu 10 vteřin po displeji rolovat, a zároveň se pošle chybové hlášení po sériové lince. Pak se UHL vrátí do režimu zobrazení teploty.

Pravidla

1. Pokud něčemu nerozumíte, tak se ihned zeptejte.

2. Musí se použít jen dodaný jednotný hardware.

3. Smí se použít Standard Libraries, které jsou dostupné v čisté instalaci Arduino IDE viz. https://www.arduino.cc/en/Reference/Libraries.

4. Smí se použít knihovna TM1636 pro ovládání displeje, kterou dodá pořadatel. (Odstranili jsme znaky A-F, abychom si ověřili, že soutěžící chápou cizí kód  dokážou ho upravit)

5. Knihovny se mohou libovolně upravovat.

6. Můžete vytvořit vlastní knihovnu.

7. Jiné knihovny jsou zakázané.

8. Zdrojový kód musí být pečlivě okomentován, aby bylo zřejmé, že mu autor rozumí. I když vydělíte dvě čísla, tak musíte do komentáře napsat proč je dělíte.

9. Zdrojové kódy aplikace, včetně knihoven, uložte na plochu do adresáře, jehož jméno bude vaše startovní číslo. Adresář je třeba si vytvořit.

10. V případě stejného počtu bodů rozhoduje čas odevzdání úlohy. (Kdo dřív přijde, ten dřív mele. First come, first serve.)

Co máte k dispozici

1. Schéma zapojení použitého shieldu.

2. Seznam použitých součástek.

3. Katalogový list hodin reálného času.

4. Knihovnu TM1636.

5. Katalogový list použitého termistoru.

6. Vzorec pro přepočet °C na °F.

t[C°]= 5/9.(t[F°]−32)

7. Vzorec pro výpočet teploty.

t [°C] – výsledná teplota

r [Ω] – odpor termistoru

B – konstanta z katalogového listu

t[°C]=1 / (log(r[Ω] / 10000) / (B+1) / 298.15)−273.15


Tak co, troufnete si?

Soutěžící (12-19 let) se s tím popasovali všelijak. Dva byli výrazně lepší než zbytek, vítěz dokone používal i DDRD a PORTD, nastavil si přerušení,…

Na druhé straně konstrukce:

byla velmi neotřelá a ukazovala, že autor možná udělá líp, když se bude věnovat jiným aktivitám 😉

Troufnete si vy? Alespoň koncept…

Rubriky: Software | Štítky: , , , | 4 komentáře

O objektu, struktuře a gotu

A taky o globální proměnné.

Programátoři se od pradávna dělili na Opravdové Programátory a Pojídače koláčů. Tenhle sloupek Eda Posta je tak notoricky známý, že ho ani nebudu připomínat, a místo toho rovnou řeknu, co mám na srdci…

Totiž já už to psal, ale klidně to připomenu: Učte se programovat mikrokontroléry, naučte se assembler aspoň jednoho procesoru, a uvidíte, jak vám věci začnou dávat smysl.

Uvědomil jsem si to, když mi jeden velmi zkušený programátor ukazoval svůj kód pro Arduino a divil se, že se mu to nevejde do paměti. Koukám do kódu, a ten byl – přátelé! – ten byl nádherný! Srdce každého učitele programování by nad tím zaplesalo. Nahoře měl konstruktor a destruktor, pod tím ty struktury, správně přetypované malloc()…

Polknul jsem.

„Co? Mám chybu v tom pointerovém typecastu? To snad ne…“

Povídám: „Co to tady tím mallocem tvoříš?“

Prý že nějaké úložiště dat… V hlavní smyčce se volají dvě funkce, první nějak sebere data, vytvoří tuhle strukturu, předá ji druhé, ta je zpracuje a strukturu zase zruší. Napsal bych objekt, ale nemělo to metody. Tady by asi ten učitel povytáhnul obočí.

Funkce, která data zpracovávala, měla taky nějaké lokální proměnné. Ještě že nepoužil rekurzi, pak by bylo neštěstí hotové.

Dal jsem mu stručnou nalejvárnu. Naštěstí šlo o chápavého a velmi liberálního programátora. Kdyby byl rigidní, tak mě ještě dneska škrtí a křičí, že globální proměnná neexistuje a GOTO je ďábel!

Pojďme si to trošku nahodit na koleje. Pokud jste programátor bankovních systémů v Javě, pokud děláte weby nebo pokud programujete, cojávím, matematické algoritmy v … čemkoli, zkrátka pokud programujete cokoli s výjimkou low level systémů, tak si opravdu vystačíte s objektovým / objektově orientovaným přístupem, ti drsnější z vás se naučí funkcionální, a neberte to teď nijak zle: vystačíte si s tím a budete v tom klidně dobří. Ale nepouštějte se, probůh, do low level, protože tam jsou lvi a temnota a zmatení a jistoty přestávají platit.

Trošku to připomíná situaci člověka, který je zvyklý na newtonovskou mechaniku, a najednou je postaven před teorii relativity. Všechno je jinak a sčítání rychlostí není sčítání a tak. Jenže platí, a to si zapište červenou tužkou hned vedle tabulky ASCII kódů, že v normálním životě si většina lidí vystačí s newtonovskou mechanikou, a kdo by při výpočtu doby dojezdu z Prahy do Brna autem po D1 montoval relativistické vzorce, dopočítal by se téhož, ale působil by značně nepatřičně. Tam stačí obyčejné „vzdálenost lomeno rychlost“. Teda – na D1 je to potřeba ještě vynásobit imaginární jednotkou i, protože D1 se řídí vlastními zákony a žádný vzorec nikdy nezohlední počet bílých Transitů, Felicií jedoucích 110 v levém pruhu, vymletý pravý pruh od Humpolce po Jihlavu ani Slováků v audinách tak temných, že mají zatemněné i přední sklo, ale – rozumíme si, ne?

Zkrátka úplně stejně, jako jsou relativistické vzorce vhodné jen pro některé oblasti, tak jsou low level postupy taky vhodné převážně pro low level programování. Ale zase je dobré je znát, abyste si nepřipadali před cyklotronem a Arduinem jako mistři světa, protože umíte newtonovskou fyziku a Quicksort.

Pár základních věcí tedy zde:

Zaprvé – globální proměnné existují a jsou užitečné. Pokud se pracuje s jednou instancí něčeho (tedy jako že singleton), tak to uložte do „globální proměnné“. V praxi to dostane v RAMce, které v jednočipu není nikdy dost, tolik bajtů, kolik to skutečně zabírá, bude to na konstantní adrese, a nazdar bazar, bude to tam furt, přistupuje se k tomu jednoduše a hotovo dvacet.

Zadruhé – žádná halda. Víte vy, jak se pracuje s haldou? Jasně že víte, ale otázka zní: jak to ten procesor vlastně dělá, že tu haldu má, a že vám z ní přiděluje paměť, o kterou si řeknete? No, on si totiž vezme celou volnou paměť, co má k dispozici (a to se liší podle architektury), a udělá si v ní bloky. V zásadě si na začátku zapíše na začátek celé haldy pár servisních bajtů, typicky: toto je prázdný blok, má délku tolik a tolik. Pak uděláte malloc(), knihovna koukne do paměti, najde značku pro „prázdný blok“, z ní odpočítá požadovaný počet bajtů, a na začátek zapíše: Alokovaný blok, tolik a tolik bajtů, a za konec zapíše: Prázdný blok, tolik a tolik bajtů. Chvilku je přidělujte a rušte, nejlépe s různými a nesoudělnými délkami, a za chvilku v RAMce nebudete mít k hnutí. Prostě ne, dynamická alokace paměti je v jednočipu prostě hloupý nápad a pokud můžete, tak se jí vyhněte.

Zadvouapůlté – ukazatel. Když už máte nějakou dynamickou paměť přidělenou, tak k ní přistupujete přes ukazatel a přes index. Což tedy v praxi znamená, že buď má procesor nějaké indexové registry, a do nich si uloží hodnotu ukazatele a pak přistupuje k paměti prostřednictvím nepřímé adresy, nebo je nemá, a pak si musí pokaždé adresu dopočítat. Naštěstí je dneska mají, taky překladače umí hodně dobře optimalizovat, ale raději se na to nespoléhejte, protože i překladač může narazit na omezení, buď svoje, nebo procesoru.

Zatřetí – žádné lokální proměnné. Taková lokální proměnná, to je místo na zásobníku. Zásobník, helejte, to není nějaká abstraktní struktura ze skript „Algoritmy I – datové struktury“, ale docela zásadní součást procesoru na nízké úrovni. Když voláte podprogram (což je ve vyšších jazycích plusmínus ekvivalent „volání funkce“), tak se na zásobník, což je struktura v paměti, uloží adresa, ze které se skáče, aby se po returnu mohl procesor vrátit tam, kde byl naposledy. Na zásobník se taky ukládají věci, které si potřebujete na chvíli někam schovat. Zkrátka zásobník je velmi důležitá věc, bez ní by vám program ve strojáku fungoval naprosto nestrukturovaně. U „velkých“ procesorů to nebývá úplně takový problém, tam bývá zásobník hodně velký a s chybou „stack overflow“, která nastává ve chvíli, kdy toho na zásobník uložíte moc, se setkáte jen zřídka. Nebo ještě hůř – nesetkáte se s ní až do chvíle, než vám někdo pomocí téhle chyby nezruší systém a nenabourá se do něj. U malých procesorů to už problém je, tam není dost RAMky. Některé dokonce mají omezenou velikost (třeba 6502 měl jen 256 bajtů na zásobníku) a některé jednočipy mají hardwarově zásobník zcela mimo adresní prostor a pevně omezený například na 16 hodnot.

No, a proč o zásobníku mluvím? Protože zrovna lokální proměnné se dělají tak, že po vstupu do podprogramu (=funkce, procedury, jakkoli) se na zásobníku alokuje množství paměti, potřebné pro všechny proměnné, a pak se k nim přistupuje (zase) nepřímo. Moderní překladače to řeší tak, že se snaží alokovat pro tyto situace některé z registrů, ale zase: nejde to vždy a všude, nespoléhejte na to.

Mimochodem – když předáváte funkci parametry, víte, co se stane? Záleží na překladači, ale obecně platí, že zase uloží všechny na zásobník a zavolají podprogram. Pak je opět zahodí. Znovu: překladače optimalizují a snaží se nacpat parametry do registrů, ale když jich je moc, tak i registry dojdou.

Začtvrté – rekurze. Není to dobrý nápad, důvod vizte výš.

Za páté – goto. Nebo GO TO. Zkrátka přímý skok na nějaké místo programu. Od dob strukturovaného programování je to zlo, protože to rozbíjí strukturu. Ve skutečnosti za všemi těmi for a loop a while není nic jiného než prachsprosté goto, jen zakapotované tak, že cílovou adresu skoku řeší překladač a ne chybující programátor. I známé breakcontinue jsou jen syntaktický cukřík místo goto. V assembleru se mu ale říká většinou jump (JMP, JP, JUMP) nebo branch. Je to velmi silný nástroj, takže chápu, proč ve vyšších jazycích moc nebývá, ale tam dole, tam, kde to smrdí křemíkem, se bez něj neobejdete. A stačí jedna chyba, a program vám najednou skáče, kam nemá, kde ho nikdo nečekal, a dějou se věci veliké.

Holt jednočipy, osmibity a assembler nejsou pro měkkýše… Jsou to mocné nástroje, ale nebezpečné a v rukou nezkušeného můžou napáchat obrovské škody. Ale rozhodně pomůže, když se je naučíte – i kdyby hlavním důvodem měla být ta úleva, že programujete v něčem s podstatně vyšší mírou abstrakce.

Rubriky: Jen tak, Software | Štítky: , , , | 3 komentáře