Zaslal: pá únor 04 2011, 20:13 Předmět: Co třeba ...
... takto,pokud chceš čekat na stisk nějakého tlačítka a jinak zařízení nemá dělat nic jiného,nebo jenom to,co vložíš do nekonečné smyčky,viz soubor.?
Nebo můžeš testovat rovnou celou bránu,stav uložíš do příznakového bytu,ten můžeš testovat a pokud bude nulový/nebo naopak nenulový(to si zvolíš),může se zavolat rutina obsluhy kláves.Nebo můžeš cyklicky v obsluze přerušení testovat stav vstupů.Obecně klávesnice nevyžaduje extrémní rychlost čtení,navíc mnohdy musíš ošetřit softwarově zákmity tlačítek,takže bych v přerušení obsluhoval raději displej,no je to na tobě
Založen: Sep 19, 2007 Příspěvky: 3698 Bydliště: Praha
Zaslal: pá únor 04 2011, 20:53 Předmět:
S těmi tlačítky to není složité, ale ani ne úplně triviální. Po změně úrovně napětí z tlačítka byste měl otestovat, že tato nová úroveň je stabilní po nějakou dobu - například 5 ms. Každé mechanické tlačítko má při přepnutí zákmity, které by se jinak mohly programem v důsledku rychlosti procesoru vyhodnotit chybně jako série sepnutí. Takže po detekci změny počkat třeba 3 ms, otestovat - přečíst podruhé, že úroveň je stejná, počkat další 3 ms a do třetice všeho dobrého i zlého to znovu načíst, jestli úrověň drží. Pak teprve považovat tlačítko za přepnuté.
Pozn. k C# a čekání na tlačítko a podobně: program ve Windowsích se nikde nezastavuje, nota bene nečeká v nějaké smyčce na stisk tlačítka. On po skončení toho, co měl udělat nakonec volá funkci GetMessage() v okenní funkci hlavního okna, a pokud není žádná zpráva ve frontě, tak se řízení odevzdá do systému. Variantně volá čekání na signalizaci objektu jádra WaitForSingle(Multiple)Object(s) (), kde se také předá řízení systému, pokud tento objekt už nebyl signalizován nebo může volat čekání na socket. Ale nikdy se nehaltuje nebo necyklí na místě. Pokud se to udělá v kódu násilně, tak při nejbližším přerušení od časovače stejně systém řízení sebere.
Nakonec, pokud je potřeba snímat stav tlačítek a přitom také současně potřeba obsluhovat ještě jiné události z okolí - kontakt čipové karty, vypršení časovače (softwarového), příjem pro RS232 a tak dále, je nejlépe výše nastíněné paradigma napodobit. Udělat si hlavní smyčku, která je v roli "systému" a detekuje všechny možné události. Jestliže se daná událost vyskytne, předá se řízení příslušnému obslužnému podprogramu.
Jo, nejlepší bude dát na ten 8bitovej jednočip windousy.
Stačí tu klávesnici skenovat jednou za x desítek ms v přerušení od časovače a zákmity jsou odstraněné automaticky, pokud se přidá testování 2x stejného stavu po sobě, tak se odstraní i případné rušení.
...ono to až tak jednoduché není.Pokud budu skenovat stavy a dva stavy budou po sobě stejný,navíc po 5ms a kabel od klávesnice bude delší(třeba kódový zámek,klávesnice bude oddělená od řídící jednotky),můžou nastat dva stejný stavy vlivem kapacity vodiče a stejně to bude chybný stav a procesor to nepozná.Osobně to testuji tak,že uložím první sken portu do registru a pak po určitou dobu a počtu skenování porovnávám s prvním vstupem.Tak ošetřím i případnou kapacitu kabelu.Osvědčila se mně doba 20ms.Jinou věcí je,zda má zařízení rozpoznat puštění klávesy,či zda má po určité době spustit repetici znaku.
Zaslal: pá únor 04 2011, 21:25 Předmět: Systém při přerušení...
....cyklení neopustí,protože si pamatuje návratovou adresu(následující instrukce) a tam po návratu z přerušení skočí.Pokud nepotřebuji obsluhovat od procesoru nic jiného,bohatě čekání ve smyčce stačí.U kódového zámku naprosto dostačující.Samozřejmě při složitém programu,kdy se obsluhují i jiné periférie,jako I2C,displej....je test kláves v nekonečné smyčce kravina.Ve složitějším systému budou navíc použity jak příznaky,tak i priority přerušení jednotlivých požadavků...
Zaslal: pá únor 04 2011, 22:25 Předmět: No pokud bude spát...
tak není nic jednoduššího,než ho změnou stavu na portu vzbudit,stačí nastavit příslušné registry(vzbuzení může rovněž iniciovat i AD převodník,watchdog,přetečení timeru...např.)Takhle jsem dělal konstrukci na bateriové napájení,po uplynutí času se vypnulo podsvícení,následovalo vypnutí displeje a skok do SLEEP módu.Stiskem kterékoliv klávesy se procesor vzbudil(klávesnice 4 x 4 ).Při uspání je rovněž uložena návratová adresa programového čítače ve stacku.Dokonce ho můžeš vzbudit a zakázat obsluhu přerušení vyvolanou touto akcí.Možností je několik:-)
Nevím co to bylo za procesor, ale AVR může vzbudit jen reset nebo přerušení, takže pokud vynecháme ten reset, tak obsluha klávesnice s uspáváním procesoru není bez použití přerušení u AVR možná.
A ještě,jak se to dělá,když se chci vyhnout tomu přerušení,jednoduše zakážu globální přerušení (bit GIE).Sice to procesor vzbudí,ale neprovede se skok do rutiny přerušení(vektor 0004h)
...dokonce i AD převodník ho vzbudí.Jediné,na co je si dávat pozor,je spotřeba ve SLEEP modu,AD převodník trochu žere.A musí se samozřejmě ošetřit porty tak,aby nemohly sloužit jako zdroj proudu...Např. teď mám na stole PIC16F630 a ten má to samé.Oni ty obvody PIC mají totiž ještě další bity,které povolují jednotlivá přerušení od periferií a instrukce sleep je tak trochu vyjímkou.Samozřejmě za běhu programu,pokud bude globální přerušení zakázáno,k přerušení nedojde.Takže mně stačí v programu před isntrukcí SLEEP toto globální přerušení zakázat a jako první instrukci po vzbuzení ho zase povolit:-)
Časy uváděny v GMT + 1 hodina Jdi na stránku Předchozí1, 2, 3, 4Další
Strana 2 z 4
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.