Do znawców AVR'ów, szczególnie ATMegi16 -

Apr 20, 2006 4 Replies

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



formatting link
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.


.....

...

  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ł

Użytkownik ****************** napisał:

No więc nie dawniej niż tydzień temu miałem dokładnie ten sam problem :) Czyli klwaiaturka 3x4 i Mega16... procedurka obsługi podobna... i podobny objaw...1 kolumny nie da się czytać, a w debugu wszystko jest ok. Mnie pomogła malutka pętla opóźniająca pomiędzy wystawianiem zer w wierszach. Pozdr Marek

Użytkownik "******************" snipped-for-privacy@host.sk napisał w wiadomości news: snipped-for-privacy@40tude.net...

Między Reset a If masz 3 x Set

Między Reset a If nie masz nic.

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required