Ein Port für alle Fälle! Der ST wird handgreiflich, Teil 1

Im Umfeld eines Computers gibt es immer eine Menge zu messen oder zu steuern, einfaches Umschalten zwischen verschiedenen Monitoren oder gar eine komplexe Lichtanlage. Es ließe sich nahezu alles mit dem Computer steuern, wenn der ATARI nur die nötigen Anschlüsse hätte! Einen universellen Port nämlich, ähnlich dem Userport des C-64.

Der in dieser Ausgabe vorgestellte Userport für den Atari kann sogar etwas mehr. Er ver fügt über 16 I/O- Leitungen, jede einzeln als Eingang oder Ausgang konfigurierbar, einen zusätzlichen Timer und etwas RAM. Zusätzlich werden noch ein Busmonitor/-treiber zur Anzeige der Pegel auf den I/O-Leitungen sowie das nötige Testprogramm vorgestellt. In der nächsten Ausgabe folgt als erste Anwendung des Userports die Realisierung einer parallelen Druckerschnittstelle.

Im Gegensatz zu den üblichen Bauanleitungen wird keine der vorhandenen Schnittstellen, etwa der ROM-Port, umfunktioniert, sondern der Userport zusätzlich bereitgestellt. Als Anschluß an den Rechner dient der Megaslot. Diese Art der Einbindung bietet mehrere Vorteile:

Abb. 1: Der Schaltplan für die Mega-Slot-Karte

Als Port-Baustein findet der 6532 Verwendung. Er ist recht universell einsetzbar und läßt sich mit wenig zusätzlicher Logik in den Atari eingliedern. So war es möglich, die gesamte Steuerschaltung mit nur zwei GAL-ICs zu realisieren. Das dritte IC dient lediglich als Treiber.

Der Port-Baustein selbst wurde als Peripherie zur 6502-CPU entwickelt, stammt also aus einer IC-Familie mit 8-Bit-Daten-bus. Im Gegensatz dazu ist der Datenbus im ST jedoch 16 Bit breit. Die CPU ist mit speziellen Mechanismen ausgerüstet, die neben dem normalen 16-Bit-Zugriff auch den Zugriff auf 8-Bit-Bausteine erlauben. Dabei bleibt jedoch der halbe Datenbus unbenutzt, was den Datendurchsatz verringert. Welcher Teil des Datenbusses (Low- oder Highbyte) dabei verwendet wird, meldet die CPU über -LDS und -UDS (Lower and Upper Data Strobe).

Diese Signale entsprechen zusammen etwa dem AO-Signal der 8-Bit-CPU. Eine Folge dieser Aufteilung ist, daß der Baustein lediglich jedes zweite Byte im Adreßbereich belegen kann.

Auch bezüglich der Zugriffsgeschwindigkeit kennt die 68000-CPU zwei Betriebsarten, den synchronen und den asynchronen Speicherzugriff. Bei synchronem Betrieb drosselt die CPU ihr Tempo soweit, daß garantiert alle Bausteine am Bus mithalten können. Asynchron betrieben, muß der jeweils angesprochene Baustein melden, wann er die Daten übernommen oder bereitgestellt hat. Die Geschwindigkeit des Zugriffs wird also durch den jeweiligen Baustein bestimmt und kann so maximal werden. Die CPU kann ständig zwischen beiden Zugriffsarten wechseln. Der 6532 unterstützt leider den asynchronen Anschluß nicht und wird so, um die Schaltung einfach zu halten, synchron betrieben.

Wie im Schaltplan (Abb. 1) zu erkennen, ist ein GAL,’ADRESS’ für die Adreßdecodierung zuständig. Es bestimmt, in welchem Adreßbereich die CPU den 6532 im Speicher ansprechen kann. Atari schlägt laut [1] die Bereiche $C0 0000... $CF FFFF, $FF 0000... $FF 7FFF und $FF FE00 ... $FF FFFD vor. Bei der einfachen Adreßdecodierung benötigt der 6532$1FF Bytes Speicherraum, zuviel für den dritten Bereich. Welcher der anderen Bereiche mit dem 6532 belegt wird, ist mehr oder weniger Geschmacksache.

Das im Listing beschriebene GAL und die Programme unterstützen den zweiten Bereich. Dazu bildet es aus den Leitungen A23-A15 und - AS ein Freigabesignal. Da die Leitungen A14-A9 unberücksichtigt bleiben, erscheinen die Register des 6532 mehrfach gespiegelt im Speicher, d.h. die Register wiederholen sich mit einem Offset von $200 (s. Programmierung des 6532).

Das zweite GAL, ‘STEUER’, generiert die weiteren Signale für den Zugriff auf den 6532. Es schaltet die CPU auf synchronen Speicherzugriff um. Weiter beinhaltet es die Logik zur Interrupt-Bestätigung und prüft anhand des Function-Codes der CPU, ob ein erlaubter Speicherzugriff auf den Port-Baustein stattfindet, um diesen dann freizugeben.

Erlaubt sind in diesem Zusammenhang alle Datenzugriffe. Sie haben die Freigabe des Bausteins zur Folge. Dabei bleibt unberücksichtigt, ob im User- oder Supervisormodus auf den Speicher zugegriffen wird.

Userport-Bestückungsseite

Liegt bei gültiger Adreße der Function-Code für eine Interrupt-Bestätigung vor, wird der 6532 nicht freigegeben. Stattdessen wird geprüft, ob er den Interrupt ausgelöst hat, und dies wird gegebenenfalls der CPU bestätigt.

Dazu muß zum einen bekannt sein, welchen Interrupt (Level 1-7) die CPU erkannt hat, und zum anderen, ob die -IRQ Leitung des 6532 aktiv ist.

Die CPU legt die Nummer des erkannten Interruptlevels auf die Leitungen Al-A3. Stimmt diese Nummer mit der im GAL für den 6532 festgelegten Level (Level 3) überein, und ist das -IRQ-Signal aktiv, erfolgt die Bestätigung durch das GAL über das -VPA-Signal. Es kann an diversen Stellen im Atari unabhängig voneinander erzeugt werden. Da jedoch der Zusammenschluß mehrerer TTL-Ausgänge nicht zulässig ist, muß das - VPA-Signal über einen Open-Kollector-Treiber, das dritte IC, geführt werden.

Die Platine für die Schaltung ist so ausgelegt, daß der Steckverbinder für den Userport an der Rückseite des Mega ST zur Verfügung steht. Er kann in die dafür vorgesehene Abdeckung eingearbeitet werden. Der Steckverbinder ist so beschältet, daß bei Anschluß über Flachbandkabel eine Aufteilung in zwei 8-Bit-Gruppen durch einfaches Teilen des Kabels möglich ist. Die so entstandenen Anschlüsse sind in der Belegung identisch, werden aber unter anderen Adressen angesprochen.

Neben den 16 I/O-Leitungen steht am Userport auch die +5 V-Leitung des Rechners zur Verfügung. Sie ist wegen der Teilbarkeit ebenfalls doppelt ausgeführt und kann als Versorgungsspannung für kleinere Interface-Schaltungen genutzt werden. Beim Entwurf dieser Erweiterungen ist darauf zu achten, daß diese das Netzteil des Rechners nicht überlasten.

Das Lochrasterfeld auf der Platine kann ebenfalls für eigene Erweiterungen, etwa Treiber für die Verwirklichung einer Normschnittstelle, genutzt werden. Alle Signale des nach außen geführten Userports liegen auch am Rande des Lochrasterfeldes an.

Zur Kontrolle der Buspegel und als Testhilfe kann der im Kasten beschriebene Busmonitor dienen. Bei geeigneter Beschaltung ist er auch als Treiber für die als Ausgang arbeitenden Leitungen zu verwenden. Die maximale Leistung hängt von den verwendeten ICs und der gewählten Spannungsversorgung ab.

Der Aufbau des Userports auf der vorgefertigten Platine ist recht einfach. Bestückt wird in der üblichen Reihenfolge von passiv zu aktiv. D.h. zuerst werden der Steckverbinder ST2 und die IC-Sockel eingelötet, dann die Blockkondensatoren und das Kabel für die Stromversorgung. Als letztes wird der Megabusstecker ST1 auf der Lötseite der Platine eingesetzt. Damit der Userport den richtigen Abstand zur Platine des ST bekommt, wird eine Buchse der Bauform DIN 61412 F B ww eingesetzt. Sie muß so festgelötet werden, daß der Abstand zwischen Platine und oberem Ende der Buchse 19mm beträgt. Die Anschlüsse dieser Buchse sind länger als die der Normalausführung und erlauben diese Montage. Ist die Platine einer Sichtkontrolle auf Kurzschlüsse unterzogen, kann ein erster Test erfolgen.

Nach Öffnen des Mega-ST (Achtung: Garantieverlust!) wird die Platine provisorisch in den Slot gesteckt und der Rechner (ohne angeschlossene Peripherie, das ist billiger) eingeschaltet. Meldet er sich ordnungsgemäß, kann bei ausgeschaltetem Rechner auch die Stromversorgung des Userports auf den dafür vorgesehenen Stecker im Mega ST gesteckt werden. Er liegt neben dem, der die Verbindung zum Netzteil des ST herstellt.

Userport-Lötseite

Ein weiterer Test sollte nun ebenfalls positiv verlaufen. Bootet der Rechner nicht, liegt dies wahrscheinlich an einem Kurzschluß zwischen den einzelnen Signaloder aber zwischen Signal- und Versorgungsleitungen. Eine weitere Sichtkontrolle oder das Nachmessen aller Leitungen anhand des Schaltplans bringt den Fehler zutage.

Sind soweit alle Probleme ausgeräumt, können Sie die Platine mit den ICs bestücken und erneut testen, ob der Rechner bootet. Ist dies nicht der Fall, hat sich wahrscheinlich eine kalte Lötstelle eingeschlichen und stört den Datenfluß. Ist diese nicht offensichtlich, wird es wohl das Schnellste sein, alle Lötstellen nachzulöten, nachdem man die ICs aus den Fassungen genommen hat.

Mit dem Busmonitor und dem Testprogramm lassen sich die 16 I/O-Leitungen, das RAM und der Timer auf ihre einwandfreie Funktion prüfen. Verlief auch dieser Test zufriedenstellend, können Sie die Platine mit entsprechenden Abstandsbolzen sichern und den Rechner endgültig zuschrauben.

Als erstes Beispiel für die Anwendung des Userports dient das kurze BASIC-Programm. Es liest die DATA-Zeilen ein und stellt die dem Bitpattem der Zahlen entsprechenden Lichtmuster auf dem Busmonitor dar. Das Programm zeigt die Grundzüge der Programmierung des 6532 und ist leicht zu erweitern.

**Stückliste**

Userport:

   
IC1 6532
IC2 GAL 16V8
IC3 GAL16V8
IC4 74LS06
C1 100nF
C2 100nF
C3 100nF
C4 100nF
ST1 64pol. DIN 41612 B female, wire wrap
ST2 Pfostensteckverbinder Stiftleiste 20 Pol 90GD
1 IC-Sockel 40pol.
2 IC-Sockel 20pol.
1 IC-Sockel 14pol.
6 15cm Litze
1 Buchsenleiste 6pol. einreihig für die Stromversorgung

Platine
Abstandsbolzen
Schrauben

Busmonitor:

   
IC1-3 74LS04 oder 74LS06 (s.Text)
C1-C3 100 nF
16*R 220Ω
16*D Leuchtdiode d:3mm
BS1-BS3 Stiftleiste 20pol. zweireihig
BV1 Buchsenleiste 6pol. einreihig
3 IC-Sockel 14-Pol
S1,S2 Mikro-Schiebeschalter (1 xUM)
Platine

Busleitung:

   
1 Pfostensteckverbinder Buchse 20pol. (s.Text)
1 20pol. Flachbandkabel
Projekt: Userport Gal: ADRESS 3.0 Datum: 30.10.91 Funktion: Decodierung des Bereichs $FF 0000 bis $FF 7FFF
%ID
    ADRESS30

%TYP
    GAL16V8

%PINS
    NC  A23 A22 A21 A20 A19 A18 A17 A16
    NC  NC  NC  NC  NC  A0  NC  -AS A15

%LOGIC

    A0 = A23 * A22 * !A15 * A21 * !-AS * A20 * Al9 * Al8 * Al7 * A16; 

%END

GAL-Listing für GAL-IC2

Projekt:    Userport
Gal:        STEUER 5.1
Datum:      30.10.91
Funktion:   Steuer und Interruptlogik

%ID
    STEUER51
%TYP
    GAL16V8

%PINS
    NC -VMA -IN3 FC2 FC1  FC0  A1 A2 A3
    NC -LDS NC   NC  —VPA -CS2 NC A0 -AS

%LOGIK

    !-CS2 = A0 * !CF1 * FC0*!-LDS*!-VMA;

    !—VPA = A0 * !-LDS
        + !-IN3 * !-AS * FC2 * FC1 * FC0 * A1 * A2 * !A3;
%END

GAL-Listing für GAL-IC3

Die Belegung des Userports

Der Busmonitor

Der hier vorgestellte Busmonitor hat zwei Aufgaben. Er soll zum einen als Testhilfe für den Aufbau des Userports dienen und zum anderen während des Betriebs die optische Überwachung der 16 I/O-Leitungen ermöglichen. Dazu kann er an BS1 einfach auf das Verbindungskabel zwischen Userport und zu steuerndem Gerät aufgesteckt werden. Zur Entlastung des Netzteils im Atari ermöglicht die Busmonitorplatine auch den Anschluß einer externen Spannungsquelle.

Das Schaltungsprinzip ist denkbar einfach. Die 16 I/O-Leitungen werden über invertierende Treiber an LEDs geschaltet, die wiederum über einen Vor widerstand an +5V geführt sind. Sobald am Eingang des Treibers eine log.'1' anliegt, geht der Ausgang des Treibers auf 0V. Es fließt ein Strom durch Vorwiderstand und Diode, die Diode leuchtet.

Als Treiber können aufgrund ihrer gleichen Anschlußbelegung Bausteine der Typen 74LS04 und 74LS06 verwendet werden. Zur einfachen Pegelkontrolle bietet sich der 74LS04 an. Er liefert mit max. 25mA je Ausgang ausreichend Strom für die einfache LED-Schaltung.

Der 74LS06 ist ein sog. Open-Kollektor-Treiber. Er ist in der Lage Spannungen bis zu 30V auf Massepegel zu ziehen. Mit ihm können kleine Lampen, Relais und sogar Schrittmotoren gesteuert werden. Nach [3] liegt dabei der maximale Strom pro o.k.-Ausgang bei 40 mA, was einer Maximalleistung von 1.2 Watt entspricht. Diese verstärkten Ausgänge stehen an BS3 zur Verfügung und dürfen auf keinen Fall extern als Eingang beschältet werden. Die Versorgungsspannung an BS3 läßt sich über S2 wählen. In Stellung ‘5 V’ liegt die über S1 gewählte +5V-Quelle an, bei ‘U+’ die an BV1 Pin 1,2 anliegende Spannung.

Die Signale vom Eingang BS1 stehen auch an BS2 zur Verfügung. Er entspricht also genau dem Userport. Entsprechend der Programmierung sind die 16 Leitungen Ein- oder Ausgänge. Der einzige Unterschied zum Userport besteht darin, daß sich die Versorgungsspannung über S1 einstellen läßt. ‘Int’ schaltet die 5 V des Atari durch, ‘Ext’ die an BV1 anzulegenden 5 V. Da in dieser Schalterstellung auch die Treiber über BV1 versorgt werden, sollten die 5 V möglichst genau eingehalten werden.

Zum Aufbau wird die Platine der Reihe nach mit IC-Sockeln, den drei Steckerleisten, zwei Schaltern sowie den Blockkondensatoren bestückt. Es folgen die Vor widerstände und die Dioden (auf die Polung achten). Nach der Sichtkontrolle können die ICs in die Sockel gesteckt werden.

Für die folgenden Tests müssen Sie +5V an BV1 anlegen und S1 auf ‘Ext’ stellen. Nun ziehen Sie die einzelnen Eingänge über einem 4.7-kΩ Widerstand auf Masse. Erlöschen die entsprechenden LEDs, ist alles in Ordnung und der Portmonitor für den Userport fertig.

Die Programmierung des 6532

Alle Register des 6532 liegen an den in der Tabelle angegebenen Adressen im Speicherbereich des Atari. Bedingt durch die 8-Bit-Struktur des Bausteins bleibt jede zweite Adresse unbelegt. Die 128 Byte RAM können durch einfaches Lesen oder Schreiben (Byte-Zugriff) angesprochen werden.

Die 16 I/O Leitungen werden, in zwei 8-Bit-Ports PA und PB aufgeteilt, über die Register ORA (Output Register), DDRA (Data Direction Register), ORB und DDRB verwaltet. Die Register DDRA/B legen die Arbeitsrichtung der einzelnen Signalleitungen fest. Wird ein Bit in diesen Registern gesetzt, arbeitet die entsprechende Leitung als Ausgang, und die in ORA/B geschriebenen Daten werden ausgegeben. Liest man die Register ORA/B, so gibt der 6532 die dem logischen Pegel des Ports entsprechenden Daten an den Rechner weiter.

Die Ports PA und PB unterscheiden sich lediglich durch ihre Ausgangstreiber. PA hat TTL-kompatible Treiber, während PB sogenannte ‘push-pull’-Treiber hat. Mit ihnen kann er bis zu 3mA an 1,5 V liefern, genug, um direkt Transistoren anzusteuern.

Die Betriebsart des Timers wird durch die Adresse des Timer-Registers festgelegt, in das der Timer-Startwert (1-255) eingeschrieben wird. Der bei den Registern angegebene Faktor legt fest, nach wievielen Takten der Leitung E (800Hz) der Registerinhalt erniedrigt wird. Ob der Timer beim Erreichen der Null einen Interrupt auslößt, wird ebenfalls durch Wahl des Timer-Registers bestimmt. Dieser Nulldurchlauf des Timers setzt immer das 7 .Bit im Interrupt-Flag-Register. Ein gesperrter Interrupt verhindert lediglich die Aktivierung der -IRG-Leitung und somit die Unterbrechung der CPU.

Auch eine Flankenerkennung an PA7 wird in jedem Fall im Interrupt-Flag-Register (Bit 6) vermerkt. Ob dadurch ein Interrupt ausgelößt wird, legt der Programmierer durch Zugriff auf das jeweilige ‘EDGE’-Register fest.

Bei der Initialisierung des Bausteins ist zu beachten, daß durch einen Reset zwar die Interrupts gesperrt werden, doch während des Resets durch ungünstige Pegel an PA7 das 6.Bit im Interrupt-Flag-Register gesetzt werden kann. Zur Vermeidung von Fehlem im Programmablauf sollte es daher durch Auslesen gelöscht werden.

Weitere Informationen zu diesem Baustein können Sie den entsprechenden Unterlagen der Hersteller entnehmen.

Literatur:

[1] Jankowski, Reschke, Rabich; Atari ST Profibuch, 1989 Düsseldorf, Sybex-Verlag

[2] Motorola: M68000 User Manual; 1989 Englewood Cliffs N.J., Prentice Hall

[3] Texas Instruments, Pocket-Guide, Band 1: Digitale integrierte Schaltungen

Der Schaltplan des Busmonitors
Busmonitor-Bestückungsseite
Busmonitor-Lötseite
Das Blockbild zeigt den einfachen Aufbau des 6532

REM (c)1991 by MAXON-Computer 
REM ***************************
REM *      Demoprogramm       *
REM * für den 16-Bit Userport *
REM *     Stephan Neikes      *
REM ***************************

REM ***************************
REM *   Konstanten setzen     *
REM ***************************
ram=&HFF0000
basis=&HFF0100
a=0
b=1
DIM rauster(8,2)
READ musterzahl 
tpause=3

REM ***************************
REM * Initialisierung         *
REM ***************************
SPOKE basis+3,&HFF 
SPOKE basis+7,&HFF

FOR muster=1 TO musterzahl

    REM *************************** 
    REM *       Muster lesen      *
    REM *************************** 
    READ max 
    READ zeit 
    FOR port=0 TO 1 
        FOR y=0 TO 7
            READ muster(y,port)
        NEXT y 
    NEXT port

    REM *************************** 
    REM *   Musterfolge ausgeben  * 
    REM *************************** 
    FOR faktor=1 TO max 
        FOR x=0 TO 7
            dummy=PEEK(basis+11)
            SPOKE basis+1,muster(x,0) 
            SPOKE basis+5,muster(x,1) 
            SPOKE basis+47,zeit 
            WHILE (PEEK(basis+11) AND 128)=0 
            WEND 
        NEXT x 
    NEXT faktor 
NEXT muster

REM ***************************
REM *       Rücksetzung       *
REM *************************** 
SPOKE basis+3,&H0 
SPOKE basis+7,&H0

END 

REM Maximale Musterzahl 

DATA 7

REM Anzahl der Wiederholungen; Wartezeit; Muster je 8*A / 8*B

DATA 1,3
DATA 01,02,04,08,16,32,64,128 
DATA 128,64,32,16,8,4,2,1

DATA 1,7
DATA 01,03,07,15,31,63,127,255 
DATA 01,03,07,15,31,63,127,255

DATA 1,15
DATA 255,127,63,31,15,7,3,1 
DATA 255,127,63,31,15,7,3,1

DATA 1,31
DATA 01,03,07,15,31,63,127,255 
DATA 01,03,07,15,31,63,127,255

DATA 4,63
DATA 255,127,63,159,207,231,243,121 
DATA 255,127,63,159,207,231,243,121

DATA 1,127
DATA 60,30,15,7,3,1.0,128 
DATA 60,30,15,7,3,1,0,128

DATA 3,255
DATA 192,96,48,24,12,6,3,1 
DATA 192,96,48,24,12,6,3,1


**********************************
* Adressen der Register des 6532 * 
**********************************

RAM     : $ FF 0001 bis $ FF 00FF

ORA                   : $ FF 0101
DDRA                  : $ FF 0103
ORB                   : $ FF 0105
DDRB                  : $ FF 0107

TIMER,   %1,   IRQ ON : $ FF 0139
TIMER,   %8,   IRQ ON : $ FF 013B
TIMER,  %64,   IRQ ON : $ FF 013D
TIMER,%1024,   IRQ ON : $ FF 013F

TIMER,   %1,  IRQ OFF : $ FF 0129
TIMER,   %8,  IRQ OFF : $ FF 012B
TIMER,  %64,  IRQ OFF : $ FF 012D
TIMER,%1024,  IRQ OFF : $ FF 012F

READ Timer, IRQ ON    : $ FF 0119
READ Timer, IRQ OFF   : $ FF 0109
READ Interrupt Flags  : $ FF 010B

PA7 IRQ OFF neg Edge  : $ FF 0109
PA7 IRQ OFF pos Edge  : $ FF 010B
PA7 IRQ ON  neg Edge  : $ FF 010D
PA7 IRQ ON  pos Edge  : $ FF 010F

Stephan Neikes
Aus: ST-Computer 12 / 1991, Seite 168

Links

Copyright-Bestimmungen: siehe Über diese Seite