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!