Zeby klawisz zostal uznany jako wcisniety, to sygnal wcisniecia musi trwac _bez_przerwy_ przez jakis okreslony czas. Jak trwal krocej - znaczy wystapilo drganie stykow i liczymy czas od nowa. Potem, jak juz uznamy klawisz za wcisniety, to musimy poczekac na odpowiednio dlugi sygnal puszczenia klawisza (poniewaz podczas puszczania tez moga byc drgania stykow - zle napisany program moglby to zinterpretowac jako szybkie wciskanie).
Rzeczy typu powtarzanie itp. to zaleza juz od "fantazji" programisty.
W artykule <bjkbhr$7dm$ snipped-for-privacy@atlantis.news.tpi.pl> Piotr Wyderski napisał(a):
Jesli jest taka mozliwosc, mozesz zastosowac przelacznik typu isostat. Tzn. w jednej pozycji zwiera styki 1 z 2 w drugiej 2 z 3. Wtedy dajesz na 2 stan aktywny, 1 i 3 ,,pul up/down'' do niaktywnego oraz 1 i 3 podlaczasz na wejscia R i S przerzutnika RS.
Jak niemozesz isostata to tak jak Ci ktos ju napisal - musi byc przez jakis czas nieprzerwanie dany sygnal. My na laborkach z mikroprocesorow robilismy 0.2s i dzialalo w sposob pewny. Ale czas pewnie zalezy od tego jakie masz styki.
Jesli sie nie boimy jakis latajacych zaklocen od np transformatorowki, to wcale nie trzeba sprawdzac powyzszego - pojawienie sie choc jednego impulsu swiadczy o tym ze uzytkownik naprawde klawisz nacisnal.
Problem sie robi jak uniknac zeby kolejne drgania zarowno przy wciskaniu jak i przy puszczaniu nie zostaly odebrane jako kolejne nacisniecia klawisza. No i jak tu zrobic zeby nacisniecie klawisza wprowadzilo jeden znak, a nie jeden co ms :-)
Innymi slowy - czekac trzeba na "solidne" puszczenie klawisza.
Problem w tym kiedy to zrobic ?
- sprawdac klawisze w przerwaniach powiedzmy co 50ms, nie przejmowac sie drganiami - nie przeszkadzaja przy tak wolnym pollingu.
- bezczelnie wydluzyc procedure obslugi zdarzenia wybranego klawiszem do powiedzmy 1s - przy okazji zyskujemy autorepeat i zadnym deboucingiem sie nie przejmujemy.
- w procedurze odczytu klawisza poczekac az do jego zwolnienia. Skuteczne, choc troche nienaturalne. Nie ma AR, no chyba ze zaprogramujemy powrot jesli nie ma zwolnienia przez zadany czas.
- w procedurze odczytu klawisza poczekac najpierw na zwolnienie wszystkich klawiszy. Uniemozliwia niestety sterowanie "z wyprzedzeniem", fifo klawiatury sie czasem przydaje.
- siegnac do listingu spektrum .. skanning leci w przerwaniach, musi sie pare razy ten sam odczyt powtorzyc, ladujemy wtedy znak do bufora, sledzimy zwalnienie klawisza - tez musi byc pare razy pod rzad, mozna szybko pisac, repeata zaprogramowac,
Tue, 9 Sep 2003 20:45:42 +0200 jednostka biologiczna o nazwie "Piotr Wyderski" snipped-for-privacy@hoga.pl wyslala do portu 119 jednego z serwerow news nastepujace dane:
Wed, 10 Sep 2003 09:24:50 +0200 jednostka biologiczna o nazwie Andrzej Ekiert snipped-for-privacy@to.invalid wyslala do portu 119 jednego z serwerow news nastepujace dane:
Ja mam juz baardzo "wymeczony" przycisk eject w CD-ROMie i przy nacisnieciu potrafi wysunac szufladke zeby po gdzies sekundzie wciagnac ja spowrotem. Kiedys przycielo mi plyte przy wyjmowaniu przez to :-)
W artykule <bjn4a9$k7f$ snipped-for-privacy@panorama.wcss.wroc.pl> Piotr Wyderski napisal(a):
A mnie się udało :-) Co prawda aplikacja mało czasowymagająca (cóż za piękne słowo ;-)). Odświeżanie i ADC na komparatorze chodzą w przerwaniach, asynchronicznie do pętli głównej, w której są sprawdzane przyciski.
To i ja dołoże swoje. Mega128. Przerwanie na Timer0 z preskalerem na 1024 Przerwanie Timer1 z preskalerem 8. Tim0 zmniejsza licznik (danego przycisku)do zera. Oczywiście tylko jeśli jego wartość jest <>0. Tim1 sprawdza stan klawisza jeśli jego licznik jest =0. Obowiązuje dla stanu klawisza 0 oraz dla stanu 1. Zmiana stanu zostaje zapisana jako aktualna i wpisywana jest liczba do jego licznika.
Pętla główna uznaje za klawisz wciśnięty dopiero kiedy jego wartość jest 1 (zwierają do masy) i licznik jest równy 0, a poprzednio uznany stan klawisza był 0, czyli licznik zliczył do zera, w czasie kiedy przy każdym przerwaniu Tim1 na wyprowadzeniu podłączonym do klawisza było 0. W ten sposób reaguje tylko na zwolnienie klawisza, pozwala to na np. wciśnięcie jednocześnie drugiego klawisza aby spokojnie wycofać się z zamiaru czegoś tam. Podobnie jak wciśnięcie przycisku myszy nad np."klawiszem Anuluj" i trzymając wciśnięty przesunięciu nad inny obszar. Klawisze kursora mają jeszcze dodatkowo licznik zwłoki, żeby w przypadku dłuższego przyciśnięcia, po zmniejszeniu licznika zwłoki do zera (w przerwaniu timer0) następowała "automatyczna" inkrementacja lub dekrementacja.
Zainteresowanym udostępnię oryginał. W BASCOM :-P
pzdr Artur
PS1 Trzeci timer steruje jasnością podświetlenia i kontrastem. mega128 jest piękna ;-)
PS2 do Miłosza. Jak się spotkamy to pokażę Ci jak za pomocą BASCOMa można przerobić program "mało czasochłonny" na "czasożerny" ;-)
PS3 do Wszystkich. ale BASCOM i tak jest OK. Można się dużo nauczyć, szczególnie przy pisaniu procedur w asm. ;-)
PS4 do mnie Zaślęczyłbym się na śmierć gdyby nie BASCOM ;-)
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.