SNES-Joypad

Aus Hobbyelektronik.org
Wechseln zu: Navigation, Suche
AVR
Typ ATtiny45
Takt 16,5 MHz
Fuses
High 0xDD
Low 0xE1
Extended 0xFF
Engbedded com logo.png Details


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.

Anschlussbelegung am Stecker

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 V-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 Implementierung (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. Netterweise ist im Gamepad ziemlich viel Platz vorhanden, welcher erlaubt, selbst einen DIP-IC aufgelötet auf einer Platine zu fassen.

Also flugs die Schaltung vom Steckbrett auf die Platine bringen. Nach dem ersten Test am PC war ich etwas irritiert: kein fröhliches "Plüm-Plim" vom PC, stattdessen kam nach einigen Wartesekunden ein "Plopp" aus den Lautsprechern: "Hardware wurde nicht erkannt". IC ausgelötet und wieder aufs Steckbrett: "Plüm-Plim" (Hardware erkannt). Auch nach langem Suchen war kein Fehler in der Schaltung zu finden. Also zurück an den Anfang: PLL im ATTiny45 kalibrieren.

Einbau des V-USB-Controllers im SNES-Gamepad

Nach ein paar Versuchen klappte es auch und ich konnte das Gamepad wieder schließen. Wenn mich jetzt die Lust packt heißt es nur noch Controller vorne am PC an einem freien USB-Port anschließen und losspielen.

Da der Aufbau auf Lochraster zwar "ganz nett" ist, aber noch nicht der Weisheit letzter Schluss ist, habe eine kleine Schaltung + Platine in SMD in EAGLE erstellt:

Die Schaltung ist zwar nicht gerade ideal zum Brennen des AVRs, aber evtl. könnte es klappen, wenn man die Anschlüsse für USB (oben) und für den SNES-Controllers (unten) ausnutzt. Leider kommt man nicht 'drum, einen Draht direkt an RESET zu löten. Platz für einen Testpin ist leider nicht mehr vorhanden.

Die Anschlussbelegungen sind jeweils nach den "Standards". Auf der SNES-Seite wie oben angegeben, auf USB-Seite so wie im USB-Standard angegeben (Näheres ist dem Stromlaufplan in der ZIP-Datei zu entnehmen).

Eine weitere, nicht unbedingt schönere Methode ist, die Schaltung fliegend aufzubauen. Für einen zweiten Controller habe ich diese Methode gewählt:

Downloads

Die Firmware ist unkompiliert, da der OSCCAL-Wert nicht automatisch ermittelt wird. Weiterhin wurde kein Kompilat beigelegt, da das verwendete VID/PID-Paar (siehe usbconfig.h) nicht mir gehört und von jedem, der die Hardware einsetzt durch sein Paar ersetzt werden muss. (Wenn man die Schaltung für sich daheim privat betreibt, sollte es jedoch keine Probleme geben)

Nachtrag (07/2009)

Das Kalibrieren des PLLs kann seit einiger Zeit wegfallen - es gibt nun die Möglichkeit, die PLL anhand der USB-Framelänge beim Anschließen der USB-Devices zu kalibrieren. Habe es selber schon erfolgreich getestet. Näheres dazu: Clocking the AVR from the RC oscillator with auto-calibration.

Achtung: DIE FIRMWARE IN SNES-USB.zip HIER ENTHÄLT DIESES FEATURE NOCH NICHT!

Nachtrag (03/2010)

Ich habe jetzt zusätzlich die Firmware für den ATtiny2313 und die für den ATtiny45 mit automatischer Kalibrierung der PLL hochgeladen.

Am Notebook meiner Schwester gab es mit angeschlossenem Gamepad mit Autocal-Firmware ein paar Bluescreens. Ob diese tatsächlich von der Firmware ausgelöst wurde, kann ich nicht mit absoluter Sicherheit sagen. Ich weise einfach mal auf den Haftungsausschluss hin.