Die Timer des HD64180

Gerald Schröder

Der HD64180 verfügt über zwei programmierbare 16-Bit-Zähler und einen
nicht-programmierbaren 8-Bit-Zähler. Der 8-Bit-Zähler wird alle 10 Takte
dekrementiert und kann nur gelesen werden, und zwar über Port 18h. Das
Beschreiben dieses Ports kann Fehler im Timing des HD64180 verursachen.

Die 16-Bit-Zähler werden alle 20 Takte dekrementiert. Einer der 16-Bit-
Zähler kann über den Pin TOUT an einen anderen Chip melden, daß er den
Zählerstand 0000 erreicht hat. Beide Zähler können einen Interrupt auslösen,
wenn sie 0000 erreichen.

Die Ports

Port   Abk.      Name
----------------------------------------------------
0Ch    TMDR0L    Timer Data Register Channel 0 Low
0Dh    TMDR0H    Timer Data Register Channel 0 High
0Eh    RLDR0I    Reload Data Register Channel 0 Low
0Fh    RLDR0H    Reload Data Register Channel 0 High
10h    TCR       Timer Control Register
14h    TMDR1L    Timer Data Reister Cbanel 1 Low
15h    TMDR1H    Timer Data Regigter Channel 1 High
16h    RLDR1L    Reload Data Register Channel 1 Low
17h    RLDR1H    Reload Data Register Channel 1 high


TCR  (Control)

  0    1    2    3    4    5    6    7
TDE0 TDE1 TOC0 TOC1 TIE0 TIE1 TIF0  TIF1

DDE0/1  Timer Decrement Enble Channel 0/1
TOC0/1  Timer Output Control (beide für Kanal 1!)
TIE0/1  Timer Interrupt Enable Channel 0/1
TIF0/1  Timer Interrupt Flag Chanel 0/1

Programmierung

Zuerst sollte der Timer gestoppt werden, indem TDE in TCR auf 0 gesetzt
wird. Dann das gewünschte Zählintervall in RLDR und (!) TMDR eintragen; die
Eintragung in TMDR ist nötig, weil der Zähler sonst bei dem alten Wert
staret. Es handelt sich hier um 16-Bit-Werte, so daß bei einem Takt von
9,216 MHz Warteschleifen von ca. 2,2  Microsekunden bis ca. 0,142 Sekunden
realisiert werden können;  bzw. der Zähler erreicht 460800 (Iatervall 0001)
bis 7,03125 (Intervall FFFFh) Mal in der Sekunde den Stand 0000.

Der Zähler fängt erst an zu zählen, wenn TDE in TCR auf 1 gesetzt wird.
Gleichzeitig wird über TIE  ausgewählt, ob ein Interrupt ausgelöst werden
soll, wenn TMDR den Zählestand 0000 erreicht. Für Kanal 1 kann über TOC
noch augewählt werden, welche Reaktion an Pin TOUT (Timer Output) beim
Erreichen von 0000 erfolgt (Achtung: TOUT ist mit Adreßbit A18 gemulti-
plext):

TOC0 TOC1   Reaktion TOUT
  0    0    keine (Pin als A18)                                   
  0    1    TOUT wird getoggelt (0 -> 1) (1 -> 0 )                      
  1    0    TOUT auf 0
  1    1    TOUT auf 1

Der Zähler TMDR darf zwischendurch ausgelesen werden, aber nur in der
Reihenfolge Low-Byte und dann High-Byte. Sobald TMDR den Zählerstand 0000
erreicht, wird der in RLDR stehende Wert in TMDR geladen und es wird wieder
mit dem Zählen angefangen. Außerdem wird TIF in TCR gesetzt. Falls vorher
TIF gesetzt wurde, wird auch ein Interrupt ausgelöst.

TIF wird erst gelöscht, wenn zuerst (!) TCR und dann TMDR (in der Reihen-
folge Low-/High-Byte) gelesen werden. Ansonsten bleibt es gesetzt, was bei
der Rückkehr von einer Interrupt-Routine sofort einen neuen Interrupt ver-
ursacht!
