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
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.
Fajne? Ranking DIY