Odstranění zákmitů tlačitek

Zdravím, pustil jsem se do jednoho projektu a potřeboval bych vyřešit problém se zákmity tlačítek. Zatím jsem to “vyřešil” spožděním o 30ms ale toto řešení není košér. Hledal jsem na internetu ale nic co bych pochopil jsem nenašel. Programuju to ve Wired což je podobný Céčku, ale bude mi stačit když mi někdo poradí jak to softwarově ošetřit, když to pochopím tak už si program sesmolím sám. Takže sem hrňte všemožnou pochopitlenou teorii jak na to. Díky.

:arrow_right: administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"

V některé knížce bylo popsáno několik příkladů, třeba ti nějaký bude vyhovovat. Myslím že to byla kniha Učebnice programování PIC, ale nejsem si jistý.

100ms na stlacenie je nezmysel pre tlacitka sluziace ako mala klavesnicka napriklad pri display. Ak totizto tlacitka reaguju pomalsie ako za 30-40ms, uz ma obsluha pocit, ze nefunguju/maju zly kontakt a tak ma tendenciu tlacitka prilis zatlacat.

Algoritmus casovej filtracie stlacenia tlacitka:
Tlacitko si mozes skenovat kazdych 5ms. Ak tri vzorky po sebe zodpovedaju stlaceniu tlacitka, interne si nastav premennu - stlacene tlacitko = true. Ak 10-20 vzoriek po sebe zodpoveda pusteniu tlacitka, interne si nastav premennu - stlacene tlacitko = false.

Inak to aj uplne riesi i kondenzator 100nF-10nF paralelne k tlacitku, ak je pullpu odpor okolo 2k2-10k.

V tý knížce jsem nic co by mi pomohlo nenašel Petře.

Opravuji, je to kniha “Komunikace mikrokontroléru s okolím 1” strana 18.
2.1 Způsoby obsluhy klávesnice
2.1.1 Ošetření zakmitávání kontaktů

ak mas pouzite pullup externy alebo interny tak je moznost pouzit kondik paralelne ktlacitku a nemusis to riesit softverom

zatím tam mám vytvořeno toto, ale stále mi to nepracuje úplně podle představ:

val = digitalRead(buttonPin3); delay(5); bounceCheck = digitalRead(buttonPin3); if(val == bounceCheck){ delay(5); bounceCheck2 = digitalRead(buttonPin3); if(bounceCheck == bounceCheck2){ if (val == HIGH) { buttonState3 = HIGH; } else { buttonState3 = LOW; } } }

tím tlačítkem si vlastně nastavuju hodnotu proměné pro switch, a stane se že přejedu přes nějakou hodnotu…

A co použít klasické zapojení se schmittoým klopným obvodem? Nebo mám radši použít ten kondenzátor paralelně na tlačíko? Jaké je riziko poškození nebo co by se stalo kdyby tam ten kondenzátor byl a nebylo to v pullupu? Ten schmittuv klopný obvod se mi na to více líbí, ale nevím, nikde jsem snad neviděl takové řešení.

Tak Ti jednu teorii sem nahrnu:
Nezmáčnuté tlačítko nemůže mít zákmity, takže bude mít spolehlivou např. log.1 (při pull up do +Ucc). Jestliže je zmačknuto, zákmity způsobí náhodné střídání 0 a 1. Pokud budeš číst stav tlačítek v pravidelných intervalech a provedeš mezi např. 20 po sobě jdoucími vzorky log. AND, získáš vyfiltrovaný stav tlačítek. V praxi postačí vzorkovat 100x/sek, a z 5 vzorků dělat AND.

KEd tam nebude pullup tak to bude fungovata zle ale skor vobec.

Pullup- vecinou je myslenu zdvihaci odpor pripojeny na + pol.
ALe existuje aj moznost ak tlacitko spina + pol tak ten odpor musi ist na zem…a intreny pullup vypnut.

Robi sa to koli definovaniu stavu pri rozopnutom tlacidle.

Chtěl jsem se zeptat jakou hodnotu pull-up rezistoru používáte? Programuju teď Atmegu88, tak jsem se chtěl zeptat jestli stačí použít vnitřní pull-up odpory? Nebo oba dohromady (vnitří i přidaný vnější?)? :question:

Díky