Witam,
Kupiłem klawiaturę matrycowa 4 na 4 (4 rzedy i 4 kolumny). Podłączyłem ją do ATMegi16 nastepująco: linie portu A0-A3 biegną bezpośrednio do klawiatury (na "rzędy" - piny 1-4 w klawiaturze), a linie A4-A7 biegną poprzed diodę na piny 5-8 klawiatury (kolumny).
A0-A3 to są wyjścia i na nich jest krążące 0 (na pozostałych w danej chwili jest "1"), a A4-A8 to są wejścia podciągnięte do "1" przez wewnętrznego pullupa w atmedze (porta=1).
Sytuacja jest taka: wszystko działa pięknie oprócz klawiszy na 1 rzędzie klawiatury i to nie wszystkich: klawisz "1" działa, a "2", "3" w ogóle nie działają, a "A" działa aż zanadto :D Wytłumaczę: wszystkie te sporne kalwisze znajdują się na wejsciu procka A4. Z wejściami A5-A7 nie ma żadnego problemu. Co najlepsze wejście A4 dobrze współpracuje z wyjściem A0 (klawisz "1" działa OK). Natomiast źle działa z A1, A2 i A3. Testowałem na
3 egzemplarzach procka, zawsze to samo. Nie zależy to też od klawiatury ani od plytki.
Działanie klawiatury jest takie, że w momencie naciśnięcia klawisza krazace
0 powinno zejsc do wejscia. Ale na klawiszu "2" i "3" zero jakby całkowicie nie schodzilo, bo na linii A4 robi sie nagle zamiast "0" stan pośredni - ani 0 a ni 1 ze wskazaniem na 0... Z klawiszem "A" - skrzyżowanie A3 i A4 sytuacja jest inna. Powinno być tak, że procek trzyma 0 dopóki ni epuszcze klawisza i dopiero potem pojawia sie na wejsciu "1". Niestety w przypadku klawisza "A" sytuacja jest taka, że tylko na moment przeskakuje na "0", procek to odnotowuje, a potem natychmiast pomimo braku puszczenia klawisza przechodzi stan na "1"!!! Nie wiem dlaczego tak jest. Czy ktoś potrafi mi pomóc? Już naprawde nie mam sił z tym... Wszystko testowałem miernikami, próbnikami stanów logicznych - niestety dalej to samo. Oto kod odpowiedzialny za klawiaturę:
---------------------------------------------------------------------------------------------------- 'Procedura obsługi klawiatury 'Po kolei wysyłamy "0" na kolejne kolumny matrycy i patrzymy na którym wierszu przyszło Klawiatura:
Liczba = 16 'zakladamy, ze nic nie nacisnelismy
Reset Porta.0 Set Porta.1 Set Porta.2 Set Porta.3
If Pina.4 = 0 Then Liczba = 1 'wcisnieto "1" Bitwait Pina.4 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.5 = 0 Then Liczba = 4 'wcisnieto "4" Bitwait Pina.5 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.6 = 0 Then Liczba = 7 'wcisnieto "7" Bitwait Pina.6 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.7 = 0 Then Liczba = 14 'wcisnieto "*" Bitwait Pina.7 , Set 'poczekaj az klawisz zostanie puszczony End If
Set Porta.0 Reset Porta.1
If Pina.4 = 0 Then Liczba = 2 'wcisnieto "2" Bitwait Pina.4 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.5 = 0 Then Liczba = 5 'wcisnieto "5" Bitwait Pina.5 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.6 = 0 Then Liczba = 8 'wcisnieto "8" Bitwait Pina.6 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.7 = 0 Then Liczba = 0 'wcisnieto "0" Bitwait Pina.7 , Set 'poczekaj az klawisz zostanie puszczony End If
Set Porta.1 Reset Porta.2
If Pina.4 = 0 Then Liczba = 3 'wcisnieto "3" Bitwait Pina.4 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.5 = 0 Then Liczba = 6 'wcisnieto "6" Bitwait Pina.5 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.6 = 0 Then Liczba = 9 'wcisnieto "9" Bitwait Pina.6 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.7 = 0 Then Liczba = 15 'wcisnieto "#" Bitwait Pina.7 , Set 'poczekaj az klawisz zostanie puszczony End If
Set Porta.2 Reset Porta.3
If Pina.4 = 0 Then Liczba = 10 'wcisnieto "A" Bitwait Pina.4 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.5 = 0 Then Liczba = 11 'wcisnieto "B" Bitwait Pina.5 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.6 = 0 Then Liczba = 12 'wcisnieto "C" Bitwait Pina.6 , Set 'poczekaj az klawisz zostanie puszczony End If
If Pina.7 = 0 Then Liczba = 13 'wcisnieto "D" Bitwait Pina.7 , Set 'poczekaj az klawisz zostanie puszczony End If
If Liczba < 16 Then Gosub Glos_krotki 'jezeli nacisnieto przycisk to wydaj glos
Return
----------------------------------------------------------------------------------------------------
No i na początku programu definicje portów:
---------------------------------------------------------------------------------------------------- Config Pina.0 = Output 'piny do klawiatury bez diody Porta.0 = 1 Config Pina.1 = Output Porta.1 = 1 Config Pina.2 = Output Porta.2 = 1 Config Pina.3 = Output Porta.3 = 1 Config Pina.4 = Input 'piny do klawiatury z diodą Porta.4 = 1 Config Pina.5 = Input Porta.5 = 1 Config Pina.6 = Input Porta.6 = 1 Config Pina.7 = Input Porta.7 = 1
----------------------------------------------------------------------------------------------------
Dodam, że w przypadku gdy stosowalem reczna symulacje (bez procka) to wszystko jest ok na plytce (podawalem napiecia na odpowiednie piny w podstawce bez procka i aptrzylem cos ie pojawi na "wyjsciach".
Procek ATMega16 nowy z półki, bez żadnych modyfikacji ani nic, tylko ustawione wszystkie CKSEL w celu użycia zewnętrznego rezonatora kwarcowego. Cały program podaję tu (wraz z wszystkimi plikami z bascoma):
I jeszcze jedno: nie wiem czy to normalne ale do procka nie można podłączyć diody na port bezposrednio przez rezystor 150 omow i do masy, bo na porcie C w ogóle wtedy nie da sie wystawić "1" na tym pinie co jest ta dioda podłączona (napiecie w stanie "1" okolo 1,88V), a na porcie A jesdna dioda przechodzi jeszcze, ale 2 wieszaja procka. Diody trzeba przez tranzystor sterować niestety... Dodam, że LCD też mi nie działa (kod programu u góry) i też pewnie z powodu tego że każdy pin LCD trzeba przez tranzystor sterowac...
Zasilacz jest ok, ma wydajność około 1A przy 12V... Przy 5V jeszcze wiecej ;)
Dzięki za wszelkie info i pozdrawiam.