Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Konwerter padów od Pegasusa pod Commodore 64 (C64)

phanick 17 Jul 2012 23:43 19518 20
Renex
  • Konwerter padów od Pegasusa pod Commodore 64 (C64)
    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.
    Konwerter padów od Pegasusa pod Commodore 64 (C64)
    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:
    Konwerter padów od Pegasusa pod Commodore 64 (C64)

    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?
    Konwerter padów od Pegasusa pod Commodore 64 (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.
    Konwerter padów od Pegasusa pod Commodore 64 (C64)

    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:
    Konwerter padów od Pegasusa pod Commodore 64 (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.
    Konwerter padów od Pegasusa pod Commodore 64 (C64) Konwerter padów od Pegasusa pod Commodore 64 (C64)

    Zdjęcia:
    Konwerter padów od Pegasusa pod Commodore 64 (C64) Konwerter padów od Pegasusa pod Commodore 64 (C64) Konwerter padów od Pegasusa pod Commodore 64 (C64) Konwerter padów od Pegasusa pod Commodore 64 (C64)

    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
    About Author
    phanick
    Level 28  
    Offline 
    Has specialization in: energetyk najwyższych napięć
    phanick wrote 2659 posts with rating 2614, helped 61 times. Live in city Warszawa. Been with us since 2007 year.
  • Renex
  • #2
    xanio
    Level 27  
    No i cudnie, chociaż gdybyś zrobił przejściówkę na kablach od strony komputera, mógłbyś stosować ją też do innych ośmiobitowców.
  • #3
    cyclone4
    Level 17  
    phanick wrote:

    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.


    Do czasu propagacji sygnału jest jeszcze daleko -- ograniczeniem jest tutaj układ siedzący w padzie od Pegasusa.
  • #4
    John5MM
    Level 19  
    Wynalazek fajny, lecz czy nie prościej było by zrobić płytkę dać kilka przycisków microswitch dołączyć kabel i zamknąć w obudowie po padzie od pegazusa ? Ogólnie pady od pegazusa lubiły przerywać w kablu i wściec się można było, a z tego co pamiętam w joysticku chodzi o to aby wybrany przycisk był zwarty do masy i w tedy jest ruch, ale brawo za wykonanie i estetykę.
  • #5
    phanick
    Level 28  
    luzik1980 wrote:
    Wynalazek fajny, lecz czy nie prościej było by zrobić płytkę dać kilka przycisków microswitch dołączyć kabel i zamknąć w obudowie po padzie od pegazusa ? Ogólnie pady od pegazusa lubiły przerywać w kablu i wściec się można było, a z tego co pamiętam w joysticku chodzi o to aby wybrany przycisk był zwarty do masy i w tedy jest ruch, ale brawo za wykonanie i estetykę.

    Planowałem też taką możliwość, jednak microswitche się do tego nie nadają - zbyt mocno je trzeba naciskać, `klikają` przy wduszaniu i ogólnie są niewygodne. A pady, w których zastosowano przyciski z gumkami (jak w pilotach) są wlaśnie do tego celu stworzone. Jedyną wadą jest to, że cały krzyżak zrobiony jest jako jeden kawałek plastiku i często przy naciskaniu np strzałki w lewo i w prawo może się niechcący wdusić strzałka w górę albo w dół.

    Mi nic nie przerywa - może na padach od terminatora za 2 złote przerywa.


    xanio wrote:
    No i cudnie, chociaż gdybyś zrobił przejściówkę na kablach od strony komputera, mógłbyś stosować ją też do innych ośmiobitowców.

    Miałem na początku pomysł użycia kabli, jednak nie lubie, gdy się dużo rzeczy `majta`.

    Czy inne ośmiobitowce mają takie samo złącze i układ wyprowadzeń? Np. Amiga, ZX Spectrum, Atari, Armstrad?

    Moderated By androot:

    Amiga to żaden ośmiobitowiec!!!

  • Renex
  • #7
    Karaczan
    Level 41  
    Atari i Amiga z moich informacji mają taki sam system sterowania joystickami.
    Nie jestem pewien co do ZX Spectrum i CPC Schnider/Amstrad CPC.
    Gniazdo mają takie samo ale CPC ma coś zamienione.
    Wiem bo miałem joy z przełączaniem Atari/CPC, i przy ustawieniu CPC nie współpracował poprawnie z innymi komputerami.
    Jeśli cię to interesuje może znajdę jeszcze gdzieś ten niezniszczalny joystick i rozrysuję schemat.

    Powodzenia w rozbudowie C64, to fajna maszyna jest i ostatnimi czasy doczekała się wielu ciekawych dodatków i modyfikacji.
  • #8
    Anonymous
    Anonymous  
  • #9
    lepczon
    Level 9  
    phanick wrote:
    * kabel C64-Euro SCART (dający idealną jakość obrazu),

    czy mógłbyś coś więcej powiedzieć na ten temat? mam w domu C64 lecz nie mam do niego kabla żeby go podłączyć pod telewizor. czy skonstruowanie takiego kabla jest opłacalne w porównaniu do kupienia nowego np. z allegro?
  • #10
    phanick
    Level 28  
    lepczon wrote:
    phanick wrote:
    * kabel C64-Euro SCART (dający idealną jakość obrazu),

    czy mógłbyś coś więcej powiedzieć na ten temat? mam w domu C64 lecz nie mam do niego kabla żeby go podłączyć pod telewizor. czy skonstruowanie takiego kabla jest opłacalne w porównaniu do kupienia nowego np. z allegro?

    Więcej informacji tutaj:
    https://www.elektroda.pl/rtvforum/topic2299894.html

    Jeśli dysponujesz wtyczką euro (2 złote), wtyczką 7 pin din (2 złote) oraz paroma metrami kabla 5 żyłowego (4 żyły + oplot), oraz cyną i lutownicą, to taka wtyczka jest twoja. Czy się opłaca kupować? Ja bym nie kupował, zawsze gdy samemu coś można zrobić za niewielkie pieniądze, to warto się pokusić.
  • #11
    k4be
    Level 31  
    Układ ATmega8 wydaje się przesadnie dużym mikrokontrolerem do takiego zastosowania - wystarczyłby tutaj nawet mały CPLD. Czym podyktowany był jego wybór?
  • #12
    phanick
    Level 28  
    k4be wrote:
    Układ ATmega8 wydaje się przesadnie dużym mikrokontrolerem do takiego zastosowania - wystarczyłby tutaj nawet mały CPLD. Czym podyktowany był jego wybór?

    Wiedziałem, że kiedyś padnie taka uwaga. Jeżeli wg kolegi jest on przesadnie duży, można zastosować wersję SMD, która jest mniejsza :-)

    Nie wiem jak z dostępnością i ceną układów CPLD, bo nigdy się nimi nie interesowałem, jednak ze wstępnych orientacji kiedyś przykładowo natknąłem sie na jakiś za 9zł. Atmega kosztuje złotych 5.

    Wybór padł na At8, bo jest
    * tani
    * łatwo dostępny i programowalny
    * jak mi będzie do czegoś porzebny, to go wyjmę z podstawki i przeprogramuję. CPLD bardziej nadaje się do szybkich zastosowań, jak np. generator wideo, konieczność stworzenia nietypowego układu realizującego funkcje logiczną.

    Ponadto programowanie układów CPLD wymaga specjalnego programatora. Jego wersja na USB kosztuje 200złotych (PLDIII Cable). Wersję na LPT można zrobić za złotych 2, ale wymaga portu równoległego, a nie chce mi się za każdym razem włączać starego komputera.
  • #13
    tymon_x
    Level 30  
    phanick wrote:
    Ponadto programowanie układów CPLD wymaga specjalnego programatora. Jego wersja na USB kosztuje 200złotych (PLDIII Cable). Wersję na LPT można zrobić za złotych 2, ale wymaga portu równoległego, a nie chce mi się za każdym razem włączać starego komputera.

    Nie, nie wymaga. Są specjalne przemysłowe standardy jak SVF (Serial Vector File) albo XSVF. Wystarczy samo FTDI i oprogramowanie typu SVFPlayer. Sam standard jest prostacki do zaimplementowania. I można tak skonfigurować każdego CPLD czy nawet FPGA.

    I to jest przykład jak nie należy projektować urządzenia. Atmega i 4 złącza, gdzie są chociaż kondensatory filtrujące !
  • #14
    phanick
    Level 28  
    tymon_x wrote:

    I to jest przykład jak nie należy projektować urządzenia. Atmega i 4 złącza, gdzie są chociaż kondensatory filtrujące !

    W Commodore:P

    Dodano po 1 [minuty]:

    tymon_x wrote:
    phanick wrote:
    Ponadto programowanie układów CPLD wymaga specjalnego programatora. Jego wersja na USB kosztuje 200złotych (PLDIII Cable). Wersję na LPT można zrobić za złotych 2, ale wymaga portu równoległego, a nie chce mi się za każdym razem włączać starego komputera.

    Nie, nie wymaga. Są specjalne przemysłowe standardy jak SVF (Serial Vector File) albo XSVF. Wystarczy samo FTDI i oprogramowanie typu SVFPlayer. Sam standard jest prostacki do zaimplementowania. I można tak skonfigurować każdego CPLD czy nawet FPGA.

    Akurat z FPGA (Xilinxa) miałem trochę doczynienia. Długo szukałem schematu jakiegoś otwartego programatora (z plików .BIT) i jedyne na co trafiłem, to tylko PLDIII Cable na LPT.
  • #15
    k4be
    Level 31  
    phanick wrote:
    tymon_x wrote:

    I to jest przykład jak nie należy projektować urządzenia. Atmega i 4 złącza, gdzie są chociaż kondensatory filtrujące !

    W Commodore:P
    Nota aplikacyjna Atmela, rozdział drugi ;) Ten układ działa tylko dzięki zbiegowi okoliczności: krótkie przewody łączące mikrokontroler z układami zasilania w mikrokomputerze, i wysokie napięcie szyny zasilającej (5V) względem minimalnego napięcia pracy AVR (nie podano, która wersja ATmega8 została zastosowana, ta bez literek według dokumentacji wymaga 4,5V ale w praktyce może pracować dużo niżej jeśli wyłączono fuse-bit BOD). Dzięki temu szpilki prądowe opisane w podanym dokumencie nie powodują aż takich spadków napięcia, aby przeszkadzało to w pracy układu (co oczywiście nie oznacza, że projekt taki jest poprawny). Z typowym mikrokontrolerem na 3,3V to by pewnie nie przeszło.
    A teraz troszkę inne pytanie: na ile prawdopodobne, że mogłaby się udać taka modyfiacja systemu KERNAL w C64: mikrokomputer sam odbiera stan kontrolera pegasusa używając SPI, robiąc 'bit-banging' - a aplikacje interpretowały to jako działanie kontrolera oryginalnego? Czy może typowe oprogramowanie tego komputera odwołuje się wprost do rejestrów CIA, i te układy należałoby podmienić (nie polecam)?
  • #16
    phanick
    Level 28  
    Aż tak głęboko w C64 nie siedzę, ale aplikacje pisane pod BASICem odwołują się do kernala (z reguły jakieś proste programiki), natomiast assemblerowe korzystają prosto z hardware'owej kontrukcji maszyny.
  • #17
    Anonymous
    Anonymous  
  • #18
    ptero
    Level 23  
    phanick wrote:
    Czy inne ośmiobitowce mają takie samo złącze i układ wyprowadzeń? Np. Amiga, ZX Spectrum, Atari, Armstrad?


    Joystick do Amstrada jest podłączany do matrycy klawiatury. Procesor odczytuje tylko zwieranie linii (przyciski) i nie można podłączyć takiego konwertera, ani nie można włączyć "autofire". Odpada więc wystawianie różnych stanów na złącze joysticka, jak w C64 i Atari. Trzeba czekać, aż procesor ustawi niski poziom na kolejnym wierszu matrycy (74LS145) i odczyta która kolumna jest zwarta do masy (port AY). Czyli trzeba czekać aż COM1 (lub COM2) będzie w stanie niskim i podać 0 na odpowiedni pin portu joysticka. Gdy COM będzie w stanie wysokim, trzeba zmienić stan pinu. Inaczej procesor uzna to za wciśnięcie klawisza na kolejnym wierszu matrycy. Co do Spectrum, to nie wiem... ale też ma AY.
  • #19
    k4be
    Level 31  
    Chyba prostszym rozwiązaniem jest rzeczywiste zwieranie linii z użyciem elementów półprzewodnikowych, choćby zwykłego tranzystora MOSFET.
  • #20
    przem997
    Level 15  
    Najciemniej pod latarnią. Świetne utrudnienie banalnego rozwiązania, które sam podałeś. Tak się składa, że C64 miałem i naprawiało się joysticki a nawet robiło.

    Wystarczało styki z pada dostosować do wtyku wg schematu
    Konwerter padów od Pegasusa pod Commodore 64 (C64)

    tym bardziej skoro masz ich dużo...