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:
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.
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.
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.
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 |
%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
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.
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
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