Najprostszym rozwiązaniem było kupienie FT232, ale w wyniku porównania jego ceny z ceną ATmega8 nie było ono zbyt ekonomiczne. Dlatego autor postanowił zaprojektować konwerter na mikrokontrolerze. A jak jest już mikrokontroler, to sam USART wydaje się minimalistycznym rozwiązaniem. Stąd pomysł na bardziej rozbudowane i uniwersalne urządzenie z kilkoma interfejsami.
Tak więc urządzenie posiada następujące możliwości:
- port USB->USART;
- port USB->SPI;
- port USB->I2C;
i oprócz tego jest to urządzenie USB HID, żeby nie męczyć się z instalacją sterowników.
Autor wybrał mikrokontroler ATmega8, ponieważ w obudowie TQFP zajmuje niewiele miejsca (znacznie mniej niż AtTiny2313) i posiada całe 8KB pamięci.
Na początku były plany, żeby wszystkie interfejsy dało się programować, ale po rozplanowaniu ścieżek autor musiał zrezygnować ze sprzętowego I2C, ponieważ nie udało się go zaimplementować na jednostronnej płytce. W przyszłości autor rozwiąże ten problem.
Dlatego też funkcjonalność I2C została nieco ograniczona, co na szczęście nie dotyczy USART i SPI.
Schemat urządzenia wygląda następująco:
Jak widać, jest bardzo prosty. Mikrokontroler jest zasilany napięciem +5V, poziomy napięć dla USB dopasowano za pomocą dzielników napięcia. Rezystor 68Ω + dioda Zenera 3,3V. Częstotliwość taktowania mikrokontrolera - 12MHz. To minimalna wymagana częstotliwość dla pracy z szyną USB.
Schemat również przewiduje trzy diody wskazujące poszczególne tryby pracy. Jedna dioda pokazuje jaki tryb pracy jest aktualnie włączony, a dwie pozostałe wskazują odbiór/transmisję danych.
Nie przewidziano żadnych przycisków i przełączników w urządzeniu, a wszystkie ustawienia wprowadza się bezpośrednio na komputerze.
Oprócz tego na wszystkich wyjściach służących do pracy interfejsów znajdują się rezystory 68Ω w celu ochrony mikrokontrolera przed zwarciem. A ponowne lutowanie obudowy TQFP nie jest zbyt ciekawym zajęciem.
Jak wcześniej wspomniano, komputer rozpoznaje urządzenie jako HID i nie jest potrzebna instalacja sterowników (system operacyjny myśli, że pracuje z urządzeniem wejściowym). Za wymianę danych przez USB jest odpowiedzialna biblioteka V-USB. Działa ona zarówno na mikrokontrolerze, jak i na komputerze. VID i PID wybrano z opcji oferowanych przez V-USB: VID – 0x16c0, PID - 0x05df. W przeciwnym wypadku trzeba by było przeznaczyć okrągłą sumę na zakup indywidualnego identyfikatora dla urządzenia USB lub stosować urządzenie tylko do własnego użytku. A ponieważ to projekt Open Source, spokojnie można korzystać z identyfikatorów V-USB.
Całość zmontowano na płytce o wymiarach 23х34 mm. Wygląda to tak:
A po wytrawieniu i polutowaniu tak:
Jest to próbna wersja urządzenia, dlatego można znaleźć niewielkie różnice w porównaniu ze schematem płytki przedstawionym powyżej. Autor zdecydował, że nie potrzebuje wyjścia SS do pracy SPI i go nie zamontował. Jednak jak się później okazało, był to błąd, gdyż tryb Slave bez niego nie działa. Po wymaganych poprawkach całość działa jak trzeba.
Jak wcześniej wspomniano, komputer traktuje urządzenie jak HID, czyli system operacyjny dobiera do niego sterownik ze swojej bazy. To umożliwia pracę tego urządzenia na dowolnym komputerze. Ale jest tu pewien mały szkopuł - żaden z dostępnych programów służących do wymiany danych za pośrednictwem USART nie będzie współpracować z tym urządzeniem. Oznacza to, że będzie potrzebny specjalny program, który umożliwi pracę z modułem. Dlatego autor skorzystał z C++ Builder w wersji 2007 i napisał taki oto program:
Jest on dość prosty, każdy interfejs posiada pewną ilość ustawień. Co ważne każdy z interfejsów może pracować tylko pojedynczo. W momencie podłączenia urządzenia do komputera, w oknie programu pojawią się przyciski, których kliknięcie spowoduje uruchomienie odpowiedniego interfejsu. Następnie wystarczy wpisać dane w pole w określonym formacie i kliknąć przycisk „Send”. Każdy interfejs posiada swój format danych. Poniżej je dokładnie omówię:
USART: (odbiór danych non stop dopóki tryb jest włączony)
- Wysyłanie kilku liczb HEX - wpisujemy je z przerwami w dowolnej ilości, np. 01 05 fa aa ...
- Wysyłanie ciągu znaków (tekst, liczby itd.) - tu na początku ciągu należy wpisać identyfikator S (s), np. s www.cxem.net
SPI:
- Aby przesłać dane do urządzenia, należy zastosować taki format ciągu: adres (do kogo przesyłamy i do jakiej komórki pamięci) А (а) i dane D (d).Np., aa3 dfa
- Aby wysłać zapytanie dotyczące wysłania danych z urządzenia: adres (od kogo otrzymujemy i z jakiej komórki pamięci) oraz identyfikator odczytywania R (r). Np., aa3 r
I2C:
- Aby wysłać dane do urządzenia: adres urządzenia (bit odczyt/zapis=0) А (а) adres komórki pamięci M (m) dane D (d). Np., аа2 m03 d15
- Zapytanie dotyczące danych wygląda tak: adres urządzenia (bit odczyt/zapis=0) А (а) adres komórki pamięci M (m) adres urządzenia (bit odczyt/zapis=1) А (а) Identyfikator odczytu z ilością komórek pamięci do odczytu R (r). Np., aa2 m03 aa3 r1
Dla SPI w trybie Slave nie przewidziano żadnych komend - siedzimy i czekamy aż coś zostanie przesłane.
Aby rozpocząć pracę z urządzeniem, podłączamy je do komputera, czekamy, aż system operacyjny wyświetli komunikat o odnalezieniu sterowników, włączamy program i rozpoczynamy wymianę danych.
Program współpracuje ze wszystkimi wersjami Windows, począwszy od Windows XP, a skończywszy na Windows 8 i nie potrzebuje do tego żadnych dodatków jak np. NetFramework. To samo dotyczy modułu.
FUSE bity ustawia się za pomocą zewnętrznego rezonatora kwarcowego o wysokiej częstotliwości. Wygląda to tak:
Na obrazku LOW FUSE bity mają wartość 1, kiedy są zaznaczone i 0, kiedy nie są. W przypadku HIGH z FUSE bitami jest na odwrót. W systemie szesnastkowym tak to wygląda: HIGH: D9, LOW: FF.
I na koniec wideo (USART pracuje w trybie echo (Rx i Tx są połączone), a SPI i I2C autor testował z układem scalonym RTC PCA2129T, który posiada zarówno interfejs SPI, jak i I2C):
http://youtu.be/ZjMxuMmkHxY
W załączniku płytka drukowana, źródła i oprogramowanie
Autor: neo-bars(_at_)ya.ru
Link do tłumaczonego tekstu: http://radiokot.ru/circuit/digital/pcmod/49/
