Z80 CTC (in der DDR U857) Funktionsbeschreibung history menue Letztmalig dran rumgefummelt: 11.02.05 03:56:08
Implementiert in ein 28-poliges DIL-Gehäuse präsentiert sich die Z80-CTC mit einem 8 Bit breitem Daten-BUS als Aritmetic-Logical Unit 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.
  1. Betriebsartenauswahl
  2. Betriebsartenbeschreibung
  3. CTC-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 PIO, SIO, DMA und CTC noch immer für Anlagen der Kleinstautomatisierung

Die IS U857 ist ein Zähler/Zeitgeber-Schaltkreis (CTC), die bezüglich Interruptverhalten und Leistungsfähigkeit auf das System U880 zugeschnitten ist. Sie umfasst vier vollständige Zähler/Zeitgeber-Kanäle mit einem Zählumfang von jeweils 8 Bit sowie 8-Bit-Vorteilern, die in der Zeitgeberbetriebsart zum Herunterteilen des Systemtakts dienen. Die Einheit ist in ihren Eigenschaften in weiten Grenzen programmierbar (Zeitkonstanten, Vorteiler, Triggerflanken, Interruptverhalten usw.). Die charakteristischen Merkmale der IS sind

  • n-Kanal-Silicon-Gate-Technologie, Depletion-Load 

  • eine Versorgungsspannung von 5 V

  • Einphasensystemtakt (5-V-Pegel) mit 4 MHz (UA857) bzw. 2,5 MHz (UB857) maximaler Taktfrequenz

  • vier unabhängige 8-bit-Kanäle mit Eingängen für externe Takt/Triggerflanke und Ausgängen für Nulldurchgang/Zeitgeberausgang (programmierbar)

  • zwei Betriebsarten

    • Zählermode (8-bit-Zähler, Zählvorgang mit maximal halber Systemtaktfrequenz)

    • Zeitgebermode (8-bit-Rückwärtszähler mit rückladbarem Zeitkonstantenregister und programmierbaren 8-bit-Vorteilern)

  • Interruptfähigkeit bei Nulldurchgang der Zähler ermöglicht schnelle und leistungsfähige Reaktion der CPU

  • Interruptkaskadierung durch „daisy-chain"-Logik 

  • automatische Interruptvektorerzeugung

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

  • 28poliges DIL-Gehäuse nach TGL 26713

Typische Anwendungsfälle für den CTC sind Zeitgeber für Anzeigeroutinen und Echtzeituhren, Ereigniszähler, Frequenzzähler und integrierende DA-Wandler. Die IS ist hierbei aufgrund der Vielzahl der programmierbaren Eigenschaften sehr anpassungs-
fähig. Zur Realisierung von Zählerumfängen größer als 8 Bit können die CTC-Kanäle mittels ihrer Ein- und Ausgänge zur Erreichung des notwendigen Zählumfangs kaskadiert werden. Die Zusammenschaltung der IS U857 mit der CPU U880 erfordert keine weiteren Zusatzbauelemente. Ausgenommen hiervon sind Standardbauelemente in großen Mikrorechnersystemen, die zur Bustreibung, Adressdekodierung und Kaskadierung dienen. Hier 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

Nach Zuschalten der Betriebsspannung nimmt der Zähler/Zeitgeber einen undefinierten Zustand ein. Das Anlegen eines RESET-Impulses an den zugehörigen Pin bewirkt ein Unterbrechen der Zählvorgänge aller Kanäle, ein Rücksetzen der Interruptbearbeitungszustände der Ports, die Inaktivierung aller Kanalausgänge sowie das Abschalten der Datenbusleitungen. Dieses hardwaremäßige Rücksetzen erfolgt üblicherweise in Mikrorechnern systemweit nach Einschalten der Betriebsspannung durch ein "power-on-reset". Eine weitere Möglichkeit des Rücksetzens von Zähler/Zeitgeber-Kanälen ist softwaremäßig durch Setzen des Bits D1 der Kanalsteuerregister gegeben. Hiermit kann ebenfalls eine Unterbrechung des Zählvorgangs erreicht werden.
Zur Initialisierung der Kanäle des CTC als Zähler oder Zeitgeber müssen durch die CPU die entsprechenden Kanalsteuerregister und die Zeitkonstantenregister geladen werden. Um Interruptanmeldungen zu ermöglichen, muss das Interruptvektorregister durch ein entsprechendes Steuerwort, das in den Kanal 0 geschrieben wird, definiert werden. Das Zählen bzw. die Zeitgeberfunktion beginnt daraufhin mit Erreichen der vorgewählten Auslösebedingungen.

Interruptvektor - siehe auch hier sowie auch hier

Bei Anwendung der leistungsfähigen Interruptbetriebsart IM2 der CPU U880 wird von dem den Interrupt anmeldenden peripheren Gerät ein Interruptvektor im Interruptquittierungszyklus der CPU abgefordert. Dieser 8-bit-Vektor bildet in Verbindung mit dem CPU-internen Register I einen 16-bit-Pointer, der im Hauptspeicher auf die Startadressentabelle der Interruptbearbeitung zeigt.
Beim CTC wird der Interruptvektor durch Einschreiben eines Steuerworts (OUT-Operation der CPU) nur in den Kanal 0 geladen. Dieses Steuerwort hat folgendes Format:

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

Tabelle 1 - CTC-Interrptvektor-Allgemein

Das Bit D0 = 0 identifiziert das Steuerwort als Interruptvektor. Beim Einschreiben dieses Vektors werden die beiden Bits D2 und D1 nicht berücksichtigt und können deshalb einen beliebigen Wert haben.
Bei Aussendung eines Interruptvektors nach vorausgegangener Interruptanmeldung und Quittierung durch die CPU geben diese Bits (D2 und D1) binär kodiert die Kanalnummer des interruptauslösenden CTC-Kanals an. Somit können vom Zähler/Zeitgeber folgende Vektoren ausgesendet werden:
 

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

Tabelle 2 - CTC-Interrptvektor-Kanal 0

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

Tabelle 3 - CTC-Interrptvektor-Kanal 1

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

Tabelle 4 - CTC-Interrptvektor-Kanal 2

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

Tabelle 5 - CTC-Interrptvektor-Kanal 3

Bei Freigabe aller Interruptfreigabeflipflops können somit im Zusammenhang mit dem I-Register der CPU vier verschiedene Pointer gebildet werden, die in der Startadressentabelle auf vier unterschiedliche ISR-Startadressen hinweisen. Damit kann jeder Zähler/ Zeitgeber-Kanal mit einer eigenen ISR bedient werden.

Kanalsteuerwort - siehe auch hier

Jeder der vier Kanäle der IS U857 kann entweder als Zähler oder als Zeitgeber arbeiten. Die Auswahl hierzu wird im Kanalsteuerregister vorgenommen. Ebenso werden in diesem Register die Vorteilerauswahl, die Definition der Auslösebedingungen (Trigger), das Laden des Zeitkonstantenregisters, das Rücksetzen des Kanals und die Interruptfreigabe festgelegt. Das Steuerregister des entsprechenden Kanals (ausgewählt durch die Selectsignale CS0 und CS1) wird durch eine OUT-Operation der CPU mit dem Kanalsteuerwort geladen. Dieses Steuerwort hat folgendes Format:

D7 D6 D5 D4 D3 D2 D1 D0
EI M VT F T TC R 1

Tabelle 6 - CTC-Kanalsteuerwort

EI Enable Interrupt
M Mode (entscheidet über die Betriebsart Zähler oder Zeitgeber)
VT Vorteiler-Wert (16 oder 256)
F Flanke - Schaltflanke zum Starten des CTC in beiden Betriebsarten, wenn dies programmiert wurde (Taktflanke ist "H" oder "L")
T Timer - löst die Timerfunktion in der Betriebsart Zeitgeber aus (ist also unbedingt im Zusammenwirken mit "F" zu sehen)
TC Time-Constant - entscheidet, ob eine Zeitkonstante folgt oder nicht
R RESET

Die Belegung des Bits D0 = 1 identifiziert das Steuerwort als Kanalsteuerwort. Es wird somit vom Interruptvektor des Kanals 0 unterschieden.
Das Bit D7 beeinflusst das Interruptfreigabeflipflop des ausgewählten Kanals. Bei Setzen des Bits D7 (D7 = 1) erfolgt die Weitergabe von Interruptanforderungen, die durch einen Nulldurchgang des Rückwärtszählers ausgelöst wurden, an den Steuereingang INT der CPU. Voraussetzung für das Einschreiben von D7 = 1 in das Kanalsteuerregister ist, dass zuvor der Interruptvektor in den Kanal 0 eingeschrieben wurde. Bei rückgesetztem Bit (D7 = 0) wird vom ausgewählten Kanal beim Nulldurchgang des Rückwärtszählers kein Interrupt ausgesendet. Eine noch nicht bearbeitete anhängige Interruptanmeldung des Kanals wird zurückgenommen. Bei erneutem Setzen des Bits D7 durch ein neues Kanalsteuerwort erfolgt keine Interruptaussendung durch die vor dem Einschreiben dieses Steuerworts vorangegangenen Nulldurchgänge des Zählers.
Mit dem Bit D6 wird die Betriebsartenauswahl des CTC-Kanals vorgenommen. Bit D6 = 1 setzt den Kanal in die Zählerbetriebsart. Der Rückwärtszähler wird mit jeder Triggerflanke des am CLK/TRG-Eingang anliegenden externen Taktsignals dekrementiert. Mit Bit D6 = 0 wird die Zeitgebermode des CTC-Kanals ausgewählt. Der Rückwärtszähler wird durch den um den Vorteilerwert geteilten Systemtakt dekrementiert und erzeugt durch seine Nulldurchgänge Zeitintervalle mit einer Periode tP

  • tp = tc - VT - TC
  • tc Periode des Systemtakts, (tcmin = 250 ns bzw. 400 ns bei 2 bzw. bei 4 MHz Taktfreuquenz) 
  • TC Wert des Zeitkonstantenregisters (TC = 1 ... 256) 
  • VT Wert des Vorteilers (VT = 16, 256)


Das Bit D5 wird nur in der Betriebsart Zeitgeber ausgewertet. Es dient zur Auswahl des Vorteilerfaktors. Mit Bit D5 = 1 wird der Wert des Vorteilers auf VT = 256 gesetzt; anderenfalls (D5 = 0) wird der Wert VT = 16 eingestellt.
Mit Bit D4 wird in beiden Betriebsarten die aktive Flanke des am Kanaleingang CLK/ TRG anliegenden Takt- bzw. Triggersignals definiert. In der Zählerbetriebsart erfolgt mit D4 = 1 das Dekrementieren des Rückwärtszählers bei jeder positiven Flanke bzw. bei D4 = 0 mit jeder negativen Flanke des externen Taktsignals. In der Betriebsart Zeitgeber erfolgt unter der Voraussetzung, dass der Zeitgebervorgang durch ein externes Triggersignal gestartet wird (D3 = 1), die Auslösung bei D4 = 1 mit der positiven bzw. bei D4 = 0 mit der negativen Flanke dieses Signals.
Das Datenbit D3 wird ebenfalls nur bei Auswahl der Betriebsart Zeitgeber ausgewertet. Es dient zur Definition des Auslösezeitpunkts des Zeitgebervorgangs. Bei gesetztem Bit D3 (D3 = 1) erfolgt der Start des Zeitgebervorgangs nach Eintreffen der mittels Bit D4 ausgewählten gültigen Flanke des am Eingang CLK/TRG anliegenden Triggersignals. Dieses Triggersignal wird erst nach dem Einschreiben der Zeitkonstante gültig. Der Vorteiler wird hierbei bei Einhalten der Voreinstellzeit (setup time) nach zwei Taktzyklen des Systemtakts erstmalig dekrementiert (anderenfalls nach drei Zyklen). Bei rückgesetztem Bit D3 (D3 = 0) beginnt die Zeitgeberoperation mit der steigenden Flanke des T2 Maschinenzustands (M1-Cycle, instruction fetch), der dem Laden der Zeitkonstante (port write cycle) folgt.
Mit Bit D2 erfolgt an die Steuerlogik des Zähler/Zeitgeber-Kanals eine Voranmeldung, ob mit der nächsten Portoperation (OUT-Befehl der CPU) zum betreffenden Kanal eine Zeitkonstante in das entsprechende Register geladen wird. Hierbei wird bei gesetztem Bit D2 (D2 = 1) das nächste Datenwort, das in den Kanal eingeschrieben wird, in das Zeitkonstantenregister geladen. Diese Aktion ist bei jeder Neuinitialisierung des CTC-Ports erforderlich. Wird in einen bereits initialisierten und sich in Betrieb befindenden Kanal ein Steuerwort mit Bit D2 = 1 und ein nachfolgendes Zeitkonstantendatenwort eingeschrieben, so beendet der CTC-Kanal den laufenden Zyklus mit der alten Zeitkonstante. Nach dem Nulldurchgang des Rückwärtszählers wird dann die neue Zeitkonstante rückgeladen und im folgenden auch weiter benutzt. Auf diese Art und Weise kann im laufenden Zähler- oder Zeitgeberbetrieb die Zeitkonstante geändert werden. Wenn das Bit D2 nicht gesetzt ist (D2 = 0), erfolgt kein Einschreiben eines nachfolgenden Datenworts in das Zeitkonstantenregister des Kanals. Diese Bedingung ist nur dann sinnvoll, wenn das betreffende Port bereits initialisiert ist und mit dem neuen Datenwort andere Bedingungen (z. B. Interruptfreigabe, Betriebsart oder Triggerflanke) neu festgelegt werden sollen. Der CTC-Kanal arbeitet dann immer mit der alten Zeitkonstante weiter.
Das Datenbit D1 des Kanalsteuerworts dient zum softwaremäßigen Rücksetzen oder zum Unterbrechen des ablaufenden Zähler- oder Zeitgebervorgangs. Bei gesetztem Bit D1 (D1 = 1) unterbricht der betreffende Kanal das Dekrementieren des Rückwärtszählers. Es werden hierbei aber keine Bits des Kanalsteuerregisters und somit keine aktuellen CTC-Bedingungen verändert. Wenn außerdem das Bit D2 gesetzt ist (D2 = 1), führt der CTC-Kanal nach Einschreiben einer Zeitkonstante die Operation in der vorgewählten Betriebsart fort. Ist Bit D2 rückgesetzt (D2 = 0), besteht in der Neuinitialisierung des Ports durch Einschreiben eines neuen Kanalsteuerworts die einzige Möglichkeit, den Kanal wieder in Betrieb zu nehmen. Bei rückgesetztem Steuerwortbit D1 (D1 = 0) wird der Zähler- bzw. Zeitgeberbetrieb nicht unterbrochen. Diese Möglichkeit wird angewendet, wenn Bedingungen im Kanal verändert werden sollen (Verändern des Interruptfreigabeflipflops, Laden einer neuen Zeitkonstante u. dgl.), ohne dabei den bearbeiteten Vorgang zu unterbrechen.

Zeitkonstante

Nach der Initialisierung eines Zähler/Zeitgeber-Kanals mit Hilfe eines entsprechenden Kanalsteuerworts kann das CTC-Port erst nach Laden eines Datenworts in das Zeitkonstantenregister des ausgewählten Kanals mit der programmierten Operation beginnen. Das Laden des Zeitkonstantenregisters erfolgt durch eine OUT-Operation der CPU, wenn zuvor in den Kanal ein Kanalsteuerwort mit gesetztem Bit D2 (D2 = 1) eingeschrieben wurde. Das hiermit gesetzte Bit D2 des Kanalsteuerregisters bewirkt, dass die Kanalsteuerlogik dieses nachfolgende Datenwort von der CPU als Zeitkonstante interpretiert. Deshalb werden keine besonderen Bitbelegungen des Zeitkonstantenworts zur Kennzeichnung benötigt, somit sind alle 8 bit für die Informationsübertragung gültig. Das Zeitkonstantenwort hat folgendes Format:

D7 D6 D5 D4 D3 D2 D1 D0
TC7 TC6 TC5 TC4 TC3 TC2 TC1 TC0


Das Bit D7 dieser Zeitkonstante ist das höchstwertige Bit (MSB). Aufgrund des Umfangs von 8 bit kann der Wert der Zeitkonstante zwischen 1 und 256 liegen. Hierbei ist dem hexadezimalen Wert TC = 00H die Zeitkonstante TC = 256D zugeordnet.

Zusammenfassung

In der Tafel unten ist die Programmierung vom Zähler/Zeitgeber U857 zusammenfassend dargestellt.

für den Profi - Kurzreferenz zur CTC-Programmierung

Übersichtstafel CTC-Programmierung


2. Betriebsartenbeschreibung 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.

Zählermode

Der Zähler/Zeitgeber U857 hat vier Kanäle, die unabhängig voneinander betrieben werden können. Ein Kanal des CTC nimmt die Betriebsart Zähler ein, wenn in sein Kanalsteuerregister ein Datenwort mit gesetztem Bit D6 geladen wird. Bei einer Initialisierung, also bei zuvor rückgesetztem Port, muss zur Inbetriebnahme außerdem eine Zeitkonstante in das entsprechende Register dieses Kanals eingeschrieben werden. Der Rückwärtszähler wird dann bei jedem Aktivwerden bzw. sinngemäß mit jeder aktiven Flanke am Kanaleingang CLK/TRG dekrementiert. Hierbei wird durch Bit D, im Steuerregister des Kanals festgelegt, welcher Pegel an diesem Eingang aktiv ist (H oder L).
Wird einer der Kanäle (unabhängig von der gewählten Betriebsart) zur Erzeugung von Interrupts benutzt, muss vor der Inbetriebnahme dieses Kanals (mit gesetztem Interruptfreigabeflipflop) das Vektorregister des Kanals 0 geladen werden.
Das Einschreiben dieser Datenwörter in die Kanalsteuerregister und die Zeitkonstantenregister der CTC-Kanäle sowie in das Vektorregister erfolgt über Ausgabebefehle des Prozessors (OUT-Operation der CPU). Das hierbei auftretende Zeitverhalten am Zähler/Zeitgeber U857 ist in diesem Bild dargestellt. Aus diesen Zeitbedingungen ist zu entnehmen, dass die IS U857 direkt mit dem Prozessor U880 zusammengeschaltet werden kann.
Der aktuelle Stand des Rückwärtszählers kann jederzeit durch einen Eingabebefehl (IN-Operation) der IS U880 abgefragt werden. Das zugehörige Zeitverhalten vom Zähler/Zeitgeber ist in diesem Bild verdeutlicht. Der mit der steigenden Flanke des CPUSystemtaktzyklus T2 in diesem Lesevorgang gültige Inhalt des Rückwärtszählers des durch die binären Auswahlsignale CSO und CS1 angesprochenen Kanals wird auf den Datenbus ausgegeben.
Beim Nulldurchgang des Rückwärtszählers wird automatisch die Zeitkonstante aus dem entsprechenden Kanalregister in den Zähler rückgeladen. Dabei erfolgt keine Unterbrechung des Zählvorgangs. Wurde zuvor ein neues Datenwort in das Zeitkonstantenregister durch entsprechende Vorankündigung mit einem Kanalsteuerwort (D6 = 1, D2 = 1, D1 = 0, D0 = 1) geschrieben, so erfolgt nach dem Nulldurchgang das Rückladen dieser neuen Zeitkonstante.
Gleichzeitig wird bei jedem Nulldurchgang des Rückwärtszählers am Kanalausgang ZC/TO ein positiver Impuls mit der Länge von etwa anderthalb Systemtaktperioden ausgesendet. Dieses Signal kann beispielsweise zur Kaskadierung von CTC-Kanälen verwendet werden. Bei Verwendung dieses Übertragsimpulses zur Taktung eines nachfolgenden Zählerkanals können leistungsfähige Zähler mit großem Zählumfang (z. B. 16-bit-Zähler bei Verwendung von zwei Ports) realisiert werden. Aufgrund der Pinbeschränkung des 28poligen DIL-Gehäuses besitzt jedoch der Kanal 3 keinen ZC/TOAusgang. Dieser Kanal kann also nur dann eingesetzt werden, wenn keine hardwaremäßige Kaskadierung bzw. Auswertung des Übertrags notwendig ist.
Vom Übertrag der Rückwärtszähler wird außerdem in allen vier CTC-Kanälen bei entsprechend gesetzten Freigabeflipflops in den Kanalsteuerlogiken eine Interruptanforderung ausgelöst. Die Anwendung der leistungsfähigen Interruptbearbeitung des Systems (Interruptmode IM2 der CPU U880) kann aber nur erfolgen, wenn das Vektorregister des CTC geladen wurde. In diesem Bild ist zusammenfassend das Zeitverhalten eines CTC-Kanals dargestellt.
Das folgende Bild zeigt Zeitverhalten des CTC im Zählerbetrieb

  • CP Systemtakt

  • CLK CTC-Kanaleingang CLK/TRG in Zählermode

  • RZ aktueller Inhalt des internen Kanalrückwärtszählers CTC geladene Zeitkonstante)

  • ZC CTCKanalausgang ZC/TO in Zählermode

  • TINT Interruptausgang des CTC (nur Wirkung des betreffenden Kanals dargestellt)

Während des Betriebs können Zählbedingungen für den Kanal verändert werden, indem ein neues Steuerwort in das Kanalsteuerregister eingeschrieben wird. In diesem Datenwort muss Bit D1 rückgesetzt sein, damit der Dekrementiervorgang des Rückwärtszählers nicht unterbrochen wird. Es ist somit möglich, eine neue Zeitkonstante anzukündigen, die Zählflanke zu ändern, das Interruptfreigabeflipflop zu beeinflussen oder in die Betriebsart Zeitgeber überzuwechseln. Ein Rücksetzen des Kanals kann softwaremäßig durch Setzen des Bits D1 des Kanalsteuerregisters oder hardwaremäßig durch Anlegen eines RESET-Impulses erfolgen.

Zeitgebermode

Das Einstellen dieser CTC-Betriebsart erfolgt ebenfalls durch Laden eines Steuerworts in das entsprechende Kanalsteuerregister. Das Bit D6 dieses Datenworts ist hierbei rückgesetzt. Der Zeitgebervorgang beginnt in Abhängigkeit vom Wert des Bits D3 dieses Steuerworts entweder direkt nach dem Laden der Zeitkonstante in das betreffende Kanalregister oder nachdem bei bereits geladenem Zeitkonstantenregister am Eingang CLK/ TRG eine vorgewählte Triggerbedingung eintrifft. Das Laden der Kanalsteuerregister und Zeitkonstantenregister erfolgt wie in der Zählermode mit dem im Bild dargestellten Zeitverhalten. Auch das Auslesen des Inhalts der Rückwärtszähler erfolgt wie im Abschnitt oben  bereits beschrieben (Bild).
Der Rückwärtszähler des Zähler/Zeitgeber-Kanals wird durch den Vorteiler getaktet.
vorgangs alle im Kanalsteuerregister festgelegten Bedingungen geändert werden. Mit rückgesetztem Bit D1 (D1 = 0) wird gesichert, dass der Zeitgebervorgang nicht unterbrochen wird. Das Rücksetzen des Kanals erfolgt mit Setzen des Bits D1 im Kanalsteuerwort bzw. hardwaremäßig durch Auslösen eines RESET-Impulses.

Interruptbearbeitung

Die Auslösung von Interruptanmeldungen eines Zähler/Zeitgeber-Kanals erfolgt unabhängig von der gewählten Betriebsart durch die Nulldurchgänge des Rückwärtszählers. Voraussetzungen für die Weitergabe dieser Anmeldungen an die CPU sind, dass sowohl das Interruptfreigabeflipflop der Kanalsteuerlogik gesetzt ist als auch der betrachtete Kanal die höchste aktuelle Interruptpriorität im Mikrorechnersystem aufweist (also am Eingang IEI H-Potential führt).
Diese Interruptpriorität wird im System U880 in der Interruptprioritätenkette ermittelt. Die Kette entsteht durch systemweites Zusammenschalten der peripheren Schaltkreise (PIO, SIO, CTC, DMAC) mit Hilfe der Interruptsignale IEI und IEO. Ein H-Potential am Eingang einer IS U857 bedeutet somit, dass der z. Z. höchstwertige Kanal zur Weitergabe seiner vorliegenden Interruptanmeldung über die INT-Leitung zur CPU berechtigt ist. Bei einer solchen Interruptanmeldung zum Prozessor wird der Interruptausgang IEO rückgesetzt (IEO = L), um Interruptanmeldungen von nachfolgenden (also niederwertigeren) Peripherieelementen zu verhindern. Die Interruptanmeldung und Rücksetzung des IEO-Ausgangs wird jedoch während eines aktiven M1-Signals der CPU für die Dauer dieses Signals verzögert. Diese Maßnahme ist erforderlich, damit die Interruptprioritätenkette im Interruptquittierungszyklus (gekennzeichnet durch M1) einen eingeschwungenen Zustand aufweist.
Der Zähler/Zeitgeber U857 hat vier Kanäle, die in Bezug auf das Interruptverhalten völlig gleichwertig wirken. Jeder Kanal besitzt in seiner Steuerlogik ein Interruptfreigabeflipflop und antwortet im Fall einer Interruptanmeldung im Quittierungszyklus der CPU mit einem eigenen Interruptvektor. Dieser Interruptvektor wird dadurch erzeugt, dass der für alle Kanäle gleichzeitig zuvor in das Interruptvektorregister des Kanals 0 geladene Vektor durch Hinzufügen von 2 bit spezifiziert wird. Diese Bits (D1 und D2 des Vektors) enthalten die binär kodierte Kanalnummer des aussendenden Ports. Sie ermöglichen somit, dass der Prozessor auf jeden Kanalinterrupt mit einer zugehörigen ISR reagieren kann. Die Interruptpriorität unter den vier Zähler/Zeitgeber-Kanälen wird durch die Reihenfolge der Kanalnummern festgelegt. Der Kanal 0 hat hierbei die höchste Priorität. Er kann somit bei Einhaltung der Interruptfreigabebedingungen die Serviceroutinen aller anderen Kanäle unterbrechen.
Bei einem Nulldurchgang des Rückwärtszählers eines CTC-Kanals sendet der CTC unter den Voraussetzungen, dass das Interruptfreigabeflipflop dieses Ports gesetzt war und der Kanal die höchste aktuelle Interruptpriorität aufweist, eine Interruptanmeldung an den Prozessor. Die CPU fragt nach jedem Befehl die Interruptanmeldungslinie (INT-Eingang der CPU) ab und reagiert bei freigegebenem CPU-Interruptflipflop (Freigabe z. B. nach Befehl EI) mit einem Interruptquittierungszyklus auf eine erkannte Anmeldung. Dieser Quittierungszyklus unterbricht die bisherige Programmabarbeitung und bewirkt eine Abfrage des Interruptvektors des anmeldenden Kanals. Im Bild hier ist das für diesen Zyklus charakteristische Zeitverhalten des Zähler/Zeitgebers U857 dargestellt. In dem Interruptquittierungszyklus erfolgt automatisch das Abspeichern des aktuellen Befehlszählerstands im Stapelspeicher (stack). Gleichzeitig erfolgt die Bildung des neuen Befehlszählers, der auf die Anfangsadresse der eingeschobenen ISR zeigt. Der neue 16-bit-Befehlszählerstand (PC) wird aus zwei aufeinander folgenden Speicherplätzen entnommen (Low-Byte, High-Byte), die von einem 16-bit-Pointer (Zeiger) von der CPU adressiert werden. Dieser Interruptpointer setzt sich aus dem I-Register der CPU (8 bit, High-Byte) und dem Interruptvektor des anmeldenden CTC-Kanals (8 bit, Low-Byte) zusammen. Da Bit D0 des Vektors den Wert V0 = 0 aufweist, zeigt der Pointer auf eine „gerade" Speicherplatzadresse. Diese Zelle enthält das Low-Byte des neuen Befehlszählers. Der um eins inkrementierte Pointer weist dann auf den Speicherplatz, der das High-Byte enthält. Nach dem Ende des eingeschobenen Interruptquittierungszyklus bearbeitet der Prozessor dann den ersten Befehl der durch den interruptenden Kanal aufgerufenen ISR.
Hierbei wird zunächst automatisch das Einschieben weiterer ISR von höherwertigeren Kanälen bzw. peripheren Geräten, die spätere Interruptanmeldungen an die CPU weitergaben, durch systembedingtes Rücksetzen des CPU-Interruptfreigabeflipflops verhindert. Erfolgt aber im Befehlsablauf der ISR eine Interruptfreigabe (durch Befehl EI), so wird erneut das laufende Programm unterbrochen und die ISR des höherwertigen Kanals (bzw. Geräts) eingeschoben. Eine laufende Serviceroutine wird durch den Befehl RETI abgeschlossen. Hierbei erfolgt automatisch das Rückspeichern des letzten aktuellen Standes des Befehlszählers (vor Beginn der abgeschlossenen ISR) aus dem Stapelspeicher (stack). Gleichzeitig erfolgt die Rücksetzung des Interruptbearbeitungszustands des Kanals, der diese beendete ISR anmeldete. Dieser Kanal ist dadurch gekennzeichnet, dass er der höchstwertig quittierte Kanal ist. Die Kanallogik muss hierzu parallel zum Prozessor den Datenverkehr in den Befehlsholzyklen der CPU (data fetch) überwachen, um den Befehl RETI dekodieren zu können. Im Bild hier ist das Zeitverhalten am Zähler/Zeitgeber während des RETI-Befehls verdeutlicht.
Folgende Besonderheit ist bei der Abarbeitung des RETI-Befehls zu beachten:
Zwei CTC-Schaltkreise liegen in der Interruptprioritätenkette. Ein Kanal vom niederwertigeren Zähler/Zeitgeber meldet eine Interruptanforderung an den Prozessor an. Diese Anmeldung wird in einem Interruptquittierungszyklus anerkannt, und die ISR dieses Kanals wird in die Befehlsfolge eingeschoben. In dieser ISR erfolgt keine weitere Interruptfreigabe der CPU mit Hilfe eines EI-Befehls. Daraufhin löst ein Port des höherwertigen CTC ebenfalls eine Interruptanmeldung aus. Der CTC-Ausgang IEO führt L-Potential, das in der Prioritätenkette durchgeschaltet wird. Die Anmeldung wird jedoch wegen der oben genannten Bedingung nicht quittiert. Am Ende der durch den niederwertigen CTC-Kanal eingeschobenen ISR erfolgt die Ausführung des RETI-Befehls. Dieser Befehl wird parallel zum Prozessor wiederum von beiden Zählern/Zeitgebern mitdekodiert. Hierbei gibt nun der höherwertigere CTC-Kanal nach Dekodierung des ersten RETI-Bytes (EDH) die IEO-Linie für die Dauer dieses Befehls frei (IEO = H). Die Freigabe der Kaskadierungslinie IEI-IEO durch alle höherwertig anmeldenden, aber nicht durch die CPU quittierten Kanäle nach Empfang des RETI-Bytes EDH ist notwendig, damit der in Bearbeitung befindliche höchstwertige Kanal bei Empfang des zweiten RETI-Bytes (4DH) am Eingang IEI H-Potential besitzt. Er ist somit als höchstwertiger bearbeiteter Kanal identifiziert (Eingang IEI = H, Ausgang IEO = L) und verlässt den Interruptbearbeitungszustand. Der Prozessor arbeitet nun die zuvor unterbrochene Programmfolge, die durch den rückgespeicherten Befehlszähler gekennzeichnet wird, weiter ab. Nach Interruptfreigabe im weiteren Programmablauf durch den Befehl EI (evtl. auch schon am Ende der ISR) erfolgt die Quittierung des noch anstehenden höherwertigen Kanalinterrupts sowie das Einschieben der zugehörigen ISR.
Erfolgt bei gesetztem Interruptfreigabeflipflop eines CTC-Kanals ein Nulldurchgang des Rückwärtszählers, so geschieht bei L-Potential am Eingang IEI keine Weitergabe der Interruptanmeldung an die CPU. Die Anmeldung wird jedoch im CTC-Kanal zwischengespeichert und nach Aktivwerden des Eingangs IEI (H-Pegel) zum Prozessor weitergeleitet.


3. CTC-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.

 

Ein CTC enthält vier völlig unabhängig programmierbare Kanäle. Jeder Kanal kann in einer von zwei Betriebsarten arbeiten:

1. Zeitgeber

In dieser Betriebsart wird die Betriebsfrequenz intern über einen Vorteiler auf einen programmierbaren Teiler gegeben. 
Jedes mal, wenn diese Teilerkette einmal vollständig durchgezählt hat, geht der Kanalausgang kurzzeitig auf H-Pegel (hardwaremäßige Auswertung möglich) und gibt, wenn er erlaubt wurde, einen Interrupt ab (softwaremäßige Auswertung). 
Damit kann man sich Verzögerungszeiten, Haltezeiten o. ä. programmieren. Der Vorteiler lässt nur zwei Teilerverhältnisse zu - 1:16 und 1:256. Der eigentliche CTC-Kanal ist beliebig in den Grenzen von 1 bis 256 programmierbar (Zeitkonstante). Es ergeben sich für einen Kanal folgende Maximalzeiten (bei 2,5 MHz Betriebsfrequenz):

  • bei Vorteiler 1:16 - 1,64 ms :(in 6,4-lts-Schritten programmierbar),

  • bei Vorteiler 1:.256 = 26,2 ms (in 102,4-µs-Schritten programmierbar). 

Der Kanaleingang kann für einen hardwaremäßigen -Start der eingestellten Zeit benutzt werden (Triggerung). Sonst beginnt der Zeitablauf sofort nach der Programmierung der Zeitkonstante. Nach Ablauf der Zeit beginnt automatisch ein neuer Start, unabhängig, ob der Interrupt beantwortet wurde oder nicht.

2. Zähler 

Hier werden am Kanaleingang anliegende Impulse gezählt. Die Richtung ist dabei (wie auch in Betriebsart „Zeitgeber") rückwärts von der Zeitkonstante bis -Null. Bei Erreichen der Null rührt der Ausgang des Kanals kurzzeitig ` „H" und löst einen Interrupt aus. Die Zeitkonstante wird automatisch nachgeladen, so dass der , Ablauf. `erneut beginnt. Mit einem IN-Befehl (Eingabe) kann die ZVE- jederzeit den aktuellen Zählerstand abfragen. Die maximale Zählfrequenz ist halb so groß Arie die Betriebsfrequenz: 
Die Betriebsart -;,Zähler". benutzt man außer zum Zählen irgendwelcher Impulse auch zur Erhöhung der programmierbaren Festzeiten. durch Hintereinanderschalten mehrerer Kanäle.

Allgemeine Hinweise zum CTC

Da jeder Kanal Interrupt geben kann, benötigt der - CTC vier Interruptvektoren (8 Bytes in der IV-Tabelle). per IV wird jedoch nur in den Kanal 0 eingespeichert. 
Die anderen Kanäle erhalten die drei folgeraden Interruptvektoren intern zugeordnet. Bei Interrupt schreibt der interruptgebende Kanal seine Nummer in das Bit 1 und das Bit 2 ein (Beispiel: Kanal 0 hat IV C8, Kanal 1 hat IV CA, Kanal 2 hat IV CC und Kanal -3 hat IV CE). Bit 0 ist wie beim PIO stets Null. Der Kanal 3 hat keinen Ausgang. Er ist also nur softwaremäßig auswertbar. Infolge der, vier Kanäle belegt ein CTC vier Adressen, wenn die Adressenleitungen A0 und A1 mit KS0 und KS1 verbunden werden. 
Diese legen die gewünschte Kanalnummer fest. Eine Unterscheidung zwischen Steuer- und Datenwort ist nicht notwendig, da eine Ausgabe zum CTC nur beim Programmieren erfolgt.

Programmierung des CTC (Tabelle 2) 
Interruptvektor

Beliebiges Byte mit einer 0 im niederwertigsten Bit, wird nur im Kanal 0 programmiert.

- Steuerwort Betriebsart

S7 legt fest, ob das Aussenden von Interrupts verboten (S7 = 0) oder erlaubt wird (S7 =1). S6 legt Betriebsart Zeitgetier (S6 = 0) - oder Zähler (S6 =,1) fest. S5 legt in. Betriebsart - Zeitgeber das Vorteiler-Verhältnis 1:16 - (S5 = 0) oder 1:256 
(S5 =1) fest. S4 wählt die Flanke aus, mit der der Zähler weitergezählt oder der Zeitgeber gestartet wird. S3 entscheidet in Betriebsart Zeitgeber, ob er sofort, nach Ausgabe der Zeitkonstante (S3 =.0) oder 
erst nach einer Taktflanke am Kanaleingang (S3 = 1) startet. S2 zeigt mit S2 = 1 an, dass das nächste Wort .die Zeitkonstante ist. S1 hält mit Sl =1 den Zähler bis zur Eingabeeiner Zeitkonstanten =an S0 = 1 unterscheidet das Steuerwort vom 
Intenuptvektor:

- Zeitkonstante

Stellt den internen Kanalzähler rauf den gewünschten Wert ein (zwischen 0l = 1 und, FF = 255). Die Zeitkonstante 00 entspricht einem Zählbereich von 256.

Ein Beispiel in Bild 6 und Tabelle 2 verdeutlicht die Programmierung eines CTC. Die Kanäle liefern Zeitmarken l ms, 1_00 ms; 1 s, 1 min. Die Betriebsfrequenz beträgt 2,5 MHz. 1 ms, 1 s und 1 min sollen softwaremäßig "'ausgewertet" werden (interruptgebend). 



CTC-Programmierung Kurzreferenz