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

AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.

cyber90 08 Lip 2015 19:58 1683 16
  • #1 14833398
    cyber90
    Poziom 15  
    Witam, chcę uruchomić kontroler panelu pojemnościowego, ale niestety sposób opisany protokołu w datasheet jest dla mnie nie zrozumiały, więc postanowiłem wykorzystać tryb standalone. Moje pytanie czy w tym trybie po naciśnięciu klawisza na pinach I/O otrzymam stan niski czy wysoki? Chcę podpiąć diody na tych pinach a nie wiem w jaki sposób zachowują się te wyjścia po naciśnięciu (czyli rozładowaniu kondensatora).

    AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.

    link do układu:
    http://pdf1.alldatasheet.pl/datasheet-pdf/view/394058/ATMEL/AT42QT1060.html
  • #2 14833732
    oloam
    Poziom 22  
    cyber90 napisał:
    ale niestety sposób opisany protokołu w datasheet jest dla mnie nie zrozumiały

    Przeciez to jest protokol i2c, wiec co jest niezrozumiale? Mam napisana komunikacje na wersji 1070 i dziala znakomicie... Z czym masz konkretnie problem, to odkopie swoj program i postaram sie pomoc
  • #3 14833839
    cyber90
    Poziom 15  
    Z zrozumieniem tej tabeli:
    AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.
    Jeśli chodzi o sprzętowe I2C to potrafię napisać sobie procedurę wysyłania oraz odbioru. Ale nie wiem jak ustawić aby kontroler ustawił piny IO jako wyjścia i jak odczytać jaki stan jest na przyciskach.
  • #4 14833879
    oloam
    Poziom 22  
    Jezeli chcesz tylko odczytywac klawisze (ja potrzebowalem tylko tego, wiec skupilem sie tylko na odczycie, innych funkcji nie implementowalem) to ogolny schemat:

    inicjalizacja
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w inicjalizacji mam ustawiona na sztywno kalibracje przyciskow (sa dosyc blisko siebie i przykryte 2mm plexi)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i odczyt w przerwaniu zewnetrznym
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wszystko pisane na stm32 z uzyciem spl
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Funkcje pisalem samodzielnie, wiec pod wzgledem skladniowym i optymizacji pewnie moglyby wygladac lepiej. Wazne, ze dzialaja.
  • #5 14833956
    cyber90
    Poziom 15  
    1. Chcąc coś wysłać do urządzenia, wysyłam bita staru, następnie wysyłam adres urządzenia, następnie adres rejestru (tabela) i następnie wartość jaką chcę wpisać do tego rejestru i całość kończę bitem stop?

    2. I drugie pytanie w inicjalizacjii przycisków pod adresy NTHRkX wpisujesz różne wartości co te wartości znaczą?
  • #6 14834140
    oloam
    Poziom 22  
    1. Dlatego podalem listing T_writereg. Na stronie 14 datasheet twojego ukladu masz graf wysylania/zapisu. W moim przypadku adres urzadzenia musi byc przesunietu o 1bit w lewo bo jak z grafu wynika wysylany jest adres+bit zapisu/odczytu, czyli u mnie:
    #define Tadr 0x1b<<1
    2.Te wartosci definiuja jak bardzo czuly jest przycisk (o ile dobrze pamietam im mniejsza wartosc, tym bardziej czuly jest przycisk). U siebie wartosci dobieralem doswiadczalnie. Na wartosciach domyslnych to dotyk 'lapal' nawet na sciezkach od przycisku do ic oraz obszary przyciskow zachodzily na siebie. Po dodaniu tych wartosci dotyk 'lapie' tylko w obszarach miedzi przycisku.
    Plytka wyglada tak: AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.
  • #7 14836358
    cyber90
    Poziom 15  
    Mógłbyś napisać coś jeszcze i PInie CHANGE I RESET? Jeżeli wyślemy same jedynki pod adres Resetu to układ będzie się resetował co 125ms, dlaczego masz zaraz po resecie opóźnienie 350ms?
    I czy łączyć Reset z Resetem mikroprocesora?

    Czy korzystasz z PINU CHANGE? Odczytywałeś w jakiś sposób jego stan uc i uwzględniałeś w programie?
  • #8 14836666
    oloam
    Poziom 22  
    CHANGE generuje u mnie przerwanie (zmiana stanu przy wykryciu dotyku) a w przerwaniu mam odczyt ktory przycisk jest dotkniety. CHANGE u mnie (sprawdz datasheet czy w 1060 jet tak samo) jest podciagniete do zasilania przez rezystor 47k. Wazne, jezeli wykorzystujesz CHANGE do generowania przerwania, musisz odczytac oba rejestry statusu (tak jak masz to w listingu wyzej).
    RESET jet podciagniety wewnetrznie wiec mozesz pozostawic wiszacy lub podlaczyc do zasilania
    RESET softwareowy trwa 125ms plus przez 30ms uklad odpowiada nack jezeli probujesz sie z nim kontaktowac.Dalem bezpieczny czas...
  • #9 14840671
    cyber90
    Poziom 15  
    Jeszcze dwa pytania i uda mi się napisać program.
    1. Adres urządzenia wynosi 0x1b. Po wysłaniu bitu start wysyłamy adres urządzenia ale z bitem określającym typ operacji. W przypadku Zapisu wysyłamy adres 0x36, a w przypadku odczytu 0x37?
    2.W przypadku funkcji T_readreg po wysłaniu MEMADRES powinno się wysłać bit Stopu a później bit startu według schematu a Ty pomijasz bit Stopu? Możesz mi to wyjaśnić?
    AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.
  • #10 14840721
    oloam
    Poziom 22  
    1. Dla 1060 adres urzadzenia wynosi 0x12.. Jak widac z listingu adres jest przesuniety a lewo a bit zapisu/odczytu jest dodawany automatycznie
    2.Nie moge,bo nie pamietam. Pisalem to dosyc dawno i to byla jedyna stycznosc z i2c jak dla mnie...
  • #11 14843164
    cyber90
    Poziom 15  
    1. Obsługuję jednak AT32QT1070. Jeszcze jedno pytanie aby odczytać który przycisk jest wciśnięty muszę zresetować urządzenie wysłać konfigurację przycisków czyli adresy od 32 do 38 i odczytać stany Detection status oraz Key status. Jeśli chodzi o Key status to wiem o co chodzi ale Detection Status? Możesz mi objaśnić dlaczego też sprawdzasz ten Status?

    I prosiłbym o sprawdzenie kodu a dokładnie odczyt z QT, bo nie jestem pewien czy muszę użyć *wsk = I2C_ReceiveData_ACK(); czy *wsk = I2C_ReceiveData_NACK();: Kod poniżej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wgrywając taki kod kontroler powinien mi odpowiedzieć swoim adresem, czyli z zmiennej bufor powinna znajdować się wartość 0x1b?

    Poniżej sekwencja odczytu z AT42QT1070:
    AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.
  • #12 14843498
    oloam
    Poziom 22  
    Resetujesz raz aby miec pewnosc ze urzadzenie jest gotowe do pracy. Ja, jak wynika wyzej, uzywam resetu softwareowego. Nie musisz rowniez zapisywac adresow 32-38,ja zapisuje je zeby skalibrowac przyciski - domyslnie wszystkie maja ustawienie 20. W tym wycinku pdfa masz rowniez odpowiedz na swoje wczesniejsze pytanie dlaczego nie mam w swojej funkcji sekwencji START STOP. Odczytuje oba rejestry wzgledu na to, ze uzywam CHANGE do generowania przerwania. CHANGE generuje przerwanie przechodzac w stan niski. Odczytujac tylko jeden rejestr statusu CHANGE pozostaje wciaz w stanie niskim az do odczytu jakiegos rejestru (przydatne jest to do wykrywania 'puszczenia' przycisku).W moim przypadku drugim rejestrem jest rejestr statusu klawisza, co powoduje powrot CHANGE w stan wysoki oraz zwraca dotkniety klawisz. O kodzie moze niech ktos inny sie wypowie, nie orientuje sie zbytnio w avr...

    Przegladajac twoj kod (nie wnikajac czy obsluga i2c jest poprawna) to masz raczej za wysokie warosci rejestrow 32-38. Zostaw je domyslne i ewentualnie dokalibruja w trakcie uruchamiania urzadzenia. Druga sprawa to do jakiej zmiennej odczytujesz ID skoro wywoluesz funkcje odczytu z jednym parametrem (wogole to przeszlo przez kompilator)?

    ID ukladu to 0x2e
  • #13 14843769
    cyber90
    Poziom 15  
    Nie przeszło właśnie. Chcę przechować do zmiennej bufor. To w takim przypadku muszę zrobić tą zmienną globalną i tak samo wskaźnik? A funkcję wywołać w taki sposób?
    Read_QT(0x00, bufor); ?
    Wybacz ale dopiero dzisiaj zacząłem czytać o wskaźnikach jeżeli możesz pomóc to będę wdzięczny.
  • #14 14843936
    oloam
    Poziom 22  
    Wskaznikow uzywam intuicyjnie :)
    Postaram sie wytlumaczyc ale nie wiem czy zrobie to poprawnie:
    deklarujesz zmienna
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zeby przekazac jej adres do funkcji (argument jako wskaznik) musisz zastosowac operator
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    teraz deklarujac wskaznik (np jako ragument funkcji) uzywasz operatora
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    i tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    czyli masz zadeklarowany wskaznik wsk, ktory 'przejmie' adres zmiennej bufor.
    Zgodnie z tym, co napisalem wyzej, przekazanie adresu zmiennej buffor do funkcji Read_QT bedzie wygladalo tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w tym momencie adres zostal przekazany do funcji i operujac na wartosci wsk operujesz na zmiennej bufor.
    Teraz ,co moim zdniem jest niedorzeczne w skladni c, operujac na wartosci zapisanej pod wskaznikiem rowniez uzywasz operatora
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    co moze mylic poczatkujacych poniewaz przy delkaracji wskaznika uzywajac tego operatora mowimy o adresie a nie o wartosci zapisanej pod tym adresem (a mogli tworcy c dac poprostu inny operator przy deklaracji...). I tak juz w funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    powodujesz, ze wartosc zmiennej bufor rowniez przyjmie wartosc 34.
  • #15 14844708
    cyber90
    Poziom 15  
    Jeszcze odnośnie prowadzenia ścieżek. Czy pady pojemnościowe zrobić na jednej stronie tak jak Ty i nie wstawiać nic na druga stronę?
  • #17 14884001
    cyber90
    Poziom 15  
    A mam do Ciebie jeszcze pytanie. Na osobnej płytce robię elektrody. Czy GuardKey da mi coś jeżeli wykorzystuję czułość przycisków na około 10? Rozumiem że on działa w taki sposób że ustawia się go na max czułość czyli no 2-3 i otacza pola elektrod. Czy każdy KEY może być Guard? Czy wybrany?

    AT42QT1060 - Kontroler panelu dotykowego-pojemnościowego.
REKLAMA