Ads_700x200

sobota, 31 marca 2018

Klawiatura MATRYCOWA - ciekawa biblioteka w C

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.

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:









;)

17 komentarzy:

  1. Czekam z niecierpliwością na kolejne części ;)

    OdpowiedzUsuń
  2. 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.
    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

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń
    2. To może jeszcze raz napiszę bo chyba nie zostałem zrozumiany ;(
      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

      Usuń
    3. 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.
      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ę.

      Usuń
    4. Ok poprawka programowa jeśli chodzi o sytuację o jakiej napisałeś będzie wyglądać tak:

      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

      Usuń
    5. 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ć:
      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

      Usuń
    6. 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:

      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ś.

      Usuń
    7. Ja uparty jak ten baranek (oczywiście Wielkanocny ;) ).
      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 ;)

      Usuń
    8. Ło matko! nie po oczach tym strumieniem ! :D :D

      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 ;)

      Usuń
  3. Witam mam nadzieję że trzecia część powstanie ? czekam z niecierpliwością.

    OdpowiedzUsuń
  4. 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ń
  5. Kusisz Mirek kusisz :-)
    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". :)

    OdpowiedzUsuń
  6. Ja też chciałbym zobaczyć tworzenie tej biblioteki od podstaw.

    OdpowiedzUsuń
  7. Witam,
    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...

    OdpowiedzUsuń
  8. Gdzie można otrzymać kod źródłowy?

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń