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


Z80-CTC

Die nächsten zwei Experimente zeigen den Einsatz eines CTC als Stoppuhr bzw. als Frequenz-Messgerät. Bei den beiden Experimenten werden Kanal 0 und Kanal 3 des CTC eingesetzt. CTC3 wird im Timer-Modus betrieben und dient zur Erzeugung einer Zeitbasis mit 1 ms Auflösung. CTC0 wird als Zähler betrieben. Beide CTC-Kanäle erzeugen Interrupts, die im Folgenden kurz besprochen werden.

Kanal 3 des CTC wird so eingestellt, dass er den CPU-Takt (4.000 MHz) durch 4000 teilt und im Abstand von 1 ms einen Interrupt generiert. Die Interrupt-Serviceroutine ICLOCK verwaltet nun zwei zeitgesteuerte Vorgänge. Zum einen wird nach 1000 Interruptaufrufen (= alle 1.000 s) der Zählerstand für das Frequenz-Messgerät ermittelt und zum anderen wird alle 10 Aufrufe (= 0.01 s) der Wert der Stoppuhr weitergezählt. Diese beiden Vorgänge bilden die Zeitbasis für die Stoppuhr und das Frequenz-Messgerät.

Kanal 0 des CTC dient als Zähler bei der Frequenzmessung. Da jeder CTC-Kanal nur acht Bit breit ist und eine Kaskadierung nicht möglich ist (die Kanäle 1 und 2 werden zur Baudratenerzeugung benötigt), wird die Zählerbreite von Kanal 0 per Software erweitert. Dazu wird der CTC-Kanal so programmiert, dass nach jedem Nulldurchgang (Overflow) ein Interrupt generiert wird. Die entsprechende Serviceroutine (IFREQ) inkrementiert nun eine Variable, so dass sich der Gesamtzählerstand aus dem Wert der Variablen und dem Wert von Kanal 0 ergibt. Zu beachten ist, dass die CTC-Kanäle aus Abwärtszählern aufgebaut sind, das Ergebnis also vor der Weiterverarbeitung invertiert werden muss, wenn das Zeitkonstantenregister auf null gesetzt ist.

;===================================================
;------ INTERRUPT: CTC Kanal 0 ---------------------
;===================================================
;
IFREQ: PUSH AF
            LD      A,(FQHB)
            INC     A
            LD      (FQHB),A
            POP     AF
            EI
            RETI
;
;===================================================
;------ INTERRUPT: CTC Kanal 3 ---------------------
;===================================================
;
ICLOCK: PUSH        AF
            PUSH    HL
            LD      HL,(SEK)    ;Sekundenzähler für
            DEC     HL          ;  Zeitbasis Frequenz-
            LD      (SEK),HL    ;  zähler
            LD      A,H
            OR      L
            JR      NZ,$1
            LD      HL,1000     ;neu laden
            LD      (SEK),HL
            IN      A,(CTC0)    ;Messwert übernehmen
            NEG
            LD      (FREQ),A
            LD      A,(FQHB)
            LD      (FREQ+1),A
            LD      A,0         ;Überlaufvariable
            LD      (FQHB),A    ;  rücksetzen
            LD      A,03H
            OUT     (CTC0),A
            LD      A,C5H       ;Zähler neu laden
            OUT     (CTC0),A
            LD      A,0
            OUT     (CTC0),A
;
$1:         LD      A,(HSEK)    ;Hundertstel Sekunden
            DEC     A           ;  für Stoppuhr
            LD      (HSEK),A
            JR      NZ,$2
            LOAD    HSEK,10
            LD      HL,(CLKCNT) ;clock (10 ms)
            INC     HL
            LD      (CLKCNT),HL
$2:         POP     HL
            POP     AF
            EI
            RETI
;
            .DATA
CLKCNT:     DEFW    0           ;Zähler für Uhr
HSEK:       DEFB    0           ;10 ms Zähler
SEK:        DEFW    0           ;Sekundenzähler
FREQ:       DEFW    0           ;Frequenz
FQHB:       DEFB    0           ;Overflow - Frequenz
            .CODE

 


Last Update: 2008-05-31