Mateusz Majchrzycki
Guest
Sun Dec 26, 2004 5:14 pm
Właśnie wlaczę z klawiaturą matrycową w której musi być umozliwione
naciśnięcie jednego lub dwóch klawiszy.
Narazie w celach testowych mam klawiaturę 4x4. Wszystko to jest
podpięte bezpośrednio do portu A uC AVR Tiny26.
Kolumny są liniami wyjściowymi, rzędy to linie wejściowe uC z
włączonymi pull-upami.
Algorytm wygląda tak:
Ustawiamy pierwszą kolumnę w stan L, pozostałe w stan H. Rozpoczynamy
skanowanie wierszy. Jeżeli natrafimy na stan L na wejściu to zapisujemy
kod napotkanego klawisza do pamięci, wskaźnik komórki zwiększamy o 1 i
szukamy dalej. Po skończeniu skanowania pierwszej kolumny ustawiamy ją
w stan H, a drugą kolumnę w stan L. I rozpoczynamy całe skanowanie od
początku.
Algorytm działa dobrze, lecz ma jedną wadę. W przypadku gdy są
naciśnięte dwa klawiasze w jednym rzędzie zaczyna głupieć. Najczęściej
po prostu ich nie widzi
Próbowałem znaleźć jakieś procedury obsługujące taką klawiaturę w
zasobach sieci, ale niczego takiego nie stwierdziłem. Jedynie nota
Atmela AVR243 coś tam wspomina o klawiaturze w której można wciskać
kilka klawisz, lecz wszystko kończy się na informacji o tym że w pewnej
sytuacji pojawia się "ghost key" i podowduje błędy. Żadnych konkretów
Moze ktoś z grupowiczów stoczył kiedyś pomyślny pojedynek z obsługą
takiej klawiatury i mógłby mnie poratować jakimś sprawdzonym
algorytmem? Za wszelką pomoc z góry dziękuję...
--
+-----Pozdrawiam------+------------------------+
\ Mateusz Majchrzycki \ W życiu liczą się \
\ MateoM[at]poczta.fm \ drobne przyjemności... \
+------GG#897890------+------------------------+
Krzysztof Rudnik
Guest
Sun Dec 26, 2004 5:14 pm
Mateusz Majchrzycki wrote:
Quote:
Właśnie wlaczę z klawiaturą matrycową w której musi być umozliwione
naciśnięcie jednego lub dwóch klawiszy.
Narazie w celach testowych mam klawiaturę 4x4. Wszystko to jest
podpięte bezpośrednio do portu A uC AVR Tiny26.
Kolumny są liniami wyjściowymi, rzędy to linie wejściowe uC z
włączonymi pull-upami.
Algorytm wygląda tak:
Ustawiamy pierwszą kolumnę w stan L, pozostałe w stan H. Rozpoczynamy
skanowanie wierszy. Jeżeli natrafimy na stan L na wejściu to zapisujemy
kod napotkanego klawisza do pamięci, wskaźnik komórki zwiększamy o 1 i
szukamy dalej. Po skończeniu skanowania pierwszej kolumny ustawiamy ją
w stan H, a drugą kolumnę w stan L. I rozpoczynamy całe skanowanie od
początku.
Algorytm działa dobrze, lecz ma jedną wadę. W przypadku gdy są
naciśnięte dwa klawiasze w jednym rzędzie zaczyna głupieć. Najczęściej
po prostu ich nie widzi
Próbowałem znaleźć jakieś procedury obsługujące taką klawiaturę w
zasobach sieci, ale niczego takiego nie stwierdziłem. Jedynie nota
Atmela AVR243 coś tam wspomina o klawiaturze w której można wciskać
kilka klawisz, lecz wszystko kończy się na informacji o tym że w pewnej
sytuacji pojawia się "ghost key" i podowduje błędy. Żadnych konkretów
Moze ktoś z grupowiczów stoczył kiedyś pomyślny pojedynek z obsługą
takiej klawiatury i mógłby mnie poratować jakimś sprawdzonym
algorytmem? Za wszelką pomoc z góry dziękuję...
Zasadniczo wykrycie dowolnej kombinacji klawiszy umozliwia matryca,
ktora ma do kazdego klawisza dolaczona szeregowo diode.
Jednak normalnie problem pojawia sie dopiero przy trzech klawiszach.
Podejrzewam ze klopoty moze powodowac sterowanie matrycy z wyjsc
z aktywna jedynka. Przy open-collector nie powinno byc problemow.
W opisanym ukladzie, jak nacisniesz dwa klawisze w jednym rzedzie
robisz zwarcie stabow H i L.
Krzysiek Rudnik
Piotr Wyderski
Guest
Mon Dec 27, 2004 12:17 am
Mateusz Majchrzycki wrote:
Quote:
Algorytm działa dobrze, lecz ma jedną wadę.
Ma tez druga wade: wcale nie dziala dobrze. :->
Po pierwsze: czy do linii i kolumn podlaczyles procesor
bezposrednio, czy przez oporniki? Bo jesli to pierwsze, to
moge sobie wyobrazic kombinacje klawiszy powodujaca
eleganckie zwarcie... W przeciwnym razie moge podac
kombinacje, ktora zadziala jak dzielnik wymuszajacy
stan przeciwny do wykrywanego.
Poprawienie algorytmu:
"Ustawiamy pierwszą kolumnę w stan L, pozostałe w stan H"
zmien na
"Ustawiamy pierwszą kolumnę w stan L, pozostałe w stan
wysokiej impedancji, tj. przelaczamy je na wejscia bez
pull-upow."
reszta bez zmian. Teraz _musi_ dzialac.
Quote:
Atmela AVR243 coś tam wspomina o klawiaturze w której można wciskać
kilka klawisz, lecz wszystko kończy się na informacji o tym że w pewnej
sytuacji pojawia się "ghost key" i podowduje błędy.
Wybacz szczerosc, ale klasyfikuje to (tekst z noty Atmela,
nie Twoja wypowiedz...) do kategorii "pitolenie".
Kiedys zrobilem sterownik takiej klawiatury wedlug wlasnego
pomyslu -- do dzis dziala doskonale. Ale spadek jakosci
not aplikacyjnych to chyba ogolne zjawisko -- kilka dni
temu z pewnej noty udalo mi sie wyeliminowac jeden
zupelnie niepotrzebny uklad dekodera adresow, wystarczylo
tylko zmodyfikowac oprogramowanie...
Pozdrawiam
Piotr Wyderski
Mateusz Majchrzycki
Guest
Mon Dec 27, 2004 10:15 pm
Pewnego dnia Piotr Wyderski <wyderskiREMOVE@ii.uni.wroc.pl>
nastukał(a):
Quote:
Algorytm działa dobrze, lecz ma jedną wadę.
Ma tez druga wade: wcale nie dziala dobrze. :-
No tego bym nie był tak na 100% pewien, bo wszystkie kombinacje
klaiwszy mi działały (chyba że to był tylko czysty przypadek) z
wyjątkiem tych paru problemowych :)
Quote:
Po pierwsze: czy do linii i kolumn podlaczyles procesor
bezposrednio, czy przez oporniki? Bo jesli to pierwsze, to
moge sobie wyobrazic kombinacje klawiszy powodujaca
eleganckie zwarcie...
No właśnie były podłączone bezpośrednio

Tak właśnie stwierdziłem że
strasznie głupi byłem

Człowiek robił zwarcia linii procesora nawet
się nad tym nie zastanawiając, a później się dziwi że mu procesor do
krainy wiecznego idle odchodzi :)
Quote:
W przeciwnym razie moge podac
kombinacje, ktora zadziala jak dzielnik wymuszajacy
stan przeciwny do wykrywanego.
?? Można coś jaśniej, bo w tej chwili tak nie bardzo łapię z tym
dzielnikiem :/
Quote:
"Ustawiamy pierwszą kolumnę w stan L, pozostałe w stan
wysokiej impedancji, tj. przelaczamy je na wejscia bez
pull-upow."
Myślałem o tym, ale doszedłem wtedy do wniosku że taka kombinacja może
zostać odczytana jako stan L. Ale teraz po głębszym zastanowieniu... to
moze nawet zadziałać

Jak tylko będę miałm okazję to sprawdzę :)
Quote:
Ale spadek jakosci
not aplikacyjnych to chyba ogolne zjawisko
Nie chyba lecz napewno. Sam Atmel ma całą stertę not, z których
praktycznie nic nie wynika :(
--
+-----Pozdrawiam------+------------------------+
\ Mateusz Majchrzycki \ W życiu liczą się \
\ MateoM[at]poczta.fm \ drobne przyjemności... \
+------GG#897890------+------------------------+
Mateusz Majchrzycki
Guest
Mon Dec 27, 2004 10:18 pm
Pewnego dnia Krzysztof Rudnik <rudnik@kki.net.pl> nastukał(a):
Quote:
Zasadniczo wykrycie dowolnej kombinacji klawiszy umozliwia
matryca, ktora ma do kazdego klawisza dolaczona szeregowo diode.
No ale przy matrycy 8x8 to już troszke tych diod jest

A taka
klawiatura (lub nieco mniejsza) w docelowym układzie będzie
zastosowana.
Quote:
Przy open-collector nie powinno byc problemow.
Hmmm... to może być jakiś pomysł, który dodatkowo uprości mi część
programową

Dodam do listy eksperymentów :)
--
+-----Pozdrawiam------+------------------------+
\ Mateusz Majchrzycki \ W życiu liczą się \
\ MateoM[at]poczta.fm \ drobne przyjemności... \
+------GG#897890------+------------------------+
Piotr Wyderski
Guest
Mon Dec 27, 2004 10:49 pm
Mateusz Majchrzycki wrote:
Quote:
?? Można coś jaśniej, bo w tej chwili tak nie bardzo łapię z tym
dzielnikiem :/
Chodzi mi o rezystorowy dzielnik napiecia.
Gdybys mial rezystory szeregowo z liniami CPU
(z czego niektore sa w stanie L, a inne H), to
wciskajac odpowiednio klawisze moglbys ustawic
stopien podzialu z bardzo szerokiego zakresu -- a
CPU rozumie tylko dwa stany na wejsciach. Narysuj
sobie taka matryce z pozwieranymi niektorymi
klawiszami, slowami to trudno opisac, a na rysunku
(+ odrobina zastanowienia) od razu zobaczysz.
Quote:
Myślałem o tym, ale doszedłem wtedy do wniosku że taka kombinacja może
zostać odczytana jako stan L.
A w jaki sposob, skoro na wejsciach masz pull-upy? :-)
Quote:
Ale teraz po głębszym zastanowieniu... to
moze nawet zadziałać
To musi zadzialac, sprawdzone. Tylko sobie jeszcze
programowy debouncing dorob, bo inaczej bedziesz
mial niechciany autorepeat. :-)
Pozdrawiam
Piotr Wyderski