Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Panel dotykowy na attiny44 z komunikacją i2c

bobeer 15 Paź 2017 01:14 3729 4
  • Panel dotykowy z 6 diodami sterowany po i2c na ATTINY44



    Poniższy materiał przedstawia próbę ugryzienia tematu krytycznych zależności czasowych w asemblerze. Zadaniem było stworzenie stabilnie działającej aplikacji która obsłuży:

    komunikację z procesorem nadrzędnym w trybie slave i2c
    sterowanie multipleksowanymi diodami z 8bitowa regulacja jasności pwm
    obsługę pól dotykowych (pomiar czasu ładowania pojemności na portach)

    Ponieważ zainteresowanie asemblerem jest raczej mizerne, w telegraficznym tylko skrócie przedstawię funkcjonowanie programu.

    Wykorzystane jest max 6 przerwań w zależności od użytej biblioteki obsługującej i2c. Ponieważ chciałem mieć możliwość obsługi również procesorów bez USI, najpierw napisałem bibliotekę w oparciu tylko i wyłącznie o przerwania PCINT, działającą na maszynie stanu. (Na tiny13 bez problemowo obsługiwała prędkość 100kb). Dla tiny10 już było nieco gorzej ze względu na powolniejsze wybudzanie z powerdown. Następnie zrobiłem obsługę i2c z użyciem dziwacznego peryferium, które niby to ma wspierać komunikację i2c, a nie posiada nawet własnego przerwania dla I2C stop :) . Max prędkości z użyciem USI to około 330kb. Prędkości są podane dla wartkiego zegara około 16MHz (tyle potrafił ustawić tiny na max oscal). Przełączania pomiędzy bibliotekami dokonuje się w programie głównym ustawiając zmienną 'usiLib' .
    Dołączony program 'demo' „Tiny44panel” w przypadku wygaszenia wszystkich diod, oraz braku aktywności i2c zmienia tryb działania programu na 'standby' gdzie procesor przechodzi w powerdown, a próbkowanie dotyku jest realizowane nieco wolniej (pobór prądu tutaj około 300uA). Przy tej okazji można użyć wyjścia przerwania które zmienia stan w przypadku wykrycia dotyku i pozostaje w nim do czasu skasowania bitu w rejestrze przez zapis do pamięci i2c.
    Panel jest zorientowany rejestrowo. 6 pierwszych rejestrów zawiera poziomy jasności LEDów, następnie znajduje się licznik używany do multipleksowania, po nim kolejny licznik czasu, następnie surowe wartości czasów czujników, wartości przeliczone będące w pewnym zakresie odzwierciedleniem siły nacisku, kilka wolnych bajtów, na dwa ostatnie przypadają flagi aktywnych czujników, przy czym bajt 14 to flagi „sticky” które są powiązane z wystawianym przerwaniem.
    Wszystkie bajty przestrzeni i2c ram można dowolnie zapisywać i odczytywać (tak jak się to robi z pamięcią eeprom adresowaną jednobajtowo). W przypadku użycia adresowania rejestru przekraczającego 16B nastąpi 'przewinięcie' odczyt od bajtu 0 (zapis i odczyt pamięci procesora jest zabezpieczony maską uniemożliwiającą dostęp do jakichkolwiek innych danych).
    Na koniec zaimplementowane jest sterowanie 6 LED z użyciem 3 pwm- ów. Wymagało to multipleksowania 2 wspólnych katod, oraz synchronizacji timerów, dla uniknięcia artefaktów wizualnych.
    Przy okazji debug w źródłach znajduje się też prorgam soft uartu który dla 16MHz zegara dostarczał danych z szybkością 1Mbit.
    Mimo iż głównym celem projektu było rozpoznanie tematu obsługi i2c oraz możliwości 'równoczesnego' funkcjonowania kilku krytycznych czasowo procedur. Panel może być użyty jako uzupełnienie jakiegoś procesorowego systemu z szyna i2c.

    W załącznikach źródło programu oraz schemat płytki użytej do jego stworzenia i testów.
    Panel dotykowy na attiny44 z komunikacją i2cPanel dotykowy na attiny44 z komunikacją i2c


    Fajne!
  • #2 15 Paź 2017 12:16
    __Maciek__
    Poziom 19  

    Hej, czy to będzie część jakiegoś większego urządzenia ?
    Interesuje mnie szczególnie czułość przycisków dotykowych. ( Czy da radę uzyskać sensowną czułość powiedzmy przy szybie 3mm ? )
    Brak triggera i odczyt bezpośredni wartości w celu pracy analogowej ? czy raczej brak miejsca / czasu / procedur kalibracyjnych ?
    Czeka na mnie klawiatura dotykowa dlatego pytam.

  • #3 15 Paź 2017 12:32
    R-MIK
    Poziom 37  

    Projekt mnie zaciekawił ze względu na to, ze będę robił IIC Slave na AtMega88. Tam jest TWI, więc pewnie nie będzie problemu z 400kHz. Zdziwiło mnie natomiast, że w USI nie można uzyskać 400kHz. Jest to o tyle istotne, że w jednym z projektów mam AtTiny4313. Jak pamiętam rejest z USI nie ma zatrzasku i dana trzeba odebrać zanim pojawi sie kolejny bit transmisji. Z tego wynika, że gdyby pomiędzy transmitowanymi bajtami przez mastera były przerwy to USI wyrabiało by się. Jest to dla mnie o tyle istotne, ze gdybym nadawał do układu slave z USI robiłbym pauzy, do innych bez tych pauz.
    W każdym razie, kody, które złączyłeś przydadzą się.

  • #4 15 Paź 2017 18:22
    bobeer
    Poziom 28  

    USI to taki dziwoląg który jakoś tam wspiera pewne operacje na magistrali udostępniając licznik (taktowany oboma zboczami) oraz rejestr przesuwający. Chwała bogu że detektor startu też tam jest, przerwania od stopu nie uświadczy niestety.

    Jeśli będziesz pracował na ATMEGA88 to tam TWI jest obsługiwane przez inne peryferium. USI to taka proteza i2c bardziej dla procesorów tiny.

    Dodano po 11 [minuty]:

    __Maciek__ napisał:
    Hej, czy to będzie część jakiegoś większego urządzenia ?
    Interesuje mnie szczególnie czułość przycisków dotykowych. ( Czy da radę uzyskać sensowną czułość powiedzmy przy szybie 3mm ? )
    Brak triggera i odczyt bezpośredni wartości w celu pracy analogowej ? czy raczej brak miejsca / czasu / procedur kalibracyjnych ?
    Czeka na mnie klawiatura dotykowa dlatego pytam.


    Może to być częścią większego urządzenia.
    Czułość nie jest na tyle duża by uzyskać 3mm przez szybę, aczkolwiek gdyby procesor miał obsługiwać same tylko pola dotykowe nie musząc dzielić czasu, to dało by się uzyskać o wiele większą precyzję i czułość niż w tym momencie.
    Podanie orientacyjnych 3mm zresztą nie wiele mówi, ponieważ wypadkowa czułość zależy od rozmiarów padów, kształtu, miejsca masy, dielektryka etc.
    Do precyzyjnych rozwiązań wymagających wysokiej czułości polecałbym raczej dydykowane układy.
    Odczyt wartości analogowych jest tylko przy okazji. Rejestry wyrzucają flagi po przejściu przez histerezę. Nie wiem co masz na myśli pisząc 'trigger' w takiej implementacji.

  • #5 19 Paź 2017 07:35
    nouki
    Poziom 25  

    Witam.

    Układ AT42QT1070 dobierając odpowiednie pola działa na 4mm. Zastanawia mnie czy ten zmyślny układ wyjdzie taniej niż gotowy specjalizowany.

    Pozdrawiam
    Maciej.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME