multilanguage

czwartek, 15 grudnia 2011

Uniwersalna przejściówka USB I/O problemy przy konstrukcji

Stwierdziłem, że miło by było mieć możliwość komunikacji komputera ze światem wewnętrznym. Wymogi nie były duże kilka portów I/O, ale wiadomo, że apetyt rośnie w miarę jedzenia. Z racji tego, że laptop nie posiada innych portów prócz USB, wybór sposobu komunikacji nie był zbyt trudny.
Teoretycznie mógłbym kupić jakieś gotowe rozwiązanie, ale problemem jest dostarczane oprogramowanie i cena. Chciałbym mieć możliwość pełnej kontroli nad systemem, tak aby w przyszłości móc go w pełni zaimplementować do swoich potrzeb. W większości producenckie biblioteki są zamknięte, więc pozostał tylko Open Source.

Zacząłem szukać różnych rozwiązań. Wystarczyła mi łączność poprzez usb z mikrokontrolerem AVR który to męczę już od dawna. Znalazłem to: VUSB
Stwierdziłem, że najłatwiej będzie zaadoptować gotowe rozwiązanie które potem się tylko trochę przerobi. Wybrałem ten projekt powerswitch Niestety nie udało mi się go uruchomić sprzętowo. (VUSB korzysta z różnych konfiguracji podłączenia do portu USB) Wtedy olśniło mnie, że przecież programator z którego korzystam to właśnie to czego szukam. Odszukałem szybko usbtinyisp

Żeby nie zniszczyć programatora skopiowałem go na płytce uniwersalnej. System zaczął wykrywać urządzenie USB tylko za bardzo nie wiadomo było co dalej. Wróciłem do projektu powerswitch który to był dostarczony razem z programem do sterowania portami. Firmware avr nie wymagał ingerencji gdyż zawierał wbudowany loopback, zaczęło się za to mozolne wertowanie kodu powerswitcha w celu zamiany danych urządzenia. Tu bardzo pomocny był program wireshark który ma możliwość podsłuchiwania pakietów na porcie USB. (Program dostępny w repo Ubuntu. BTW: podnosi informatyczną samoocenę użytkownika po przeczytaniu tego wikipedia:Wireshark)
Dalej poszło już z górki, z fimwaru wyrzuciłem komunikację przez ISP i dorzuciłem obsługę I2C, aby móc skorzystać z zewnętrznego ADC (PIC8591) którego to niestety attiny2313 nie posiada. Zastanawiałem się jak najlepiej wykorzystać potencjał takiego rozwiązania. Najpierw chciałem w procesorze konfigurować wszystkie układy peryferyjne, ale prawie od razu zaprzestałem tego rozwiązania i stwierdziłem że najlepiej będzie mieć możliwość obsługi I/O całego wolnego portu i możliwość odczytu i zapisu do rejestrów funkcyjnych. Dzięki temu nie będzie problemu z objętością kodu, a w dodatku z kartą katalogową na kolanach (lub drugim monitorze) będę wstanie praktycznie w pełni wykorzystać możliwości układu. Ponieważ rejestry funkcyjne są restartowane przy resecie, nie ma problemu z błędną konfiguracją. Tu napotkałem spory problem gdyż w C nie ma za bardzo możliwości zapisu wartości rejestru poprzez podanie jego adresu. Sporo czasu zajęło mi szukanie gotowych rozwiązań, aż w końcu wzbiłem się na programistyczne wyżyny i napisałem dwie wstawki asemblerowe, które wykonują to o co mi chodzi. Zdarzało mi się pisać w asemblerze, ale jednak integracja kodu asm w c jest nadal dla mnie zbyt magiczna, bardzo pomocne były inline asm i inline assembler

Teraz zostało mi tylko uporządkowanie kodu i hardwaru, jak tylko to nastąpi postaram się opublikować gotowy projekt. Mam zamiar pobawić się trochę obecnym rozwiązaniem, dopracować je, a potem wykorzystać zdobyte doświadczenie do konstrukcji czegoś większego 64 pinowa atmega128 powinna pasować.

Linki zewnętrzne:
http://www.obdev.at/products/vusb/index.html
http://www.obdev.at/products/vusb/powerswitch.html
http://www.ladyada.net/make/usbtinyisp/
http://www.wireshark.org/
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
http://www.rn-wissen.de/index.php/Inline-Assembler_in_avr-gcc

Brak komentarzy:

Prześlij komentarz