Wir basteln uns ein Interface (3)

Heute wollen wir uns wieder mit der wichtigsten Sache dieses Sonnensystems befassen - unserem Interface. Das Einlesen von Daten über den Romport steht in dieser Ausgabe auf dem Programm. Doch zuvor noch die Auflösung des A0-Rätsels.

A0 selbst generiert

Tips zur Entwicklung eines Lösungsvorschlages gab es in der letzten Ausgabe eigentlich genug. Ich hoffe, daß sich all jene, denen des Rätsels Lösung bisher vorenthalten blieb, mit Flüchen und Bannsprüchen an meine Adresse zurückhalten konnten. Ein Lauflicht mit acht LEDs macht eben mehr her, als eines mit nur sieben. Außerdem ist mit fehlendem AO-Signal unser unteres Byte nicht komplett. Die tragende Rolle bei der Erzeugung von AO kommt dem Signal /UDS zu.

Beim Zugriff auf eine gerade Adresse wird dieses Signal aktiviert, geht in diesem Fall von Hi nach Lo (/UDS ist Lo-aktiv!). Im Prinzip hätten wir damit schon unsere AO-Leitung, doch leider wird /UDS gemeinsam mit den /ROM-Signalen deaktiviert, so daß unser Flip-Flop im IC 74LS374 immer nur den inaktiven Zustand von /UDS speichert. AO wäre dann also immer Hi (vielleicht nicht der schlechteste Zustand ;-) ). Genau betrachtet stehen wir hier vor einem Timing-Problem, was nichts anderes heißt, als daß uns der zeitliche Ablauf der Signale nicht in den Kram paßt.

Glücklicherweise soll /UDS nicht früher, sondern später am Flip-Flop anliegen, als von der CPU geliefert. Wir müssen durch geeignete Maßnahmen also dafür sorgen, daß /UDS etwas verzögert wird. Ein Knoten in der Leitbahn verspricht mäßigen Erfolg, wir entscheiden uns deshalb für die bewährte Methode die Gatterlaufzeiten eines ICs als Signalverzögerung zu mißbrauchen. Dazu kann man fast jedes beliebige IC hernehmen, ich habe mich für ein 74LS00 entschieden, weil es gerade auf dem Tisch herumlag. Das 74LS00 invertiert das Eingangssignal, deshalb lassen wir es durch zwei Gatter laufen. Am Ausgang des zweiten Gatters steht dann das verzögerte /UDS an, das haargenau dem gewünschten AO-Signal entspricht und mit dem unser Flip-Flop gefüttert werden kann.

Der messerscharfe Verstand einiger Bastler wird nun folgern, daß bei Invertierung des Signals eigentlich auch /LDS zur Erzeugung von AO herangezogen werden könnte. Denn /LDS wird bei Zugriff auf eine ungerade Adresse Lo, durch Invertierung also Hi, und würde somit die Forderungen an das AO-Signal ebenfalls erfüllen. Diese Annahme ist aber nur solange richtig, wie mit Bytes, also 8 Bit gearbeitet wird. Der 8-Bit-Zugriff ist beim Atari auf jede Adresse des Romports erlaubt, der 16-Bit-Zugriff jedoch nur auf gerade Adressen. Beim Zugriff auf 16 Bit werden sowohl /UDS, als auch /LDS aktiv. Ein invertiertes /LDS würde nun ein aktives AO-Signal anzeigen, aber das stimmt nicht..., /UDS hingegen funktioniert richtig.

Die andere Richtung

So, wie man Daten über den Romport aus dem Rechner herausschaufelt, wissen wir nun. Jetzt geht es darum, Daten auf dem gleichen Wege in den Atari einzuschleusen. Dazu benötigt man zunächst einmal Daten, die man einlesen kann. Eine zusätzliche Bastelarbeit oder gar ein zweiter Rechner ist glücklicherweise nicht erforderlich, denn alles, was für die Produktion externer Daten benötigt wird, ist mit der LED-Ansteuerungsgeschichte bereits erschlagen. In dem am Romport hängenden 74LS374 kann ein Byte gespeichert werden (AO haben wir ja jetzt), das bis zum nächsten Lesezugriff in den Adreßbereich von FB0000 bis FBFFFF auch dort verfügbar bleibt. Dieses Byte läßt sich natürlich auch wieder in den Rechner einlesen. Dazu ist ein weiteres IC erforderlich, das das anstehende Byte zum richtigen Zeitpunkt auf den Datenbus des Atari legt, ohne die anderen Prozesse im Rechner zu stören.

Das IC

Zum Einschleusen von Daten in den Rechner bietet sich ein 74LS244 an. Dieses IC ist ein 8-Bit-Bustreiber, dessen Ausgänge auch in einen hochohmigen Zustand (tri-state) versetzt werden können. Das IC verfügt über 20 Pins, 8 Eingänge (E), 8 Ausgänge (Q), einen Anschluß für 5Volt (Pin 20), einen für Masse (Pin 10) und zwei mit FE bezeichnete Anschlüsse (Pins 1 uns 19). Zwischen 5Volt und Masse gehört (wie bei jedem IC!) ein Kondensator von lOOnF, um mögliche Spannungsspitzen, die durch die Schaltvorgänge im IC entstehen können, abzufangen. Das 74LS244 tut eigentlich nichts anderes, als die Daten, die an den Eingängen anliegen, an den Ausgängen zur Verfügung zu stellen. Insofern könnte man das IC eigentlich als überflüssig betrachten, denn es stellt ja lediglich etwas zur Verfügung, was ohnehin schon da ist. Fast richtig - aber wie die Bezeichnung "Bustreiber" schon andeutet, werden die an den Eingängen anliegenden Signale aufbereitet, so daß sie die mehr angeschlossenen Bauelemente ansteuern (treiben) können. Außerdem lassen sich die Ausgänge in den tri-state, also den hochohmigen Zustand, versetzen, dadurch haben die an den Eingängen anliegenden Signale keinen Zugang zum Datenbus und können somit auch keinen "Datensalat" verursachen. Über FE läßt sich dieser hochohmige Zustand der Ausgänge herbeiführen: Liegen die FE-Eingänge des ICs auf Hi-Pegel, so verhält sich das 74LS244 so, als ob es gar nicht vorhanden wäre. Legt man die FE-Eingänge allerdings auf Lo-Pegel, so werden die an den Eingängen anliegenden Signale an den Ausgängen des ICs sichtbar und man kann sie verarbeiten.

Rein in die Schaltung

Nachdem das 74LS00 oder so was zur Generierung von AO unterhalb des 74LS374 eingelötet und verdrahtet ist (lOOnF-Kondensator nicht vergessen), bietet sich als Wohnort für das 74LS244 der Platz unterhalb des 74LS00 an, die drei ICs fluchten sozusagen. Die Verdrahtung sollte keine Probleme bereiten. Erst 'mal die Spannungsversorgung herstellen, dann die Eingänge des 74LS244 mit den Ausgängen des 74LS374 verbinden. Netterweise liegen die Ausgänge des 74LS374 direkt an den Anoden der LEDs, so daß man hier hübsch der Reihe nach vorgehen kann. Es ist wichtig, die Übersicht nicht zu verlieren, denn zu jedem Eingang gehört auch ein Ausgang, der mit der richtigen Datenleitung des Romports verbunden werden muß. A0 vom 74LS374 soll über das 74LS244 auf der Datenleitung D0 des Romports landen, Al entsprechend auf D1 usw., dann gibt es auch keine faltige Stirn beim Probelauf. Zu guter Letzt werden noch die beiden FE-Eingänge (Pin 1 und 19) mit /ROM4 verbunden, das war's dann auch schon.

# Listing 1
' Mit diesem Programm werden Daten in den 
' Flip-Flops hochgezählt, permanent einge-
' lesen und mit einem Vorgabewert verglichen. 
' Bei übereinstimmung stoppt das Programm.

INPUT "Zahl bis 255: ",z	!Vorgabewert

FOR i=0 TO 255
	a=PEEK(&HFB0000+i)	!Daten hochzählen
	b=PEEK(&HFA0001)	!Daten in b lesen
	PRINT b	!gelesene zeigen
	IF b=z	!wenn b=Vorgabe
		PRINT "Zahlenwert erreicht, Taste” 
		c=INP(2) 'warten auf Taste
		EDIT	!zum Interpreter
	ENDIF
NEXT i

Wie funktioniert es?

Wie ein Datenbyte in die Flip-Flops geladen wird, wissen wir: Es wird eine Adresse im Bereich von FB0000 bis FBOOFF per PEEK-Befehl angesprochen. Es findet also ein Lesezugriff statt. Die gewählte Adresse wird durch die Speicherung in den Flip-Flops zu einem Datum (ist die Einzahl von "Daten") und bringt die entsprechenden LEDs zum Leuchten. Dadurch, daß die Ausgänge der Flip-Flops des 74LS374 mit den Eingängen des 74LS244 verbunden sind, steht dieses Datum jetzt auch am Datenbus des Atari zur Verfügung. Das 74LS244 läßt dieses Datum nur nicht durch, weil die FE-Eingänge auf Hi-Potential liegen. Die FE-Eingänge des 74LS244 werden durch /ROM4 gesteuert. Dieses Signal wird aktiv, also Lo, wenn aus dem Speicherbereich von FA0000 bis FAFFFF gelesen wird.

Der GFA-Basic-Befehl "PRINT PEEK (&HFB0000+8)" speichert den Zahlenwert "8" im 74LS374 und läßt die vierte LED leuchten. Als Wert auf dem Bildschirm erhält man "255", denn es wird zwar /ROM3 aktiv, um die angelegte Adresse als Datum zu speichern, nicht aber /ROM4, um den gespeicherten Wert einzulesen. Folgt dann der GFA-Befehl "PRINT PEEK(&FA0001)", so sollte auf dem Bildschirm der in den Flip-Flops gespeicherte Wert von "8" erscheinen. Serviert der Rechner einen anderen Wert, dann sind irgendwelche Leitungen vertauscht. Warum FA0001 und nicht FA0000, wird sich manch' einer fragen, denn bei Abfrage der Adresse FA0000 erhält man den Zahlenwert 255 auf dem Bildschirm. Die Antwort verbirgt sich im Motorola-Datenformat. Das obere Byte eines Datenwortes (lword = 2byte = 16bit), also D8 bis Dl 5, liegt immer an einer geraden Adresse. Das untere Byte, also DO bis D7, immer an einer ungeraden. Das wirkt auf den ersten Blick verkehrt herum, funktioniert aber trotzdem. Die Abfrage von DO bis Dl5 bringt für obiges Beispiel den Wert 65288 auf den Schirm. Dieser setzt sich folgendermaßen zusammen: Die Datenleitungen D8 bis Dl 5 werden von unserer Hardware nicht bedient und bleiben im "Ruhezustand". Der ist für Datenleitungen Hi, deshalb hat das obere Byte den hexadezimalen Wert FF (dezimal 255). Das untere Byte hat den in den Flip-Flops gespeicherten hexadezimalen Wert 08 (dezimal 8). Der hexadezimale Wert des Wortes (= 2byte) ist somit FF08 (dezimal 65288). Doch mit den Zahlenspielereien befassen wir uns später.

Die Wahl der /ROM-Signale für das Speichern bzw. Auslesen von Daten ist nicht zufällig. Der Atari überprüft nach dem Einschalten das Vorhandensein eines Rom-Modules. Dabei wird FA0000 abgefragt und bei bestimmten vorhandenen Datenworten auf die Präsenz eines Rom-Modules geschlossen. Diese automatische Abfrage würde nun schon ein Datum in unsere Flip-Flops schreiben, wenn /ROM4 als Taktleitung benutzt würde. Durch das Ausweichen auf den von /ROM 3 bedienten Adreßbereich wird diese Möglichkeit ausgeschlossen.

Das Signal /ROM3 auch zum Einlesen der Daten zu benutzen, würde bedeuten, daß man, wenn das Datum in den Flip-Flops des 74LS374 nicht verändert werden soll, immer mit der Adresse abfragen müßte, die als Datum in den Flip-Flops liegt. Auch nicht gut (siehe Listing l).

Die Schaltung im Ganzen

Auf den ersten Blick mag das alles nicht sehr beeindruckend wirken, doch die Grundvoraussetzungen für Steuerungen mit dem Computer sind mit dieser Schaltung schon gegeben. Genau betrachtet wurde bisher lediglich ein 8bit Datenbus realisiert. Über das 74LS374 schaffen wir Daten raus, über das 74LS244 läuft's in die andere Richtung. Die LEDs dienen der optischen Kontrolle und helfen uns, in diesem Stadium eventuelle Schaltungsfehler aufzuspüren. Hier noch einmal alles im Überblick, die Kondensatoren habe ich dabei ausgelassen:

Wie geht's weiter?

In der nächsten Ausgabe wird es etwas theoretisch. Da gibt es einiges über das Dual- und Hexadezimalsystem zu lesen, außerdem sollen aufgetauchte Fragen beantwortet und Anregungen behandelt werden. Einige Erläuterungen zur Programmierung runden das trockene Thema ab. Damit es nicht gar zu langweilig wird, realisieren wir noch einen einfachen Digital/Analog-Wandler, dazu ist noch ein Widerstand nötig, der Wert sollte so zwischen 10R und 50R liegen.

Eine Bitte noch:

Alle Fragen, Wünsche, Anregungen und Kritik bitte nach Erscheinen dieser Ausgabe SCHNELLSTENS auf die Reise schicken, sonst ist eine Berücksichtigung in der nächsten Ausgabe nicht möglich.


Ulrich Skulimma
Aus: ST-Computer 12 / 1998, Seite 41

Links

Copyright-Bestimmungen: siehe Über diese Seite