Z80 CTC (in der DDR U857) - Programmierung | ![]() |
![]() |
Letztmalig dran rumgefummelt: 04.02.05 18:09:43 |
![]() |
Zur Programmierung eines CTC sind maximal drei Steuerbytes notwendig - in Extremfall ein Interrptsteuerwort, ein Betriebsartensteuerwort sowie eine Zeitkonstante, welche als Rückwärtszähler dient. Natürlich entscheiden auch beim Z80-CTC einzelne Bits des Betriebsartensteuerworts über die Funktionalität. |
![]() |
1. Interrptsteuerwort |
![]() |
Abhängig von der Betriebsart ist der CTC in der Lage, folgende
Funktionen jeweils mit bzw. ohne Interruptanforderung eines Kanals
auszuführen:
|
![]() |
Spätestens hier beweist sich der Spruch: "Es gibt zehn Arten von Menschen: die einen verstehen das Binärsystem, die anderen nicht!" - deshalb hier noch mal zu den entsprechenden Zahlensystemen ;-) |
![]() |
alle folgenden Bitmuster müssen via OUT-Befehlen auf die Steuerdresse des jeweiligen Bausteins mit Kanaladresse gesendet werden |
![]() |
Detaillierte Funktionsbeschreibung und Programmierbeispiele findet man auch hier |
![]() |
Beispielprogramme zur CTC-Programmierung |
![]() |
für den Profi - Kurzreferenz zur CTC-Programmierung Die zwei Adressbits des CTC-Bausteins CS0 und CS1 ermöglichen bei der Datenausgabe und bei der Dateneingabe zwischen U880 und U857 die Auswahl
eines der vier CTC-Kanäle. Bei der Dateneingabe vom U857 in den CPU-Schaltkreis gelangen die aktuellen Zählerstände der einzelnen Kanäle in den Mikroprozessor. Der Zählvorgang wird dadurch nicht beeinflusst. Bei der
Datenausgabe muss zwischen dem Interruptvektor (Low-Teil), dem eigentlichen U857-Steuerwort und der abzuzählenden Zeitkonstante unterschieden
werden.
|
1. Interruptsteuerwort | ![]() |
![]() |
![]() |
Betriebsart | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Interrptvektor | X | X | X | X | X | X | X | 0 |
Kanalsteuerwort (siehe 2.) | X | X | X | X | X | X | X | 1 |
Tabelle 1 - CTC-Interrptvektor-Programmierung
![]() |
Interruptvektor muss auf einer geraden Hexadezimalzahl enden Bit0 = 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
Empfohlenes Steuerwort für Interruptvektor: 00H (nicht zu berücksichtigende Bits sind auf 1 gesetzt worden!) - Konsequenz: auch die Tabelle der Vektoren muss dann auf einer Adresse beginnen, welche auf 00H endet | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
somit können mit dem CTC folgende Adressen für die Kanäle 0 bis
3 ausgesendet werden:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
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. |
2. Kanalsteuerwort | ![]() |
![]() |
![]() |
Funktion | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Kanalsteuerwart | X | X | X | X | X | X | X | 1 |
Interrptfreigabe-FlipFlop frei (nur möglich, wenn zuvor erfolgreich ein Interrptvektor eingeschrieben wurde) | 1 | X | X | X | X | X | X | 1 |
Interrptfreigabe-FlipFlop gesperrt | 0 | X | X | X | X | X | X | 1 |
Zählerbetriebsart | X | 1 | X | X | X | X | X | 1 |
Zeitgeberbetriebsart | X | 0 | X | X | X | X | X | 1 |
Vorteiler für Zählerbetriebsart = 256 | X | X | 1 | X | X | X | X | 1 |
Vorteiler für Zählerbetriebsart = 16 | X | X | 0 | X | X | X | X | 1 |
Taktflanke für den Start der Zählerbetriebsart = H | X | X | X | 1 | X | X | X | 1 |
Taktflanke für den Start der Zählerbetriebsart = L | X | X | X | 0 | X | X | X | 1 |
Trigger extern | X | X | X | X | 1 | X | X | 1 |
Zeitkonstantenstart | X | X | X | X | 0 | X | X | 1 |
Zeitkonstante folgt | X | X | X | X | X | 1 | X | 1 |
Zeitkonstante folgt nicht | X | X | X | X | X | 0 | X | 1 |
RESET Kanal | X | X | X | X | X | X | 1 | 1 |
NOP - No Operation | X | X | X | X | X | X | 0 | 1 |
Tabelle 2 - CTC-Kanalsteuerwort - alle rot gekennzeichneten Bits sind für die jeweilige Programmierung relevant
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=L; Trigger intern; Zeitkonstantenstart; keine Zeitkonstante; NOP: 01H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=L; Zeitkonstantenstart; kein externer Trigger ; Zeitkonstante folgt nicht; RESET Kanal: 03H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=L; Zeitkonstantenstart; kein externer Trigger; Zeitkonstante folgt; NOP: 05H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=L; Zeitkonstantenstart; kein externer Trigger; Zeitkonstante folgt; RESET Kanal: 07H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=L; Trigger extern; Zeitkonstantenstart; Zeitkonstante folgt nicht; NOP: 09H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 16; Trigger-Flanke=H; Trigger extern; Zeitkonstante folgt nicht; NOP: 19H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 256; Trigger-Flanke=L; Trigger extern; Zeitkonstante folgt nicht; NOP: 29H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zeitgeberbetriebsart; Vorteiler 256; Trigger-Flanke=H; Trigger extern; Zeitkonstante folgt nicht; NOP: 39H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zählerbetriebsart; Vorteiler 256; Trigger-Flanke=H; Trigger extern; Zeitkonstante folgt nicht; NOP: 69H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zählerbetriebsart; Vorteiler 256; Trigger-Flanke=L; Trigger extern; Zeitkonstante folgt nicht; NOP: 49H |
![]() |
Empfohlenes Steuerwort: Interrupt gesperrt; Zählerbetriebsart; Vorteiler 16; Trigger-Flanke=L; Trigger extern; Zeitkonstante folgt nicht; NOP: 59H |
Achtung: alle Angaben ohne Gewähr - laufende Überarbeitung ;-)
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:
Die Belegung des Bits D0 = 1 identifiziert das Steuerwort als Kanalsteuerwort. Es wird somit vom Interruptvektor des Kanals 0 unterschieden.
Das Bit D0 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:
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
Zeitgebererfolgt 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:
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.
3. Beschreibung der Betriebsarten | ![]() |
![]() |
![]() |
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 D4 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 im Bild 3.4.4 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 im Bild 3.4.5 verdeutlicht. Der mit der steigenden Flanke des CPU-Systemtaktzyklus T2 in diesem Lesevorgang gültige Inhalt des Rückwärtszählers des
durch die binären Auswahlsignale CSO und CSl 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/TO-Ausgang. 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.
Im Bild 3.4.6 ist zusammenfassend das Zeitverhalten eines CTC-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 3.4.4. dargestellten Zeitverhalten. Auch das Auslesen des Inhalts der Rückwärtszähler erfolgt wie
im Abschn. 3.4.5.1. bereits beschrieben (Bild 3.4.5).
Der Rückwärtszähler des Zähler/Zeitgeber-Kanals wird durch den Vorteiler getaktet.