home sitemap

3. Der Gameport


zurück zur parallelen Schnittstelle

Grundlagen zum Gameport:
Der Gameport befindet sich häufig auf der Soundkarte, er wird auch MIDI- Schnittstelle genannt und dient zum Anschluß von Geräten wie Joysticks, Lenkrädern oder Keyboards (MIDI) usw. Der Gameport hat am Computer einen weiblichen Stecker mit 15 PINs. Dabei ist dieser Stecker eigentlich für zwei Joysticks ausgelegt (obere und untere PIN-Reihe) mit jeweils zwei Tasten und jeweils 2 analogen Richtungsmessern. Entweder wird der zweite Joystick über einen y-Adapter angeschlossen oder man hat einen großen Joystick / Lenkrad mit Pedale , der / das einfach alle PINs benutzt. Am Gameport liegen zwischen 0 und 5 V.

Der Gameport zum Messen und Steuern:
Der Gameport ist gerade in der Kombination mit den anderen Schnittstellen am Computer eine besondere Schnittstelle, da er die Möglichkeit bietet, 4 analoge Eingänge anzufragen! Gleichzeitig verträgt er sich gut mit der parallelen Schnittstelle (bitte unverbindlich Ratschläge beachten, siehe parallele Schnittstelle) und seine Signale dürften auch von der seriellen Schnittstelle gelesen werden. Hingegen darf er nicht die Signale der seriellen Schnittstelle empfangen (wegen 12V!).

Die Abbildung 1 zeigt einen männlichen Stecker, wie er in den weiblichen am Computer gesteckt wird (von vorne, nicht von der Kabelseite!):

Die gelben PINs sind digitale Eingänge und die mit "a" gekennzeichneten PINs sind analoge Eingänge. "M" sind die MIDI PINS, "+" sind die PINS mit Dauer_5V und grün sind die Masse- PINs.

Die Programmierung:
Der Gameport hat nur ein Register, wo dieses liegt, zeigt der Gerätemanager in den Ressourcen des Gameports. Im Beispiel liegt der E/A Bereich bei 0200-0207. D.h., bei $200 liegt das Byte des Gameports.
Der Gameport muß nicht geöffnet werden, jedoch sollte ein Joystick im Betriebssystem installiert werden. Folgender Code fragt das Register des Gameports auf die Tasten ab:

..
var
Wert:byte; //Wert aus Gameport-Register

asm // inline Assembler
mov dx,$200; // Lade die Adresse 200 in DX
in al,dx; // Lade Wert aus 200 in al
mov Wert, al; // Lade Wert aus al in VAR Wert
end; // Ende inline Assembler

Wert nimmt nun 16 verschiedene Werte bei 4 Joysticktasten an (je zwei Tasten pro Joystick), wobei die T1J1=16, T2J1=32, T1J2=64 und T2J2=128 ist. Werden mehrere Tasten auf einmal gedrückt, so bildet sich als Wert eine Summe der Tasten. Bemerkung: 4 Tasten a zwei Zustände sind 2^4 Kombinationen. T2J2 ist das 8.Bit des Bytes, T1J2 das 7. usw.

Es ist auch eine Abfrage der einzelnen Tasten möglich:

..
var
Wert:byte; //Wert aus Gameport-Register
Label M1;

asm // inline Assembler
mov dx,$200; // Lade die Adresse 200 in DX
M1: //Sprung-Label
in al,dx; // Lade Wert aus 200 in al
Test al, 10h; // Teste ob Taste 1 des Joysticks 1 gedrückt wurde
JnZ M1; // Sprungbedingung, wenn Test-Bedingung nicht erfüllt, springe zu M1
mov Wert, al; // Lade Wert aus al in VAR Wert
end; // Ende inline Assembler

Dieser Code kommt nur zurück, wenn die Taste 1 des 1. Joysticks gedrückt wurde (T2J1= 20h, T1J2=40h und T2J2=80h).

Dieser Weg über den Inline-Assembler zeigt deutlich, wie die Tasten im Register verankert sind. Es gibt einen zweiten Weg, der zwar nicht so anschaulich ist, jedoch weitere Vorteile bietet:

Wird der Gameport über APIs gehandelt, so übernimmt das Betriebssystem das Polling, d.h., alle 4 digitalen Eingänge und alle 4 analogen Eingänge "melden sich beim Programm per Botschaft, wenn etwas passiert ist". Auch ist der Code zur Abfrage der analogen Eingänge einfacher, da die Zeitmessung entfällt (Die analogen Eingänge sind eigentlich auch digitale Eingänge, nur mit dem Unterschied, dass das Registerbit solange braucht, um nach dem Löschen gesetzt zu werden, wie groß der Widerstand ist, der vor dem Eingang liegt. D.h., der analoge Wert ist der "Zeitwert" bis zum Eintreffen der digitalen Eigenschaft "an". Dabei drückt eine ganzzahlige Zahl zwischen 0..65535 das Analoge aus.).

Mit diesem zweiten Weg hat nun der Gameport zwei gute Eigenschaften für den Roboterbau:
- Die vier digitalen Eingänge können sehr gut für Zähltaster an angetriebenen Achsen benutzt werden, da das Polling "automatisch" läuft. Damit muß die Steuerung eines Motors nicht mehr mit einer Positionsüberwachung in eine Schleife programmiert werden. Durch die Trennung der Steuerung von der Überwachung wird der Code einfacher und leistungsfähiger!
- Vier analoge Eingänge (pro Gameport!) runden die das Gesamtbild aller Standard - Schnittstellen am Computer ab. Somit dürften die meisten Vorhaben beim Roboterbau ohne zusätzliche Interfaces machbar sein.

Wofür braucht man eigentlich analoge Eingänge?
Es gibt Widerstände, die abhängig vom Licht, Temperatur, Feuchtigkeit usw. sind. Beim Roboterbau speziell im Bereich Hausschaltwerk gibt es super viele Einsatzgebiete für diese analogen Eingänge (z.B.Raumklimasteuerung, Überwachung usw.). Im Bereich Roboter (stationär und mobil) können damit sehr einfach Lichtschranken gebaut werden. Taster, welche den Druck beim Zugreifen messen (Mechanik mit Widerständen) sind u.U. auch mal nötig. Sicherlich können diese analogen Eingänge auch zum Strommessen genutzt werden.

Nun ein Anwendungsbeispiel:
Messen der Lichtintensität:

Hardware:
- Gameport am Rechner
- Klingeldraht
- 15 PIN SUB-D-Stecker (männlich)
- lichtabhängiger Widerstand (siehe Suchmaschine im www und Abbildung unten)
- ca. 500Ohm Widerstand (siehe Suchmaschine im www "widerstand berechnung ringe")


Aufbau:
Der 500Ohm Widerstand verbindet PIN 1 (Dauer-Plus) und PIN 6. Somit wird für die eine Achse des "Joysticks" ein Wert gebildet, den das Betriebssystem auslesen kann. Der lichtabhängige Widerstand verbindet PIN 1 (Dauer-Plus) und PIN 3 über einen längeren Draht, damit man nicht nur das Licht beim Gameport messen kann. Hier wird dem Betriebssystem die zweite Achse des "Joysticks" lichtabhängig übergeben.

In der Systemsteuerung des Betriebssystem bindet man nun einen 2-Achsen-Joystick ein.

Die Programmierung muß ich hier nicht zeigen, da sie der normalen Joystickabfrage entspricht (siehe Delphi-Links im Linkbereich und suche auf der jeweiligen Seite "joystick"). Dort sind sehr kleine überschaubare Quelltexte (ca.10 Zeilen), die man zur Not einfach ins eigene Programm einbindet.



weiter zum Kapitel 4: externes Interface