Woofe píše:Řídit triak procesorem se dá ale je to zbytečně složitý a ve třech fázích už si to nedovedu představit.
Nechci vám vnucovat MCU za každou cenu, ale proč je to nepředstavitelné? Asi vás děsí 3 násobný paralelní chod algoritmu pro každou fázi extra, ale na tohle jsou docela dobře zvládnuté postupy.
Je třeba to naprogramovat jako stavový automat. Nejdůležitější je na začátku identifikovat správně potřebné stavy a události, které na něj přicházejí z okolních zdrojů událostí i vnitřních zdrojů - časovače. Situace je o to jednodušší, že máte pevné daný počet paralelních zpracování na 3 a nemusíte dynamicky přidělovat řídící struktury. Každá fáze by měla mít svůj datový řídící blok, který uchovává okamžitý stav řízení pro danou fázi.
Srdcem - motorem celého programu bude stejně jako v každém OS smyčka sběru událostí. Ta může buďto neustále nebo na nějaké opakované přerušení oblézat všechny možné zdroje událostí. Jakmile identifikuje vznik události, provede její rozlišení podle kategorie a předá ji na kus kódu, který si říká interfacový proces automatu.
Interfacový proces zkontroluje korektnost události z formálního hlediska, určí, ke které fázi událost patří, identifikuje příslušný řídící blok a události přidělí její identifikační číslo. Na základě stavu automatu, který je poznačen v řídícím bloku a čidla události určí přes distribuční tabulku vstupní bod centrálniho automatu a tam předá řízení.
Automat je v tomto okamžiku zavolán na zpracování určité události v daném stavu. Proto musí mít automat počet vstupních bodů = počet stavů x počet možných událostí. Automat v příslušné sekci načte z řídícího bloku stavová data řízení příslušné fáze, provede patřičnou akci a řízení předá zpět. Pokud je výsledkem jeho akce změna stavu, poznačí tento nový stav do řídícího bloku.
Nakonec to vybublá zpátky do smyčky sběru událostí a kolotoč vesele pokračuje dále.
Jak jsem řekl na začátku, nejdůležitější je správně identifikovat události a stavy v systému, pak už to jde jako na drátkách.
Pro představu můžu nastínit, jak jsem třeba identifikoval události a stavy, když jsem dělal FW pro PC kartu, která autonomně přijímá zprávy s hlídacích ústředen v hlídaných objektech a předává je do programu v PC. Před obrazovkou pak sedí operátor putlu centrální ochrany. Situace se zkomplikovala, když zadání požadovalo processor "rozdělit" na 2 poloviny a přijímat nezávisle po 2 linkách. Na každé lince bylo třena provést sekveci operací od detekce vzyzvánění a zvednutí vidlice, přes navázání spojení, příjem zpráv a hlídání různých časových intervalů až po komunikaci s PC.
Události byly rozdělelena do 3 kategorií
- události přicházející od telefonní sítě, jako náběh a spadnutí ss napětí, příchod vyzváněcího pulsu, ukončení vyzváněcího pulsu, příchod dat buď pulsně nebo DTMF atd.
- události od časovače
- události od nadřízeného programu v PC, což je zejména příjem znaku povelové zprávy
Co se týče stavů, tak ty byly identifikovány jako sled stavů od detekce vyzvánění, přes navazování spojení atd až po zavěšení vidlice.
Díky použití výše naznačeného konceptu automatu se pak procesy na linkách neovlivňují a vlastně o sobě vůbec "neví".