Witam,
Było już o drganiach styków "to bajki?" ;) ... no to nadszedł czas w końcu, aby zabrać się za obsługę klawiaturek matrycowych na poważnie. Tym razem zaprzęgniemy do pracy przerwania, zaś sama biblioteka jaka powstanie w wyniku tego cyklu - będzie uniwersalna i pozwoli zastosować we własnych projektach zarówno klawiatury 4x3 (czyli 12-to klawiszowe) oraz 4x4 (czyli 16-to klawiszowe). Zaś po przeróbkach źródeł zapewne uda się obsłużyć jeszcze wiele innych rodzajów klawiatur, w tym także własnych. Poradnik oczywiście skierowany jest do CAŁKOWICIE POCZĄTKUJĄCYCH ... którzy dopiero rozpoczynają przygodę z tego typu urządzeniami wejściowymi ;). Przy okazji napomknę tylko, że ten poradnik stanowić będzie swego rodzaju wstęp do kolejnego - w którym omówimy również ciekawy projekt dla początkujących ale tak od A do Z. Wykorzystamy w nim stworzoną tutaj bibliotekę a przy okazji nauczymy się stosować różne inne ciekawe techniki programowania.
Ok zapraszam...
Bibliotekę można nabyć tutaj:
Ok zapraszam...
oto filmiki:
PREZENTACJA GOTOWEJ JUŻ BIBLIOTEKI W OSTATECZNEJ I ROZSZERZONEJ WERSJI, wraz z obsługą pojedynczych przycisków:
Bibliotekę można pozyskać pod tym linkiem: https://goo.gl/mwCeq4
Poniżej poradniki omawiające proces tworzenia tego typu biblioteki od podstaw we własnym zakresie:
PREZENTACJA GOTOWEJ JUŻ BIBLIOTEKI W OSTATECZNEJ I ROZSZERZONEJ WERSJI, wraz z obsługą pojedynczych przycisków:
Bibliotekę można pozyskać pod tym linkiem: https://goo.gl/mwCeq4
Poniżej poradniki omawiające proces tworzenia tego typu biblioteki od podstaw we własnym zakresie:
;)
Czekam z niecierpliwością na kolejne części ;)
OdpowiedzUsuńPrzy ustawianiu wszystkich kolumn na wyjścia i ustawiając na jednej kolumnie 0 a na pozostałych kolumnach 1, to gdy naciśniemy dwa klawisze z tego samego wiersza w tym samym czasie dwa różne klawisze, to mamy zwarcie wyjść kolumn z wystawionym 0 oraz z wystawionym 1.
OdpowiedzUsuńCzy przypadkiem nie powinno być tak, by wszystkie kolumny poza tą w danej chwili wybraną (wystawionym 0) powinny być ustawione jako wejścia z pull-upem by nie robić "zwarcia" przy naciśnięciu więcej niż jednego klawisza?
--
Pozdrawiam,
Robert
Coś kolega przekombinował ;) TYLKO na jedno wyjście TYLKO na jedną kolumnę jest i będzie podawane zero, cyklicznie po kolei na każdą z nich i bez żadznego dziwnego przełączania pinów kolumn na WEJŚCIA ;) ... tu już kolega przekombinował. Postaraj się lepiej przeanalizować te trzy linijki kodu z końca przerwania bo to one tym się zajmują ... Już nie wspomnę, że na diodach LED obok pokazałem i sam też możesz się przekonać jak to działa - nawet w spowolnieniu gdy dodałem do przerwania _delay_ms(400) ;)
UsuńTo może jeszcze raz napiszę bo chyba nie zostałem zrozumiany ;(
UsuńWeźmy rysunek z pierwszej części pokazany w minucie 5:35. Ustawiamy cyklicznie na jednym z pinów PC4, PC5, PC6, PC7 wartość 0 a na pozostałych ustawiamy 1. Wszystko jest OK do puki wciskamy jeden klawisz. Ale co będzie gdy ustawimy np. PC4...PC7 = 0111 a wciśniemy klawisze 1 i 2? Wejście PC0 będzie zwarte do wyjścia PC4 podającego 0 oraz wejście PC0 będzie zwarte do PC5 podające na wyjściu 1. Czyli zewrzemy wyjścia PC4 z PC5 mające przeciwne stany!
--
Pozdrawiam,
Robert
A tak teraz rozumiem o co chodziło no i oczywiście masz tu 100% racji, że może dojść do takiej sytuacji. Można to załatwić diodami z rezystorami na liniach kolumn albo tak jak piszesz ew ustawianiem pozostałych pinów kolumn, gdzie ma panować stan wysoki jako WEjście z podciągnięciem no ale to ewidentnie z kolei zwiększy czas obsługi w przerwaniu, więc rozwiązanie sprzętowe z diodami i rezystorami na liniach kolumn byłoby może opytmalniejsze - ale znowu problem bo trzeba byłoby babrać się z tymi elementami dyskretnymi.
UsuńTak czy inaczej warto o tym wspomnieć. Na szczęście też te klawiaturki foliowe są tak zrobione, że te ich ścieżki mają stosunkowo sporą rezystancję więc ciężko upalić w ten sposób pin procka, co nie znaczy, że to jest rozwiązanie problemu.
Ja po prostu na tym etapie nie rozpatrywałem reakcji na wciskanie kilku przycisków - bo tak samo metoda o której mówię nie bierze pod uwagę sytuacji, gdy ktoś wciśnie DWA przyciski w ramach jednej kolumny. Omawiana tu biblioteka nie zadziała prawidłowo w takiej sytuacji - no ale to już kwestia tylko problemu w kodzie a nie w sprzęcie i możliwym zwarciu na pinach.
DZIĘKUJĘ za słuszną uwagę.
Ok poprawka programowa jeśli chodzi o sytuację o jakiej napisałeś będzie wyglądać tak:
Usuńuint8_t out = pgm_read_byte( &tab[licznik] );
KBD_DIR = ( KBD_DIR & 0x0F ) | ( out & 0xF0 );
KBD_PORT = ( KBD_PORT & 0x0F ) | ( ~out & 0xF0 );
i na szczęście jednak nie zajmie dużo dużo więcej czasu - ok 10 dodatkowych cykli zegara
tab[] jest częścią biblioteki, więc nie ma sensu jej walidowania (dodatkowego maskowania na wszelki wypadek) w kodzie. Dlatego czy nie prościej i szybciej będzie w wersji po zmianie dać:
UsuńKBD_DIR = out;
KBD_PORT = ~out;
Mając wartości 0x10, 0x20, 0x40, 0x80, będziemy ustawiać wyjście DIR = 1 tylko na jednym pinie. Reszta będzie wejściem bo DIR = 0 a przez negację to od razu będzie ten jeden pin jako zero a reszta pinów będzie miała pull-upy.
A kod będzie zabezpieczony przed zwarciem i krótszy :D
--
Pozdrawiam,
Robert
Ja rozpoczynałem pisanie biblioteki od klawiaturki 4x3 i stąd to maskowanie out, które później, tak na szybko tylko przeniosłem dla klawiaturki 4x4. Bo niestety dla klawiatury 4x3 gdy chcemy mieć pin 7 "nie ruszany" bo wykorzystywany jest do innych celów niż obsługa klawiatury, to nie da rady tak zrobić jak piszesz. Będzie trzeba jednak pobawić się w maskowanie:
Usuńuint8_t out = pgm_read_byte( &tab[licznik] );
KBD_DIR = ( KBD_DIR & 0x8F ) | ( out & 0x70 );
KBD_PORT = ( PORTC & 0x8F ) | ( ~out & 0x70 );
ale dla klawiaturki 4x4 ;) masz rację da się to uprościć dokładnie tak jak pokazałeś.
Ja uparty jak ten baranek (oczywiście Wielkanocny ;) ).
UsuńNie wiem dlaczego tak nie ufasz zmiennej out i musisz ja maskować ;). Według mnie tego nie trzeba :), więc można usunąć jedną operację &:
KBD_DIR = (KBD_DIR & 0x80) | out;
KBD_PORT = (KBD_PORT & 0x80) | (~out & 0x7F);
Wracając do Świąt, to życzę Ci oraz Twojej rodzinie wesołych, spokojnych, rodzinnych i zdrowych (by nie było problemy w tworzeniu poradników ;) ) Świąt Wielkanocnych oraz mokrego Dyngusa.
--
Pozdrawiam,
Robert
PS. Już na zapas na lany poniedziałek psikam Cię ze strumienia bitów wysyłanych po rs232 ;)
Ło matko! nie po oczach tym strumieniem ! :D :D
Usuńa wracając do meritum naszych rozważań no to ok - święta racja - skoro już tak wyrywamy każdy cykl maszynowy to rzeczywiście to drugie maskowanko można sobie odpuścić dla KBD_DIR ;)
Witam mam nadzieję że trzecia część powstanie ? czekam z niecierpliwością.
OdpowiedzUsuńTak, chcę dowiedzieć się jak powstała biblioteka do obsługi klawiatury z bajerami typu wciśnięcie, zwolnienie, trzymanie wciśniętego klawisza.
OdpowiedzUsuńKusisz Mirek kusisz :-)
OdpowiedzUsuńJa używam w porywach do 5 przycisków, ale... cholera czemu nie więcej? :D
Bardzo fajny poradnik. Pozdrawiam i życzę przysłowiowego "mokrego jajka". :)
Ja też chciałbym zobaczyć tworzenie tej biblioteki od podstaw.
OdpowiedzUsuńWitam,
OdpowiedzUsuńmam sugestię dotyczącą wszystkich poradników - prośba o zwiększenie dwukrotnie czcionki kodu, bo nawet w okularach na TV 50" z kilku metrów jest mało czytelnie.
A co do tworzenia biblioteki od podstaw, to jak najbardziej proszę o kolejne odcinki...
Gdzie można otrzymać kod źródłowy?
OdpowiedzUsuńJak dobrze pójdzie to pojawi się jutro w sklep.atnel.pl ... wynikła pewna zwłoka ale mam nadzieję, że wszyscy chętni się ucieszą - ponieważ pojawiło się dzięki temu w bibliotece kilka NOWYCH i MEGA Funkcjonalności ;) normalnie aż chyba przesadziłem - ale będzie niezła jazda bez trzymanki ;) ... a przy okazji usunąłem też pewnego BABOLA który nie dawał mi spokoju. Nakręcę jeszcze krótką prezentację WIDEO ostatecznej i najnowszej wersji tego LIB'sa - który (uchylając nieco rąbka tajemnicy) nie będzie służył już li tylko do klawiatur! ;)
Usuń