Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier. |
Home Experimente I/O-Bausteine Experimente mit Z80-CTC Z80-CTC | |
Siehe auch: Z80-CTC (Z8430, MK3883) | |
|
|
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
|
|
Home Experimente I/O-Bausteine Experimente mit Z80-CTC Z80-CTC |