SNES-Joypad

Aus Hobbyelektronik.org
Version vom 9. Oktober 2007, 23:31 Uhr von Chris (Diskussion | Beiträge) (noch nicht ganz fertig...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Als Kind hatte ich mir mal (ja, aus eigener Tasche) einen Super Nintendo gekauft. Nachdem er die Jahre leider nicht überlebt hat und ich doch ab und an mal ein bisschen Verlangen nach SNES habe, griff ich auf Emulatoren für den PC zurück.

So gut die Programme auch sind - man hat ein Problem: man muss auf der Tastatur spielen. Das mag bei manchen Spielen noch gehen, wenn man jedoch in brenzliche Situationen kommt, braucht man dann doch die etwas trainierteren Daumen. Irgendwann kam ich auf die Idee, einfach das Gamepad an den PC anzuschließen. Mit einem Nachbau eines SNES-Gamepads, das ich mal geschenkt bekommen habe, funktionierte das ziemlich gut.

Im Pad selbst waren zwei CD4021 (Schieberegister) verbaut. Die Funktionsweise des Gamepads ist somit genauso simpel wie... simpel. Wenn die CPU in der Konsole den Controller auslesen will, werden die Daten per Latch in das Register geladen, von wo es dann seriell ausgelesen werden kann.

Die Beschaltung im Controller ist folgendermaßen:

Pin Farbe Funktion
1 braun GND
2 rot Data
3 orange Latch
4 gelb Clock
5 weiß Vcc

Bei meiner ersten Entwicklung war das Gamepad am Parallel-Port angeschlossen und wurde von einem kleinen VB-Programm ausgelesen. Die Tastenanschläge wurden dann per DLL als Tastatur-Eingaben simuliert.

Das ganze hatte nur ein paar Nachteile:

  • Die Software war nicht besonders schön
  • Der Parallelport wurde (mal wieder) zweckentfremdet
  • Man muss hinter den PC kriechen, wenn man wieder etwas drucken will
  • Das Ganze ist einfach nicht rund (vorangegangene Punkte)
  • Mein Notebook hat weder eine parallele noch serielle Schnittstelle

Irgendwann entdeckte ich AVR-USB, eine Software-Implementierung von USB in AVRs. Als Projekt war SNES/NES gamepad (and mouse) to USB adapter verlinkt.

Die Schaltung habe ich mir dann relativ zügig aufgebaut, um zu testen, ob da wirklich das dahintersteckt, was ich mir erwartet hatte. Tatsächlich meldete Windows 2s nach dem Einstecken der Konstruktion eine neue Hardware.

Nur die Tatsache, dass an einem 28-Pin-Mikrocontroller nur ca. 10 Pins und auf den 8KB Speicher nur 3 belegt waren und das Ganze nicht richtig im Gamecontroller untergebracht werden konnte, störte mich ein wenig.

Vor kurzem las ich dann folgendes auf obdev.at:

New: Internal RC Oscillator Supported
AVR-USB supports the internal RC oscillator of all AVRs with internal high
frequency PLL, such as the ATTiny45 or ATTiny26. No external crystal is 
needed on these devices! See the EasyLogger example for details.

Das war das, worauf ich gewartet hatte: Der ATTiny45 hat 8 Beine, wofür 2 für USB und weitere 3 für die Standardbeschaltung verwendet werden. Somit bleiben genau die benötigten drei Anschlüsse für das Gamepad frei.

Die Beispielanwendung für die Impementierung (EasyLogger) zielt schon sehr gut in die Richtung, in die ich gehen will.

Der Großteil des Quelltextes konnte beibehalten werden, Teile kamen von Raph und wurden ziemlich stark umgebaut.

Nachdem ich einige Wochen zuvor kläglich daran gescheitert bin, die Software von oben auf den ATTiny2313 zu portieren, nahm ich mir zum Ziel, den Quelltext so klein wie möglich zu gestalten. Nach etlichen Optimierversuchen und Brennvorgängen war es dann geschafft: Das kompilierte Programm ist exakt 2000 Byte groß. Leider hat der Device-Name etwas darunter gelitten - es ist allerdings noch deutlich erkennbar, worum es sich handelt.

Ein weiteres Ziel war, die Elektronik im Controller unterzubringen, sodass nur noch ein USB-Kabel ohne weitere Elektronik am PC angeschlossen wird.