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):
http://www.orinoco.host.sk/prog_bas.zip
Jakby ktoś coś wiedział to proszę o pomoc.
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.
.....
...
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 -
1. Na wejściach włączyć pull-upy, a wyjścia sterować tak, aby zachowywały
się jak "open drain".
2. A może by tak tą diodę wywalić? Po co tu ona? Przesuwa stan niski do
około 0,7 - 0,8V. Jeśli do tego doda się inne spadki, np. na buforze
wyjściowym MCU, to okaże się że stan niski jest w obszarze zabronionym.
Paweł
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
If Pina.4 = 0 Then
Liczba = 1 'wcisnieto "1"
If Pina.4 = 0 Then
Liczba = 2 'wcisnieto "2"
Nie wiem jak Atmel, ale niektóre procesory stan pinów ustawiają w czasie
następnego cyklu po rozkazie, a stan odczytywany to stan złapany podczas
poprzedniego rozkazu.
Więc tutaj If może testować stan jeszcze sprzed Reset (albo w czasie trwania
akurat zbocza).
P.G.
Witam,
Dzięki wszystkim za info, faktycznie pomogło dołożenie opóźnienia między
wystawianiem zera a odczytem linii :)