Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Programmierung des CTC

Nach dem Einschalten der Versorgungsspannung ist der Zustand des CTCs nicht definiert. Erst ein Reset-Impuls setzt den CTC in einen bekannten Zustand. Nach einem Reset muss die Art der gewünschten Betriebsart eingestellt, die jeweiligen Zeitkonstanten geladen und eventuell die Interruptlogik aktiviert werden.

Jeder der vier Zähler des CTC kann unabhängig von den anderen Zählern in zwei verschiedenen Modi betrieben werden: dem Zählermodus und dem Timermodus. Beim Zählermodus wird ein externer Takt verwendet, beim Timermodus wird der Systemtakt über einen Vorteiler verwendet. Die Zählereingangsleitung steht dann als Triggerleitung zur Verfügung.

Zählermodus

Im Zählermodus werden die Schaltflanken des Signals am jeweiligen Pin CLK/TGx gezählt, wobei wahlweise die ansteigende oder die abfallende Flanke des Signals verwendet werden kann. Der 8-Bit-Zähler wird nach Auftreten einer Schaltflanke am Eingang jedoch nicht sofort weitergezählt, sondern erst synchron mit der nächsten ansteigenden Flanke des Systemtaktes (CLK). Dies bedeutet, dass der Zähler eines CTCs Signalfrequenzen bis zu einer Höchstfrequenz in der Höhe der Systemtaktfrequenz verarbeiten kann.

Bei jeder Signalflanke am Eingang CLK/TGx wird der Zählerstand um eins erniedrigt. Erreicht der Zähler den Stand Null, so wird ein Impuls auf der Ausgangsleitung ZC/TOx ausgegeben (bei Zähler drei wurde diese Leitung aus Platzgründen gespart), der Zähler mit dem Inhalt des Zeitkonstantenregisters neu geladen und eventuell ein Interrupt generiert.

Timermodus

Im Timermodus wird als Eingangssignal der interne Systemtakt (Anschluss CLK) verwendet, der über einen einstellbaren Vorteiler (/16 oder /256) auf den Eingang des Zählers gelegt wird. Die jetzt nicht benötigte Eingangsleitung CLK/TGx wird als optionale Triggerleitung verwendet, um den Timer zu einem definierten Zeitpunkt zu starten. Jeder Impuls aus dem Vorteiler dekrementiert den Zähler. Beim Nulldurchgang wird der Zähler wieder aus dem Zeitkonstantenregister geladen und außerdem ein Impuls am Ausgang TOx erzeugt. Bei Bedarf wird auch ein Interruptsignal an die CPU abgegeben. Am Ausgang TOx wird also eine regelmäßige Impulsfolge ausgegeben, wobei der zeitliche Abstand durch das Produkt aus der Periodendauer des Systemtaktes (tCLK), aus dem eingestellten Teilerverhältnis des Vorteilers (P) und dem Inhalt des Zeitkonstantenregisters TC definiert ist:

tCLK * P * TC

Die Triggerleitung kann per Software aktiviert oder deaktiviert werden. Ist sie aktiviert, so beginnt der Timer nach dem Einstellen des Timermodus und dem Laden der Zeitkonstante erst nach Eintreffen eines Triggerimpulses zu arbeiten. Die Triggerleitung ist flankengesteuert, wobei die aktive Signalflanke per Software ausgewählt werden kann.

Programmierung

Die Programmierung eines jeden der vier vorhandenen Zählerkanäle erfolgt immer in derselben Weise: zuerst muss das entsprechende Kontrollregister geladen werden und dann eventuell das Zeitkonstantenregister. Möchte man Interrupts verwenden, so muss außerdem noch das Interruptregister entsprechend gesetzt werden. Die folgende Abbildung zeigt die Bedeutung der einzelnen Bits dieser drei Register.

Z80-CTC Register

Die drei Register pro Zählerkanal werden wie folgt angesprochen: Das Kontrollregister und das Interruptregister können direkt gesetzt werden, das Zeitkonstantenregister existiert als 'Schattenregister' und kann nur indirekt über das Kontrollregister angesprochen werden. Bit 0 des Kontrollregisters entscheidet, ob die restlichen Bits ins Kontrollregister oder ins Interruptregister geladen werden. Ist dieses Bit gleich 1, so wird das Kontrollregister angesprochen, ist es gleich null, so gelten die restlichen Bits als Interruptvektor. Das Zeitkonstantenregister wird geladen, indem man zuerst im Kontrollregister das Bit 2 auf 1 setzt und dann auf die Adresse des Kontrollregisters die Zeitkonstante schreibt. Ein interner Umschaltmechanismus leitet das zweite Byte ins Zeitkonstantenregister.

Die einzelnen Bits des Kontrollregisters haben folgende Bedeutung:

Bit 7

 

Interrupt enable

Falls dieses Bit auf eins gesetzt ist, erzeugt der betreffende Kanal bei jedem Nulldurchgang des Zählers eine Interruptanforderung an die CPU. ACHTUNG !!! Bevor dieses Bit gesetzt werden darf, muss der Interruptvektor initialisiert werden !

Bit 6

 

Mode

Falls Bit 6 gleich eins ist, ist der Zählermodus ausgewählt. Der Zähler wird von einem externen Takt gesteuert, der Vorteiler wird nicht verwendet. Ist Bit 6 gleich null, so wird der Timermodus aktiviert und der Zähler wird über den Vorteiler mit dem Systemtakt verbunden.

Bit 5

 

Range

Falls Bit 5 gleich eins ist, ist der Vorteiler auf 1/256 eingestellt, sonst auf 1/16. Dieses Bit hat nur im Timermodus Bedeutung (Bit 6 = 0).

Bit 4

 

Slope

Mit diesem Bit wird die Art der aktiven Signalflanke des Takteingangs (CLK/TGx) ausgewählt. Falls Bit 4 gleich null ist, wird bei der negativen Signalflanke weitergezählt (Zählermodus) bzw. der Timer gestartet (Timermodus), andernfalls treten diese Aktionen bei der positiven Signalflanke ein.

Bit 3

 

Trigger

Dieses Bit bestimmt, ob der Zähler im Timermodus frei laufen darf oder zuerst auf ein Triggersignal gewartet wird. Falls Bit 3 gleich eins ist, wird nach dem Laden der Zeitkonstante auf ein externes Triggersignal gewartet, bis der Timer gestartet wird. Nach dem Auftreten des Triggers läuft der Zähler frei durch. Falls Bit 3 gleich null ist, wird der Timer gleich nach dem Laden der Zeitkonstante gestartet und läuft dann frei durch.

Bit 2

 

Load Time Constant

Falls dieses Bit gleich eins gesetzt wird, wartet der Zähler auf ein zweites Byte, das an die Adresse des Kontrollwortes geschrieben und ins Zeitkonstantenregister geladen wird. Die Zeitkonstante kann zwischen 0 und 255 liegen, wobei der Wert 0 dem Wert 256 entspricht, also die längste mögliche Zeitkonstante darstellt. Damit kann ein Zähler im Timer-Modus bei 4 MHz CPU-Takt Zeitverzögerungen zwischen 4 µs und 16.384 ms erzeugen. Für längere Werte können mehrere Zähler kaskadiert werden.

Bit 1

 

Reset

Im Gegensatz zum Hardware-Reset hält der Software-Reset nur den adressierten Zähler an. Zum Weiterzählen muss eine neue Zeitkonstante geladen werden. Werden Bit 1 und Bit 2 gleichzeigig auf eins gesetzt, so wird der Zähler angehalten und wartet auf die Eingabe einer neuen Zeitkonstante.

Bit 0

 

Control/Interrupt

Ist dieses Bit gleich null, so wird der Interruptvektor geladen, ist es gleich eins, so werden die Bits 1-7 ins Kontrollregister geschrieben.

Interruptverarbeitung

Die Z80-CTC Interruptverarbeitung ermöglicht jedem der vier Zähler eine Interruptanforderung abzugeben, die den Interruptmodus 2 der CPU unterstützen, wobei jeder Zähler einen eindeutigen Interruptvektor generiert. Der für die Bearbeitung des Interrupts notwendige 16-Bit-Pointer (Startadresse der Interrupt-Service-Routine) wird aus dem Inhalt des CPU-Registers I (high Byte) und den Bits 3-7 des Interruptregisters des CTCs (low Byte) erzeugt. Zur eindeutigen Unterscheidung der einzelnen Zählerkanäle setzt der CTC in den Bits 1 und 2 automatisch die jeweilige Zählernummer (0-3) ein. Bit 0 des Interruptvektors ist immer gleich null.

Die Priorisierung der Interruptanforderungen erfolgt intern über eine Daisy-Chain, wobei Kanal 0 die höchste und Kanal 3 die niedrigste Priorität besitzt. Die Interruptanforderungen eines jeden Zählers können durch das Bit 7 des Kontrollregisters ein- und ausgeschaltet werden.

Eine interessante Eigenschaft des CTCs ist, dass dieser Baustein auch als Interruptcontroller eingesetzt werden kann. Dazu wird jeder Kanal in den Zählermodus gebracht und das Zeitkonstantenregister auf 1 gesetzt. Da der CTC bei jedem Nulldurchgang eines Zählers eine Interruptanforderung generieren kann, wird bei einer Zeitkonstante von 1 bei jeder Signalflanke (wahlweise fallend oder steigend, siehe Bit 4 des Kontrollregisters) ein Interrupt erzeugt. Natürlich können die Kanäle eines CTCs auch gemischt als Interruptcontroller und Zähler/Timer verwendet werden.


Last Update: 2008-05-31