logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Proszę o pomoc - ATMega16 + klawiatura matrycowa nie działa

tebe 21 Kwi 2006 07:19 2025 5
REKLAMA
  • #1 2549998
    tebe
    Poziom 10  
    Posty: 11
    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

    Jest też jako załącznik bez prowizji.

    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 informacje i pozdrawiam.
    Załączniki:
    • prog_bas.zip (24.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2550370
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Witam. Wiesz,przede wszystkim sądzę że powinieneś zastosować jakąkolwiek eliminację drgań styków klawiatury bo wnioski z działania programu mogą być mylące.
    Zrób to na przykład tak:

    If pina.4=0 then
    waitms 25
    if pina.4=0 then
    Liczba = 10
    Bitwait Pina.4 , Set
    End If
    End if

    Każdy mikrowyłącznik drga podczas naciskania,może to powodować nieoczekiwane niewłaściwe działanie programu,eliminujemy to stosując zwłokę (ok.25mS)w 2 kolejnych odczytach stanu pinu,jeśli wykryte jest 0 i po 25 Ms też to jest prawie pewne że wciśnięto klawisz a nie jest to zakłócenie.
    Pozdrawiam
  • REKLAMA
  • #3 2550408
    Oineh
    Poziom 20  
    Posty: 395
    Pomógł: 48
    Ocena: 21
    Jak używasz baskomu to tam jest podprogramik obsługi klawiatury getkbd Z tego skorzystaj. Ja mam jeszcze podpięte rezystory na wszystkie piny po 200Ω. Wszystko jest w helpie do bascoma. Jak by coś jeszcze to pisz na GG albo PW. Ale uważam że klawiatura matrycowa to jest nie zabardzo. Przydało by się zastosować jakiś dekoder pomiędzy klawiaturę a procka. Ale do tego się dopiero przymierzam i nie będę się wypowiadał...
  • REKLAMA
  • #4 2550458
    WaldekPrzybyłek
    Poziom 15  
    Posty: 103
    Pomógł: 10
    Ocena: 4
    Przejrzałem program i moje wnioski:
    1) brak deklaracji $regfile="m16def.dat" na początku programu
    2)co do portu c sprawdż czy masz wyłączonego jtag-a
    3)zgadzam się z jacobsek co do drgań styków - napewno trzeba to poprawić

    Pozdrawiam.
    Waldek.
  • REKLAMA
  • #5 2551156
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Co do dekodera to jeśli są wolne porty to nie ma takiej potrzeby przy matrycy,dekoder to kolejna komplikacja układu
  • #6 2552313
    sysio10
    Poziom 16  
    Posty: 110
    Pomógł: 13
    Ocena: 14
    A co do portu C to dzisiaj sam otrzymałem z forum rozwiązanie:
    FUSEBIT J Disable JTAG - i port zaczął działać jak porty A,B.D
REKLAMA