Z80 PIO (in der DDR U855) Funktionsbeschreibung history menue Letztmalig dran rumgefummelt: 23.06.16 17:20:12
Implementiert in ein 40-poliges DIL-Gehäuse präsentiert sich die Z80-PIO mit einem 8 Bit breitem Daten-BUS als PIO mit den Befehlen eines Prozessorsystems zum Ein- und Auslesen von 8 Bit breiten Datenbussen mit 3 leitungsfähigen Interruptmodi und einem linear adressierbarem Speichervolumen von 64 KByte (das entspricht 65536 Adressen). Die CPU verfügt über nur eine 5 Volt-Versorgungsspannung, einen Einphasentakt. Alle Ausgänge sind TTL-kompatibel und können eine Standardlast treiben - Port-Ausgänge des PIO müssen auf jeden Fall verstärkt und eventuell galvanisch entkoppelt werden.
  1. Betriebsartenauswahl
  2. Betriebsartenbeschreibung
  3. PIO-Praxis

Warum fiel die Wahl für die Unterrichtsarbeit ausgerechnet auf den Z80 bzw. sein System? Dieser Prozessor sowie sein System vereinigt eine Reihe positiver Merkmale für den Rechentechnik-Einsteiger:

  • alles funktioniert im Prinzip bis heute unverändert - anders geworden sind: 
    • wesentlich höhere Taktfrequenzen - die spielen aber eh' erst bei komplexen Algorithmen eine Rolle ;-
    • Cache
    • Befehlspipeline
    • verbesserter Befehlssatz
    • RISC-Architekturen
  • 30-jährige Einsatzzeit und nicht totzukriegen
  • kostengünstig zu beschaffen
  • zwischenzeitlich als CMOS-Bauelement mit modernen Taktfrequenzen und als Einchipsystem verfügbar und weiterhin entwickelt
  • Programme selbst mit professionellen Betriebssystemen (CPM) verfügbar (ausgetestet und fehlerfrei: PASCAL-Compiler, Word-Star, dBase liefen auf Z80!!!)
  • statischer Prozessor - das heißt, Taktrate niedrig oder ganz STOPP (nicht WAIT - das's was and'res!) - so was geht hier wirklich noch!!!
  • einfaches Verständnis für die Grundlagen der Prozessorarbeit, da Adressraum noch mit 64K linear - ein unschätzbarer Vorteil für alle Assemblerprogrammierer!!!
  • durch seine Einfachheit sowie Vielseitigkeit bestechen Z80 CTC, SIO, DMA und PIO noch immer für Anlagen der Kleinstautomatisierung

Die IS U855 ist eine parallele Ein-/Ausgabe-Einheit (PIO), die ihre maximale Leistungsfähigkeit im System U880 erreicht. Sie beinhaltet zwei vollständige, nach außen TTL-kompatible 8-Bit-Ein-/Ausgabe-Kanäle und ist in ihren wesentlichen Eigenschaften programmierbar.
Die charakteristischen Merkmale der IS sind:

  • n-Kanal-Silicon-Gate-Technologie (nSGT), Depletion Load

  • eine Versorgungsspannung 5 V

  • Einphasensystemtakt (5-V-Pegel) mit 4 MHz (UA855) bzw. 2,5 MHz (UB855) Taktfrequenz

  • zwei unabhängige 8-bit-Ein-/Ausgabe-Kanäle mit Handshakelogik (ermöglicht Quittierungsbetrieb)

  • vier Betriebsarten können programmiert werden: 

    • Byteausgabe

    • Byteeingabe

    • bidirektionaler Bytebetrieb (nur bei Port A) 

    • bitorientierter Datenaustausch

  • Interruptfähigkeit der PIO ermöglicht reaktionsschnelle und leistungsfähige Systemkonzepte

  • Interruptverschachtelungen durch.„daisy chain"-Logik möglich (Kaskadierung mehrerer PIO bzw. systemspezifischer peripherer IS) automatische Interruptvektorerzeugung

  • Kanal B ermöglicht direkte Treibung von Darlingtontransistorstufen (8 Ausgänge)

  • TTL-Kompatibilität aller Ein- und Ausgänge

  • 40poliges DIL-Gehäuse nach TGL 26713.

Typische Anwendungsfälle für die IS U855 sind parallele Schnittstellen zu Tastaturen, Kontaktabfrageeinheiten, Lochbandlesern und -stanzern, Druckern und PROM-Programmiereinheiten. Die PIO-Einheit ist hierbei wesentlich leistungsfähiger als beispielsweise ein Interface mit der IS DS8212 (s. auch Abschn. 5.2.), da sie u. a. eine vollständige programmierbare automatische Interruptbearbeitung ermöglicht. Dadurch ist es nicht notwendig, die Mikrorechnerperipherie mit Hilfe zyklischer Abfrage zu überwachen und zu bedienen (sog. Polling), sondern es ist eine wesentlich zeitgünstigere Überwachung durch Interruptbearbeitung möglich.
Die Zusammenschaltung der IS U855 mit der CPU U880 erfordert keine weiteren zusätzlichen Standardbauelemente, ausgenommen bei großen Systemen Adressendekoder, Kaskadierungslogik und Datenbustreiber.

Hier wurde ein allgemeiner Überblick über Bauelemente und - Wirkungsweise eines Mikrorechners gegeben. An dieser Stelle sollen nun Anwendung und Programmierung der Schaltkreise PIO U 855 D und CTC U 857 D näher erläutert werden. Periphere Schaltkreise werden meist unmittelbar nach dem Einschaltendes Gerätes (Inbetriebnahmeprogramm) programmiert. Erst dadurch sind sie benutzbar. Bei sich ändernder Aufgabe ist eine Umprogrammierung dann irgendwo im Programm möglich.


1. Betriebsartenauswahl history menue scroll up
Aus den insgesamt zwei Grundbetriebsarten kann hier nochmals eine Differenzierung der Kombination aus Interrupt- oder nicht interrptgesteuerter Programmierung, aus ex- oder intern gestartetem Modus und unter Hinzuziehung einer Zeitkonstante oder eben auch nicht gewählt werden.

Rücksetzen des Z80 PIO (U855)

Die parallele Ein-/Ausgabe-Einheit Z80 PIO (U855) nimmt nach Einschalten der Betriebsspannung automatisch einen rückgesetzten Zustand ein. Hierbei werden beide Kanäle in die Betriebsart Byteeingabe (Mode 1) gesetzt, um einen hochohmigen Zustand an den Portdatenleitungen (A0 ... A7, B0 ... B7) zu erreichen. Die Readysignale (A RDY, B RDY) sind inaktiv. Außerdem werden bei beiden Kanälen jeweils die Maskierungsregister, die Ausgaberegister und die Interruptfreigabeflipflops rückgesetzt.
Aufgrund der Anschlussbeschränkung des 40poligen Gehäuses besitzt die IS Z80 PIO (U855) keinen gesonderten Rücksetzanschluss. Die IS lässt sich aber durch die Signalkonfiguration

M1 = L, RD = H, IORQ = H

rücksetzen. Diese Signalbelegung tritt im System U880 nicht auf und kann deshalb für diese Funktion verwendet werden.
Im Bild unten ist die Verknüpfung des Rücksetzsignals mit M1 dargestellt.
Beim Rücksetzen der IS U855 mit dem Signal M1 werden ebenfalls die oben beschriebenen Funktionen ausgeführt; die Inhalte der Vektorregister beider Kanäle bleiben erhalten.


RESET eines Z80 PIO (U855)

Neben diesen beiden Möglichkeiten des Rücksetzens kann die PIO auch softwaremäßig in den durch die genannten Bedingungen charakterisierten rückgesetzten Zustand gesetzt werden. Hierbei müssen die entsprechenden PIO-Register einzeln geladen werden. Besondere Bedeutung kommt der Rücksetzung des Interruptbearbeitungszustands zu.
 

Interruptvektor - siehe auch hier sowie auch hier

In der leistungsfähigen Interruptbetriebsart IM2 der CPU U880 wird von dem unterbrechenden peripheren Gerät (in diesem Fall: die PIO) ein Interruptvektor abgefordert. Dieser Vektor wird von der PIO während des von der CPU eingeschobenen Interruptquittierungszyklus auf den Datenbus geschaltet. Er bildet mit dem CPU-internen Register I einen Pointer (das 8-bit-Register stellt hierbei den höherwertigen Anteil dar), der auf eine Speicherplatzadresse zeigt. Aus den Inhalten dieses und des nachfolgenden Speicherplatzes wird die Startadresse des durch die Interruptanmeldung aufzurufenden Unterprogramms gebildet.
Da zur Bildung der Startadresse jeweils zwei Speicherplätze benötigt werden, muss der Interruptvektor (V) des peripheren Geräts die Wortlänge von 7 Bit bereitstellen.
Das Bit V0 des Vektors wird bei Aussendung automatisch zu 0 gesetzt. Der hieraus gebildete „gerade" 16-bit-Pointer (Bit0 = 0) zeigt auf das niederwertige Byte der Startadresse, der inkrementierte Pointer (Bit0 = 1) auf das höherwertige Byte.
Der Interruptvektor kann durch einen OUT-Befehl der CPU in den ausgewählten Kanal der PIO als Steuerwort (C/D Sel = 1) eingeschrieben werden. Dieses Steuerwort hat folgendes Format:

D7 D6 D5 D4 D3 D2 D1 D0
V7 V6 V5 V4 V3 V2 V1 0

Tabelle 1 - PIO Interruptsteuerwort nur auf Port A

D7 D6 D5 D4 D3 D2 D1 D0
V7 V6 V5 V4 V3 V2 V1 0

Tabelle 2 - Z80 PIO-Interrptvektor-Port A

Achtung muss (darf) nicht gesondert in Port B eingetragen werden - Interruptvektor Port B ergibt sich automatisch durch Einschreiben Vektor in Port A

D7 D6 D5 D4 D3 D2 D1 D0
V7 V6 V5 V4 V3 V2 V1 1

Tabelle 3 - Z80 PIO-Interrptvektor-Port B - er ergibt sich zwangsläufig


Das Bit D0 = 0 identifiziert das Steuerwort als Interruptvektor für den PIO-Kanal.


2. Betriebsartenbeschreibung history menue scroll up
Aus den insgesamt vier Grundbetriebsarten kann hier nochmals eine Differenzierung der Kombination aus Interrupt- oder nicht interrptgesteuerter Programmierung gewählt werden.

  1. Byteausgabe
  2. Byteeingabe
  3. Bidirektionaler Betrieb
  4. Einzelbitbetrieb
  5. Interruptbearbeitung
  6. Einsatz in Rechnersystemen

Beide Kanäle der IS U855 können in einer der Betriebsarten Byteausgabe, Byteeingabe, bidirektionaler Bytebetrieb und Bitbetrieb (ausgenommen Port B im bidirektionalen Betrieb) arbeiten. Die Auswahl hierzu wird in der Kanallogik durch das 2-bit-Betriebsartenregister getroffen. Dieses Register des ausgewählten Ports kann mit Hilfe eines OUT-Befehls der CPU mit einem Steuerwort (C/D Sel = 1) geladen werden.
Das hierfür notwendige Steuerwort hat folgendes Format:

D7 D6 D5 D4 D3 D2 D1 D0
M1 M0 V5 V4 1 1 1 1

Tabelle 4 - PIO-Betriebsartensteuerwort-Allgemein

Die Belegung der Bits D0, D1, D2 und D3 mit 1 identifiziert das Steuerwort als Betriebsartenauswahlwort. Der Wert der Bits D4 und D5 wird nicht abgefragt. Die Bedeutung der Bits D6 und D7 für die ausgewählte Betriebsart ist in Tafel unten dargestellt.
 
D7 D6 Betriebsart Mode Mögliches Steuerwort
0 0 Byteausgabe 0 0FH
0 1 Byteeingabe 1 4FH
1 0 Bidirektionaler Betrieb 2 8FH
1 1 Einzelbitbetrieb 3 CFH

Tabelle 5 - Z80 PIO-Betriebsartensteuerwort - Funktionale Zuordnung

Bei Auswahl der Betriebsart Byteausgabe (Mode 0) können Daten durch einen OUTBefehl der CPU in das ausgewählte Ausgaberegister der PIO eingeschrieben werden. Der Inhalt des Ausgaberegisters wird direkt auf den zugehörigen Portbus (A0 ... A7 bzw. B0 ... B7) durchgeschaltet. Er kann jederzeit unabhängig vom Zustand der Quittierungssignale (A STB, A RDY bzw. B STB, B RDY) durch eine entsprechende OUT-Operation verändert werden. Die Quittierungssignale dienen zur Ansteuerung der Peripherie (A RDY, B RDY) und zur Anmeldung von Interrupts durch die Peripherie (A STB, B STB). Der aktuelle Inhalt des aktivierten Ausgaberegisters kann jederzeit durch eine Leseoperation (IN-Befehl der CPU) abgefragt werden.
Die Auswahl der Betriebsart Byteeingabe (Mode 1) bewirkt ein automatisches Rücksetzen der Quittierungssignale A RDY und B RDY. Das Laden der Eingaberegister der beiden PIO-Kanäle mit den auf den zugehörigen Portbussen anliegenden Daten erfolgt durch die Quittierungssignale A STB bzw. B STB zustandsgesteuert. Bei Ansteuerung dieser Signale durch die Peripherie (also bei Quittungsbetrieb) muss nach Auswahl der Betriebsart eine Leseoperation (IN-Befehl der CPU) ausgeführt werden, um die Signale A RDY bzw. B RDY zu aktivieren.
In der Betriebsart bidirektionaler Bytebetrieb (Mode 2) des Ports A werden alle vier Quittierungsleitungen zur Richtungssteuerung des bidirektionalen Port-A-Busses benötigt. Deshalb muss vor Auswahl der Mode 2 des Kanals A der Kanal B in die Betriebsart Bitbetrieb gesetzt werden. In dieser Betriebsart (Mode 3) werden die Quittierungsleitungen (B RDY, B STB) nicht benutzt und an den Kanal A freigegeben. Bei Datenleseoperationen (IN-Befehle der CPU) im bidirektionalen Betrieb werden in Abhängigkeit vom Zustand der Quittierungssignals A STB Daten entweder aus dem Ausgaberegister (A STB = L) oder aus dem Eingaberegister (A STB = H) des Kanals A gelesen.
Bei Selektierung der Betriebsart Bitbetrieb (Mode 3) können alle Bits des dem jeweiligen Kanal zugehörigen Portbusses unabhängig voneinander als Eingänge oder als Ausgänge definiert werden. Zu dieser Auswahl muss nach Festlegung der Betriebsart ein Steuerwort (C/D Sel = 1) in den entsprechenden Kanal eingeschrieben werden (OUT-Befehl der CPU). Mit diesem Steuerwort wird das Ein-/Ausgabe-Wahlregister der Portlogik geladen. Es hat das nachfolgend dargestellte Format:

 

D7 D6 D5 D4 D3 D2 D1 D0
IO7 IO6 IO5 IO4 IO3 IO2 IO1 IO0

Tabelle 6 - Z80 Ein/Ausgabewahlregister im Einzelbitbetrieb

Hierbei bedeutet das Setzen von Bits (IOm = 1), dass die der Wertigkeit dieser Bits entsprechenden Busleitungen (Am bzw. Bm) des ausgewählten Kanals als Eingänge wirken. Umgekehrt definiert das Rücksetzen (IOm = 0) die zugehörigen Busleitungen (Am bzw. Bm) als Ausgänge. Das Steuerwort ist nicht besonders als Ein-/Ausgabe-Wahlwort gekennzeichnet (alle 8 bit werden zur Informationsübertragung verwendet), da automatisch nach Auswahl der Mode 3 das nächste in die Kanallogik eingeschriebene Steuerwort zur Ein-/Ausgabe-Wahl verwendet wird.
Bei Datenleseoperationen (IN-Befehl) werden bei dieser Betriebsart die zur CPU übertragenen Daten bitweise entsprechend dem Inhalt des Port-Ein-/Ausgabe-Wahlregisters aus dem Eingabe- oder dem Ausgaberegister des Kanals zusammengestellt. Sind die entsprechenden Portleitungen als Eingänge programmiert, werden die zugehörigen Bits dem Eingaberegister, anderenfalls dem Ausgaberegister des Kanals entnommen. In der Bitbetriebsart werden die Quittierungssignale nicht verwendet; die Ausgänge A RDY bzw. B RDY sind inaktiv (führen also L-Pegel). Eine Ausnahme hiervon bildet der bereits erwähnte Fall, dass Kanal A in der Betriebsart bidirektionaler Betrieb arbeitet.

Interruptsteuerwort

Bei der IS U855 erfolgt die Auslösung von Interruptanmeldungen in Abhängigkeit von der für den Kanal ausgewählten Betriebsart. Bei den bytebezogenen Betriebsarten (Mode 0, 1 und 2) erfolgt die Anmeldung mit Hilfe der Quittierungslogik. In der Betriebsart Bitbetrieb (Mode 3) erfolgt die Interruptanmeldung durch eine programmierbare logische Auswertung der am Portbus anliegenden Datenkonfiguration.
In allen Betriebsarten hängt aber die Weitergabe, der Interruptanmeldung an die CPU vom Zustand des zum PIO-Kanal zugehörenden Interruptfreigabeflipflops ab.
Das nachfolgend dargestellte Interruptsteuerwort dient zum Laden des Interruptfreigabeflipflops der Portlogik und zum Festlegen der in der Mode 3 zur Interruptauslösung benötigten Auswahlkriterien. Steuerwort hat das nachfolgend dargestellte Format:

 
D7 D6 D5 D4 D3 D2 D1 D0
EI A/O H/L MF 0 1 1 1

Tabelle 7 - PIO-Interruptsteuerwort (nur im Interrptmode von PIO und CPU zu setzen)

EI Enable Interrupt
A/O AND bzw. OR als Verknüpfungslogik zur Interruptauslösung
H/L "H" oder "L" als definierter Pegel zur Interruptauslösung
MF Maskierungssteuerwort folgt oder folgt nicht (entscheidet, ob ein Bit in die Interruptauslösung einbezogen wird oder nicht)

Die Belegung der Bits D0 bis D3 identifiziert das Steuerwort als Interruptsteuerwort. Das Bit D7 des Wortes beeinflusst das Interruptfreigaberegister (Interruptenableflipflop) des programmierten Kanals. Bei Setzen dieses Bits (D7 = 1) erfolgt die Weitergabe von anhängigen Interruptanmeldungen, die durch die PIO-Interruptlogik ausgelöst wurden, an den Steuereingang INT der CPU U880. Bei rückgesetztem Bit D7 (D7 = 0) wird die Weitergabe dieser Anmeldung an die CPU verhindert. In diesem Fall wird aber eine durch die Peripherie ausgelöste Interruptforderung in der PIO abgespeichert. Wird das Interruptfreigabeflipflop des betreffenden Kanals im späteren Programmablauf wieder gesetzt (D7 = 1), gelangt dieser abgespeicherte Interrupt zur Anmeldung an die CPU. Diese Anmeldung erfolgt auch, wenn seitens der Peripherie dieser Interrupt nicht mehr aktuell ist (also die den Interrupt auslösende Bedingung aufgehoben ist). Die PIO reagiert hierbei unabhängig von der Art der Interruptanmeldung, die durch die Betriebsart des Kanals festgelegt wird. Eine anhängige Anmeldung geht aber verloren, wenn zum Zeitpunkt dieser Interruptforderung die PIO bereits eine Interruptbearbeitung hat (Interruptbearbeitungsflipflop der Kanallogik gesetzt) und das auslösende Ereignis zum Zeitpunkt der Rückkehr aus dieser ISR nicht mehr aktuell ist.
Die Bits D6, D5 und D4 werden in der Betriebsart Bitbetrieb zur logischen Auswahl der Kriterien, die eine Interruptanmeldung auslösen sollen, verwendet. Die Interruptanmeldung erfolgt, wenn die logische Verknüpfung (OR oder AND) der als aktiv definierten Pegel (H oder L) von durch eine Maskierung ausgewählten Bits des Portbusses wahr ist. Die durch diese Bedingungen spezifizierte logische Funktion hat (Interruptbearbeitungsflipflop der Kanallogik gesetzt) die gleiche Wirkung wie das STB-Signal in den Bytebetriebsarten.
Hierbei erfolgt mit Bit D6 die Auswahl der logischen Verknüpfung. Bei Setzen dieses Bits (D6 = 1) wird die logische AND-Funktion, beim Rücksetzen (D6 = 0) die logische OR-Funktion angewendet.
Mit Bit D5 erfolgt die Festlegung des aktiven Pegels der Portleitungen. Ein Setzen dieses Bits (D5 = 1) definiert H-Pegel als aktiv; umgekehrt ist bei D5 = 0 L-Pegel das aktive Niveau.
Mit Setzen des Bits D4 (D4 = 1) erkennt der PIO-Kanal das nachfolgende Steuerwort als Maskierungswort. Dieses Steuerwort dient zum Laden des 8-bit-Maskierungsregisters der Portlogik. Es hat das nachfolgend dargestellte Format:

 
D7 D6 D5 D4 D3 D2 D1 D0
MB7 MB6 MB5 MB4 MB3 MB2 MB1 MB0

Tabelle 8 - Z80 Interrptmaskierungsregister im Einzelbitbetrieb

Hierbei bedeutet das Rücksetzen der verwendeten Maskierungsbits (MBm = 0), dass die in der Wertigkeit korrespondierenden Bits des Portbusses (Am bzw. Bm) zur logischen Auswertung bei der Interrupterzeugung herangezogen werden. Bei Setzen der Bits (MBm = 1) werden die zugehörigen Portleitungen (Am bzw. Bm) nicht bewertet.
Dieses Maskierungswort braucht nicht geladen zu werden (D4 = 0 des Interruptsteuerworts), wenn alle Bits des Kanals zur Auswertung herangezogen werden sollen und wenn sich der PIO vor der Programmierung im rückgesetzten Zustand befand. Beim Rücksetzen des PIO wird das Maskierungsregister rückgesetzt; alle Maskierungsbits sind MB = 0.
Das Bit D4 des Interruptsteuerworts hat eine weitere Bedeutung für bestimmte Systemanwendungen. Das Einschreiben eines Interruptsteuerworts mit gesetztem Bit D4 (D4 = 1) zu einem beliebigen Zeitpunkt bewirkt, dass in allen Betriebsarten der IS U855 eine anhängige, jedoch nicht durch die CPU quittierte Interruptanforderung rückgesetzt wird. Das bedeutet, dass intern abgespeicherte Anmeldungen gelöscht werden. Die Weitergabe anhängiger Interruptforderungen wird durch die KanalsteuerLogik bei rückgesetztem Interruptfreigabeflipflop, bei einem quittierten Interruptbearbeitungszustand des Kanals und bei inaktivem Interruptfreigabeeingang IEI (IEI = L) verhindert.
Andererseits wird eine über die INT-Linie an die CPU weitergeleitete Interruptanmeldung vom Prozessor nicht quittiert, wenn eine Busanforderung vorliegt (BUSRQ = L) oder wenn das prozessorinterne Interruptfreigabeflipflop IFF, rückgesetzt ist. Für alle diese dargestellten Fälle hat also das Setzen des Bits D4 des Interruptsteuerworts Bedeutung. Eine mögliche Anwendung dieses Steuerworts besteht also z. B. darin, dass am Ende der ISR eines PIO-Kanals eine erneute (anhängige) Interruptforderung des gleichen Kanals zurückgenommen werden kann.
Nach dem Laden dieses Interruptsteuerworts (D4 = 1) erkennt der PIO-Kanal das nachfolgende Steuerwort unabhängig von der gewählten Betriebsart als Maskierungswort. Es wird das zugehörige PIO-Register geladen.
Die IS Z80 PIO (U855) bietet eine weitere Möglichkeit zur Beeinflussung des Interruptfreigabeflipflops der PIO-Kanallogik. Das hierzu vorgesehene Steuerwort hat folgendes Format:

D7 D6 D5 D4 D3 D2 D1 D0
EI X X X 0 0 1 1

Tabelle 9 - PIO-Betriebsartensteuerwort-Allgemein

Durch Bit D7 kann das Interruptfreigabeflipflop (IFF) beeinflusst werden (D7 = 0, IFF rückgesetzt; D7 = 1, IFF gesetzt), ohne dass weiter Informationen in die PIO eingeschrieben werden müssen. Dieses Steuerwort, das durch die Bitbelegung D0 bis D3 charakterisiert wird, kann deshalb insbesondere zur Beeinflussung der PIO-Interruptfreigabe im Programmablauf benutzt werden.

Betriebsart Byteausgabe

Nach Auswahl der Betriebsart Byteausgabe mit dem entsprechenden Steuerwort nimmt das dem angesprochenen PIO-Kanal entsprechende READY-Signal (A RDY oder B RDY) einen inaktiven Zustand ein.
Das Ausgaberegister der Portlogik dieses Kanals ist direkt auf den Portbus (A oder B) geschaltet.
Durch Einschreiben eines Datenworts (C/D Sel = 0) wird nun eine Byteausgabeoperation ausgelöst. Hierbei wird das Ausgaberegister des Kanals geladen. Bei Verwendung der Quittierungslogik durch die Peripherie ergibt sich das im Bild 3.2.5 dargestellte Zeitverhalten am PIO.
Das Einschreiben des Datenworts erfolgt in einem Schreibzyklus, der durch das intern in der IS U855 erzeugte Signal WR' gekennzeichnet ist:

WR' = RD + CE + C/D + IORQ.

Nachdem dieses Signal inaktiv geworden ist, also nach dessen steigender Flanke, sind die von der CPU übertragenen Daten auf dem entsprechenden Portbus verfügbar. Dieser Zustand wird der Peripherie angezeigt, indem das zugehörige READY-Signal (A RDY oder B RDY) nach der nächsten fallenden Flanke des Systemtakts aktiv wird (also H-Pegel führt). Eine positive (steigende) Flanke des in der Peripherie zu erzeugenden Quittierungssignals (A STB bzw. B STB) bewirkt danach ein Rücksetzen des READY-Signals ebenfalls nach der nächsten fallenden Taktflanke. Gleichzeitig kann von dieser Flanke des STROBE-Signals in Abhängigkeit vom zuvor programmierten Zustand des Interruptfreigabeflipflops der Portlogik und abhängig von der aktuellen Priorität des PIO-Kanals eine Interruptanmeldung an die CPU ausgelöst werden.


Die Anwendung dieses unkomplizierten Quittierungsbetriebs erfolgt hauptsächlich bei der Bedienung langsamer Peripheriegeräte und bei der Synchronisierung der Peripherie mit der Mikrorechnerschnittstelle beim Vorhandensein bestimmter zeitlicher Bedingungen.
Sollen Ausgabeoperationen ohne Quittierungsbetrieb ausgeführt werden, kann der STROBE-Eingang des Kanals (A STB bzw. B STB) an einen festen Pegel (H oder L) gelegt werden. Es ergibt sich dann an der Portlogik das im Bild dargestellte Zeitverhalten.


Nach Initialisierung der Betriebsart ist die entsprechende READY-Linie wiederum inaktiv. Das Einschreiben eines Datenworts bewirkt ein Umschalten des Signals (A RDY bzw. B RDY) auf H-Pegel nach Beendigung des Schreibzyklus. Da am STROBE-Eingang jetzt keine steigende Flanke auftreten kann, bleibt das READY-Signal bis zur nächsten Ausgabeoperation des Kanals aktiv. Das. Signal (A RDY bzw. B RDY) wird nach der fallenden Taktflanke des automatisch von der CPU bei diesem OUT-Befehl (gekennzeichnet durch WR' = 0) eingefügten Waitzustands rückgesetzt. Nach Beendigung des Schreibbefehls (WR' = 1) wird READY wieder aktiv.
Das READY-Signal ist also während der Änderung und des Einschwingens der neuen Information auf dem Portbus (A bzw. B) inaktiv. Seine positive Flanke kann durch die Peripherie zur flankengesteuerten Zwischenspeicherung der Ausgabedaten verwendet werden (z. B. direkte Ansteuerung derTrigger D174 durch dieses Signal). Da am STROBE-Eingang keine positive Flanke auftritt, erfolgt keine Anmeldung von Interrupts.
Eine weitere Möglichkeit der Beschaltung der IS Z80 PIO (U855) in dieser Betriebsart stellt das Zusammenschalten beider Quittierungssignale des Kanals dar (A STB = A RDY bzw. B STB = B RDY). Das hierbei auftretende Zeitverhalten ist im Bild dargestellt.
Die READY-Linie wird nach einer OUT-Operation wie in den bereits beschriebenen Fällen aktiv. Die hierdurch ausgelöste positive Flanke am STROBE-Eingang bewirkt ab sofort ein Rücksetzen von READY nach der nächsten fallenden Flanke des Systemtakts. Es wird somit vom READY-Ausgang ein positiver Impuls mit der Dauer von etwa einer Taktperiode erzeugt, nachdem der Portbus bereits einen eingeschwungenen Zustand erreicht hat.
Obwohl der STROBE-Eingang eine positive Flanke empfängt, wird keine Interruptanmeldung ausgelöst. Das ist dadurch begründet, dass der auf einen OUT-Befehl folgende Maschinenzyklus systembedingt grundsätzlich ein M1-Zyklus ist. Bei aktivem M1-Signal wird aber die interne Interruptlogik aller peripheren Geräte (also auch der PIO) nicht verändert, um Einschwingvorgänge bei der Interruptquittierung zu vermeiden.


In der Peripherie kann der so erzeugte READY-Impuls zur flankengesteuerten (positive oder negative Flanke) oder zur zustandsgesteuerten Zwischenspeicherung der auf den Portbus geschalteten Ausgabedaten verwendet werden (z. B. direkte Ansteuerung von parallelbetriebenen Schieberegistern D195 als 4-bit-Register).

Betriebsart Byteeingabe

Nach Initialisierung des angesprochenen PIO-Kanals in dieser Betriebsart nimmt die zugehörige READY-Linie (A RDY bzw. B RDY) einen inaktiven Zustand ein. Mit diesem Status wird der Peripherie angezeigt, dass das Eingaberegister keine neuen Daten erwartet. Umgekehrt wird mit aktivem READY-Ausgang signalisiert, dass das Porteingaberegister zuvor von der CPU gelesen wurde.
Das Einspeichern der auf dem entsprechenden Portbus (A oder B) anliegenden Daten erfolgt mit aktivem Zustand des zugehörigen STROBE-Eingangs.
Die Verwendung dieses somit ermöglichten einfachen Quittierungsbetriebs kann zur Synchronisation oder zur schnellen Bedienung der Paralleleingabeschnittstelle dienen. Das Zeitverhalten an der IS Z80 PIO (U855) bei Quittierungsbetrieb ist im Bild dargestellt.


Bei dieser Anwendung muss nach Initialisierung des Kanals eine blinde (also nicht auszuwertende) Dateneingabeoperation ausgeführt werden, damit die READY-Linie einen aktiven Zustand einnimmt. Dieser H-Pegel zeigt der Peripherie an, dass Daten in das Eingaberegister der PIO-Kanallogik eingeschrieben werden können. Dieses Einschreiben erfolgt zustandsgesteuert mit aktivem Pegel des zugehörigen STROBE-Signals. Mit Inaktivwerden dieses Eingangs (also mit der steigenden Flanke) wird ein Rücksetzen des READY-Ausgangs nach der folgenden fallenden Flanke des Systemtakts ausgelöst. READY signalisiert also der Peripherie, dass sich bereits neue Daten im Eingaberegister des Ports befinden. Gleichzeitig wird von der positiven STROBE-Flanke bei freigegebener Interruptlogik des Kanals eine Interruptanmeldung erzeugt. In der dadurch ausgelösten Interruptserviceroutine (ISR) könnte nun beispielsweise das Lesen des Eingaberegisters durch die CPU erfolgen. -
Die Leseoperation der CPU (IN-Befehl) ist durch das in der PIO generierte Signal RD' gekennzeichnet:

RD' = RD + CE + C/D + IORQ.

(3.2.2) Nach Beendigung dieser Operation (inaktives RD'-Signal) erfolgt das erneute Setzen des READY-Ausgangs nach der nächsten fallenden Taktflanke. Der Peripherie wird an gezeigt, dass der PIO neue Daten erwartet. Der Ausgangszustand für einen neuen Einschreibvorgang ist somit erreicht.
Sollen Eingabeoperationen ohne Quittierungsbetrieb ausgeführt werden, muss der entsprechende STROBE-Eingang mit L-Pegel beschaltet werden. Das Einschreiben der auf dem Portbus anliegenden Daten erfolgt nun direkt in das Porteingaberegister. Bei einem Lesezyklus durch die CPU (IN-Befehl), der wiederum durch aktives RD'-Signal gekennzeichnet ist, wird die READY-Leitung nach der negativen Taktflanke des automatisch von der CPU eingeschobenen Waitzustands rückgesetzt. Nach Ende der IN-Operation wird sie, wie bereits beschrieben, wieder aktiv.
Der inaktive Pegel der READY-Linie kann bei dieser Anwendung in der Peripherie benutzt werden, um die Übergabe von Daten an den Portbus zu unterbinden. Damit ist sichergestellt, dass während einer Einschreibeoperation eingeschwungene Daten in die CPU übernommen werden. Da am STROBE-Eingang kein Pegelwechsel auftritt, können keine Interruptanmeldungen ausgelöst werden. Das Bild zeigt das Zeitverhalten am PIO bei diesem Anwendungsfall.

Bidirektionaler Betrieb

Bei Auswahl dieser Betriebsart für den Kanal A der Ein/Ausgabe-Einheit muss Kanal B die Mode Bitbetrieb gesetzt werden. Das ist erforderlich, weil alle vier Quittierungssignale (A RDY, A STB, B RDY, B STB) für die Steuerung des bidirektionalen Datenaustauschs über den Portbus A durch die Peripherie genutzt werden. Im Bild unten ist das Zeitverhalten am PIO bei ausgewählter Betriebsart 2 dargestellt.


Die Quittierungssignale des Kanals A der IS U855 (A RDY, A STB) dienen zur Steuerung des Datentransports in Richtung Peripherie (Ausgabe). Analog zur Betriebsart Byteausgabe wird der Ausgang A RDY nach einer Schreiboperation der CPU (OUT- Befehl) aktiviert.
Er signalisiert somit der Peripherie, dass neue Ausgabedaten im Ausgaberegister des Kanals A verfügbar sind. Diese Daten können nun durch Aktivierung des Eingangs A STB auf den bidirektionalen Port-A-Bus geschaltet und durch die Peripherie empfangen werden.
Durch Rücksetzen dieses Quittungssignals (A STB = 1) wird der Portbus wieder in einen hochohmigen Zustand versetzt. Gleichzeitig wird mit der nächsten fallenden Flanke des Systemtakts der Ausgang A RDY rückgesezt (A RDY = 0), um der Peripherie die Beendigung des Ausgabezyklus und die Freigabe des Port-A-Busses anzuzeigen. Mit der steigenden Flanke von A STB wird bei gesetztem Interruptfreigabeflipflop des Kanals A und freigegebener Interruptlogik der PIO (IEI = 1) eine Interruptanmeldung an die CPU ausgelöst. Bei Quittierung dieser Anmeldung durch die CPU wird der Interruptvektor des Kanals A gelesen.
Der Datentransport von der Peripherie zur IS Z80 PIO (U855) über den Port-A-Bus wird durch die Quittierungssignale des Kanals B (B RDY, B STB) gesteuert. Das Zeitverhalten entspricht hierbei dem der Betriebsart Byteeingabe.
Die Daten werden also mit aktivem B STB-Signal in das Eingaberegister des Kanals A eingeschrieben. Nach dem Inaktivwerden dieses Signals wird der Ausgang B RDY rückgesetzt, um der Peripherie anzuzeigen, dass der Eingabezyklus beendet ist und sich aktuelle Daten im Eingaberegister befinden. Die positive Flanke von B STB löst eine Interruptanmeldung des Kanals B aus, wenn das Interruptfreigabeflipflop dieses Ports gesetzt und die Interruptlogik freigegeben ist. Die Quittierung dieser Anmeldung durch die CPU hat das Aussenden des Interruptvektors des Kanals B zur Folge. Da der Kanal B in der Betriebsart Bitbetrieb arbeitet, können Zweideutigkeiten bei der Interruptanmeldung auftreten, weil in dieser Mode die Anmeldung von Interrupts durch eine maskierbare Auswertung der auf dem Port-B-Bus liegenden Dateninformationen erfolgt.
Der Kanal B kann also bei entsprechender Portbelegung die gleiche Interruptserviceroutine aufrufen wie Kanal A bei Quittierung des Eingabebetriebs (in der bidirektionalen Betriebsart). Wenn diese Zweideutigkeit der Interruptanmeldung vermieden werden soll, muss durch Setzen des Maskierungsregisters des Kanals B eine Anmeldung des im Bitbetrieb arbeitenden Ports verhindert werden. Dieser Kanal kann dann durch die CPU mit Polling bedient werden.
Bei der Eingabe im bidirektionalen Betrieb ist eine weitere Besonderheit zu beachten. Bei einer Leseoperation der CPU (RD' = 0) werden nur dann die Daten des Eingaberegisters gelesen, wenn das Signal A STB inaktiv ist. Im anderen Fall (A STB = 0) wird der Inhalt des Ausgaberegisters des Ports A gelesen. Zur Vermeidung dieses Falls kann in der Peripherie A STB mit dem negierten B RDY-Signal mit Hilfe OR logisch verknüpft werden.
Das Quittungssignal A STB nimmt dann während einer Leseoperation (B RDY = 0) einen inaktiven Zustand (A STB = 1) ein. Die Eingabedaten werden also dem Eingaberegister des Kanals A entnommen.

Bitbetrieb

Bei Anwendung der Betriebsart Bitbetrieb werden die Quittierungssignale des ausgewählten Kanals nicht benutzt. Das READY-Signal (A RDY bzw. B RDY) führt L-Pegel, ausgenommen B RDY, wenn Kanal A im bidirektionalen Betrieb arbeitet.
Eine Datenschreiboperation der CPU (OUT-Befehl) bewirkt ein Einschreiben der Daten in das Ausgaberegister der Kanallogik der PIO. Mit dem Inhalt des Ein-/AusgabeWahlregisters ist festgelegt, welche Bits dieses Registers direkt auf den Portbus geschaltet sind (also als Ausgänge wirken). Die anderen Bits des Busses wirken als Eingänge. Bei einem auf den PIO-Kanal bezogenen Lesebefehl der CPU (IN-Befehl) erfolgt die Übernahme der auf dem Portbus liegenden Daten flankengesteuert mit der fallenden Flanke des RD-Signals in das Eingaberegister der Kanallogik. Die mit dieser Flanke übernommenen aktuellen Portdaten werden während des laufenden Lesezyklus an den Prozessor gesendet. Dieses Datenwort wird je nach Inhalt des Ein-/Ausgabe-Wahlregisters aus Eingabebits (vom Portbus) und Ausgabebits (aus dem Ausgaberegister) gebildet. Das Zeitverhalten am PIO ist im Bild unten dargestellt.

Bitbetrieb des PIO-Ports

Die Auslösung von Interruptanmeldungen erfolgt in der Betriebsart Bitbetrieb durch logische Auswertung der auf dem Portbus anliegenden aktuellen Bitbelegung. Diese Auswertung bezieht sich also sowohl auf die Bits des Portbusses, die als Eingänge wirken und ihre Belegung von der Peripherie erhalten, als auch auf die als Ausgänge definierten Bits, die durch das Ausgaberegister belegt werden. Durch den Inhalt des Maskierungsregisters ist bestimmt, welche dieser Bits einen Einfluss auf die logische Auswertung haben. Das 2-bit-Maskierungssteuerregister legt nun fest, mit welchem Pegel (H oder L) und welcher Funktion (OR oder AND) die Auswahl erfolgt. Als logische Funktion der Bitauswertung kann deshalb die AND-, NAND-, OR- oder NOR-Verknüpfung der nichtmaskierten Bits des Portbusses verwendet werden.
Die Interruptanmeldung erfolgt bei freigegebener Interruptlogik der PIO und gesetztem Interruptfreigabeflipflop, wenn diese logische Funktion der ausgewählten Portbusbits erfüllt wird (also bei einem 0/1-Übergang). Bleibt diese Verknüpfung wahr (unabhängig vom Ereignis), wird nach Verlassen des Interruptbetriebs (RETI-Befehl) hierdurch keine neue Anmeldung ausgelöst. Voraussetzung für die Interruptauslösung ist also, dass sich bei freigegebener Interruptlogik der PIO durch Veränderung der Bitbelegung ein Sprung der verwendeten Funktion auf logisch 1 vollzieht. Es erfolgt somit ebenfalls keine neue Interruptanmeldung, wenn der Übergang der logischen Funktion der Bitbelegung auf logisch 1 noch bei blockierter Interruptlogik (durch Bearbeitung der vom Kanal ausgelösten Interruptserviceroutine) ausgelöst wird. Die anhängige Interruptforderung wird jedoch PIO-intern abgespeichert und kann nach dem Verlassen des Interruptbearbeitungszustands (RETI-Befehl) eine Anmeldung auslösen. Voraussetzung hierfür ist aber, dass bei Abarbeitung des RETI-Befehls die logische Funktion noch erfüllt ist.
Da bei aktivem M1-Signal der Interruptzustand der IS U855 nicht verändert werden darf (Einschwingen der Interruptprioritätenkette), erfolgt bei Erfüllung der logischen Funktion während eines M1-Zyklus die Anmeldung des Interrupts nach der Rückflanke des M1-Signals (wiederum vorausgesetzt, dass die logische Funktion dann noch erfüllt ist).
Im Bild unten sind noch einmal an einem Beispiel die Bedingungen für die Interruptanmeldung im Bitbetrieb dargestellt. In diesem Beispiel sei das Interruptfreigabeflipflop gesetzt, und die Bits A0 und A1 sollen über die logische OR-Funktion (positive Logik) Interrupts auslösen. Das Signal IEO der PIO zeigt den aktuellen Bearbeitungszustand der vom Kanal aufgerufenen ISR an.

BInterruptanmeldung des PIO-Ports im Bitbetrieb

Interruptbearbeitung

Die Erzeugung von Interrupts erfolgt in den bytebezogenen Betriebsarten mit Hilfe des Quittierungssignals STROBE bzw. im Bitbetrieb durch logische Auswertung der aktuellen Portbusbelegung. Voraussetzung hierfür ist, dass die betrachtete PIO (-Kanal) in der Interruptkette (daisy chain) die höchste Priorität aufweist (IEI = 1).
Diese Interruptprioritätenkette wird im System U880 durch Reihenschaltung der peripheren Bauelemente (PIO, SIO, CTC, DMAC) mit den Interruptfreigabesignalen IEI und IEO gebildet. Ein H-Pegel am Eingang IEI der PIO bedeutet hierbei, dass die interne Interruptlogik freigegeben ist und eine Interruptanmeldung in Abhängigkeit vom Zustand des Interruptfreigabeflipflops des betrachteten Ports an die CPU weitergegeben wird. Ein L-Pegel am Ausgang IEO der PIO bewirkt, dass bei nachfolgenden peripheren IS die Interruptanmeldung blockiert bzw. dass deren in Bearbeitung befindliche ISR bei Interruptfreigabe der CPU (Befehl EI erfolgte) durch das höherwertigere Gerät unterbrochen wird.
Die IS U855 enthält zwei Ein-/Ausgabe-Kanäle, die in Bezug auf die Interruptbearbeitung gleichartig wirken (zwei getrennte Interruptfreigabeflipflops, zwei Vektorregister). Hierbei besitzt der Kanal A die höhere Priorität, liegt also in einer Interruptkette weiter vorn als Kanal B. Damit bei der Quittierung einer Interruptanmeldung durch die CPU diese Prioritätenkette einen eingeschwungenen Zustand erreicht, wird die Interruptlogik aller PIO (der Kette und der anderen peripheren IS) während des aktiven M1-Signals blockiert. Die Interruptquittierung der anmeldenden PIO (die gekennzeichnet ist durch IEI = 1 und IEO = 0) erfolgt durch gleichzeitiges Auftreten der aktiven Zustände der Signale Ml und IORQ in einem in den Befehlsablauf von der CPU eingeschobenen Quittierungszyklus. Das entsprechende Zeitverhalten ist im Bild unten dargestellt.

Interruptanmeldung des PIO-Ports

Nach Empfang dieser Quittierung befindet sich der PIO-Kanal im Interruptbearbeitungszustand. Er sendet seinen Interruptvektor an die CPU, und programmäßig wird eine durch diese Interruptanmeldung aufgerufene ISR eingeschoben. Die INT-Linie wird durch diesen PIO-Kanal wieder freigegeben. Das Ende einer ISR wird durch den CPURückkehrbefehl RETI gekennzeichnet.
Die im Bearbeitungszustand befindliche PIO dekodiert parallel zur CPU die auf dem Datenbus ankommenden Befehle (die gekennzeichnet sind durch M1-Zyklen). Erkennt sie die Befehlsfolge ED, 4D (2-byte-Befehl RETI), so verlässt sie den Interruptbearbeitungszustand und aktiviert ihren Ausgang IEO (vorausgesetzt IEI = 1). Dieses Zeitverhalten ist im Bild unten dargestellt.
Bei der Interruptbearbeitung können aber auch die nachfolgend beschriebenen Fälle auftreten. Wenn während der Abarbeitung der ISR des betrachteten PIO-Kanals (der sich im Interruptbearbeitungszustand befindet) eine höherwertige periphere IS (in diesem Fall: PIO) einen Interrupt anmeldet (INT = 0), dann schaltet dessen Freigabeausgang IEO auf L-Pegel (IEO = 0). Die Prioritätenkette gibt dieses Potential an die nachfolgenden IS weiter. Die niederwertigere, in Bearbeitung befindliche PIO, empfängt also auch IEI = 0.
Ist nun in der laufenden ISR (der niederwertigeren PIO) das Interruptfreigabeflipflop der CPU gesetzt (mit dem Befehl EI der CPU), so unterbricht die Interruptanmeldung des höherwertigen PIO (eigentlich: PIO-Kanal) die laufende ISR. Die Anmeldung wird durch die CPU quittiert (Bild unten), und programmäßig wird eine ISR der höherwertigen IS eingefügt. Nach Beendigung dieser ISR empfängt die höherwertige PIO die RETI-Instruktion, da ihr Interruptfreigabeeingang H-Pegel führt (IM = 1).
Der Interruptfreigabeausgang wird wieder auf H-Pegel geschaltet (Bild unten), und die niederwertigere IS empfängt am IEI-Eingang ebenfalls wieder H-Pegel. Die CPU bearbeitet daraufhin die zurückgespeicherte und zuvor unterbrochene ISR der niederwertigen PIO zu Ende. Der daraufhin folgende RETI-Befehl setzt nun den Interruptbearbeitungszuständ der niederwertigen PIO zurück. Der Ausgangszustand ist wieder erreicht.

Interruptquittierung des PIO-Ports

Ist im anderen Fall das Interruptfreigabeflipflop der CPU im Befehlsablauf der ISR der niederwertigeren PIO nicht gesetzt worden, so erfolgt keine Unterbrechung des laufenden Unterprogramms. Der höherwertige PIO-Kanal meldet weiter seinen Interrupt an (INT 0); sein Freigabeausgang führt ebenfalls weiter L-Potential (IEO = 0). Somit empfängt die niederwertigere IS am Eingang IEI ebenfalls L-Pegel (IEI = 0). Damit nun der im Interruptbearbeitungszustand befindliche PIO-Kanal die RETI-Instruktion erkennen kann, muss der IEO-Ausgang der anmeldenden, aber nicht bearbeiteten höherwertigen IS nach Erkennen des Befehlsbytes ED (l. RETI-Byte) für die Dauer eines M1-Zyklus auf H-Pegel geschaltet werden. Dadurch führt der IEI-Eingang bei Empfang des zweiten Befehlsbytes 4D der RETI-Instruktion H-Potential und kann den Interruptbearbeitungszustand verlassen.
Der IEO-Ausgang dieses (niederwertigeren) PIO-Kanals führt aber weiterhin L-Potential, da das höherwertigere PIO-Port weiter seine nichtquittierte Interruptanmeldung aussendet und somit am IEO-Ausgang wieder L-Pegel führt, der durch die Prioritätenkette weitergegeben wird.

Interruptquittierung des PIO-Ports

Zusammenfassend lässt sich aus diesen Bedingungen die logische Funktion des PIOAusgangs IEO darstellen:
IEO = IEI - RF2A - RF2B - (INTPA - INTPB + RF1). (3.2.3)
IEO Interruptfreigabeausgang des PIO (H aktiv).
IEI Interruptfreigabeeingang des PIO (H aktiv)
RF2A Kombinationssignale, die sich aus dem Interruptbearbeitungszustand des
RF2B•} ~ Kanals (A oder B) und dem in einem FF zwischengespeicherten dekodierten zweiten Byte des RETI-Befehls zusammensetzen (H aktiv) INTPA, Interruptanforderungen der Kanäle (A oder B), die nochnicht durch die CPU INTPB J quittiert wurden (H aktiv)
RF1 Zustand des FF, in dem das dekodierte-erste Byte des RETI-Befehls für einen M1-Zyklus zwischengespeichert wird (H aktiv).

Einsatz der PIO in Mikrorechnersystemen

Hardware

Die Signalkonfiguration der IS U855 erlaubt eine direkte Zusammenschaltung mit dem Prozessor U880. In Mikrorechnerminimalsystemen kann deshalb eine direkte Kopplung der Daten- und Steuerbuslinien erfolgen
Ansteuerseitig können das Freigabesignal CE und die Auswahlsignale B/A Sel, C/D Sel direkt mit Adressleitungen der CPU beschaltet werden. In größeren Mikrorechnern wird aufgrund der Anzahl peripherer Geräte der Einsatz eines Adressdekoders notwendig. Üblicherweise wird hierbei aus den Adresslinien A0 ... A7 das Freigabesignal CE gebildet, während die Auswahlsignale mit den niederwertigen Adressen A0 und A1 beschaltet werden. Es ergibt sich somit ein Adressierungsraum für 128 PIO-Kanäle.
Reicht diese Anzahl bei besonderen Anwendungsfällen nicht aus, so erlaubt die Befehlskonfiguration der OUT- bzw. IN-Instruktion die Einbeziehung der höhenwertigen Adressen A0 ... A15 in die Adressdekodierung. Es können dann aber Probleme bei der Zuordnung der ISR (ebenfalls durch Interruptvektor auf 128, begrenzt) auftreten.
Die Zeitverhältnisse an der PIO U855 gestatten die Pufferung des Adress-, Steuer- und Datenbusses sowie des Systemtakts. Üblicherweise erfolgt die Treibung des Adress- und Steuerbusses prozessorseitig bzw. in Busverlängerungseinheiten, um ausreichende Pegel und Lastfaktoren zur Ansteuerung der Peripherie bereitzustellen. Die Datenbuspufferung erfolgt sowohl CPU-seitig als auch peripherieseitig, um Störgrößen und große Leitungskapazitäten (z. B. bei Anschluss großer Standardspeicher) auf dem Bus zu vermeiden. Da der Datenbus bidirektional arbeitet, muss an den Treiberschaltkreisen eine Richtungsumschaltung vorgesehen werden. Peripherieseitig muss diese Umschaltlogik auf Schreib- und Lesevorgänge und auf Interruptquittierungen der zugehörigen Peripherie reagieren. Bild unten zeigt das Prinzipschaltbild einer Richtungsumschaltung für ein PIO-Bauelement, das über einen Datenbustreiber mit dem Prozessor korrespondiert. Die Umschaltlogik reagiert jeweils nur bei Aktivierung des Peripherieelements. Im Interruptquittierungszyklus erfolgt eine Richtungsumschaltung in Abhängigkeit vom Zustand des IEI-Eingangs und des IEO-Ausgangs der PIO. Die Konfiguration IEI = 1 und IEO = 0 zeigt hierbei an, dass das Element eine priorisierte Interruptanmeldung zum Prozessor gesendet hat. Bei inaktiven PIO muss dennoch der Datenbus übertragen werden, damit die parallele Auswertung des RETI-Befehls durch die Peripherieelemente erfolgen kann.
Der Bustreiber muss deshalb immer aktiviert sein (CS = L).

Datenbus-Richtungsumschaltung

Bei der Interruptkaskadierung der PIO mit weiteren peripheren Elementen mit Hilfe der IEI - IEO-Linie wird in großen Rechnersystemen (mehr als sechs Elemente) eine Hardwarelösung benötigt, die die Verzögerung der Weitergabe des L-Pegels in der Prioritätskette kompensiert. Im Bild unten ist eine Möglichkeit für eine derartige Logik dargestellt.
Der L-Pegel wird durch eine „vorausschauende" Logik (look ahead) in der Kette weitergegeben. Die L-Verzögerungszeit der gesamten Kette wird durch die Verzögerung der TTL-Gatter bestimmt.

Schnelle Look-Ahead-Logik

Software

Die Initialisierung der parallelen Ein-/Ausgabe-Einheit U855 erfolgt üblicherweise zusammen mit den anderen peripheren Systemelementen zu Beginn des Hauptprogramms. Zu dieser Anfangsinitialisierung gehören das Laden der Interruptvektoren, das Festlegen der Betriebsarten und das Laden der Kanalsteuerregister. Nach Einschalten der Betriebsspannung nimmt die PIO automatisch die Betriebsart Eingabe ein. Somit befinden sich

 

Zusammenfassung

In der Tafel unten ist die Programmierung des Z80 PIO (U855) zusammenfassend dargestellt.

für den Profi - Kurzreferenz zur PIO-Programmierung

Übersichtstafel PIO-Programmierung


3. PIO-Praxis history menue scroll up
Aus den insgesamt zwei Grundbetriebsarten kann hier nochmals eine Differenzierung der Kombination aus Interrupt- oder nicht interrptgesteuerter Programmierung, aus ex- oder intern gestartetem Modus und unter Hinzuziehung einer Zeitkonstante oder eben auch nicht gewählt werden.

Eine PIO enthält zwei Kanäle (A und B) mit je 8 Bit Datenbusbreite und je zwei Steuersignalen (STB, RDY), die unabhängig voneinander arbeiten (Ausnahme: bidirektionale Betriebsart). An die Kanäle wird die Peripherie 'des Mikrocomputers angeschlossen (z. B. Tastatur, Magnetband- und Druckeransteuerung). Die PIO dient als Trennstelle zwischen den Signalen- des Computers und denen der Eine und Ausgabegeräte.. Jeder: Kanal kann wahlweise in einer von drei Betriebsarten arbeiten. Die bidirektionale Betriebsart kann nur über Kanal A erfolgen:

1. Ausgabe

Hier werden dem peripheren Gerät (z. B. - Drucker) Daten zur Verfügung gestellt, die es hardwaremäßig weiterverarbeitet. Zur Anpassung der verschiedenen Übertragungsgeschwindigkeiten zwischen Computer und Peripherie können die Steuersignale des Kanals dienen (Bild 1). Am Beispiel Drücker soll das erklärt werden. 
Die ZVE hat ein Zeichen im Register A, das gedruckt werden soll. Mit einem Befehl veranlasst das Programm die ZVE, dieses Zeichen über den Datenbus in die PIO zu schreiben. Dort erscheint es am Kanalausgang. Kurz darauf aktiviert die PIO ihren RDY-Ausgang (neues Zeichen für Drucker bereit). Hardwaremäßig wird jetzt der Druckvorgang ausgelöst. Der dauert infolge der langsamen Mechanik mehrere- Millisekunden. Die ZVE kann während dieser Zeit irgend ein anderes Programm abarbeiten.
Wenn der, Druck, beendet ist, wird hardwaremäßig der STB-Eingang des PIO aktiviert (Bereitschaft, das nächste Zeichen zu drucken).
Der PIO schaltet den RDY-Ausgang inaktiv (Meldung verstanden), und spricht über die ITT-Leitung die ZVE an (Anforderung, das laufende Programm zu unterbrechen, und das nächste zu druckende Zeichen zu übergeben): Die ZVE wird, wenn sie dafür Zeit hat, den Interrupt annehmen und dem PIO das nächste Zeichen einschreiben.

Nach Auswahl der Betriebsart Byteausgabe mit dem entsprechenden Steuerwort nimmt das dem angesprochenen PIO-Kanal entsprechende READY-Signal (A RDY oder B RDY) einen inaktiven Zustand ein. Das Ausgaberegister der Portlogik dieses Kanals ist direkt auf den Portbus (A oder B) geschaltet.
Durch Einschreiben eines Datenworts (C/D Sel = 0) wird nun eine Byteausgabeoperation ausgelöst. Hierbei wird das Ausgaberegister des Kanals geladen. Bei Verwendung der Quittierungslogik durch die Peripherie ergibt sich das im Bild 3.2.5 dargestellte Zeitverhalten am PIO.
Das Einschreiben des Datenworts erfolgt in einem Schreibzyklus, der durch das intern in der IS, U855 erzeugte Signal WR' gekennzeichnet ist:
Nachdem dieses Signal inaktiv geworden ist, also nach dessen steigender Flanke, sind die von der CPU übertragenen Daten auf dem entsprechenden Portbus verfügbar. Dieser Zustand wird der Peripherie angezeigt, indem das zugehörige READY-Signal (A RDY oder B RDY) nach der nächsten fallenden Flanke des Systemtakts aktiv wird (also H-Pegel führt). Eine positive (steigende) Flanke des in der Peripherie zu erzeugenden Quittierungssignals (A STB bzw. B STB) bewirkt danach ein Rücksetzen des READY-Signals ebenfalls nach der nächsten fallenden Taktflanke. Gleichzeitig kann von dieser Flanke des STROBE-Signals in Abhängigkeit vom zuvor programmierten Zustand des Interruptfreigabeflipflops der Portlogik und abhängig von der aktuellen Priorität des PIO-Kanals eine Interruptanmeldung an die CPU ausgelöst werden.
Die Anwendung dieses unkomplizierten Quittierungsbetriebs erfolgt hauptsächlich bei der Bedienung langsamer Peripheriegeräte und bei der Synchronisierung der Peripherie mit der Mikrorechnerschnittstelle beim Vorhandensein bestimmter zeitlicher Bedingungen.
Sollen Ausgabeoperationen ohne Quittierungsbetrieb ausgeführt werden, kann der STROBE-Eingang des Kanals (A STB bzw. B. STB) an einen festen Pegel (H oder L) gelegt werden. Es ergibt sich dann an der Portlogik das im Bild 3.2.6 dargestellte Zeitverhalten.
Nach Initialisierung der Betriebsart ist die entsprechende READY-Linie wiederum inaktiv. Das Einschreiben eines Datenworts bewirkt ein Umschalten des Signals (A RDY bzw. B RDY) auf H-Pegel nach Beendigung des Schreibzyklus. Da am STROBE-Eingang jetzt keine steigende Flanke auftreten kann, bleibt das READY-Signal bis zur nächsten Ausgabeoperation des Kanals aktiv. Das. Signal (A RDY bzw. B RDY) wird nach der fallenden Taktflanke des automatisch von der CPU bei diesem OUT-Befehl (gekennzeichnet durch WR' = 0) eingefügten Waitzustands rückgesetzt. Nach Beendigung des Schreibbefehls (WR' = 1) wird READY wieder aktiv.
Das READY-Signal ist also während der Änderung und des Einschwingens der neuen Information auf dem Portbus (A bzw. B) inaktiv. Seine positive Flanke kann durch die Peripherie zur flankengesteuerten Zwischenspeicherung der Ausgabedaten verwendet werden (z. B. direkte Ansteuerung der Trigger D174 durch dieses Signal). Da am STROBE-Eingang keine positive Flanke auftritt, erfolgt keine Anmeldung von Interrupts.
Eine weitere Möglichkeit der Beschaltung der IS U855 in dieser Betriebsart stellt das Zusammenschalten beider Quittierungssignale des Kanals dar (A STB = A RDY bzw. B STB = B RDY). Das hierbei auftretende Zeitverhalten ist im Bild dargestellt.
Die READY-Linie wird nach einer OUT-Operation wie in den bereits beschriebenen Fällen aktiv. Die hierdurch ausgelöste positive Flanke am STROBE-Eingang bewirkt ab sofort ein Rücksetzen von READY nach der nächsten fallenden 

 

Programmierbeispiel

2. Eingabe



Das periphere Gerät gibt Daten in den Computer ein, die softwaremäßig weiterverarbeitet werden. Zum Verständnis der Arbeitsweise der beiden Steuersignale (Bild 2) soll der Signalaustausch am Beispiel einer Tastatureingabe erläutert werden. Mit dem aktiven RDY-Signal bedeutet der PIO der Tastatur, dass sie Daten liefern darf (dieses RDY=„H" wird meist durch eine sogenannte „Blindeingabe" gleich nach dem Einschalten des Computers softwaremäßig. erreicht). Irgend jemand drückt eine Taste. Deren Kodierung liegt für, die Zeit des Drückens an den Datenleitungen des Kanals. Außerdem wird. hardwaremäßig dafür gesorgt, dass jede Tastenbetätigung den -BIT-B-Eingang des PIOs aktiviert (Bereitstellung von neuen Daten). Der PIO beendet mit der „L/H"-Flanke von STB seine Übernahmebereitschaft und zeigt das der Tastatur mit RDY „L" an (Daten sind übernommen und Weiterverarbeitung angemeldet). Letzteres geschieht durch Aktivieren der MT-Leitung zur ZVE (Anforderung, dass das laufende Programm zu unterbrechen und die Daten entgegenzunehmen sind). Die ZVE macht das, wenn sie Zeit hat, durch einen Eingabebefehl und widmet sich nach der Verarbeitung der Daten wieder anderen Dingen. Der PIO setzt RDY wieder auf „H" (Übernahmebereitschaft des PIOs für neue Daten).



3. Bitsteuerung

Diese Betriebsart wird vorrangig genutzt, wenn die 8 Bit Datenbus Ein- und Ausgänge festlegen. Anzahl und Verteilung sind dabei völlig beliebig. Die Steuersignale RDY und STB sind in dieser Betriebsart nicht verwendbar. Interrupts werden somit nicht vom STB-Signal ausgelöst, sondern direkt von den als Eingänge programmierten Daten. Dabei können verschiedene interruptauslösende Bedingungen programmiert werden:

  • welche der als Eingänge programmierten Leitungen dürfen Interrupts geben?
  • soll Interrupt, kommen, wenn alle diese  Eingänge aktiviert sind. (AND-verknüpft) oder soll schon bei der Aktivierung nur einer dieser Eingänge Interrupt gegeben werden (OR-verknüpft)?
  • wann zählt ein Eingang als aktiv („L" oder „H"-Pegel)?

4. Bidirektionaler Betrieb

Über den Kanal A können ohne Umprogramrdierung Daten aus- und eingegeben werden. Als Steuersignale für Ausgabe dienen. dabei RDY (Daten sind bereitgestellt zur Ausgabe) und STB (Daten sind durch peripheres Gerät übernommen) des Kanals A; für die Eingabe sind RDY (PIO zur Datenübernahme vom peripheren Gerät bereit) und STB (die anliegenden Datenwerden in den PIO übernommen) des Kanals B verantwortlich. Der, Kanal B maß in Bitsteuerung programmiert werden und ist nicht verwendbar.
Es folgen noch einige Hinweise; die für alle Betriebsarten gleichermaßen: gelten. 
Wenn ein..PI0 Interrupt anmeldet, maß die ZVE einen Hinweis erhalten, wo sie das Programm zur Bearbeitung dieses Interrupts findet. Dazu dient der Interruptvektor (im IM2). Dieser wird über den Datenbus auf Anforderung in die ZVE eingegeben und bildet mit dem Inhalt des Interruptregisters eine Adresse, von welcher die Startadresse für das aufzurufende Programm gelesen wird.

Bild 4 Beispiel für eine Prioritätenkette aus interruptgebundenen Schaltkreisen

Diesen so kompliziert klingenden Vorgang soll ein Beispiel verdeutlichen (Bild 3). Dabei wurde im Inbetriebnahmeprogramm das Interruptregister der ZVE mit 00 und der Tastatur-PIO mit dem Interruptvektor C0H programmiert. Bei Tastendruck meldet der PIO einen Intenupt an. Nach der Quittung durch die ZVE legt er C0H auf den Datenbus: Mit Hilfe des I-Registers liest die ZVE den Inhalt der Zeigeradresse 00C0H (=25D) und definiert das als niederwertigen Teil der Startadresse (in diesem Falle des Tastaturprogrammes). Zum Laden des höherwertigen Teiles maß. der nächsthöhere Speicherplatz mit abgefragt werden (00C1H mit 03H). Jetzt beginnt die ZVE das Programm bei 0325. Am Ende des Tastaturprogramms bewirkt der Befehl RETI eine Rückkehr an die Stelle, an der das Programm durch den Interrupt unterbrochen wurde.
Ein spezieller Rücksetzeingang fehlt am PIO. Er wird beim Anlegen der Versorgungsspannung und aktivem M1-Signal in Verbindung mit nichtaktiven RD- und IORQ-Signalen in Grundstellung gesetzt. 

Bild 5: Beispiel zur PIO-Programmierunq - nur symbolische Darstellung (direkter Anschluss von Lampen an PIO-Ausgänge ist nicht möglichl); nur ST 1 oder ST 2 sollen Interrupt auslösen- die Lampen sollen in der angedeuteten Weise leuchten; PIO-Adressen von 04 bis 07

Wenn im System also eine RESET-Taste vorhanden ist, muss hardwaremäßig für eine Bildung des M1-Signals gesorgt werden. Ansonsten könnte folgendes passieren: Ein PIO wird im Programm gerade umprogammiert, für das nächste Steuerwort ist eine Marke angekündigt. Jetzt veranlasst ein RESET die ZVE, bei Adresse 0000 mit der Arbeit anzufangen. Dort werden bald die peripheren Schaltkreise programmiert. Das erste Steuerwort wird nun jedoch, als Maske definiert, was zu einer Fehlprogrammierung des PIOS fuhrt. An als Ausgänge programmierte Kanalleitungen darf nur eine TTL-Last angeschlossen werden. Ausgänge des Kanals B können direkt Darlington-Transistoren treiben, sind aber auch TTL-kompatibel.
In einem Mikrocomputer sind oft mehrere interruptgebende Schaltkreise vorhanden. Über eine Prioritätskette (Bild 4), wird bei gleichzeitig auftretendem Interrupt - die Reihenfolge der Abarbeitung festgelegt. Im Beispiel hat PIO 1 den Vorrang, am zweitwichtigsten ist der CTC usw. Die Anordnung in dieser Kette ist beliebig. Zur Ausschaltung von Zeitproblemen ist ohne weitere Maßnahmen jedoch keine längere Kette als finit vier Schaltkreisen zu bilden. Deshalb sollte man einige Dinge beachten

  • bei der Entwicklung PIOs vermeiden, in denen' nur ein Kanal Interrupt gibt. Man gewinnt durch günstige Aufteilung PIOs, die keinen Intenupt geben und damit nicht in die Prioritätskette geschaltet werden müssen. Das gilt sinngemäß auch für CTCs
  • hat. man viele interruptgebende Geräte, ist es oft möglich, einen PIO in Bitsteuerung zu programmieren. An dessen Eingänge sind die interruptfordernden Signale der Geräte zu legen und softwaremäßig ist abzufragen, wer den Interrupt gebracht hat. Bei dieser Methode wird nur dieser eine PIO in die Kette gelegt, alle anderen werden von der ZVE aus zum Daten- und Signaltransport aufgerufen. 

Programmierung des PIO

Der PIO hat zwei Eingänge, von denen der eine zwischen A- und B-Kanal (B/A-Select) und dar andere zwischen Daten und Steuerwort (C/D-Select) unterscheidet. Häufig werden diese Eingänge mit A0 und Al des Adressenbusses belegt, womit jeder PIO vier Adressen benutzt: 

A0 bis A2 A1 A0 Inhalt Datenbus
beliebig 0 0 Datenwort Kanal A
beliebig 0 1 Datenwort Kanal B
beliebig 1 0 Steuerwort Kanal A
beliebig 1 1 Steuerwort Kanal B

Tabelle 1 - PIO-Portadressierung


Programmiert wird der PIO prinzipiell mit Steuerwörtern (Tabelle 2).

  • Interruptvektor IV
  • beliebiges Byte mit einer 0 im niederwertigsten Bit. Da jeder Interruptvektor zwei Plätze in der IV-Tabelle belegt (Bild 3), kann diese Tabelle ohne Pmprogrammierung des Interruptregisters maximal 128 IV umfassen
  • Betriebsartauswahl

Mit S6 und S7 wird die Betriebsart des Kanals ausgewählt (Tabelle 2). Bei den Betriebsarten 0 bis 2 wird nur noch das Intenuptsteuerwort benötigt.

  • Steuerwort Interrupt (Betriebsart 0 bis 17 legt fest, ob der Kanal das Aussenden von Interrupts ermöglicht (I7 = 1) oder verbietet (17 = 0).
  • Maskenwort Eingabe/Ausgabe (Betriebsart 3)

Dieses Maskenwort muss mach dem Steuerwort Betriebsartauswahl folgen und legt fest, welche Anschlüsse als Eingänge (E =1) und als Ausgänge (E - 0) verwendet werden sollen.

  • Steuerwort Intenupt (Betriebsar( 3)
  • I7 legt fest, ob der Kanal das Aussenden von Interrupts ermöglicht (17 = 1) oder verbietet (17 = 0). I6 entscheidet, ob die durch das Maskenwort Interrupt ausgewählten Eingänge UND-verknüpft (I6 = 1) oder ODER-verknüpft (I6 = 0) wirken. sollen. I5 entscheidet, ob diese Eingänge aktiv bei H (I5 =1) oder L (I5 = 0) sind. I4 kündigt mit I4 = 1 an, dass das folgende Steuerwort das Masken-Wort Interrupt ist.
  • Maskenwort Interrupt (Betriebsart 3)

Es werden mit 0 die Eingänge markiert, die Interrupt geben dürfen.

Ein abschließendes Beispiel im Bild 5 -und Tabelle 3- soll die Programmierung eines PIO verdeutlichen. Dabei wird der Kanal A als Ausgabekanal und der' Kanal B mit Bitsteuerung gewählt. Der Anschluss der Lampen und Tasten an die PIO-Kanalleitungen ist symbolisch gemeint und ohne hardwaremäßige Ankopplung nicht empfehlenswert! Der kleine Programmabschnitt wird in der Praxis eleganter mit einem automatischen Ausgabebefehl und einer Tabelle gelöst, ist in, der angegebenen Form aber übersichtlicher. 

Art Bit D7 D6 D5 D4 D3 D2 D1 D0 Betriebsart
    V7 V6 V5 V4 V3 V2 V1 0 0 bis 3
Betriebsarten-Steuerwort   S7 S6 X X 1 1 1 1 0 bis 3
Interrupt-Steuerwort   I7 X X X 0 0 1 1 0 bis 3
Maskenwort Ein/Ausgang   E7 E6 E5 E4 E3 E2 E1 E0 3
Steuerwort Interrupt   I7 I6 I5 I4 I3 I2 I1 I0 3
Maskenwort Interrupt   M7 M6 M5 M4 M3 M2 M1 M0 3

Tabelle 2 - PIO-Programmierung Kurzreferenz



PIO-Programmierung Kurzreferenz



zur Hauptseite
© Samuel-von-Pufendorf-Gymnasium Flöha © Frank Rost im Oktober 1998

... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-)

„Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“

Diddi Hallervorden, dt. Komiker und Kabarettist