ATNEL tech-forum
https://forum.atnel.pl/

Klawiatura BCD dziadka Sławka
https://forum.atnel.pl/topic20363.html
Strona 1 z 1

Autor:  SP2LUB [ 5 mar 2018, o 19:59 ]
Tytuł:  Klawiatura BCD dziadka Sławka

Pewnie wielu z Was zaawansowanych użytkowników mikrokontrolerów, uśmiechnie się z politowaniem czytając ten post. Myślę jednak że początkującym jak ja, może się przydać.
Jestem już stary i pamiętam takie rzeczy jak mechaniczne kodery DEC na BCD montwane w urządzeniach pomiarowych, które służyły do nastaw dzielników częstotliwości czy innych takich...
Niedawno zaskoczyła mnie konieczność wykonania sterownika z dużą ilością peryferiów i dużą ilością klawiszy. Mimo iż zastosowałem Atmega128, to nie wiele mi zostało zasobów żeby obsłużyć 7 klawiszy.
Do głowy mi przyszło najbardziej dla mnie oczywiste rozwiązanie, czyli klawiatura BCD (przez analogię do starych mechanicznych koderów działających właśnie w kodzie BCD). Jednak pomyślałem że przewalę internet może istnieje coś prostszego i bardziej nowoczesnego niż ta metoda starsza od torfu...?
Znalazłem w necie rozwiązania oparte na:
1 klawiaturze analogowej
2 klawiatura matrycowa
3 klawisze pojedyncze podłączane bezpośrednio do pinów kontrolera
Przykładów powyższych rozwiązań jest cała masa w necie, natomiast pomysłu który mi przyszedł do głowy, praktycznie nie znalazłem. Natknąłem się dosłownie na dwa takie rozwiązania zakamuflowane głęboko jak by to było jakieś niezwykle dziwne i nietypowe. Podczas gdy wydawać by się mogło że to najbardziej oczywiste rozwiązanie. Może ja nie umiem w internety i źle szukałem.
Tak czy inaczej postanowiłem wrzucić na nasze forum moją metodę na dużo klawiszy na małej ilości pinów :) Może się przyda komuś kto jest w potrzebie.
Panowie i Panie fachowcy, ten post jest dla początkujących :)

tak wygląda fragment schematu budowanego przezemnie sterownika, a dokładnie fragment z klawiaturą

Obrazek

jak widać, użyłem trzech pinów procka i 12 zwyczajnych diod krzemowych podłączonych do tych pinów w porządku kodu BCD.
Z trzech pinów uzyskałem w ten sposób 7 klawiszy. z Czterech pinów będziemy mogli mieć 16 klawiszy czyli już lepiej niż klawiatura matrycowa która potrzebuje całego portu.
Diody które podpięte są do pinów portów, są uporządkowane zgodnie z kodem binarnym:
8421 w negacji czyli
111 = 0 żaden przycisk nie wciśnięty stany wysokie na wszystkich pinach
110 = 1 wciśnięty przycisk 1
101 = 2 wciśnięty przycisk 2
100 = 3
011 = 4
010 = 5
001 = 6
000 = 7
Można dodać czwarty pin itd....

Żeby to obsłużyć programowo, przyszły mi do głowy dwa sposoby. Pierwszy najbardziej oczywisty i chyba najprostszy dla takiego początkującego jak ja to po prostu sprawdzanie stanu wszystkich trzech pinów jak w tym przykładzie:

Przygotowałem sobie makra dla trzech pinów ja akurat miałem do dyspozycji 3 kolejne piny tego samego portu, ale to generalnie bez znaczenia. Można użyć dowolnych pinów które pozostały do użycia.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w pętli głównej ustawiam kierunki i pociągam do VCC (na schemacie mam też rezystory podciągające na tych pinach)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i teraz pozostało stworzyć funkcję która będzie sprawdzać stany pinów

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

inna metoda obsługi takiej klawiatury to metoda tablicowa, której nie opracowałem :)

może ktoś zechce dopisać jakiś inny fajny kod do obsługi tej przedpotopowej metody klawiaturowania :)
Dla mnie warto było zapakować te diody żeby odzyskać kilka pinów procka.
Tak wygląda na mojej płytce:
Obrazek

Zdecydowałem się to tutaj opublikować nie żeby się chwalić, bo jestem naprawdę początkujący, ale tylko dla tego że nie ma wiele takich przykładów w internecie. Może dla tego że tak oczywiste jak podłączanie kwarca do procka? :)

Wada tej metody jest taka że nie da się użyć kombinacji klawiszowej, podobnie w metodzie z ADC czy matrycowej bez niezbędnych modyfikacji...
Mam nadzieję że komuś się przyda, a może ktoś zamieści bardziej prawidłową funkcję obsługi klawiatury BCD.

Autor:  SylwekK [ 5 mar 2018, o 21:07 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

Bardzo fajna metoda. Też ją pamiętam ze starych projektów na ttl :)
Najprościej to wyłuskać te trzy bity operatorem AND i mamy gotową liczbę, a następnie używać bezpośrednio lub, np.przez switch/case :)

Autor:  SP2LUB [ 5 mar 2018, o 21:42 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

No właśnie ja tej metody używałem do ustawiania dzielników TTL 74192 w moich syntezerach PLL.. oj fajnie się bawiło z tymi kostkami, cieszyłem się jak dzieciak.. a teraz znowu cieszę się jak dzieciak przy zabawie z mikroprockami i ta stara wiedza ma szanse dostać nowe życie :)

Autor:  MirkoT [ 5 mar 2018, o 22:06 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

SP2LUB napisał(a):
a teraz znowu cieszę się jak dzieciak przy zabawie z mikroprockami i ta stara wiedza ma szanse dostać nowe życie :)

I to jest właśnie najfajniejsze :)

Autor:  mczarny [ 6 mar 2018, o 07:11 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

"dziadek Sławek" wymiata :D :D :D

Autor:  ezgman [ 7 mar 2018, o 07:38 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

Fajne rozwiązanie, ale tylko dla trzech, czy pięciu klawiszy.

SP2LUB napisał(a):
z Czterech pinów będziemy mogli mieć 16 klawiszy czyli już lepiej niż klawiatura matrycowa która potrzebuje całego portu.
Widzę jedną, ale za to ogromną, wadę tego rozwiązania. Ilość diod.
Przy dołożeniu czwartego bitu trzeba dodać 20 diod? Łącznie 32? Ile to miejsca na płytce zajmie?

Odrobinę można usprawnić, bo dlaczego nie zrezygnować z diod D1, D4 i D5? Nic nie robią w tym układzie. A z 12 zrobi się 9...

W ramach oszczędności miejsca można zastosować coś z tego:
https://www.tme.eu/pl/katalog/diody_112 ... A394692%3B

Ale gdybym miał zrobić klawiaturę z 16 klawiszami, a miał problem z portami, to pewnie dałbym jakiegoś małego tiny jako kontroler klawiatury. Zaoszczędziłbym na miejscu (a może i na kosztach).... A gdyby klawiszy miałoby być jeszcze więcej, powiedzmy 20, to rozwiązanie z drabinką diod zamienia się w koszmar.

Autor:  SylwekK [ 7 mar 2018, o 07:46 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

Idąc w nietypowe rozwiązania można też użyć rejestrów przesuwnych i na trzech linach zrobić w zasadzie dowolną ilość przycisków :)

Autor:  SP2LUB [ 7 mar 2018, o 08:55 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

ezgman napisał(a):
Odrobinę można usprawnić, bo dlaczego nie zrezygnować z diod D1, D4 i D5? Nic nie robią w tym układzie. A z 12 zrobi się 9...

Czy rzeczywiscie D1, D4, D5 nic nie robia? :) Pewny jestes? :)

Oczywiscie jest masa rozwiazan z zastosowaniem dodatkowego ukladu scalonego (dedyowanego do taich rzastosowan albo i nie)... ale tez ja nie mowie ze klawisze w kodzie BCD to jedyna sluszna droga.

Autor:  ezgman [ 7 mar 2018, o 14:59 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

SP2LUB napisał(a):
Czy rzeczywiscie D1, D4, D5 nic nie robia? :) Pewny jestes? :)
Nie jestem, dlatego chętnie poznam wyjaśnienie ich roli.
Schemat jest niekompletny, a etykiety sygnałów nieczytelne, ale widać że:
D5 jest podłączone do linii PB4, D1 do PB5 a D4 do PB6
Katody idą zapewne to mikroswitchy.
To są jedyne switche które zwierają tylko jedną linię do masy. Reszta powoduje stan niski na więcej niż jednej linii.
Wciśnięty switch daje stan niski na podłączonej linii, prąd płynie przez diodę. Mamy, powiedzmy, 0,7V na linii. Zwolniony switch powoduje, że katoda diody wisi w powietrzu, a na linii jest Vcc.
Bez diody powinno działać tak samo, tyle, że przy wciśniętym przycisku będzie 0V zamiast 0,7V. A przy zwolnionym i tak końcówka wisi w powietrzu, więc nie ma różnicy.
W mojej opinii, diody potrzebne są tylko tam, gdzie jest ich dwie lub trzy podłączone do jednego switcha.

Gdzie popełniam błąd?

Autor:  SP2LUB [ 7 mar 2018, o 17:25 ]
Tytuł:  Re: Klawiatura BCD dziadka Sławka

Sama obecność tych diod już sprawia że mają one coś do "zrobienia" :) Masz rację że schemat jest niekompletny a etykiety nie są czytelne.
Jednak wystarczy ten schemat aby przedstawić ideę i pomóc zrozumieć jak funkcjonuje, komuś ktoś nie zna takiego rozwiązania, a internet mu go nie podsuwa. Etykiety w tym momencie nie mają kompletnie żadnego znaczenia, chodzi wyłącznie o ideę klawiaturowania :)
Masz rację że nie widać jak wygląda klawiatura, a rzeczywiście ma to znaczenie gdy chcesz oszczędzać na diodach, ponieważ Twoja sugestia z wywaleniem tych diod jest słuszna, klawiatura będzie działać tak samo.
W moim układzie ta klawiatura steruje nie tylko Atmegą128, jest do niej podłączony jeszcze jeden układ będący częścią interfejsu użytkownika. Ten sterownik powstał z potrzeby chwili żeby ratować stare urządzenie które poległo w konfrontacji z zębem czasu :)
Czyli diody mają za zadanie w pewnym sensie izolowanie sterownika od reszty układu.

Kolejna kwestia jaką poruszyłeś to priorytety. To prawda że diody zajmują miejsce szczególnie jeżeli są przewlekane, ale nie zawsze priorytetem jest rozmiar jakkolwiek to zabrzmi :D Czasami po prostu wala się w szufladzie stado diod, a czasami jakieś multipleksery czy inne cosie.. Ja mam tysiące takich diod i z przyjemnością je tam umieściłem. Nie musiałem nic zamawiać i tworzyć dodatkowych kosztów, tym bardziej że PCB zrobiłem sobie tak jak potrzebowałem w rozmiarze który był już uwarunkowany miejscem w istniejącym urządzeniu.
Reasumując, diody robią co powinny robić w tym przypadku a sama idea została przedstawiona i mam nadzieję że komuś się przyda.

Przydało by się opracowanie jakiejś bardziej eleganckiej metody programowego dekodowania stanów na pinach klawiatury. Przyszła mi do głowy metoda tablicowa, ale ponieważ chciałem mieć możliwość korzystania z dowolnych pinów które czasem zostają na różnych portach, i nie bardzo widzę jak to zgrabnie poskładać żeby na koniec mieć fajną biblioteczkę do takiego twora. Przyglądam się temu rozwiązaniu z Mirkowej biblioteki enkodera.. może jak przyjdą Święta i będzie nieco więcej czasu to postaram się to ogarnąć. Zrobić taką "matrycę" BCD w tablicy i potem przez callbacki obsługiwać to dalej.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/