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



Teraz jest 1 gru 2024, o 19:55


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
Avatar użytkownika

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

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 ]
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
Avatar użytkownika

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

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 ]
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 ]
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 ]
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 ]
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 1 gość


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