Diese Schaltung erlaubt den Anschluss
des weit verbreiteten und qualitativ
hochwertigen, aber dennoch preisgün-
stigen Nintendo-64-Controllers am
Gameport eines PCs (beziehungsweise
einer Soundkarte), ohne dass man
zusätzliche Treiber installieren müsste.
Statt mit PC-Tastatur und Maus lassen
sich PC-Spiele mit dem bestens in der
Hand liegenden N64-Controller steuern.
Was der N64-Controller
anbietet ...
Im Inneren des Controller befindet sich
neben ein paar Folienschaltern eine
präzise optische Analogeinheit, die ähn-
lich einer Maus arbeitet. Die Controller-
einheit gibt die Zustände der Schalter
und der Analogeinheit auf Anfrage aus,
die Kommunikation erfolgt bidirektional
über eine einzige Leitung, die im Ruhe-
zustand auf High liegt. Die Leitung wird
sowohl zum Senden von Befehlen an
den Controller wie auch zum Empfan-
gen angeforderter Daten vom Control-
ler benutzt. Um Daten vom Controller zu
erhalten, muss zuerst ein Befehlsbyte
gesendet werden. Signalisiert ein Dauer-
High eine freie Leitung, kann das
Befehlsbyte übertragen werden, so dass
der Controller als Antwort auf ein gesen-
detes $01 die Statusinformationen aller
Knöpfe und die Stellung des Analog-
sticks zurückschickt. Die Übertragung
eines Bits dauert sowohl beim Senden
wie beim Empfangen je 4 µs, ein Low
wird mit 3 µs Low- und 1 µs Highphase
signalisiert, ein High mit 1 µs Low- und 3
µs Highphase. Um beim Senden eines
Befehlsbytes die Antwort etwas hinaus-
zuzögern, kann man das letzte übertra-
gene Bit auf Low “hängen lassen”, ein
abschließendes High hat dann eine Ant-
wort binnen 2...3 µs zur Folge. Diese Ant-
wortzeit ist nicht konstant, da Controller
und N64C2PC asynchron, jeder mit
eigenem Takt arbeiten. Ein erster Ver-
suchsaufbau mit einem mit 12 MHz
getakteten 8051 (entspricht 1 µs Zyklus-
zeit) war offensichtlich zu langsam, um
dem kritischen Timing des N64-Control-
lers gerecht zu werden. Erst mit einem
Mikrocontroller vom Typ AT89C2051-
24PC, der mit 24 MHz getaktet wird, ver-
läuft die Kommunikation stabil. Und wo
wir gerade bei der Hardware (Bild 1)
sind: Neben dem Mikrocontroller und
ein paar Wiederständen zur Strombe-
grenzung sind zwei Taktgeber einge-
zeichnet. Der Grund: In der Regel sind
24-MHz-Quarze nur für Serienresonanz
erhältlich. Ein solcher Oberton-Quarz ist
hier nicht brauchbar! Sollte man keinen
Grundtonquarz beschaffen können, bie-
tet sich der Einsatz eines kompletten 24-
MHz-Quarzoszillators an (siehe Stückliste).
Zurück zur Kommunikation: Als Antwort
auf $01 erhält man eine vier Byte lange
Statusinformation des Controllers (MSB
zuerst), wie sie Tabelle 1 zeigt.
... ist nicht, was der Game-
port erwartet
Ein einfacher PC-Joystick kommt ganz
ohne aktive Schaltelemente aus, die
X-2 - 2/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
Umständliche Tastaturbefehle und eine unbequeme
Maussteuerung können einem die schönsten Spiele
am PC verleiden. Ideal wäre eine unkomplizierte
Bedienung á la Nintendo 64 kombiniert mit der
Leistungsfähigkeit eines PCs. Dieser Artikel beschreibt,
wie man einen N64-Controller an den Gameport des
PCs anschließen kann.
Entwurf von Kur t Schuster
N64 am PC
PC-Spiele mit Nintendo 64 bedient
zwei Knöpfe sind einfach Kontakte
gegen Masse. Der PC-Gameport- oder
eine entsprechende Soundkarte fragt
einfach ab, ob die Knöpfe auf Low
oder High liegen.
Beim Analogstick sieht das schon etwas
komplizierter aus. Der Stick besteht aus
zwei Potis (x und y) mit einem Wider-
stand von etwa 100 k
Ω, die an der Ver-
sorgungsspannung liegen. Über die
Potis im Joystick werden auf der Karte
Kondensatoren geladen, die zeitbe-
stimmende Glieder von monostabilen
Multivibratoren sind. Aus dem Tastver-
hältnis der Monoflops können die Stel-
lungen der Potis bestimmt werden. Alle
analogen Einheiten werden zum selben
Zeitpunkt angesprochen beziehungs-
weise abgefragt. Ein normaler PC
Gameport bietet Anschlüsse für zwei
Joysticks). hat also vier “digitale” und
vier analoge Eingänge. Manchmal
(sehr selten) kann aber nur ein Joystick
angeschlossen werden.
Zwei Welten wachsen
zusammen
Es ist unschwer zu sehen, dass diese
zwei Welten erst einmal nicht zusam-
menpassen. Die Statuswerte des N64-
Controllers anzufordern und auszuwer-
ten, sollte keine Schwierigkeiten berei-
ten, wie jedoch soll man ohne großen
Schaltungsaufwand den Gameport des
PC bedienen? Bei den Knöpfen gelingt
dies noch einfach, die relevanten Bits
des N64-Controllers können einfach
zyklisch auf Leitungen des Mikrocontrol-
lers ausgegeben werden. Was aber soll
mit den digitalen Werten des Analog-
sticks geschehen? Ein Trick hilft weiter:
Der Mikrocontroller (des Interfaces) war-
tet auf ein kurzes Low auf einer der Poti-
Leitungen, was mit dem zyklischen Ent-
laden des Kondensators der PC-Game-
port Karte einhergeht. Daraufhin legt
der Mikrocontroller alle Poti-Leitungen
auf Low, um ein weiteres Aufladen der
Kondensatoren zu verhindern und star-
tet seine Timer. Je nach Stand des N64-
Controller-Analogsticks werden die Poti-
Leitungen früher oder später einzeln
wieder auf High gelegt, der entspre-
chende Kondensator innerhalb kurzer
Zeit über den Mikrocontroller-Ausgang
geladen. Der zugehörige Multivibrator
meldet die vermeintliche Potistellung.
Mit dem Oszilloskop könnte man an den
betreffenden Ausgängen des
AT89C2051 pulsweitenmodulierte Sig-
nale mit einer Periodenzeit von unge-
fähr 840 µs mit einem Tastverhältnis je
nach Potistellung von 50...90 % ermit-
teln. Befindet sich ein Poti in Mittelstel-
lung, beträgt das Tastverhältnis 70 %.
Ins Detail, ins Programm
Die Software inklusive Quellkode wird
unter www.elektor.de im Downloadsek-
tor bereitgestellt. Wer den Mikrocontrol-
ler nicht selbst programmieren möchte,
der kann auch einen fertig program-
mierten Chip bekommen (siehe Servi-
ceanzeige im mittleren Heftteil).
Nachdem der Stack des Mikrocontrol-
lers und die beiden Timer initialisiert,
gestartet und deren Interrupts freige-
geben wurden, beginnt die Haupt-
schleife des Programms. Zuerst wird das
Timing für Joystick A (Analogeinheit) in
der Routine prepajoyt und Joystick B
mit prepbjoyt (Steuerkreuz beziehungs-
weise C-Knöpfe) festgelegt. Timer T0
und T1 sind für das Timing des Joysticks
A verantwortlich, T0 für die x-Richtung
und T1 für die y-Richtung. T0 verwaltet
außerdem auch den Timeout Mode,
der verhindert, dass sich das Programm
bei plötzlich abgezogenem N64-Con-
troller oder einem Wackelkontakt in
einer Abfrageschleife aufhängt. In einer
solchen Situation könnte ein wieder
angeschlossener N64-Controller nicht
mehr initialisiert werden, ohne dass
zuvor der Mikrocontroller manuell
zurückgesetzt wurde.
Das ganze Programm ist mit dem
langsamsten und unflexibelsten Teil syn-
chronisiert, dem PC-Gameport. Die
Befehlszeile jnb JOYAX,* wartet auf das
Entladen des Kondensators. Hat die
Gameport-Karte dies geleistet, setzt der
Mikrocontroller die vier Poti-Leitungen
JOYAX/Y und JOYBX/Y auf Low und star-
PC-P
LUS
——————————————————
Elektor
EXTRA
X-3 - 2/2000
K1
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
AT89C2051
-24PC
P3.2
P3.3
P1.0
P1.1
P3.0
P3.1
P3.4
P3.5
IC1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P3.7
RST
X1
X2
20
10
12
13
14
15
16
17
18
19
11
5
4
2
3
1
6
7
8
9
R11
4x 10k
1
5
4
3
2
R8
220
Ω
R7
220
Ω
R6
220
Ω
R5
220
Ω
R4
470
Ω
R3
470
Ω
R2
470
Ω
R1
470
Ω
C5
100µ 16V
X1
24MHz
C4
27p
C3
27p
C2
100n
joyax
joyay
joybx
joyby
joyb2
joyb1
joya2
joya1
C1
10µ
16V
R9
10k
R10
2k2
D1
XO1
EN
1
5
4
8
OSC
24MHz
5V
*
siehe Text
*
002007 - 11
5V
Ansicht
von vorne
Bild 1. Ein Mikrocontroller, ein paar Widerstände und ein Oszillator: die Zutaten für die
Adapterschaltung. Rechts unten der N64-Steckverbinder.
Tabelle 1. Serielle
Statusinformation des
N64-Controllers
Byte 1
Bit 7
Knopf A
Bit 6
Knopf B
Bit 5
Knopf Z
Bit 4
Knopf Start
Bit 3
Steuerkreuz up
Bit 2
Steuerkreuz down
Bit 1
Steuerkreuz left
Bit 0
Steuerkreuz right
Byte 2
Bit 7
unbekannt, immer 0
Bit 6
unbekannt, immer 0
Bit 5
Knopf L
Bit 4
Knopf R
Bit 3
Knopf C up
Bit 2
Knopf C down
Bit 1
Knopf C left
Bit 0
Knopf C right
Byte 3
Analogstick x
Byte 4
Analogstick y
tet Timer T0 und T1 für JOYAX/Y, die dem
Analogstick zugeordnet sind. Das Steu-
erkreuz beziehungsweise die C-Knöpfe
sind JOYBX/Y zugeordnet. Hier werden
ebenfalls analoge Werte erwartet, so
dass mangels weiterer Timer im Mikro-
controller das Timing in der Routine
joybtiming vorgenommen wird. Mit etli-
chen NOPs und geschachtelten Schlei-
fen bekommt der Gameport auch hier,
was er verlangt. JOYBX/Y werden nach
gemessener Zeit wieder auf High
gelegt. Über einfache “Knopf-An/Knopf-
Aus”-Logik hinaus wird auch ein y-Vor-
schub berücksichtigt, der in drei Stufen
eingestellt werden kann. Soll das Steu-
erkreuz beziehungsweise die C-Knöpfe
in einem Spiel zum vorwärts oder rück-
wärts bewegen genutzt werden, kann
man mit dem L-Knopf zwischen “schlei-
chen, gehen und rennen” umschalten.
Der Tastverhältnis-Bereich wird dabei
von 58...78 % (default) auf 48...88 %
und 40...97 % umgeschaltet.
Nach dem Ablauf der beiden Soft-
waretimer wird gewartet, bis die Hard-
waretimer T0 und T1 per Interrupt ihre
Arbeit verrichtet haben. Sind sie abge-
laufen, ist JOYAX/Y ebenfalls wieder auf
High. Da das Programm im nun folgen-
den zeitkritischen Teil leicht hängen
bleiben kann, wird der Interrupt des
Timers 0 in der Routine inittom zur Time-
out-Notbremse erklärt. Antwortet der
N64-Controller nicht innerhalb einer
bestimmten Zeit, startet das Programm
neu. Routine sendbyteA sendet den
Befehl $01-Statusinformationen, das fol-
gende getbytes liest dann die vier Sta-
tusbytes des N64-Controllers. Byte 1...4
landen in den Registern R4 bis R7 zur
weiteren Bearbeitung. Vor dem Lesen
jedes Bytes wird bitgenau synchroni-
siert, anschließend der Timeout Mode
des Timers 0 wieder deaktiviert und in
der Routine handlebuttons die gerade
gelesenen Werte ausgewertet. Dabei
wurde die Zuordnung wie in Tabelle 2
getroffen.
Wiederholtes Drücken des L-Knopfes
ändert die Vorschubgeschwindigkeit
der K/C-up/down-Knöpfe in drei Stufen.
Sind die Knöpfe ausgewertet und
deren Zustände an den PC-Gameport
weitergeleitet, beginnt die Schleife wie-
der von vorne mit dem Auswerten der
eingelesenen Analogstick-Werte. Die
Routine calctiming normalisiert und
skaliert dabei diese Werte in Prozessor-
zyklen, um die Hard- und Softwaretimer
für die nächste Runde zu füttern, die mit
dem Entladen der Kondensatoren
beginnt.
Spielereien
Für den Betrieb am PC unter Win95/98
muss der neue Joystick dem System
noch bekannt gemacht werden. Unter
Programme/Systemsteuerung sollte sich
ein Icon für den Gamecontroller befin-
den, wenn nicht, muss dieser Pro-
grammteil nachinstalliert werden.
Danach wird am besten durch Hinzu-
fügen ein neuer Joystick (mit vier Ach-
sen und vier Knöpfen) geschaffen. Beim
folgenden Kalibrieren ist sicherzustellen,
X-4 - 2/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
002007-1
C1
C2
C3
C4
C5
D1
F3
F4
IC1
K1
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
X1
XO1
T
+
002007-1
002007-1
Bild 2. Die Platine des N64/PC-Adapters
Stückliste
Widerstände:
R1...R4 = 470
Ω
R5...R8 = 220
Ω
R9 = 10 k
R10 = 2k2
R11 = SIL-Widerstandsarray 4
⋅10 k
Kondensatoren:
C1 = 10
µ/16 V stehend
C2 = 100 n
C3,C4 = 27 p (*)
C5 = 100
µ/16 V stehend
Halbleiter:
D1 = LED, low current
IC1 = AT89C2051-24PC (EPS 006504-1)
Außerdem:
K1 = 15poliger Sub-D-Verbinder,
gewinkelt, male, für Platinenmontage
X1 oder XO1 = 24-MHz-Grundtonquarz
oder 24-MHz-Quarzoszillator (Seiko-
Epson SG531P-24MHz) (*)
Bild 3. So können Anschlussprobleme umgangen werden.
dass die Up/Down-Knöpfe des Steuer-
kreuzes beziehungsweise die C-Knöpfe
mit dem L-Knopf auf höchste
Geschwindigkeit eingestellt sind (zu
erkennen am größten “Ausschlag” auf
dem Bildschirm). Speichern kann man
diese Einstellungen beispielsweise mit
dem Namen N64.
Den Namen
benötigt man unter Umständen später
zur Spielekonfiguration.
In älteren (DOS-) Spielen muss eigent-
lich nur kalibriert werden.
Manche Spiele bieten umfangreiche
Einstellungen für Joysticks (zum Beispiel
Unreal), die genau studiert und aus-
probiert werden wollen. In einigen Fäl-
len, etwa bei HalfLife, ist eine kleine
Joystick-Konfigurationsdatei notwendig,
in der sich die Einstellungen verstecken.
Diese Datei wird beim Start des Spiels in
einem bestimmten Ordner gesucht
(beispielsweise c:\Sierra\Half-Live\valve).
Tipps geben meist auch die Readme-
Dateien der Spiele. Tabelle 3 zeigt zwei
typische Konfigurationsdateien.
Aufbautips
Der Aufbau der Schaltung auf der Pla-
tine in Bild 2 bereitet keine Schwierig-
keiten. Der Mikrocontroller wird in eine
(gute) Fassung gesteckt. Über die Wahl
des Quarzes/des Quarzoszillators wurde
schon zu Beginn des Artikels berichtet.
Beim Einsatz eines Quarzoszillators ent-
fallen C3 und C4 (und X1 natürlich
auch). Komplikationen könnten sich
allenfalls mit den (unterschiedlichen)
Controller-Steckern ergeben, denn pas-
sende Buchsen sind nur schwer zu
beschaffen. Es bieten sich drei Lösun-
gen an: Man schlachtet eine alte N64-
Konsole aus oder man kappt das
Anschlusskabel und stellt ein Adapter-
kabel mit einem dreipoligen DIN- oder
Mini-XLR-Stecker her (und bringt an das
abgeschnittene Ende eine ebensolche
Buchse an). Natürlich kann man sich
wie in Bild 3 auch mit drei Lötnägeln
(Durchmesser 1,3 mm) behelfen, an die
man kurze Drahtstückchen lötet und so
mit den Eingängen des AT89C2051 ver-
bindet. Zum Verpolschutz sollte man die
Lötnägel im Abstand von 3,75 mm auf
ein Lochrasterplatinchen löten und
durch ein weiteres Teil (siehe Foto, hier
wurde ein Stück 3/4-Zoll-Kunststoffrohr
verwendet) verhindern, dass man den
Stecker falsch herum aufstecken kann.
(002007)rg
PC-P
LUS
——————————————————
Elektor
EXTRA
X-5 - 2/2000
Tabelle 2.
Zuordnung von N64- zu PC-Gameport-Signalen
N64 Controller
PC Gameport
Leitung
A-Knopf
Joy A Knopf 1
JOYAB1
B-Knopf
Joy A Knopf 2
JOYAB2
Z-Knopf
Joy B Knopf 1
JOYBB1
Start/R-Knopf
Joy B Knopf 2
JOYBB2
Analog x-Achse
Joy A Analog x
JOYAAX
Analog y-Achse
Joy A Analog y
JOYAAY
K/C left/right
Joy B Analog x
JOYBAX
K/C up/down
Joy B Analog y
JOYBAY
K=Steuerkreuz, C=Knöpfe
Tabelle 3.
Zwei typische Joystick-Konfigurationsdateien
// name joystick.cfg
// analog turn and look version
//
// x analog turn left/right
// y analog look up/down
// C move left/right
// C move forward/backward
// configure in game: A alternate fire, B duck, Z fire, R/Start jump
//
joyname ”N64”
joyadvanced 1
joyadvaxisx 4
joyadvaxisy 2
joyadvaxisz 1
joyadvaxisr 3
joyadvaxisu 0
joyadvaxisv 0
joyforwardsensitivity -1.0
joysidesensitivity 1.0
joypitchsensitivity -1.0
joyyawsensitivity -1.0
joyforwardthreshold 0.1
joysidethreshold 0.1
joypitchthreshold 0.1
joyyawthreshold 0.1
joyadvancedupdate
Eine zweite Variante:
// name joystick.cfg
// analog turn and move version
//
// x analog turn left/right
// y analog move forward/backward
// C look up/down
// C move left/right
// configure in game: A jump, B alternate fire, Z fire, R/Start duck
//
joyname ”N64”
joyadvanced 1
joyadvaxisx 4
joyadvaxisy 1
joyadvaxisz 2
joyadvaxisr 3
joyadvaxisu 0
joyadvaxisv 0
joyforwardsensitivity -1.0
joysidesensitivity 1.0
joypitchsensitivity 1.0
joyyawsensitivity -1.0
joyforwardthreshold 0.1
joysidethreshold 0.1
joypitchthreshold 0.1
joyyawthreshold 0.1
joyadvancedupdate