Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4

adrian1711 06 Wrz 2012 21:22 1923 12
  • #1 06 Wrz 2012 21:22
    adrian1711
    Poziom 6  

    Wczoraj zlutowałem sobie na płytce uniwersalnej najprostszą klawiaturę z 16 przyciskami. W zamierzeniu chcę skanować ją sposobem "szybkim" z tego linku. Napisałem pierwszy fragment, sprawdziłem czy działa... nie działa :(

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Teoretycznie przy skanowaniu, jeśli żaden przycisk nie został wciśnięty, zawartość PIND powinna być 0x0F, a po wciśnięciu któregoś z przycisków S1..S4 zmienić się na 0x1F i zwiększyć wartość na wyświetlaczu o 1. Tymczasem wartość na wyświetlaczu rośnie niezależnie od pozycji przycisku. Za to po połączeniu pinu PD4 z masą program zachowuje się poprawnie. Czy gdzieś się pomyliłem w programie, pomyliłem stany na wejściach/wyjściach?

    [Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4

    0 12
  • Arrow Multisolution Day
  • #2 06 Wrz 2012 21:28
    satanistik
    Poziom 27  

    Przydało by się podłączyć jakieś oporniki między wejściami a masą. Zapobiega to wiszeniu wejść w powietrzu i zbieraniu wszelakich śmieci.

    0
  • #3 06 Wrz 2012 21:38
    tmf
    Moderator Mikrokontrolery Projektowanie

    No właśnie, piny wejściowe PORTD powinny mieć albo zewnętrzny rezystor podciągający, albo włączony wewnętrzny pull up. Dodatkowo to jest klawiatura multipleksowana, aby odczytać kolumnę musisz na nią przejściowo wystawić stan niski, a na pozostałych ma być stan HiZ - inaczej naciśnięcie dwóch przycisków zrobi ci piękne zwarcie i być może nawet poleci MCU. Stąd też 4 najmłodsze bity DDRD nie powinny mieć 0x0f, wyjściem na raz powinien być tylko jeden z nich.

    0
  • #4 06 Wrz 2012 22:21
    adrian1711
    Poziom 6  

    tmf napisał:
    No właśnie, piny wejściowe PORTD powinny mieć albo zewnętrzny rezystor podciągający, albo włączony wewnętrzny pull up.

    Fakt, wystarczyło zamienić wartość PORTD z 0x0F na 0xF0 i warunek z !=0 na ==0, a układ zaczął poprawnie reagować. Ma to sens... choć jednocześnie wciąż dziwi mnie, czemu. Wydaje mi się, że sytuacja wygląda obecnie tak:
    [Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4
    Dlaczego wciśnięcie przycisku zmienia wartość na wejściu na 0, innymi słowy, czemu prąd "woli" przejść przez przycisk? (nie bijcie, jeśli na jaw wyjdzie moja ignorancja w elektronice).

    A co do tej części:
    tmf napisał:
    wyjściem na raz powinien być tylko jeden z nich.

    To się nie zgadzam, metoda z tamtego pdfa polega właśnie na tym, że naprzemiennie zmieniamy piny PD0..3 i PD4..7 na wejścia i wyjścia.

    0
  • Arrow Multisolution Day
  • #5 06 Wrz 2012 22:41
    tmf
    Moderator Mikrokontrolery Projektowanie

    Dlatego woli, że ten pull up to rezystor o wartości rzędu dziesiątek kiloomów, twój klawisz to rezystor o wartości rzędu miliomów. Więc prąd tak jak człowiek, woli iść po linii najmniejszego oporu.
    Co do metody - masz klawiaturę matrycową, należy ją multipleksować, wybierając za każdym razem jedną aktywną kolumnę. Pozostałe muszą być nieaktywne. Zastanów się co będzie jeśli naciśniesz dwa przyciski leżące w dwóch kolumnach, kiedy jedna będzie wysterowana na 1 a druga na 0. W ten sposób sterując nic naprzemiennie nie musisz zamieniać, jest to najprostsza metoda.

    0
  • #6 06 Wrz 2012 23:02
    adrian1711
    Poziom 6  

    tmf napisał:
    Dlatego woli, że ten pull up to rezystor o wartości rzędu dziesiątek kiloomów, twój klawisz to rezystor o wartości rzędu miliomów. Więc prąd tak jak człowiek, woli iść po linii najmniejszego oporu.

    Ale ten rezystor, nawet wg dokumentacji, jest tuż przy pull-upie - niezależnie od tego, czy przycisk jest wciśnięty czy nie, prąd i tak przez ten rezystor przejdzie.
    tmf napisał:
    Co do metody - masz klawiaturę matrycową, należy ją multipleksować, wybierając za każdym razem jedną aktywną kolumnę. Pozostałe muszą być nieaktywne. Zastanów się co będzie jeśli naciśniesz dwa przyciski leżące w dwóch kolumnach, kiedy jedna będzie wysterowana na 1 a druga na 0. W ten sposób sterując nic naprzemiennie nie musisz zamieniać, jest to najprostsza metoda.

    Z mojej perspektywy różnica jest prosta, wybieranie po jednej kolumnie zmusza do zrobienia czerech powtórzeń (po jednym dla każdej kolumny), a przy czytaniu naprzemiennie kolumn i wierszy wystarczy przeczytać PIND dwukrotnie. Potencjalnego zwarcia przy dwóch wciśniętych przyciskach też niestety widzę :(

    0
  • #7 07 Wrz 2012 16:27
    LordBlick
    VIP Zasłużony dla elektroda

    adrian1711 napisał:
    Potencjalnego zwarcia przy dwóch wciśniętych przyciskach też niestety widzę
    Dodaj w szereg z każdym przyciskiem po najtańszej diodce np 1N4148. Przy okazji będziesz mógł wciskać wiele klawiszy na raz i każdy rozpoznawać, ale oczywiście wystawianie testu po jednej kolumnie.

    0
  • #8 07 Wrz 2012 19:12
    adrian1711
    Poziom 6  

    Dodałem wspomniane diody, schemat:
    [Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4
    Piny PD0..3 są wyjściami, PD4..7 wejściami. Zmieniłem też program na zalecany przez was, rezygnując ze starego sposobu z zamianą wejść i wyjść. Jednak układ z powrotem przestał reagować na wciskane przyciski :(

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 08 Wrz 2012 06:44
    dondu
    Moderator Mikrokontrolery Projektowanie

    1.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    zastąp:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    więcej o opóźnieniach napisał tmf tutaj: http://mikrokontrolery.blogspot.com/2011/04/gcc-avr-funkcje-opoznienia-delay.html


    2. Opóźnienia w przerwaniu to samozagłada: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html


    3.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Błąd opisany w punkcie 1.4 tutaj: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html

    0
  • #10 08 Wrz 2012 09:53
    satanistik
    Poziom 27  

    Co do rezystorów niech kolega napisze sobie prosty program - przepisujący stan dowolnego wejścia na inne wyjście z diodą. Teraz niech kolega dołączy kawałek kabelka do tego wejścia (wejście bez pul-up) i zobaczy jak taki "odbiornik działa np po dotknięciu palcem.

    0
  • #11 08 Wrz 2012 16:33
    adrian1711
    Poziom 6  

    dondu napisał:
    1.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    zastąp:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    więcej o opóźnieniach napisał tmf tutaj: http://mikrokontrolery.blogspot.com/2011/04/gcc-avr-funkcje-opoznienia-delay.html
    2. Opóźnienia w przerwaniu to samozagłada: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html

    Zastąpiłem i zmniejszyłem opóźnienie do 10us po każdej zmianie na wyjściach, nie zamierzam jednak go usuwać (nie chcę skanować tuż po zmianie w obawie przed zakłóceniami) - a tak krótkie opóźnienie nie przeszkadza w moich obecnych programach.
    dondu napisał:

    3.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Błąd opisany w punkcie 1.4 tutaj: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html

    Tu był problem, byłem przekonany że && oznacza zarówno operację na bitach, jak i test logiczny. Po zamianie na & wszystko działa - tym samym problem jest rozwiązany, dzięki :D

    0
  • #12 08 Wrz 2012 19:22
    LordBlick
    VIP Zasłużony dla elektroda

    adrian1711 napisał:
    Dodałem wspomniane diody, schemat:
    [Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4
    Nijak ma się to do tego:
    LordBlick napisał:
    Dodaj w szereg z każdym przyciskiem po najtańszej diodce np 1N4148.
    Przycisków masz w tej chwili 16 a diod - 4...

    0
  • #13 08 Wrz 2012 20:07
    adrian1711
    Poziom 6  

    LordBlick napisał:
    adrian1711 napisał:
    Dodałem wspomniane diody, schemat:
    [Atmega8][avr-gcc] - Niezrozumiałe zachowanie programu z klawiaturą 4x4
    Nijak ma się to do tego:
    LordBlick napisał:
    Dodaj w szereg z każdym przyciskiem po najtańszej diodce np 1N4148.
    Przycisków masz w tej chwili 16 a diod - 4...

    Ach, przepraszam, źle zrozumiałem. Jednak... czy jest to konieczne? Już teraz jestem w stanie czytać kilka jednocześnie wciśniętych przycisków. Przy budowie przeglądałem inne strony - nigdzie nie widziałem, aby przy każdym przycisku znajdowała się dioda. Nawet w przykładowych zastosowaniach ze strony Atmela (Link, Link2) zastosowane zostały albo cztery diody, albo zero. Poza tym, wszystko zostało już przylutowane do płytki i zostały mi trzy diody. Jeśli sprawdzi się czarny scenariusz ze zwarciem, wydam 10zł na nową Megę i dostanę nauczkę na przyszłość ;)

    0