 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
dgregor Član

Pridružen-a: Čet 06 Jan 2005 13:55 Prispevkov: 32 Aktiv.: 0.14 Kraj: Celje
|
Objavljeno: Čet Apr 20, 2006 7:09 am Naslov sporočila: Branje tipk! |
|
|
Pozdravljeni!
Imam majhen problem pri branju tipk z PIC-em. Saj ne da ne dela vendar pritisk na tipko včasih preskoči ali pa "prime" dvakrat.
Program imam napisan z MikroBasicom in izgleda takole:
-testiram stanje tipke če je stanje na vhodu 1,
-čakam 200ms (uporabim zakasnitev),
-še enkrat testiram stanje tipke in če je še vedno na vhodu stanje 1 potem je
tipka sklenjena.
Zanima me ali ima kdo kakšen boljši predlog glede branja tipk oziroma občutek imam da je ta čas zakasnitve malo velik (kar pa še nisem stestiral, saj je ideja padla pred kratkim).
LP!, Gregor |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Čet Apr 20, 2006 7:31 am Naslov sporočila: |
|
|
Temu problemu se 'strokovno' reče debouncing (preprečevanje odskakovanja) kontakta/tipke. Jaz problem rešim tako, da zakasnim preverjanje za 20ms, preverjam pa sicer precej bolj nagosto. |
|
Nazaj na vrh |
|
 |
Slemi Član

Pridružen-a: Pet 29 Okt 2004 13:29 Prispevkov: 386 Aktiv.: 1.63 Kraj: Hrastnik
|
Objavljeno: Čet Apr 20, 2006 8:29 am Naslov sporočila: |
|
|
Če se ti program dovolj hitro izvaja, lahko preverjaš stanje tipke (t.i. polling), in je ne uporabljaš s prekinitvijo. _________________ slemi.info - en
slemi.si - slo |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Čet Apr 20, 2006 10:53 am Naslov sporočila: |
|
|
Namesto da tistih 20 (200 ali kolikor pac ze) ms cakas v zanki in ne delas nic, preverjaj stanje tipke in vsakic, ko je stanje 1, pristej 1 dolocenemu stevcu. V izbranem casu bo taka zanka sla skozi N iteracij, vrednost stevca bo torej 1 .. N (najbrz si zacel steti sele takrat, ko je bila tipka pritisnjena). Nastavi treshold (recimo N / 2), nad katerim privzames, da je bila tipka pritisnjena, pod njim pa je slo samo za motnjo.
Prakticen primer:
Ce se zanka izvede 200x, koncno stanje stevca pa je 158 (kar je vec od N / 2, ki je izbrana meja, a manj od N, kar je maksimum, saj je najbrz tipka odskakovala ob vklopu ...), potem bi to interpretiral kot pritisk. Mejo nastavis po izkusnjah in glede na dolzino intervala v katerem preverjas.
Preverjanje tipek (debounce) sprozi samo v primeru spremembe stanja iz enega izbranega v drugo (tipka) ali v primeru spremembe stanja iz kateregakoli v drugega (stikalo), da se znebis ponovnih (laznih) vklopov ob enem samem pritisku. |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Čet Apr 20, 2006 4:07 pm Naslov sporočila: |
|
|
Glede na primere raznih (delujočih) debounce procedur je 200 ms precej velik čas. Poizkusi skrajšati za deset ali večkrat. 200 ms je že tak čas, da je v njem pri hitrem tipkanju tipka pritisnjena in spuščena. Procedura kontakta tako sploh ne bo zaznala.
Jur |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Sre Avg 02, 2006 5:43 pm Naslov sporočila: |
|
|
Bi kar tukaj nadaljeval z mojim vprašanjem.
Kako se v preaksi realizira večfunkcionalnost ene tipke.
Ko pritisnem tipko naredi nekaj. Če tipko držim po 5 sec naredi nekaj drugega.
Z uporabo timerja , ki šteje. Vendar sem zbegan kaj dati v glavni program ,kaj v
timer.
Prosim za pomoč
Lp
Snoopy |
|
Nazaj na vrh |
|
 |
Slemi Član

Pridružen-a: Pet 29 Okt 2004 13:29 Prispevkov: 386 Aktiv.: 1.63 Kraj: Hrastnik
|
Objavljeno: Sre Avg 02, 2006 6:02 pm Naslov sporočila: |
|
|
Snoopy v timer daj eno spremenljivko, ki jo povečuješ za 1. V glavnem programu pa preverjaj če je recimo tista spremenljivka = 1, potem to pomeni, da je bila ravnokar pritisnjena, če pa ima npr. vrednost = 50 potem je to 5 sekund. To je primer, sam si moraš preračunati da ti bo točno. Pazi pa na to, da dodaš ukaz, da če je spremenljivka večja od 250 potem je spremenljivka 250 (if spremenljivka > 250 then spremenljivka = 250), v nasprotnem primeru se ti lahko zgodi da ti bo ukaz ponavljalo ker bo spremenljivka naredila "overflow" in bo spet štela od 0.
Lp _________________ slemi.info - en
slemi.si - slo |
|
Nazaj na vrh |
|
 |
snoopy Član


Pridružen-a: Ned 11 Maj 2003 1:17 Prispevkov: 230 Aktiv.: 0.97 Kraj: Radovljica
|
Objavljeno: Pet Avg 04, 2006 10:09 am Naslov sporočila: |
|
|
Slemi hvala za namig. Sem dodal kot si priporočal in dela.
Za eno tipko je hitro rešljivo , kaj pa če imam 16 takšnih tipk.
Kako potem rešim problem?
Lp
Snoopy |
|
Nazaj na vrh |
|
 |
clownfish Član

Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 765 Aktiv.: 3.23 Kraj: Povir / Ljubljana
|
Objavljeno: Sre Mar 21, 2007 6:24 pm Naslov sporočila: |
|
|
snoopy je napisal/a: |
Za eno tipko je hitro rešljivo , kaj pa če imam 16 takšnih tipk.
Kako potem rešim problem? |
Sam berem tipke in vračam vrednosti. Če je koda tipke 0 potem tipka ni pritisnjena.
Če pa je različna od 0 vračam nejno kodo oziroma skupno kodo vseh tipk pri čemer je vsaka tipka en bit, poleg tega pa vračam še čas koliko časa je tipka oziroma več tipk pritisnjenih.
rutina za branje tipk je v RTC rutini in se kliče vsako 1/32sec. čas pa je toliko 1/32sekunde.
Tako potem ob vsaki spremebi vrednosti tipke ki je daljša od 1/32 sekunde rečem da je tipka ali več tipk veljavna hkrati vračam tudi čas.
V meniju kjer obdelujem tipke pa imam potem možnost preverjati katera tipka in koliko časa je pritisnjena.
Tako lahko eno tipko glede na čas pritiska uporabiš za več funkcij..
Sicer sem pa zadevo pokopiral iz podobnega sisetma uporabljenega pri raznih priročnih zadevah.. ročnih urah,mobitelih in podobno.. |
|
Nazaj na vrh |
|
 |
IR ELECTRONIC(ARROW) Član

Pridružen-a: Sre 06 Dec 2006 10:08 Prispevkov: 47 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Sre Apr 04, 2007 10:37 pm Naslov sporočila: |
|
|
snoopy je napisal/a: |
Bi kar tukaj nadaljeval z mojim vprašanjem.
Kako se v preaksi realizira večfunkcionalnost ene tipke.
Ko pritisnem tipko naredi nekaj. Če tipko držim po 5 sec naredi nekaj drugega.
Z uporabo timerja , ki šteje. Vendar sem zbegan kaj dati v glavni program ,kaj v
timer.
Prosim za pomoč
Lp
Snoopy |
Ziv!
V podobnem primeru sem za štetje tistih 5sek uporabil timer1, in sicer s prekinitvijo.In seveda odsteval vrednost konstante seveda z uporabljenim prescalerjem
Tipko pa sem bral s "polling-om"
Pomagal sem si na ta način , da sem v tistih 5sek gledal najprej ali je bila tipka pritisnjena, potem pa če je bila spuščena. Če je bila spuščena v času 5sek je avtomatsko obveljal prvi način uporabe tipke. Če pa ni bila spuščena v času 5sek, pa potem drugi način.
Armin _________________ ARMIN ČATAK DFAE |
|
Nazaj na vrh |
|
 |
IR ELECTRONIC(ARROW) Član

Pridružen-a: Sre 06 Dec 2006 10:08 Prispevkov: 47 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Sre Apr 04, 2007 10:49 pm Naslov sporočila: |
|
|
snoopy je napisal/a: |
Slemi hvala za namig. Sem dodal kot si priporočal in dela.
Za eno tipko je hitro rešljivo , kaj pa če imam 16 takšnih tipk.
Kako potem rešim problem?
Lp
Snoopy |
16 tipk lahko gledaš na več načinov:
- matrica 4x4, kjer uporabis "Change on port" prekinitveno rutino.
Največkrat je uporabljen PORTB. Se pravi 4 linije na PORTB, 4 pa recimo na PORTA. In potem gledas kateri pin je pritisnjen ( ponavadi "0") tako na PORTB kot na PORTA.Seveda potrebuješ vsaj 14pinski uC ( ta ima PORTA in PORTC)
-Lahko uporabis uporovni delilnik s tipkami in delaš AD pretvorbo.Ter nato look-up tabelo kjer glede na digitalno vrednost določiš katera tipka je bila prekinjena
- Uporovni delilnik kjer je vhod peljan na komparator. Spreminjaša lahko Vref ( interno) ter ugotavljaš kje komparator preskoči.Glede na znano vrednost Vref lahko ugotoviš katera tipka je bila pritisnjena.To metodo še nisem preizkusil tako da ne morem garantirati za pravilno delovanje.
Armin _________________ ARMIN ČATAK DFAE |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|