Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 20 maja 2025, o 00:31


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
    Autor Wiadomość
    PostNapisane: 3 lut 2012, o 23:33 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    Kilku już się podpytywało o takie coś więc postanowiłem
    skrobnąć taki prosty mały programik do obsługi
    klawiaturki matrycowej 4x4 :)

    Czyli całkowicie zmarnotrawić miejsce na takie ustrojstwo :)
    Tym razem programik jest w AVRgcc, pod eclipse :)

    Testowo użyta została ATMEGA 16 popędzona na 16Mhz kwarcu.

    Jedziemy:

    Jak wiadomo klawiatura matrycowa to do niczego nieprzydatne i zajmujące dużo miejsca
    ustrojstwo które wcześniej czy później każdy chce umieć obsłużyć :)
    Jest to naprawdę nic trudnego:)

    Typowa klawiatura 4x4 wygląda tak:

    Nie no bez jaj każdy chyba wie jak wygląda nie mówiąc już o układzie połączeń
    mamy 16 klawiszy podzielonych na 4wiersze i 4 kolumny no to chyba jest jasne :)

    Chociaż ... a niech będzie
    Jak wiec mówiłem klawiatura 4x4 wygląda tak:

    Obrazek

    a schemat połączeń jest następujący:

    Obrazek


    No teraz chyba jasne :) ale bez przesady i nie pisać mi tu że moja ma inne wyprowadzenia
    bo są setki producentów głównie w chinach i pretensje o układ pinów do nich :)

    Zasada jest podobna jak w przypadku multiplexowania wyświetlaczy z tym ze tu czytamy
    piny , a nie wysyłamy na piny :)

    Program jest bardzo prosty i nie powinien nikomu sprawić problemu
    dodałem taka sobie prostą obsługę LCD żeby każdy mógł sobie sprawdzić jak to działa
    myślę że po przeczytaniu książki kolegi MIRKA oraz komentarzy w programie
    wszystko jest jasne ...

    Nie będę się tu rozpisywał więc specjalnie bo niema potrzeby , a już wielu uważa ze piszę
    przydługawe epopeje więc nie będziemy z tak prostej sprawy robić 2 części Wojny i Pokoju :)

    hehehe :)

    void Oto_kod_zrodlowy()
    {

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


    }

    hihihi ... miłej zabawy z tym idiotycznym i zbędnym urządzeniem jakim jest klawiatura matrycowa.

    No tak a najważniejsze to gdzie zaraz malkontenci zaczną płakać jak to podłączyć ...
    w sumie mogę być złośliwy i napisać przecież wszystko jest w kodzie -- prawda ??

    Ale tak nie zrobię ... dlaczego ??
    dlatego że jest tu dla was coś nowego mianowicie postanowiłem być bardzo rozrzutny
    i LCD sobie obsługuję w trybie 8bitowym a nie jak zazwyczaj oszczędnie i prosto robimy to
    na 4bitach :)

    Tak więc podłączamy wszystko zgodnie ze schematem:

    Obrazek

    Tak to sobie wygląda dlaczego mega16 bo się walała poza tym większość posiada
    płytkę ATB Mirka więc procek na miejscu --- nie wiem tylko czy czasem Mirek nie
    okroił LCD na płytce z 4 bitów :(

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 lut 2012, o 18:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 25 gru 2011
    Posty: 204
    Lokalizacja: Boguchwała
    Pomógł: 3

    A miałem przypadek ...naście lat temu zaprogramować (w asemblerze) taką właśnie klawiaturkę by uzdrowić jakąś austriacką kuchenkę mikrofalową.
    Twój program może się komuś przydać ....może np. wspomóc nasze ' zabytkowe pioniery ' ;)
    Wiem, zabytki powinny pozostać zabytkami .... ale jakby ktoś chciał, to czemu nie :roll:



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 lut 2012, o 18:10 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    temu zapodałem żeby ktoś co mu się takie coś widzi mógł sobie rozwinąć
    to założenie u używać do swoich niecnych celów :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 lut 2012, o 18:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 24 paź 2011
    Posty: 580
    Lokalizacja: Warszawa
    Pomógł: 0

    Ja osobiście lubię te klawiaturkę :)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2012, o 21:07 
    Offline
    Nowy

    Dołączył(a): 24 paź 2012
    Posty: 21
    Pomógł: 0

    Witam,
    krótko o sobie napiszę, że bawić się mikroprockami AVR zacząłem dość niedawno ok 2 lat temu tzn. książkę przeczytałem całą "Podstawy programowania" w maju 2011 i trochę sobie poćwiczyłem, ale od tamtej pory nie robiłem nic. W sumie zrobiłem sobie przerwę od programowania trochę dłuższą niż rok. Niedawno zmotywowany do działania zacząłem sobie powtarzać materiał ( wczoraj dokładnie :D ), a dziś się wziąłem za obsługę klawiatury matrycowej 4x4. Rozumiem, że dla bardziej zaawansowanych jest zbędna, ale niestety moja praca dyplomowa jej wymaga. Prosiłbym więc, by mnie traktować jak nowicjusza. Przeanalizowałem kod powyżej i nasuwają się pytania, które umieściłem w komentarzach poniżej zamieszczonego fragmentu kodu, który dotyczy głownie obsługi klawiatury:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Nie chcę by moje pytania zostały odebrane jako atak. Staram się wnikliwe analizować, po co i na co programista zastosował niektóre sztuczki. Mogę się domyślać po co, ale wyznaję zasadę, że lepiej zapytać i upewnić się.
    Program działa w następujący sposób, że przy moim założeniu zmieniam bity na kolumnach. Na każdą kolumnę po kolei jest wystawiane 0, a w momencie naciśnięcia dowolnego przycisku robimy zworę między wierszem i kolumną, a na nasz wiersz trafia sygnał z kolumny. Odczytujemy to przy pomocy zmiennej pomocniczej(jako warunek) i następnie z czytujemy wartość(PINx) z portu do kolejnej zmiennej, która znajdzie się w którymś Case w instrukcji Switch. Niżej wklejam kod przerobiony przeze mnie i dostosowany do mojego układu. Kod działa poprawnie na moim układzie uruchomieniowym:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Czy dobrze zrozumiałem zasadę działa programu ?
    Dziękuję za odpowiedzi i pozdrawiam :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2013, o 21:43 
    Offline
    Nowy

    Dołączył(a): 26 sty 2013
    Posty: 1
    Pomógł: 0

    To ja też dorzucę swoje 3 grosze.
    Otóż w przytoczonym przykładzie obsługi klawiatury matrycowej jest pewne niedopatrzenie, którego na pierwszy rzut oka nie widać, a które może doprowadzić do uszkodzenia portów procesora. Sytuacja taka może wystąpić w przypadku niechcącego (lub też zamierzonego w bardziej zaawansowanych programach obsługi klawiatury matrycowej) naciśnięcia więcej niż jednego klawisza. W programie piny wymuszające stany niskie na matrycy (PB0 - PB3) pracują jako wyjścia. W danym momencie na jednym z tych pinów wystawiony jest stan niski (np PB0), podczas gdy na pozostałych pinach wymuszających wystawiany jest w tym samym czasie stan wysoki (PB1, PB2 i PB3). Jeżeli teraz naciśniemy jednocześnie dwa klawisze (w opisywanym przypadku będą to klawisze C i 8) to nastąpi nic innego jak zwarcie VCC i GND poprzez dwa porty PB1 i PB0. Może to doprowadzić do uszkodzenia jednego z tranzystorów w którymś z tych portów.
    Bardzo łatwo jest poprawić ten program, tak by wyeliminować ten problem. Wystarczy przy wymuszaniu stanu niskiego na pinach PB0-PB3 sterować nie portem PORTB lecz DDRB czyli sterować kierunkiem portu (oczywiście wcześniej należy do portu PORTB na piny PB0-PB3 wpisać stan 0). Teraz przy wymuszaniu stanu niskiego na matrycy ustawiamy dany pin na wyjściowy (np PB0). W tym samym czasie pozostałe piny PB1-PB3 pracują jako wejściowe czyli sa ustawione w stan wysokiej impedancji HiZ i wszytko jest bezpieczne. Możemy naciskać dowolnie wiele klawiszy i nic nam się nie uszkodzi.
    Reasumując - podczas skanowania matrycy w danym momencie tylko jeden pin jest ustawiony jako wyjściowy, a pozostałych 7 jako wejściowe (3 są w stanie HiZ a 4 mają wewnętrzne podciągania do VCC). Notabene można program uprościć ustawiając wszystkie porty wejściowe w HiZ, ale wymaga to dodania 4 zewnętrznych rezystorów podciągających an pinach odczytujących stan matrycy.
    Wiem, że opisany przeze mnie przypadek jest przypadkiem szczególnym, ale lepiej gdy program jest on odporny na różne sytuacje. Tym bardziej, że poprawka jest banalna.

    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 sty 2013, o 00:31 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sty 2013
    Posty: 123
    Lokalizacja: Warszawa
    Pomógł: 10

    Dobry pomysł - właśnie u siebie dokonałem poprawki.
    Działa bezproblemowo :-)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2013, o 16:46 
    Offline
    Nowy

    Dołączył(a): 01 lut 2013
    Posty: 3
    Pomógł: 0

    Można do tego dorzucić jeszcze wykrywanie wielu klawiszy i przytrzymanie klawisza. Tak jak to pierwsze właściwie nie ma praktycznego zastosowanie, tak wykrywanie długiego przytrzymania bardzo się przydaje... Oczywiście można tez się pokusić o napisanie procedury gdzie możemy zadeklarować dowolną ilość wierszy i kolumn (oczywiście w granicach jakiś stałych określających MAX).
    Warto też zmienić podejście do programowania tego rodzaju procedur, bo wykrycie długiego przytrzymania nie może być realizowana kosztem zajętego procesora przez czas naciśnięcia klawisza.
    Zatem trzeba napisać procedurę tak, jakby była to procedura przerwania, czyli: "zrób najszybciej jak potrafisz i zakończ". W takim przypadku procedura musi zapisywać swój stan, aby mogła kontynuować swoją pracę przy kolejnym wywołaniu. Wywołania natomiast powinny być cykliczne co np. 10us. Dzięki temu procesor może przez resztę czasu zajmować się innymi "rzeczami" a my nie musimy używać funkcji _delay_xs().



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lut 2013, o 18:31 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sty 2013
    Posty: 123
    Lokalizacja: Warszawa
    Pomógł: 10

    Ja używam w tym przypadku maszyn stanów, które działają właśnie jak to kolega wyżej opisał. Wówczas oczekiwanie na jakieś zdarzenie nie blokuje procesora - można to nazwać stanem "dynamicznego zatrzymania" :-)
    Ale wymaga to zmiany filozofii programowania (przy całościowym podejściu do programu).
    Natomiast mniejsze procedurki tego typu można wpleść w normalny kod bez większego wysiłku i sprawdzają się bardzo dobrze - ciężko je zawiesić.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lut 2013, o 22:42 
    Offline
    Nowy

    Dołączył(a): 01 lut 2013
    Posty: 3
    Pomógł: 0

    Dodaj tylko, że do mojej procedury muszę jeszcze jutro dodać blokowanie wykrywania wciśnięcia tego samego klawisza 2x w czasie mniejszym niż 100ms, bo mam klawiaturę z przerobionego kalkulatora, i klawisze mają bardzo płytkie wciśnięcie. Czasami wykrywa mi dwuklik :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 lis 2013, o 11:58 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2012
    Posty: 712
    Lokalizacja: Opole
    Pomógł: 23

    Postanowiłem sam podejść do tematu klawiatury 4x3 stworzyłem mini mini biblioteke do jej obsługi ale neistety na wyświetlaczu cały czas widzę "1" a jak dotknę klawiatury to jakieś śmieci. Podejrzewam że problem dotyczy jakiś śmieci, ewentualnie przewód robi za antenę i zbiera wszystko.

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


    plik klaw4x4.c

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


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



    P.S teraz zauważyłem że w funkcji klaw_read po przejściu przez wszystkie wiersze nie ustawiam zmiennej wiersz na 1 ale to pewnie nie to powoduje problemy z zakłóceniami.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 mar 2014, o 21:57 
    Offline
    Użytkownik

    Dołączył(a): 19 mar 2014
    Posty: 87
    Lokalizacja: Okolice Ostrołęki
    Pomógł: 3

    A ja nie mogę zrozumieć istoty działania tej klawiatury, może zrozumiem jutro jak się wyśpię, a może te HEXy mnie mylą :)
    Jak ustawić, które porty i co sczytać.
    Gdyby był pin 9 to było by prościej wszystkie 16 klawiszy są podpięte pod GND i sczytuje się które dwa piny dostały GND i po sprawie, a tu nie rozumiem..
    Wiem, że to proste ale nie mogę zajarzyć

    _________________
    BB



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 mar 2014, o 07:28 
    Offline
    Użytkownik

    Dołączył(a): 19 mar 2014
    Posty: 87
    Lokalizacja: Okolice Ostrołęki
    Pomógł: 3

    Proszę nadal o pomoc

    _________________
    BB



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 mar 2014, o 14:55 
    Offline
    Użytkownik

    Dołączył(a): 17 sty 2013
    Posty: 327
    Lokalizacja: Białystok
    Pomógł: 14

    Powiększ sobie ten obrazek, może animacja da Ci lepsze zrozumienie:
    Obrazek

    Obrazek przelatuje 2x, najpierw pokazuje gdy żaden klawisz nie jest wciśnięty, następnie gdy wciśniemy klawisz nr 8.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 mar 2014, o 20:30 
    Offline
    Użytkownik

    Dołączył(a): 19 mar 2014
    Posty: 87
    Lokalizacja: Okolice Ostrołęki
    Pomógł: 3

    Już to jarzę po troszeczku, dziękuje :)

    _________________
    BB



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 maja 2014, o 12:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 lut 2014
    Posty: 210
    Lokalizacja: Poznań
    Pomógł: 12

    Pozdrawiam bywalców i jednocześnie INFORMUJĘ że jestem Początkującym w dziedzinie
    programowania (typowy amator). Zakupiłem zestaw ATB SCORPIO i moje pytanie tyczy oprogramowania
    tejże klawiaturki pod ten zestaw , czyli sterowanie LCD 4 bitowe oraz jak by wyglądało
    wstawienie poprawki zasugerowanej przez pana Bambzo.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 lis 2015, o 16:05 
    Offline
    Użytkownik

    Dołączył(a): 09 kwi 2015
    Posty: 44
    Pomógł: 0

    Witam mam pytanie co do wykorzystania tego kodu w większych programach:)
    Bawię się na ATmedze32 i fajnie kod działa ale jak sprawdzać ilość wyświetlanych cyfr? Bo powiedzmy że chce zczytać z klawiatury zmienna. jak tego dokonać?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO