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

[ATMega32][C]Problem z klawiaturą

bumcykcyk2 07 Wrz 2010 23:36 2200 11
REKLAMA
  • #1 8487395
    bumcykcyk2
    Poziom 10  
    Witam wszystkich, mam układ mniej więcej taki jak tu:
    [ATMega32][C]Problem z klawiaturą
    Różni się tylko liczbą rzędów i kolumn a więc i podłączeniem do uK(atmega32), ale to nie ma znaczenia. Napisałem program który z jednej strony ma wejścia podciągnięte do Vcc a z drugiej wyjście które przemiatają zerem(w danej chwili tylko jedno wyjście jest 0 a reszta to 1). Czyli z tego co zauważyłem w różnych przykładach to typowe rozwiązanie. Problem jednak polega na tym że to 0 robione przez wyjście które ma być masą nie wywołuje staniu niskiego na wejściu podczas wciśnięcia przycisku. Gdy drucikiem zwieram wyjście do normalnej masy to wszystko działa. Pomyślałem że jak mu nie pasuje to 0 zrobione przez uK to użyje multipleksera analogowego(HEF4051B) i będę podawał masę w danym momencie na jedną z kolumn. Jednak z multiplekserem sytuacja wygląda dalej tak samo.

    Jakieś pomysły dlaczego może to nie działać ?
  • REKLAMA
  • Pomocny post
    #2 8487417
    Karol966
    Poziom 31  
    Wywal diody. Klawiaturę podłącz bezpośrednio do portów. Wykorzystujesz oczywiście wewnętrzne pull-up'y prawda? Musi działać bo to patent sprawdzony;) Może źle konfigurujesz poszczególne linie I/O? Pokaż kod.
  • REKLAMA
  • #3 8487719
    arturt134
    Poziom 27  
    Ja też używam "gołych" klawiszy. Diody tylko przeszkadzają i zajmują miejsce na płytce.
    Poza tym, żeby było OK z Twoją masą, to muszą to być diody Schottky'ego, bo zwykłe krzemówki nie pozwolą Ci zejść poniżej 0,7V.
  • Pomocny post
    #4 8487732
    Andrzej__S
    Poziom 28  
    Karol966 napisał:

    Wywal diody. Klawiaturę podłącz bezpośrednio do portów...

    Można oczywiście sprawdzić w ten sposób, czy na diodach nie występuje zbyt duży spadek napięcia, chociaż raczej w to wątpię (nie przy prądzie z wewnętrznych pull-up). Ja mam w ten sposób podłączoną klawiaturę i działa bez problemów. Zresztą nie tylko ja, bo takich schematów w sieci spotkałem całkiem sporo.

    Podejrzewałbym raczej, ze wina leży po stronie kodu. Kluczowym elementem są tutaj opóźnienia. Stan niski musi utrzymywać się odpowiednio długo, aby przeładować pojemności; jest to szczególnie istotne przy wykorzystaniu wewnętrznych pull-up i dużej częstotliwości taktowania procesora. Jeśli stan niski jest na porcie przez 2 lub 3 takty zegara przy taktowaniu 16MHz, to napięcie na diodzie może nie zdążyć osiągnąć odpowiedniej dla stanu niskiego wartości. Dodatkowo po wyprowadzeniu stanu niskiego na wyjście należy odczekać pewną ilość taktów, zależną od częstotliwości kwarcu, przed odczytaniem stanu klawiszy. Powód jest ten sam - stromość opadania zboczy.

    Spróbuj pokombinować sam lub zamieść kod, to może coś pomożemy.

    arturt134 napisał:

    Ja też używam "gołych" klawiszy. Diody tylko przeszkadzają i zajmują miejsce na płytce.

    Diody nie tylko przeszkadzają. Zastanów się, co się stanie podczas skanowania klawiatury, jeżeli użytkownik wciśnie dwa klawisze jednocześnie (powiedzmy 1 i 4 ze schematu powyżej), a diod nie będzie. Trzeba się liczyć z taką sytuacją, chyba, że tylko sam korzystasz ze swoich projektów. Być może ATmega przetrwa to krótkotrwałe zwarcie - porty mają zdaje się ograniczniki prądowe - jednak głowy bym nie dał. Chyba, że stosujesz wtedy inną metodę skanowania klawiszy, niż przedstawioną przez autora tematu.
  • REKLAMA
  • Pomocny post
    #5 8487885
    arturt134
    Poziom 27  
    Andrzej__S:
    Wszystko zależy jaki masz algorytm skanowania.
    Jeżeli jednocześnie tylko jeden pin wyjściowy jest aktywny, czyli jest wyjściem w stanie niskim (na przykład PD0), a reszta pinów wyjściowych (PD1, PD2, PD3) ma Hi-Z, to żadne zwarcie nie wystąpi. Wciśnięcie dwóch klawiszy (powiedzmy 1 i 4 jak pisałeś) nie spowoduje żadnego zwarcia.

    Taki algorytm mam w kilkunastu projektach i nigdy nie miałem z nim żadnych problemów.

    Nie wiem jakie jest napięcie zasilające. Dla AVR stan niski jest poniżej 0,2*VCC, czyli dla 5V powinno być dobrze nawet przy diodach krzemowych. Dla 3V, na krzemowych może nie działać (warto przynajmniej sprawdzić, czy procesor odczytuje taki stan jako 0 ustawiając któreś wyjście na stałe i czytając z dużym opóźnieniem).
  • #6 8488017
    Andrzej__S
    Poziom 28  
    arturt134 napisał:

    Jeżeli jednocześnie tylko jeden pin wyjściowy jest aktywny, czyli jest wyjściem w stanie niskim (na przykład PD0), a reszta pinów wyjściowych (PD1, PD2, PD3) ma Hi-Z, to żadne zwarcie nie wystąpi.

    Zgadza się, znam tę technikę. Zresztą na końcu mojego posta dodałem: 'Chyba, że stosujesz wtedy inną metodę skanowania klawiszy, niż przedstawioną przez autora tematu.'
    Ja odnosiłem się do tego:
    bumcykcyk2 napisał:

    Napisałem program który z jednej strony ma wejścia podciągnięte do Vcc a z drugiej wyjście które przemiatają zerem(w danej chwili tylko jedno wyjście jest 0 a reszta to 1)

    W tym przypadku diody są raczej niezbędne.

    Ty zaproponowałeś usunięcie diod, a ja chciałem uprzedzić autora, że w tym przypadku musi też zmienić algorytm skanowania klawiatury. Może źle się wyraziłem, ale nie chciałem wcale forsować stosowania diod. :)

    Dodano po 28 [minuty]:

    napisał:

    Dla 3V, na krzemowych może nie działać...

    Może masz rację. Zasilanie niekoniecznie musi być równe 5V (autor nie napisał, jak to zasila). Chociaż biorąc pod uwagę wartość rezystorów pull-up w ATmega (min. 20kOhm) to prąd płynący przez diodę jest raczej znikomy, więc i spadek napięcia nie będzie zbyt duży. Ale pewności nie mam. Ja testowałem dla 5V (na takich samych diodach jak na schemacie) i działa OK.
    Niemniej stosowanie diod nie jest konieczne, a nawet wygodniej jest bez diod (przy założeniu zastosowania odpowiedniego algorytmu).
  • REKLAMA
  • #7 8488092
    Konto nie istnieje
    Poziom 1  
  • #8 8488211
    klon111
    Poziom 11  
    witam
    poco się bawić w dorabianie klawiatury a nie lepiej podłączyć klawiaturę od PC i i mamy z głowy sterowanie.
    Ja podłączyłem do atmegi8 i pięknie chodzi.
  • #9 8488213
    Andrzej__S
    Poziom 28  
    atom1477 napisał:

    No chyba że wyjścia procesora będą skonfigurowane jako Push-Pull. W tym przypadku jednak szkoda diod, taniej wstawić 4 rezystory po 100...470R.

    No tak, tylko że zastosowanie diod (w przypadku zastosowania push-pull) pozwoli na prawidłowe odczytywanie chociaż kombinacji dwu-klawiszowych. Stosując rezystory po naciśnięciu dwóch przycisków w jednym wierszu (czyli np. 1 i 4) otrzymasz na wejściu (PD4) 1/2 VCC.
  • #10 8488240
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #11 8488432
    Andrzej__S
    Poziom 28  
    atom1477 napisał:

    Ale po co stosować Push-Pull?

    Ale ja wcale nie namawiam, żeby stosować push-pull. Napisałem tylko co się stanie, jeśli zastosujesz push-pull i rezystory zamiast diod (zgodnie z Twoją sugestią).

    Podsumowując, widzę to tak:

    Stosując push-pull, tak jak zrobił autor, trzeba użyć diod lub rezystorów. Jeśli chcemy korzystać z kombinacji dwu-klawiszowych diody są lepszym rozwiązaniem.

    Jeśli chcemy pominąć diody i rezystory, należy zmienić algorytm skanowania na taki, jaki opisał arturt134.

    W obydwu przypadkach należy pamiętać o tym, że napięcie na wyjściu portu nie opada i nie narasta w czasie równym 0 i zastosować odpowiednie opóźnienia, szczególnie jeżeli używamy większych częstotliwości taktowania procesora.
  • #12 8488486
    bumcykcyk2
    Poziom 10  
    Dziękuje wszystkim za odpowiedz, głupio się przyznać ale rzeczywiście miałem w jednym miejscu źle napisany kod który powodował źle ustawienie portów. Teraz wszystko działa bez multipleksera. Jednak widzę że dyskusja poszła w ciekawym kierunku więc nie ma tego złego... :)

    Usunąłem diody i zmieniłem algorytm tak by na nie aktywnych w danej chwili wyjściach była wysoka impedancja. Teraz nawet jak wcisnę wszystkie 23 guziki na raz to funkcja to wychwytuje, działa świetnie :)

    Jeszcze raz wszystkim bardzo dziękuje i przepraszam że nie sprawdziłem dokładnie kodu zanim założyłem tematu(znaczy sprawdziłem ale dopiero po przespaniu się z tym, zauważyłem błąd).
REKLAMA