
Przedstawiam projekt urządzenia (konwertera), umożliwiającego używanie dżojstików od konsoli Pegasus na popularnym komputerze Commodore 64 (C64). Urządzenie opiera się na mikrokontrolerze Atmega 8.
Motywacja
Jakiś czas temu zakupiłem komputer Commodore 64.

Nigdy wcześniej nie miałem z nim doczynienia, jednak zakochałem się w nim od pierwszego wejrzenia.
Po skonstruowaniu do niego takich gadżetów, jak:
* kabel C64-Euro SCART (dający idealną jakość obrazu),
* Kabel XM1541 (umożliwiający podłączenie stacji dyskietek C64 do PC i tym samym transfer danych pomiędzy PC a owymi dyskietkami),
* kabel C64S (umożliwiający podłączenie magnetofonu Datasette pod PC i nagrywanie gier na taśmy oraz zgrywanie ich do PC)
mogłem już grać w swoje ulubione gry. Niestety problematyczna okazała się klawiatura od owej maszyny. Jest ona dość niewygodna i posiada tylko dwie strzałki (lewo-prawo, góra-dół uzyskujemy ze wciśniętym klawiszem Shift), co utrudnia sterowanie. Na szczęście większość gier, poza klawiaturą, obsługuje także joystick.
Joysticki do C64 to bardzo proste urządzenia, podłączane poprzez port DB9.
Kontroler taki może składać się z 5 przycisków (4 kierunki oraz ogień) oraz dwóch analogowych przycisków działających w pewnym zakresie (potencjometry). Schemat kontrolera przedstawiam poniżej:

Jako, że swoje dzieciństwo poświęciłem znanej wielu konsoli Pegasus, posiadam w domu ich kilka wersji oraz spory zestaw joysticków.
Dlaczego więc by ich nie wykorzystać, podłączając do C64?

Kontrolery Pegasusa - opis
Joystick do konsoli Pegasus posiadają 4 kierunkowy krzyżak oraz cztery przyciski (Start, Select, A, B). Często spotyka się także dodatkowe dwa (Turbo-A oraz Turbo-B), które wduszone dają efekt szybkiego naciskania i puszczania odpowiednio klawiszy A i B. Kontrolery te także podłącza się poprzez port DB9 (lub DB15, jednak przejściówka DB9<->DB15 polega wyłącznie na zmianie kolejności wyprowadzeń).
I właściwie tutaj kończy się podobieństwo między kontrolerem C64, a Pegasusowym. Dżojstik Pegasusa nie posiada każdego klawisza podpiętego do innego przewodu, jak to ma miejsce w C64. Tutaj mamy oprócz masy i zasilania trzy linie - STROBE, CLOCK oraz DATA.

Aby odczytać stan przycisków, należy najpierw wywołać zbocze rosnąse na STROBE. Następnie możemy rozpocząć odczyt stanu przycisków - dla każdego z nich wywołujemy zbocze rosnące na CLOCK, a po nim czytamy stan z linii DATA. Kolejne zbocza na linii CLOCK odczytują stany przycisków w następującej kolejności: GÓRA, DÓŁ, LEWO, PRAWO, SHIFT, START, A, B. W kontrolerze obecny jest dodatkowy układ scalony 4021 (8-bitowy rejestr przesuwny), który zajmuje się dekodowaniem powyższego protokołu.
Joystick od Pegasusa można łatwo przerobić pod C64, podlutowując się bezpośrednio pod jego przyciski (pomijając układ). Jednak dużo bardziej fascynujący okazał się pomysł bez ingerencji w jego wnętrzności...
Realizacja programowa - opis
Mikrokontroler wykonuje w pętli odpowiednie sekwencje:
* odczytuje wszystkie przyciski z pierwszego i drugiego kontrolera pegasusowego
* ustawia stan odpowiednich przycisków na wejściach portów PORT1 i PORT2 od C64 (przycisk A jest mapowany jako OGIEŃ).
Realizacja techniczna - opis
Urządzenie składa się z mikrokontrolera Atmega8 oraz 4 portów - dwóch podłączanych pod C64 i dwóch, do których dołączamy kontrolery Pegasusa. Całość (mikrokontroler + joysticki Pegasusa) zasilana jest z portów kontrolerów C64:

Płytka z układem została zaprojektowana w Eagle w taki sposób, aby była możliwie najmniejsza. Rozstaw gniazd został tak dobrany, aby dało sie ją umieścić
bezpośrednio w C64 (odpowiedni odstęp między gniazdami). Dziesięciopinowe złącze to ISP, służące do programowania mikrokontrolera bez potrzeby wyciągania.


Zdjęcia:




Problemy, ciekawe uwagi:
Podczas odczytywania stanu klawiszy kontrolera pegasusowego, pomiędzy zboczem rosnącym na CLK, a odczytem linii DATA należy zachować odpowiedni czas
odstępu - wynika to z czasu propagacji sygnału, spowodowanym chociażby długim przewodem. Pomimo taktowania mikrokontrolera zegarem 1 MHz, należało wstawic parę rozkazów NOP.
Ustawianie stanu odpowiednich linii adresowych na porcie kontrolera od C64 jest dość trikowe. Otóż, jeżeli dany klawisz ma być wciśnięty, to jego linię sterującą ściągamy do masy. Jednak jeżeli ma być puszczony, to nie podciągamy jej do napięcia! Wydaje mi się, że porty od kontrolerów i klawiatura współdzielą jakieś linie (otwarty kolektor) - wciskanie przycisku OGIEŃ na kontrolerze oraz spacji na klawiaturze jest tym samym. Wobec powyższych podciągnięcie linii sterującej przyciskiem OGIEŃ do napięcia sprawi, że komputer nie będzie reagował na wciśnięcia spacji.
Aby uciec od problemu, w przypadku nie wciśnięcia odpowiedniego przycisku, należy jego linie sterującą zostawić wiszącą. W Atmedze 8, której wszystkie wyjścia mogą być trójstanowe realizowane jest to poprzez ustawienie linii jako wejścia.
Pliki Eagle oraz program sterujący (napisany w C) można pobrać poniżej.
Cool? Ranking DIY