| 4.4 Direkter Speicherzugriff |  | Bausteine für parallele Schnittstellen |

## 4.5 Zeitgeber-/Zähler-Bausteine

Durch ihren Namen wird bereits auf die Doppelfunktion der Zeitgeber-/Zähler-Bausteine in Mikrorechner-Systemen hingewiesen: Einerseits dienen sie zur Erzeugung bzw. zur Messung von Zeitfunktionen unterschiedlichster Art, andererseits werden sie zum Zählen bestimmter Ereignisse verwendet. Sie werden im englischen Sprachgebrauch als Programmable Interval Timer (PIT) oder Programmable Timer/Counter Module (PTM) bezeichnet. Genauer betrachtet, werden diese Bausteine z.B. eingesetzt als:

- Impulsgenerator, der Einzelimpulse programmierbarer, konstanter Länge ausgibt. Als Spezialfall gehört dazu die Ausgabe von Einzelimpulsen, deren Dauer derjenigen einer Systemtakt-Schwingung entspricht. Diese Impulse werden insbesondere als Übernahmesignale (Strobe) zur Triggerung von Registern verwendet.
- Taktgenerator, der digitale Schwingungen mit beliebig programmierbarem Impuls-Pause-Verhältnis erzeugt. Dazu gehören insbesondere:
  - Rechtecksignale mit gleich langer Impuls- und Pausendauer (Square Wave), die als Taktsignale für andere Systemkomponenten gebraucht werden.
  - kurze periodische Interrupt- bzw. Trigger-Impulse mit einer programmierbaren Rate, die z.B. als Schaltimpulse einer Echtzeit-Uhr oder als Zeitscheiben-Signal in Multitasking-Betriebssystemen verwendet werden.
- Ereigniszähler, der externe, asynchron oder synchron auftretende Signale zählt.
- Zeit-Meßschaltung zur Ermittlung der Schwingungsdauer oder der Impulsdauer externer digitaler Signale, insbesondere auch zur Messung der Dauer eines abgelaufenen Zeitintervalls.

Auf weitere, komplexere Funktionen von Zeitgeber-/Zähler-Einheiten, wie sie insbesondere in Mikrocontrollern implementiert sind, können wir im Rahmen dieses Kurses nicht eingehen.

### 4.5.1 Prinzipieller Aufbau eines Zeitgeber-/Zähler-Bausteins

Bevor auf die Ausführung dieser vielfältigen Funktionen näher eingegangen wird, soll zunächst der Aufbau eines Zeitgeber-/Zähler-Bausteins beschrieben werden. Dieser ist im Bild 4.5-1 schematisch dargestellt. Dabei wurde der Einfachheit halber nur eine Ausführungseinheit gezeichnet, die wir abkürzend als Timer bezeichnen wollen. Technisch realisierte Bausteine enthalten in der Regel 3 bis 5 unabhängig voneinander zu betreibende Timer.
Die Funktion der Bausteinsteuerung, des (nicht gezeichneten) internen Steuerbusses, des Datenbuspuffers sowie der Anschlüsse zum Prozessor wurde bereits bei anderen Bausteinen beschrieben, so daß hier nicht mehr darauf eingegangen werden muß. Zu erwähnen ist lediglich, daß einige Bausteine sowohl mit dem Systemtakt als auch mit einem eigenen, Quarz-stabilisierten Takt angesteuert werden können.
Die Hauptkomponente des Timers wird von einem synchronen Binärzähler gebildet, dessen Länge typischerweise zwischen 16 und 32 bit liegt. Der Zähler reduziert die oben beschriebene Erzeugung von Zeitfunktionen im wesentlichen auf die Erzeugung eines Zeitintervalls bestimmter Länge. Dazu wird er zunächst mit einem Anfangswert (AW) geladen, der proportional zur gewünschten Intervallänge ist. Der Proportionalitätsfaktor wird durch die Dauer eines Zählertaktimpulses vorgegeben. Der Zählvorgang wird softwaremäßig durch ein spezielles Steuerwort des Prozessors oder hardwaremäßig durch andere Bedingungen gestartet, die weiter unten dargestellt werden. Dabei steht während des ersten Zähltaktes im Zähler üblicherweise noch der vorgegebene Anfangswert. Mit jedem weiteren Taktimpuls wird danach sein Wert um 1 dekrementiert, bis er den Zustand '0' erreicht. (Auf die Erzeugung des Zählertaktes werden wir weiter unten eingehen.) Wenn dieser Zustand erreicht ist, wird ein Meldesignal zur Bausteinsteuerung generiert. Als Reaktion darauf setzt die Steuerung ein bestimmtes Bit im Statusregister. Wahlweise kann sie zusätzlich eine Interruptanforderung an den Prozessor stellen oder nicht. Der Zählvorgang vom Anfangswert AW bis zum Endwert 0 wird im weiteren Zählzyklus genannt.

Bild 4.5-1: Aufbau eines Zeitgeber-/Zähler-Bausteins

Komplexere Timer bieten die Möglichkeit, wahlweise den Zähler zu inkrementieren oder zu dekrementieren. Außerdem kann bei ihnen der Vergleich des Zählerzustandes nicht nur mit dem Nullzustand, sondern mit einem beliebigen, in einem besonderen Register abgespeicherten Wert durchgeführt werden.
Der Anfangswert AW wird vom µP durch einen Schreibbefehl über den Datenbus in ein Auffangregister übertragen. Zu Beginn jedes Zählzyklus wird er daraus in den Zähler geladen. Dieser Vorgang wird Initialisierung des Zählers genannt. Für mehrfach sich wiederholende Zählzyklen mit gleichem Anfangswert muß der Prozessor diesen Wert daher nur ein einziges Mal in das Auffangregister einschreiben. Nach jedem Zählzyklus wird dann die erforderliche erneute Initialisierung des Zählers entweder automatisch bei Erreichen des Endstandes '0' oder durch das Vorliegen einer der zum Schluß des Abschnittes beschriebenen Startbedingungen ausgelöst.
Zu jedem Zeitpunkt kann der Prozessor den aktuellen Zählerstand abfragen. Prinzipiell könnte dies z.B. dadurch geschehen, daß durch einen Lesebefehl die Ausgänge des Zählers direkt auf den internen Datenbus geschaltet werden. Natürlich besteht dabei die Gefahr, daß sich während des Lesevorgangs der Zustand des Zählers ändert und deshalb ungültige Übergangsinformation ermittelt werden. Um dies zu vermeiden, kann zwar der Zählertakt kurzzeitig angehalten werden (vgl. die unten beschriebene Funktion des Gate-Einganges). Jedoch kommt es dann durch die dabei auftretende Verzögerung zu einer Verfälschung des Zählvorganges. Die meisten Timer besitzen deshalb ein Pufferregister, in das der augenblickliche Zählerstand zunächst transferiert wird. Je nach Realisierung des Timers kann dieser Transfer automatisch durch den Lesebefehl oder aber durch einen speziellen Befehl des Prozessors verursacht werden. Im letztgenannten Fall kann der Prozessor den Inhalt des Pufferregisters erst zu einem beliebigen späteren Zeitpunkt lesen.
Nun zur Erklärung der Zählertakt-Steuerung: Die Zähler der meisten Timer-Bausteine können wahlweise durch den Systemtakt oder einen externen Takt angesteuert werden. Durch einen Frequenzteiler (1:n) kann der externe Takt häufig auf eine kleinere Taktrate heruntergesetzt werden. Diese ist entweder fest vorgegeben oder sie kann (über das Steuerregister) aus einer Palette von Frequenzen ausgewählt werden. Der Gate-Eingang G besitzt eine doppelte Funktion. Einerseits wird durch ihn der Zähler aktiviert bzw. deaktiviert, wenn der Baustein als Ereigniszähler oder zur Erzeugung der oben beschriebenen Zeitfunktionen eingesetzt wird. Im letztgenannten Fall wird das vom Baustein erzeugte digitale Zeitsignal über den Ausgang OUT ausgegeben. Wird der Baustein jedoch als Zeit-Meßschaltung betrieben, so muß an den Eingang Gate das auszumessende Signal angelegt werden.

### 4.5.2 Die verschiedenen Zählmodi

Die gestrichelte Linie, die im Bild 4.5-1 den Zähler und seine Register in zwei Hälften teilt, soll auf eine Besonderheit von 16-bit-Timern in Bausteinen mit einem 8-bit-Datenbus hinweisen. Bei diesen Bausteinen sind beide Timer-Register unerläßlich, da jedes 16-bit-Datum, also Anfangswert und aktueller Zählerstand, byteweise transportiert werden muß. Ohne Zwischenspeicherung bestünde bei beiden erwähnten Datentypen die Gefahr, daß sich zwischen den sequentiell ausgeführten Bytezugriffen der Zählerstand u.U. wesentlich ändert.
Timerdes eben beschriebenen Typs besitzen häufig neben dem oben beschriebenen "normalen" 16-bit-Zählmodus noch eine weitere Zählart. Im 2 x 8-bit-Zählmodus werden das niederwertige Byte (LSB) sowie das höherwertige Byte (MSB) des Zählers als zwei getrennte 8-bit-Zähler betrieben. Der Zählertakt wird nur dem LSB-Zähler zugeführt. Immer dann, wenn der zyklisch umlaufende LSB-Zähler den Zustand '0' erreicht, wird er aus dem LSB-Byte des Auffangregisters neu initialisiert. Gleichzeitig wird ein Übertragssignal erzeugt, durch das auch der MSB-Zähler um 1 dekrementiert wird. Erst wenn beide Zähler den Wert 0 besitzen, ist ein Zählzyklus beendet. Eine weitere Differenzierung der Zählmodi ergibt sich dadurch, daß die Zähler einiger Bausteine wahlweise als Dualzähler oder aber als BCD-Zähler (Binary Coded Decimal) arbeiten können.

Selbsttestaufgabe 4.5-1: (–>Lösungsvorschlag)
Berechnen Sie für den Anfangswert $4749 die Länge des Zählzyklus für alle vier eben beschriebenen Zählmodi. Beachten Sie dabei, daß jeder Zählzyklus erst mit dem Ende des Nullzustandes abgeschlossen ist.

### 4.5.3 Das Programmiermodell

Zur Überwachung und Programmierung werden in der Regel für jeden Timer des Bausteins nur ein Statusregister sowie ein Steuerregister benötigt. Beide Register sind im Bild 4.5-2 skizziert. Ihre Bedeutung wird nun kurz beschrieben. Zum Programmiermodell gehören weiterhin die Auffangregister und Pufferregister des Timers, auf die hier aber nicht mehr eingegangen werden muß.

Bild 4.5-2: Die Register des Timers

Das Steuerregister Um alle beschriebenen Arbeitsweisen zu berücksichtigen, hat das gezeichnete Steuerregister 10 Bits. Reale Bausteine bieten in der Regel nicht alle Möglichkeiten, so daß sie meist mit einem 8-bit-Steuerregister auskommen.

- Das RE-Bit (Reset) dient dem Prozessor zum Zurücksetzen des Zählers auf den im Auffangregister gespeicherten Anfangswert, also zur softwaremäßigen Initialisierung des Zählers.
- Das IE-Bit ist das Interrupt Enable Bit, das festlegt, ob ein Nulldurchgang des Zählers zu einer Interruptanforderung an den Prozessor führen soll oder nicht.
- Das OE-Bit (Output Enable) bestimmt, ob der Ausgang OUT des Timers aktiviert ist, d.h. ob er eine intern erzeugte Zeitfunktion ausgeben soll oder nicht.
- Die Bits M2, M1, M0 (Mode) wählen eine bestimmte Funktion aus dem am Anfang des Abschnitts aufgeführten möglichen Repertoire des Timers sowie die verschiedenen Möglichkeiten der Zähler-Initialisierung aus. Im folgenden werden diese Wahlmöglichkeiten noch ausführlich dargestellt.
- Durch die Bits CM1, CM0 (Counter Mode) wird eine der oben beschriebenen vier Zählvarianten selektiert: z.B. durch CM1 der 16- oder 2x8-bit-Zählmodus, durch CM0 der duale oder der BCD-Modus.
- Das CL-Bit (Clock) wählt zwischen dem Systemtakt und einem externen Takt als Zähltakt.
- Durch das PR-Bit (Prescaled) wird der Frequenzteiler des externen Taktes aktiviert oder ausgeschaltet. Durch weitere Bits kann häufig ein bestimmter Teilerfaktor (1:n) ausgewählt werden.

Das Statusregister

- Das IF-Bit ist das Interrupt Flag, das anzeigt, ob vom Timer eine Interruptanforderung gestellt wird. Bei mehreren Timern in einem Baustein erlaubt dieses Bit dem Prozessor, im Polling-Verfahren die Quelle des Unterbrechungswunsches festzustellen.
- Das OUT-Bit spiegelt zu jedem Zeitpunkt den aktuellen Zustand des "Ausgangssignals" OUT wider, und zwar in der Form, wie er in der Ausgangssteuerung noch vor dem eventuell nachfolgenden Tristate-Treiber vorliegt. Auch bei abgeschaltetem Ausgang OUT kann der Prozessor somit softwaremäßig den augenblicklichen Zustand des erzeugten digitalen Zeitsignals feststellen.
- Das IN-Bit zeigt an, ob der Zähler bereits mit dem Anfangswert initialisiert wurde, der als letzter vom Prozessor in das Auffangregister geschrieben wurde. Bei hardwaremäßiger Initialisierung, z.B. durch die Aktivierung des Gate-Eingangs, (wie sie weiter unten beschrieben wird,) kann der Prozessor an diesem Bit feststellen, ob der gewünschte Zählzyklus bereits begonnen wurde oder nicht.
- Die restlichen Bits 4 - 0 können z.B. einige Bits des Steuerregisters wiedergeben und vereinfachen so die Feststellung der Arbeitsweise des Bausteins durch den Prozessor.

### 4.5.4 Die Timer-Funktionen

Anhand von Diagrammen wollen wir nun zunächst die Erzeugung der oben angesprochenen Zeitfunktionen genauer beschreiben. Der jeweils in der ersten Zeile der Diagramme gezeichnete Takt kann, wie oben beschrieben, entweder der (interne) Systemtakt oder aber ein extern angelegter Takt sein. Der Zählerstand ist als Treppenfunktion über der Zeitachse dargestellt, wobei die Stufenhöhe gerade einem um 1 verminderten Zählerwert entspricht. Der Zählzyklus beginnt, wie oben beschrieben, mit der Initialisierung des Zählers. In den Bildern sind zwei von drei Möglichkeiten dazu angedeutet:

- Im ersten Fall, der als Hardware-Triggerung bezeichnet wird, wird die Initialisierung durch die ansteigende Flanke des Steuersignals am Eingang Gate ausgelöst. Diese Flanke kann asynchron zum Takt auftreten. Mit der ersten negativen Flanke des Taktes wird der Anfangswert AW aus dem Auffangregister in den Zähler geladen. Mit jedem Taktsignal wird der Zähler um 1 dekrementiert, was sich jeweils als Stufe in der Treppenfunktion des Zählerstandes darstellt.
- Im zweiten Fall, der Software-Triggerung genannt wird, wird die Initialisierung des Zählers durch einen Schreibzugriff auf das Auffangregister verursacht.
- Der dritte, im Bild nicht dargestellte Fall liegt vor, wenn der Zähler durch das Setzen des RE-Bits im Steuerregister initialisiert wird.

Nun kann es natürlich passieren, daß noch während des Ablaufes eines Zählzyklus eine erneute Initialisierung des Zählers durch eines der eben beschriebenen Verfahren veranlaßt wird. Dies ist im Bild 4.5-3 durch den gestrichelten Bereich des Gate-Signals angedeutet. Im letztgenannten Verfahren wird sich die Initialisierungsanforderung auf jeden Fall durchsetzen. Bei den beiden ersten Verfahren werden zwei Reaktionsmöglichkeiten realisiert:

- Wird der neuen Initialisierungsanforderung augenblicklich stattgegeben, so beginnt der Zählzyklus von neuem mit dem Anfangswert AW. In diesem Fall spricht man von einer retriggerbaren Signalerzeugung (retriggerable).
- Im anderen Fall wird auf jeden Fall zunächst der augenblickliche Zählzyklus beendet, bevor die erneute Anforderung berücksichtigt wird (non-retriggerable).

4.5.4.1 Der Timer als Impulsgenerator Im Bild 4.5-3 sind drei verschiedene Einzelimpulsformen dargestellt, die durch einen Timer erzeugt werden können.

Bild 4.5-3: Der Timer als Impulsgenerator

Fall a)
Hier wird das Ausgangssignal OUT mit der Initialisierung des Zählers auf H-Potential gelegt. Dieser Zustand wird solange beibehalten, bis der Zähler den Wert 0 erreicht, also während des gesamten Zählzyklus T. Am Ausgang OUT erscheint somit ein positiver Impuls, dessen Länge IL durch den Anfangswert AW vorgegeben ist.
Fall b)
In diesem Fall wird der Einzelimpuls erst mit einer gewissen Verzögerung ausgegeben.

- Im Bild ist die Realisierung im 2´ 8-bit-Zählmodus skizziert. Der Impuls erscheint genau dann am Ausgang OUT, wenn der LSB-Zähler (s. Bild 4.5-1) seinen letzten Zyklus durchläuft. Daher bestimmt der Anfangswert des LSB-Zählers die Länge IL des ausgegebenen positiven Impulses. Die Länge V der Verzögerungszeit wird durch das Produkt aus MSB- und LSB-Anfangswert bestimmt: IL = (AWLSB + 1) × T, V = (AWMSB + 1) × IL.
- Einige Timer-Bausteine besitzen für jeden Zähler zwei Auffangregister. In diesem Fall kann sowohl der Wert der Impulsverzögerung V als auch die Impulslänge IL als Anfangswert in je ein Auffangregister geschrieben werden. Nach der Initialisierung wird nun zunächst der Zählzyklus mit dem ersten Anfangswert, danach automatisch ein weiterer Zyklus mit dem zweiten Anfangswert ausgeführt.

In den beschriebenen Fällen a) und b) spricht man vom Monoflop-Betrieb oder Single-Shot-Betrieb. Fall c)
In diesem Fall wird dann, wenn der Zähler den Wert 0 erreicht, für genau eine Taktlänge ein positiver Impuls ausgegeben. Wie bereits gesagt, werden Impulse dieser Form typischerweise als Triggersignale (Strobe) benutzt, z.B. zur Aktivierung eines Pufferregisters.
Im Bild wurde unterstellt, daß nach Erreichen des Zählerstandes '0' der Zählvorgang gestoppt wird. Bei alternativen Realisierungen wird der Zählzyklus periodisch (bis zur nächsten Initialisierung) wiederholt. Wesentlich ist jedoch, daß auch in diesem Fall der Ausgangsimpuls nur ein einziges Mal während des ersten Zählzyklus erzeugt, der Ausgang OUT also während aller anderen Zyklen auf L-Potential gehalten wird.
Anwendungsbeispiel
Als Beispiel wollen wir zeigen, wie man einen Timer zur Überwachung der zeitgerechten Abarbeitung eines Programmes durch den Prozessor einsetzen kann. Schaltungen dieses Typs werden als Watch Dogs ("Wachhund") bezeichnet. Der zeitliche Verlauf der Überwachung ist im Bild 4.5-4 dargestellt.
Zur Überwachung muß der Timer im retriggerbaren Strobe-Modus betrieben werden. Als Takt kann wahlweise der Systemtakt oder ein periodischer, externer Takt benutzt werden. Das Steuersignal am Gate-Eingang muß dauernd aktiv sein. Die Triggerung wird vom Prozessor entweder durch einen Schreibzugriff auf das Auffangregister oder durch das Setzen des Bits RE im Steuerregister (s.o.) vorgenommen. Der Programmierer muß dafür sorgen, daß diese Triggerbefehle möglichst gleichmäßig über die Laufzeit des Programms verteilt sind. Als Anfangswert (AW) wird ein Wert in das Auffangregister geschrieben, dessen zugeordneter Zählerzyklus den maximalen zeitlichen Abstand zwischen zwei Triggerbefehlen (etwas) übersteigt.
Im Bild ist gezeigt, wie der Zählzyklus durch jeden neuen Schreibbefehl unterbrochen wird und unmittelbar danach ein neuer Zählzyklus gestartet wird. Erst wenn der Abstand zwischen zwei Schreibbefehlen zu groß wird oder kein weiterer Schreibbefehl folgt, kann der Zähler den Nullzustand erreichen. Dies ist zum Beispiel dann der Fall, wenn der Prozessor, durch einen Störimpuls verursacht, seinen Programmbereich verlassen hat, also "in den Wald gelaufen ist".

Bild 4.5-4: Der Timer als Watch Dog

Im Augenblick des Nulldurchgangs wird am Ausgang OUT des Timers ein Strobe-Impuls erzeugt. Dieser wird üblicherweise auf den nicht maskierbaren Interrupteingang NMI des Prozessors gelegt. Er sorgt z.B. dafür, daß der µP eine Initialisierungsroutine zur geordneten Wiederaufnahme des abgebrochenen Programms ausführt.
Analog zum eben beschriebenen Einsatz kann der Timer natürlich auch zur Überwachung von externen Geräten eingesetzt werden. In diesem Fall müssen diese Geräte in regelmäßigen Abständen die (Re-)Triggerung des Zählers über den Steuereingang Gate vornehmen.
4.5.4.2 Der Timer als Taktgenerator
Kennzeichnend für die Funktion eines Timers als Taktgenerator ist, daß er periodische digitale Zeitsignale erzeugt. Dies wird dadurch erreicht, daß der Timer nach jedem Nulldurchgang des Zählers automatisch erneut initialisiert (getriggert) und dadurch der Zählvorgang kontinuierlich wiederholt wird (Continuous Mode). Im Bild 4.5-5 sind drei Möglichkeiten skizziert.
Fall a)
Hier erscheint nach der Triggerung am Ausgang OUT ein Signal mit variablem Impuls-Pausen-Verhältnis (Variable Duty Cycle). Die Erzeugung einer einzelnen Schwingung dieses Ausgangstaktes geschieht analog zu der oben beschriebenen Erzeugung eines Einzelimpulses. Der Unterschied besteht nun darin, daß mit jedem neuen Zählvorgang derselbe Impuls erzeugt wird.

Bild 4.5-5: Der Timer als Taktgenerator

Fall b)
Hier besitzt jede Taktschwingung gleich große Impuls- und Pausenlängen. Zur Erzeugung dieser Schwingung werden zwei Alternativen realisiert:

- Beim ersten Verfahren, das im Bild dargestellt ist, geht der Ausgang OUT mit jeder Initialisierung zunächst auf den L-Pegel. Er wechselt genau dann in den H-Zustand, wenn der Zählerstand den halben Anfangswert AW/2 erreicht hat.
- Beim zweiten Verfahren, das nicht dargestellt ist, wechselt der Ausgang mit jeder Initialisierung des Zählers seinen Zustand, so daß in jedem zweiten Zählzyklus der gleiche Ausgangszustand vorliegt.

Fall c)
In diesem Fall wird periodisch immer dann ein kurzer (negativer) Impuls ausgegeben, wenn der Zähler im Nullzustand ist. Die Länge dieses Impulses stimmt daher mit der Schwingungsdauer des Zähltaktes überein.
Die oben erwähnten Timer mit zwei Auffangregistern bieten häufig die Möglichkeit, in Abhängigkeit vom Zustand ('0' bzw. '1') des Steuereingangs Gate zwischen zwei Anfangswerten zu wählen. Dadurch ist die Erzeugung von Ausgangssignalen möglich, die informationsabhängig zwischen zwei verschiedenen Frequenzen umschalten. Dieses Verfahren wird mit Frequency Shift Keying bezeichnet. Es wurde (früher) z.B. bei den Heimcomputern häufig für die Aufzeichnung digitaler Daten auf einem Magnetbandgerät benutzt.
4.5.4.3 Der Timer als Ereigniszähler
Im Bild 4.5-6 ist der Einsatz eines Timers als Ereigniszähler skizziert.

Bild 4.5-6: Der Timer als Ereigniszähler

In vielen Anwendungen treten die zu zählenden Ereignisse sporadisch und aperiodisch auf. Deshalb ist im Bild 4.5-6 ein externes Taktsignal mit willkürlicher Impulslage skizziert. (Natürlich können in dieser Betriebsart aber auch der Systemtakt oder ein periodischer externer Takt benutzt werden.)
Im Unterschied zu den bisher beschriebenen Einsatzarten wird hier durch die ansteigende Flanke des Gate-Signals der Timer nicht getriggert. Dies muß statt dessen irgendwann vorher durch Einschreiben eines Anfangswertes in das Auffangregister oder durch das Setzen des RE-Bits im Steuerregister geschehen. Das Gate-Signal dient nur zur Aktivierung bzw. Sperrung des Zählertaktes. Daher kann es sich bei dem Wert AW im Bild 4.5-6 sowohl um den Anfangswert des Zählzyklus als auch um den Endwert eines bereits vorher durchgeführten Zählzyklus handeln, der vor Erreichen des Nullzustandes durch das Rücksetzen des Gate-Signals abgebrochen wurde. Das heißt, daß ohne erneute Triggerung des Timers jeder neue Zählzyklus mit dem Zähler-Endstand des vorhergehenden fortgesetzt wird. Im Bild 4.5-6 wurde der Endwert, der vor der Rücknahme des Gate-Signals erreicht wurde, mit EW bezeichnet. Die Differenz (AW-EW) gibt die Anzahl der Ereignisse an, die während der aktiven Phase des Gate-Signals aufgetreten sind. Nach Erreichen des Nullzustandes wird der Zähler deaktiviert (disarmed) und über den Ausgang OUT bis zur nächsten Triggerung ein H-Pegel ausgegeben. Dieser kann z.B. als Interruptsignal verwendet werden. Der Prozessor kann dieses Signal als Übertragssignal benutzen, wenn mehr Ereignisse gezählt werden sollen, als in einem Zählzyklus (maximaler Länge) erfaßt werden können.
4.5.4.4 Der Timer als Zeitmesser
Nun soll beschrieben werden, wie man mit einem Timer die Dauer einer Vollschwingung oder eines Impulses messen kann. Das zu vermessende Signal muß dazu an den Steuereingang Gate angelegt werden.
Vorausgesetzt wird in beiden Fällen, daß der Zählzyklus des Timers länger dauert als die zu ermittelnde Zeit. Bei Verwendung eines externen Zähltaktes ist das relativ einfach dadurch zu erreichen, daß man durch die Benutzung des Frequenzteilers (1:n) oder eines sehr niederfrequenten Taktsignals die Dauer des Zählzyklus "in die Länge zieht". Nur wenige Timer-Bausteine bieten jedoch auch einen Frequenzteiler für den (internen) Systemtakt. Dessen Benutzung zur Zeitmessung verlangt deshalb ein Programm, das zunächst zählt, wie viele vollständige Zählzyklen maximal in die zu messende Schwingungs- bzw. Impulsdauer passen und dann das eventuell übrig bleibende Restintervall nach den nun beschriebenen Verfahren ausmißt.
4.5.4.4.1 Frequenzvergleich
Im Bild 4.5-7 ist zunächst die Bestimmung einer Schwingungsdauer (TS) skizziert. Zunächst wird der Timer durch einen Schreibzugriff auf sein Auffangregister initialisiert. Geeigneterweise wird dabei der größtmögliche Zählerstand als Anfangswert gewählt: AW = $FF...FF. Mit der ersten positiven Flanke des zu vermessenden digitalen Signals am Gate-Eingang wird nun der Zählzyklus (im Zeitpunkt 0) gestartet. Die nächste positive Flanke des Eingangssignals (im Zeitpunkt TS) stoppt den Zähler und zeigt dadurch das Ende des Zählzyklus an. Der Zählerstand Z(TS) zu diesem Zeitpunkt wird vom Prozessor zur Bestimmung der Schwingungsdauer nach der folgenden Formel benutzt:

TS = [AW - Z(TS)] Taktzyklus .

Durch einen Interrupt kann der Prozessor über das Ende des Zählzyklus unterrichtet werden. Durch die oben erwähnten Mode-Bits im Steuerwort kann wahlweise ein Interrupt ausgelöst werden, wenn der Zählzyklus größer oder kleiner als die Schwingungsdauer ist. Deshalb wird diese Betriebsart als Frequenz-Vergleichsmodus (Frequency Comparison Mode) bezeichnet.

Bild 4.5-7: Messung einer Schwingungsdauer

Anwendungsbeispiel
Auf die beschriebene Weise kann z.B. durch den Einsatz zweier Timer die Frequenz eines gemeinsamen Signals an ihren Gate-Eingängen überprüft werden, d.h. festgestellt werden, ob seine Schwingungsdauer zwischen zwei vorgegebenen Grenzwerten liegt. Dies ist im Bild 4.5-7 gestrichelt skizziert. Dazu wird der Timer 1 mit einem Anfangswert AW1 geladen, der eine Zyklusdauer T1 > TS nach sich zieht, der Timer 2 hingegen mit einem Anfangswert AW2, für dessen Zykluszeit T2 < TS gilt. Nun programmiert man die Timer so, daß Timer 1 einen Interrupt abgibt, wenn T1 < TS ist, und Timer 2, wenn T2 > TS ist. Der Prozessor wird dadurch stets dann unterbrochen, wenn die Schwingungsdauer außerhalb des zulässigen Bereichs liegt. Für eine lückenlose Überwachung der Eingangsfrequenz ist es natürlich unerläßlich, daß durch jede positive Flanke am Gate-Eingang beide Timer erneut getriggert werden.
4.5.4.4.2 Impulsbreitenvergleich
Im Bild 4.5-8 ist skizziert, wie mit Hilfe eines Timers die Dauer eines Impulses gemessen werden kann. Dabei kann es sich sowohl um den Impuls eines periodisch auftretenden Signals wie auch um ein einzelnes Zeitintervall handeln.
Von der Schwingungsdauermessung unterscheidet sich dieses Verfahren nur dadurch, daß das Stoppen des Zählers hier durch die negative Flanke des Eingangsimpulses hervorgerufen wird. Auch hier sind wieder zwei Möglichkeiten für die Auslösung eines Interrupts programmierbar: Dies kann wahlweise geschehen, wenn die Impulslänge TI größer bzw. kleiner als die Zyklusdauer T ist. Völlig analog zur Schwingungsdauermessung kann auch hier durch den Einsatz zweier Timer festgestellt werden, ob die Impulsdauer innerhalb vorgegebener Grenzen liegt. Dies ist im Bild 4.5-8 gestrichelt angedeutet.

Bild 4.5-8: Messung einer Impulsdauer

### 4.5.5 Fallstudie: Der Echtzeit-Uhren-Baustein HD146818

Einige universell einsetzbare Zeitgeber-/Zähler-Bausteine besitzen neben den beschriebenen Funktionen noch die Möglichkeit, sie als Echtzeit-Uhren zu verwenden. Dazu übernehmen sie insbesondere die folgenden Zusatzfunktionen:

- Erzeugung eines 1-Hz-Taktsignales,
- Umrechnung der Uhrzeit in Stunden, Minuten und Sekunden,
- Vergleich der aktuellen Uhrzeit mit einer einprogrammierten "Weckzeit" und Auslösung eines "Alarms" bei festgestellter Übereinstimmung.

Echtzeit-Uhren-Bausteine übernehmen dazu noch die Fortschreibung des Datums (inklusive der Schaltjahr-Berücksichtigung). Im Bild 4.5-9 ist der Aufbau des Bausteins HD146818 der Firma Motorola in starker Vereinfachung skizziert, der millionenfach in älteren PCs zum Einsatz kam.
Der Baustein kann mit einer ganzen Reihe unterschiedlicher Quarzfrequenzen oder extern angelegter Systemtakte betrieben werden. Zur Steuerung anderer Bausteine wird die angelegte Frequenz über einen Taktausgang ausgegeben. Außerdem wird sie durch den programmierbaren Teiler (1:n) auf die 1-Hz-Frequenz heruntergesetzt, die der eigentlichen Ausführungseinheit, der Uhr, zugeführt wird.
Diese Uhr enthält in ihrem 10-stelligen Registersatz die aktuelle Uhrzeit in Stunden (h), Minuten (min) und Sekunden (s), die programmierte Weckzeit in den gleichen Einheiten, die Nummer (1 - 7) des Wochentages sowie das Datum, bestehend aus Tag, Monat und Jahr. Der Prozessor hat über den Datenbus Zugang zu diesem Registersatz und kann so jederzeit die Uhrzeit und das Datum auslesen, andererseits aber auch andere Daten eintragen und so "die Uhr oder den Wecker stellen". Das Weiterschalten der Uhrzeit und des Datums wird durch die Schaltlogik vorgenommen. Diese liest im Sekundentakt die Uhrzeit im Registersatz und erhöht sie jeweils um eine Sekunde. Dabei kann die Uhrzeit wahlweise

- im Dualsystem oder dem BCD-System sowie
- im 24-Stunden- oder 12-Stunden-Modus verarbeitet werden.

Bild 4.5-9: Aufbau eines Echtzeit-Uhren-Bausteins

Die neu berechnete Uhrzeit wird dann mit der einprogrammierten Weckzeit verglichen. Stimmen beide überein, so kann ein Interrupt an den Prozessor ausgegeben werden, wenn dies in einem bestimmten Bit des Steuerregisters festgelegt wurde. Durch den Eintrag spezieller Bitkombinationen kann jede Komponente der Weckzeit zu einem don't care erklärt und dadurch beim Vergleich nicht berücksichtigt werden. Auf diese Weise sind z.B. Alarmauslösungen zu jeder Sekunde, zu jeder Minute oder zu jeder Stunde möglich.
Falls die Fortschreibung der Uhrzeit eine Datumsänderung zur Folge hat, wird auch diese von der Schaltlogik vorgenommen. Dabei werden Schaltjahre und die unterschiedliche Anzahl von Tagen pro Monat berücksichtigt. Auf das Programmiermodell dieses Bausteins soll hier nicht näher eingegangen werden.

| 4.4 Direkter Speicherzugriff |  | 4.6 Bausteine für paralellele Schnittstellen |