Do =?iso-8859-2?Q?znawc=F3w_AVR'=F3w,_szczeg=F3lnie_ATMegi16_-?=
Masz problem? Zapytaj na forum elektroda.pl
From: ****************** <orinoco_at_nospam_host.sk>
Subject: Do =?iso-8859-2?Q?znawc=F3w_AVR'=F3w,_szczeg=F3lnie_ATMegi16_-?=
Date: Thu, 20 Apr 2006 23:38:29 +0200
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.
--
http://www.orinoco.host.sk
Unofficial ORiNOCO Support Page including ORiNOCO USB Classic Client
Simply the best!!!
From: "Paweł Cern" <name_at_nospam_surname.pl>
Subject: Re: Do znawców AVR'ów, szczególnie ATMegi16 - problem z klawiaturą
Date: Fri, 21 Apr 2006 07:28:12 +0200
.....
poprzed diodę na piny 5-8 klawiatury (kolumny).
...
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ł
From: "Marek P." <marco999_at_nospam_vp.pl>
Subject: Re: Do =?ISO-8859-2?Q?znawc=F3w_AVR=27=F3w=2C_szczeg=F3lnie_?=
Date: Fri, 21 Apr 2006 07:45:34 +0200
Użytkownik **************** napisał:
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
Witam,
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
From: =?iso-8859-2?Q?Piotr_Ga=B3ka?= <piotr.galka_at_nospam_CUTTHISmicromade.pl>
Subject: =?iso-8859-2?Q?Re:_Do_znawc=F3w_AVR'=F3w=2C_szczeg=F3lnie_ATMegi16_-_prob?=
Date: Fri, 21 Apr 2006 10:04:17 +0200
Użytkownik " ****************" <orinoco_at_nospam_host.sk> napisał w wiadomości
news:8gwd3oq4jnu6.hfg79tyo4uqj.dlg_at_nospam_40tude.net...
Reset Porta.0
Set Porta.1
Set Porta.2
Set Porta.3
If Pina.4 = 0 Then
Liczba = 1 'wcisnieto "1"
Między Reset a If masz 3 x Set
Reset Porta.1
If Pina.4 = 0 Then
Liczba = 2 'wcisnieto "2"
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.
From: ****************** <orinoco_at_nospam_host.sk>
Subject: Re: Do =?iso-8859-2?Q?znawc=F3w_AVR'=F3w,_szczeg=F3lnie_ATMegi16_-?=
Date: Sat, 22 Apr 2006 23:45:26 +0200
Witam,
Dzięki wszystkim za info, faktycznie pomogło dołożenie opóźnienia między
wystawianiem zera a odczytem linii :)
--
http://www.orinoco.host.sk
Unofficial ORiNOCO Support Page including ORiNOCO USB Classic Client
Simply the best!!!