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

[Atmega88] - Jak podłączyć przyciski do portów ADC6 i ADC7 w C?

mily20001 04 Lis 2012 11:42 3606 25
REKLAMA
  • #1 11486660
    mily20001
    Poziom 11  
    Jak w temacie, chciałbym podłączyć do tych portów przyciski. Czy to ma szansę działać i jak się do tych portów odwołać w C?
  • REKLAMA
  • #2 11486684
    tmf
    VIP Zasłużony dla elektroda
    Nie odwołasz się do nich jak do zwykłych portów, bo to tylko wejścia analogowe multipleksera. Co nie znaczy, że nie da się do nich podłączyć przycisków. Jedyna różnica, że stan tych przycisków będziesz musiał badać przez samplowanie ADC, Można też w tym celu wykorzystać komparator analogowy, co dla jednego przycisku może być sensowniejszym rozwiązaniem.
  • #3 11486727
    mily20001
    Poziom 11  
    Komparator odpada ponieważ i tak mam mało miejsca na płytce. Potrzebuję wykorzystać oba adc (dwa przyciski). Jakiś link, cokolwiek jak się używa samplowania adc, bo google nie chce powiedzieć
  • #4 11486808
    tmf
    VIP Zasłużony dla elektroda
    Komparator masz wbudowany w MCU. Co do ADC - po prostu odpalasz ADC i przy jego pomocy samplujesz ADC6 i 7 - wartości ADC w okolicach 0 to stan niski, w okolicach 1023 to stan wysoki. Ot cała filozofia. Przy okazji, jak korzystasz z ADC do pod jeden port można podpiąć wiele przycisków - podpowiedź - drabinka R2R.
  • #5 11486827
    mily20001
    Poziom 11  
    Tylko drabinka chyba nie pozwala na rozpoznanie który przycisk został naciśnięty chociaż możliwe że się mylę. I jeszcze jedno - jak samplować (w C)?
  • REKLAMA
  • #6 11486895
    ZbeeGin
    Poziom 39  
    mily20001 napisał:
    Tylko drabinka chyba nie pozwala na rozpoznanie który przycisk został naciśnięty chociaż możliwe że się mylę.

    Owszem. Może, jeśli dobrze to zorganizujesz.

    mily20001 napisał:
    I jeszcze jedno - jak samplować (w C)?

    Napisać odpowiednią funkcję np. uint16_t get_adc(uint8_t channel). W funkcji tej wpisujesz kanał do ADMUX, wyzwalasz pomiar przez ustawienie bitu ADSC, potem sprawdzasz flagę ADIF czy konwersja się dokonała, zerujesz ADIF i odczytujesz wynik z ADCW. Oczywiście gdzieś wcześniej trzeba jednorazowo ustawić ADC: taktowanie, AREF.

    Jest jeszcze parę sposobów na ADC, ale ten jest najprostszy i na pewno znajdziesz jakiegoś gotowca jak nie zrozumiałeś tego co napisałem powyżej.
  • #7 11488791
    Nawigator
    Poziom 33  
    Jeden przycisk można po konwersji sprawdzić stanem bitu b1 w ADCH.

    N.
  • #8 11491187
    snnaap
    Poziom 25  
    ZbeeGin napisał:
    mily20001 napisał:
    Tylko drabinka chyba nie pozwala na rozpoznanie który przycisk został naciśnięty chociaż możliwe że się mylę.

    Owszem. Może, jeśli dobrze to zorganizujesz.



    Teoretycznie można byłoby podłączyć tyle przycisków jaka jest rozdzielczość przetwornika ADC.

    Ale w praktyce chyba nie dałoby rady tego wykonać:D (Ale chciałby zobaczyć takie coś - 1023 przyciski na jednej linii - musi zapewne ciekawie wyglądać :D)

    Dla początkujących problemy zaczynają się gdy wciśnięte są np 2 przyciski jednocześnie, ale to też jest do zrobienia, np. za pomocą tablic i chyba tylko w drabince równoległej a nie szeregowej.

    Pozdrawiam
  • #9 11491261
    Konto nie istnieje
    Poziom 1  
  • #10 11491338
    snnaap
    Poziom 25  
    atom1477 napisał:
    snnaap napisał:
    Teoretycznie można byłoby podłączyć tyle przycisków jaka jest rozdzielczość przetwornika ADC.

    Ale w praktyce chyba nie dałoby rady tego wykonać:D (Ale chciałby zobaczyć takie coś - 1023 przyciski na jednej linii - musi zapewne ciekawie wyglądać :D)

    Rozdzielczość przetwornika nie wynosi 1023 tylko 10. Można więc podłączyć tylko 10 przycisków (choć i to będzie problemem).


    Może źle się wyraziłem, rozdzielczość 10 bitów to 1024 poziomy kwantyzacji?!
    Czyli teoretycznie można byłoby podłączyć 1023 przyciski, czyż nie?

    Przy 5V różnica pomiędzy poziomami powinna wynosić ok. 4,8 mV.
    Trzeba jedynie odpowiednio dobrać rezystory.

    PS. 10 to liczba graniczna przy rozważaniach praktycznych?
  • #12 11492314
    Nawigator
    Poziom 33  
    A dlaczego w ADC w AVR 8 bitów ma być szybsze w działaniu niż 10?

    N.
  • #13 11492799
    leonow32
    Poziom 30  
    1) W trybie 8-bitowym przetwornik może chodzić na wyższej częstotliwości, więc pomiar dokonuje się szybciej.
    2) AVR to procek 8-bitowy więc siłą rzeczy odczytanie 8 bitów jest szybsze niż 10 bitów.
    3) Stosowanie 10 bitowej rozdzielczości do pomiaru klawiatury analogowej najmniejszego sensu nie ma, chyba że ktoś ma więcej niż 256 przycisków :D

    Żeby włączyć tryb 8-bitowy trzeba ustawić bit ADLAR=1 w rejestrze ADMUX i wynik odczytywać wyłącznie z rejestru ADCH, a ADCL nie ruszać.
  • REKLAMA
  • #14 11493072
    tmf
    VIP Zasłużony dla elektroda
    Tak dla ścisłości to pomiar nadal jest 10-bitowy, tyle, że wyniki są wyrównywane do lewej i 2 najmniej znaczące bity są w ADCL. Częstotliwość pracy przetwornika niezależnie od ADLAR może być taka sama. Rozumiem o co ci chodzi, tak tylko uściślam :)
  • #15 11493628
    Konto nie istnieje
    Poziom 1  
  • #16 11494541
    Nawigator
    Poziom 33  
    Pozwolę sobie nie zgodzić się z Szanownym Przedmówcą.

    Cytat:
    Jeżeli chcesz móc odczytywać wciśnięcie więcej niż 1 przycisku, to można podłączyć tylko 10

    Ilość przycisków nie ma znaczenia bo i tak odczyta się jeden, ten "najbliżej" masy.

    Cytat:
    snnaap napisał:
    PS. 10 to liczba graniczna przy rozważaniach praktycznych?

    Przy ADC z ATMegi88, tak

    Praktycznym ogranicznikiem jest dobór rezystorów, ich tolerancja, rezystancja styków, zmiany temperatury itp. oraz powtarzalność produkcyjna.
    Programowo można posortować wyniki więcej niż 10-ciu przycisków.

    N.
  • #17 11494624
    Konto nie istnieje
    Poziom 1  
  • #18 11496919
    Nawigator
    Poziom 33  
    Metoda "prądowa" konstrukcji klawiatury choć możliwa do realizacji to jednak jak widać z powyższego przykładu daje zakres wymaganego prądu 512/1 dla 10-ciu klawiszy.
    Dlatego w praktyce jest stosowana inna konfiguracja - szeregowa drabinka rezystorowa i taką miałem na myśli pisząc powyższe uwagi. Przykład z joysticka Sony:

    [Atmega88] - Jak podłączyć przyciski do portów ADC6 i ADC7 w C?

    Wejście ADC jest podłączone do środkowego kołka wtyku i podciągnięte rezystorem 10k do Vcc.
    Reszta uwag pozostaje b/z.

    N.
  • #19 11497410
    tmf
    VIP Zasłużony dla elektroda
    Przecież nawet na tej drabince którą pokazałeś można odczytać stan dowolnej kombinacji przycisków (pomijając off). Jeśli na rezystory dasz GND, a odczytywaną linię podciągniesz przez rezystor do Vcc, to napięcie w tym punkcie będzie zależne od utworzonego dzielnika, którego jednym z elementów jest wypadkowa rezystancja utworzona w wyniku zwarcia jednego lub więcej przycisków. Jakie zostały naciśnięte bez problemu da się odczytać. Przypuszczam, że twórcy dali off bez rezystora, aby nadać mu w ten sposób priorytet - naciśnięcie off spowoduje powstanie np. GND niezależnie od kombinacji pozostałych przycisków. To może mieć zastosowanie w prostym układzie wykrywania naciśnięcia off bez MCU.
  • #20 11497712
    Nawigator
    Poziom 33  
    Zaraz, zaraz, jak naciśniesz np. kolejny po OFF czyli SOURCE to odetniesz do masy pozostałe przyciski licząc w prawo na schemacie. Ich naciskanie nic już nie daje i odczyt naciśniętej kombinacji jest niemożliwy.

    N.
  • REKLAMA
  • #21 11497996
    tmf
    VIP Zasłużony dla elektroda
    Niby w jaki sposób odetnę? Wyobraź sobie, że masa idzie na te rezystory, a samplujemy tą wspólną linię pod którą są podłączone przyciski. Ta linia jest podciągana rezystorem do Vcc. Mamy zwykły dzielnik, w którym opór dolnych rezystorów to wypadkowa rezystorów połączonych równolegle przez przyciski.
  • #22 11498701
    Nawigator
    Poziom 33  
    Masa jest wspólna dla wszystkich przycisków (dolna linia pozioma) co widać zresztą po podłączeniu do wtyku (mini-jack 3,5mm), myślałem że zauważysz bez dodatkowego tłumaczenia...
    Środkowy pierścień wtyku (podłączony do przycisku SHIFT) idzie do drugiego wejścia procesora i zwiera przy niektórych pozycjach joysticka, tu dla analizy działania drabinki nie ma znaczenia.
    Końcowy kołek (podłączony do drabinki i przycisku OFF) idzie do wejścia ADC procesora i jest również podłączony do rezystora 10k podciągającego do Vcc.
    W stanie początkowym na ADC jest napięcie Vcc.
    Po naciśnięciu OFF napięcie na ADC jest zerowe. Można naciskać inne przyciski bez efektu. Podobnie z kolejnymi przyciskami na prawo od aktualnie naciśniętego.
    Myślę że dalsze tłumaczenie działania tego obwodu nie będzie potrzebne.

    N.
  • #23 11498889
    tmf
    VIP Zasłużony dla elektroda
    Nie wiem czy zauważyłeś, ale w tym temacie nie rozważamy jak idiotycznie, czy nie wykorzystuje to Sony. Tylko jak przy pomocy drabinki rozpoznawać naciśnięcie kilku przycisków. Tu kolega atom1477 ma absolutną rację - 10 bitowy ADC umożliwia rozróżnienie max 10 przycisków (przy założeniu, że może być wciśnięty na raz więcej niż jeden). Jest to oczywista oczywistość.
  • #24 11499823
    Nawigator
    Poziom 33  
    Napisałeś
    Cytat:
    Przecież nawet na tej drabince którą pokazałeś można odczytać stan dowolnej kombinacji przycisków (pomijając off).

    W tej drabince Sony nie da się odczytać dowolnej kombinacji przycisków. Bez względu na to która strona jest podłączona do masy.
    Dlatego Ci zwróciłem na to uwagę.
    Poza tym w klawiaturach zawsze eliminuje się stany naciśnięcia kilku klawiszy na raz więc metoda 'wagowa' sumowania prądów wymaga dodatkowej obróbki programowej aby to uzyskać.
    Kwestią uboczną jest co kto uważa za drabinkę.

    N.
  • #25 11500056
    Konto nie istnieje
    Poziom 1  
  • #26 11500569
    Nawigator
    Poziom 33  
    Tak, faktycznie nastąpiło nieporozumienie co do rodzaju klawiatury.
    Na swoje usprawiedliwienie powiem tylko że z klawiaturą drabinkową typu pokazana Sony spotykam się bardzo często w radiach samochodowych, telewizorach itp. sprzęcie RTV. Z 'prądową' b. rzadko.
    Dodam jeszcze ze istnieje również klawiatura w oparciu o drabinkę R-2R łatwiejsza do wykonania z uwagi na dobór rezystorów i ta konfiguracja pozwala rozpoznać kombinacje klawiszy. Tu znaleziony na szybko przykład:

    [Atmega88] - Jak podłączyć przyciski do portów ADC6 i ADC7 w C?

    N.
REKLAMA