Ošetření tlačítka v přerušení

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 03 bře 2020, 09:43

Spouštím externí přerušení pomocí tlačítka, ale potýkám se se zákmity.
Delay ani millis v přerušení nefungují, dá se to nějak programově ošetřit?
Dík

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od gilhad » 03 bře 2020, 11:23

millis by se mely dat cist, jen se behem preruseni nemeni, ale test jestli ubehnul debounc nebo ne by fungovat mel (samozrejme nesmis cekat ve smycce na jeho konec)

Mnohem lepsi ovsem je osetrit ty zakmity venku hardwarove, at uz jednoduchym RC clenem, nebo treba pomoci 555

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Hanz » 03 bře 2020, 14:21

zdravím, zákmity tlačítka jsem řešil zde na foru
je tam odkaz + moje video s IO40106
snad se dají koupit i bezzákmitové tlačítka, ale nepátra jsem.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 03 bře 2020, 15:48

Dotaz byl na programové ošetření

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Ošetření tlačítka v přerušení

Příspěvek od kiRRow » 03 bře 2020, 16:12

Ve funkci, která je vykonávána při přerušení zakážeš přerušení a uložíš si čas, kdy jsi toto provedl. V loopu pak budeš testovat jestli millis()-tenČas >= časIgnoracePřerušení a pokud ano, přerušení zase povolíš.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od ondraN » 03 bře 2020, 19:04

Buď jak píše kiRRow, nebo to jde udělat automaticky ve dvou krocích. V proceduře přerušení od tlačítka si vyřešíš, co potřebuješ a spustíš si timer (třeba timer2) na nastavený čas pro odstup stisků. A v proceduře přerušení od toho timeru si vynuluješ registr přerušení od tlačítka a povolíš od něj přerušení. Tím to celé půjde na pozadí a netřeba to nějak řešit v programu.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 03 bře 2020, 19:38

Narážím na jiný problém, ošetřil jsem tlačítko dle kirrowa, přidal jsem ještě RC filtr, funguje to, ale...
Posílám stav tlačítka bezdrátově přes vysílač / přijímač RFM23BP. Pokud aktivuji přerušení pomalu (řádově 1 stisk za sekundu), je vše OK.
Pokud je aktivace přerušení častější nebo jsou dva po sobě rychlejší, program se kousne a pomůže jenom reset. Pro přenos používám knihovnu RadioHead. Když ji vyřadím a přerušení kontroluji na monitoru, zase ok. Jestli není problém v té knihovně.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 03 bře 2020, 19:56

Ještě upřesním, zjistil jsem, že kolaps programu ani tak nezávisí na četnosti přerušení, ale na tom, zda dojde k přenosu nebo ne.
Vypadá to opravdu na problém s knihovnou. Tady asi nic nevyřešíme. Ale co kdyby...

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Ošetření tlačítka v přerušení

Příspěvek od kiRRow » 04 bře 2020, 16:33

Prozkoumal bych technické parametry ono vysílače. Důležitý je odběr proudu v klidu a taky odběr proudu při vysílání - ten totiž dost často u vysílačů umí špičkově vyskočit i o několik řádu. Takovýto zvýšený odběr velmi snadno zakymácí s napájením procesoru a ten se pak zasekne.
Řešení : co nejblíže napájecím nožičkám onoho vysílače umístit kondenzátor s dostatečnou kapacitou, který zvládne zvýšený odběr krátkodobě pokrýt, nebo pokud to nepomůže, tak napájení vysílače samostatným zdrojem.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 04 bře 2020, 18:02

Už jsem program ořezal úplně na kost:
žádný vysílač, pouze externí přerušení,
tlačítkem spouštím externí přerušení a to tak, aby reagovalo na změnu (CHANGE),
pokud je náběžná hrana, vypíše na monitor text "náběžná"
pokud je sestupná hrana, vypíše "sestupná"
stav tlačítka pro jistotu ještě kontroluji paralelně připojeným vstupem a ten testuji na stav (v loopu);
v přerušovací smyčce vypínám přerušení, nastavuji flag, abych věděl, že došlo k přerušení a v loopu ho testuji a shazuji.
Výsledek: občas se nespustí přerušení (nevypíše text) zcela nepravidelně jednou náběžnou hranou, pak někdy zase sestupnou.
Není to moc často, ale je to nepravidelné a tím nespolehlivé
Doufám, že jsem to vysvětlil dostatečně zmateně.
Jednodušeji: občas nezabere přerušení a je jedno, jestli ho aktivuji rychle nebo pomalu, nástupně nebo sestupně

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů