| Inhalt KE5 |  | 5.2 Praktische Übungen MC6840 |

5.1/1

## 5. Aufbau und Funktion der Schnittstellenbausteine - Teil II

## 5.1 Der Zeitgeber-/Zähler-Baustein MC6840

### 5.1.1 Aufbau des Bausteins

Im Praktikumsrechner ist als Zeitgeber-/Zähler-Baustein1) der Typ MC6840 eingesetzt, der von der Herstellerfirma Motorola mit dem Namen

Programmable Timer Module (PTM)

bezeichnet wird. Er stellt drei unabhängig arbeitende 16-bit-Zähler zur Verfügung. Jeder Zähler besitzt ein Steuerregister (CR), einen externen Takteingang (#C), einen Steuereingang (#G) und einen Impulsausgang (O). Beim Erreichen des Zählerwertes 0 (time out) wird ein Bit in einem zentralen Statusregister gesetzt und (wahlweise) der Prozessor durch einen Interrupt davon unterrichtet. Über den Zählerausgang können Rechteckschwingungen mit fester oder variabler (modulierter) Impulsbreite oder einzelne Impulse bestimmter Länge ausgegeben werden. Die Einsatzgebiete des Bausteins sind:

- Erzeugung von Signalen zur Zeitmessung (Wave Synthesis Mode, z.B. Echtzeit-Uhr),
- Frequenzmessung (Wave Measurement Mode),
- Intervallängenmessung (Wave Measurement Mode),
- Ereigniszählung.

Der Baustein arbeitet typabhängig mit einer maximalen internen Frequenz von 1 bis 2 MHz (Takt E des MC6809). Die zulässige minimale Frequenz des Systemtaktes ist 100 kHz. Im Bild 5.1-1 ist der Aufbau eines einzelnen Zählers dargestellt.

Bild 5.1-1: | Aufbau eines der 16-bit-Zähler im MC6840 |

5.1/2

Jeder Zähler besteht aus zwei 8-bit-Zählern (MSB - Most Significant Byte, LSB - Least Significant Byte), die cascadiert als 16-bit-Zähler oder als zwei getrennte 8-bit-Zähler arbeiten können. Jedem Zähler ist ein Auffangregister (Latch) vorgeschaltet, das über den Datenbus geladen wird. Durch ein Signal wird der Zustand der Auffangregister parallel in die 8-bit-Zähler übernommen. Dieser Vorgang wird mit Initialisierung des Zählers bezeichnet. Durch den Steuereingang #G (Gate) kann der Zählvorgang gestartet oder abgebrochen werden. Mit dem Starten beginnt der Zählzyklus, wobei wahlweise der interne Takt E oder ein externer Takt #C benutzt werden kann. Im 16-bit-Zählmodus wird nach Erreichen des Wertes 0 (time out) der Zähler mit dem nächsten Takt erneut aus seinen Auffangregistern geladen. Im 2x8-bit-Zählmodus wird jedesmal, wenn der LSB-Zähler den Wert 0 erreicht, dieser aus seinem Auffangregister geladen und der höherwertige um 1 dekrementiert. Erst wenn beide Zähler den Wert 0 erreichen, werden sie gleichzeitig aus ihren Auffangregistern initialisiert. Der Begriff Zählzyklus bezeichnet immer die Zeit zwischen zwei Initialisierungen des Zählers. Durch eine Schaltung, die den Zählerstand auswertet, wird ein digitales Signal einer wählbaren Form auf den Ausgang O gegeben. Auf diese Signale wird zum Schluß dieses Abschnittes genauer eingegangen.

Das Blockschaltbild Bild 5.1-2 zeigt den inneren Aufbau des Bausteins MC6840.

Bild 5.1-2: | Blockschaltbild des Bausteins MC6840 |

5.1/3

Die Schnittstelle zum Prozessor weist keinerlei Besonderheiten gegenüber den im Kapitel 4 beschriebenen Bausteinen auf. Es stehen zwei Eingänge zur Bausteinauswahl (#CS0, CS1) und drei Eingänge zur Anwahl der internen Register (RS0, RS1, RS2) zur Verfügung. Dem Gesamtplan des Rechners im Anhang der Kurseinheit 3 können Sie entnehmen, daß die Selektion des Bausteins durch das Signal #CS12 und die Adreßleitung A3 im Adreßbereich $F018 - $F01F geschieht (vgl. Selbsttestaufgabe S3.1-2 in KE3). Die Schnittstelle zur Peripherie besteht für jeden Zähler #i aus dem schon erwähnten Takteingang #Ci, dem Steuereingang #Gi und dem Signalausgang Oi. Durch eine Zusatzschaltung (Prescaler) kann die Taktfrequenz des Zählers #3 auf 1/8 herabgesetzt werden.

Im Blockschaltbild Bild 5.1-2 erkennt man, daß teilweise mehrere Register unter der gleichen Adresse angesprochen werden:

- Da das Statusregister nur gelesen, die Steuerregister nur beschrieben werden, konnte man das Statusregister und das Steuerregister von Zähler #2 mit der gleichen Adresse versehen. Das R/#W-Signal wird zur Selektion genau eines der beiden Register mit herangezogen.
- Die Steuerregister der Zähler #1 und #3 besitzen die gleiche Adresse. Die Selektion unter ihnen wird durch das Bit 0 des Steuerregisters des Zählers #2 vor-genommen, das somit als zusätzliches Adreßbit benutzt wird (vgl. Bit CRX2 in der PIA MC6821, KE4, Abschnitt 4.2).

Bild 5.1-3 zeigt die Anschlußbelegung des Bausteins MC6840.

Bild 5.1-3: | Anschlußbelegung des Bausteins MC6840 |

Tabelle 5.1-1 gibt die Adreßzuteilung der Register des MC6840 im Praktikumsrechner wieder. Darin bezeichnen CR#1, CR#2, CR#3 die Steuerregister der Zähler #1, #2, #3 und "Latches #i" die Auffangregister des Zählers #i.

5.1/4

Tabelle 5.1-1: Adreßzuteilung der Register des MC6840

Adresse | RS2 | RS1 | RS0 | Schreiben(R/W=0) | Lesen(R/W=1)
--- | --- | --- | --- | --- | ---
$F018 | 0 | 0 | 0 | CR#3 (Bit0=0 im CR#2) | -
$F018 | 0 | 0 | 0 | CR#1 (Bit0=1 im CR#2) | -
$F019 | 0 | 0 | 1 | CR#2 | Statusregister
$F01A | 0 | 1 | 0 | MSB- Pufferregister | MSB-Zähler #1
$F01B | 0 | 1 | 1 | Latches #1 | LSB-Puffer
$F01C | 1 | 0 | 0 | MSB-Pufferregister | MSB-Zähler #2
$F01D | 1 | 0 | 1 | Latches #2 | LSB-Puffer
$F01E | 1 | 1 | 0 | MSB-Pufferregister | MSB-Zähler #3
$F01F | 1 | 1 | 1 | Latches #3 | LSB-Puffer

Weiter oben wurde bereits die Funktion der Zähler beschrieben. Da beim Erreichen des Null-Wertes die Auffangregister gleichzeitig in die 8-bit-Zähler geladen werden, ist es wichtig, vom Prozessor gewünschte Änderungen der Auffangregister gleichzeitig in allen 16 Bits vorzunehmen. Die LSB-Zähler besitzen dazu ebenso wie die MSB-Zähler jeweils einen getrennten Eingabebus und Ausgabebus. Der Ausgabebus der LSB-Zähler und der Eingabebus der MSB-Zähler werden über spezielle Puffer(register) geführt. In Tabelle 5.1-1 erkennt man, daß diese Register jeweils unter drei verschiedenen Adressen angesprochen werden. Beispielhaft wird nun die Initialisierung des Zählers #2 erklärt:

Aus KE1, Abschnitt 1.3, wissen Sie, daß der Prozessor MC6809 den speziellen Befehl STD besitzt, mit dem der 16-bit-Akkumulator D in zwei aufeinander folgenden Speicherzellen abgelegt werden kann. Dem Befehl zum Abspeichern von D in den Auffangregistern von Zähler #2

        STD $F01C    entspricht die Befehlsfolge
     1. STA $F01C
     2. STB $F01D

Bei der Ausführung dieser Folge im MC6840 wird im

1. Schritt: | der Akkumulator A in das MSB-Pufferregister übertragen,
2. Schritt: | der Akkumulator B in das Auffangregister des LSB-Zählers #2 und gleichzeitig das MSB-Pufferregister in das Auffangregister des MSB-Zählers #2 übertragen.

5.1/5

Ausführung dieser Befehle in umgekehrter Reihenfolge führt zu einem falschen Initialisierungswert, da nicht der aktuelle Wert in A, sondern ein zufällig vorher im MSB-Puffer gespeicherter Wert ins Latch übertragen wird. Auch Befehle, die Speicherzellen (oder Peripherieregister) modifizieren, z.B. INC, führen zu falschen Ergebnissen.

Beim Lesen des Zählerstandes durch den Prozessor ist es wichtig, daß er beide 8-bit-Zähler zum gleichen Zeitpunkt liest, da sonst durch zwischenzeitlich eintreffende Taktsignale der LSB-Zähler bereits seinen Zustand geändert haben könnte.

Das Lesen wird nun beispielhaft für den Zähler #3 vorgeführt.

Dem Befehl LDD $F01E entspricht die Befehlsfolge

1. LDA $F01E
2. LDB $F01F

Bei der Ausführung dieser Folge im MC6840 wird im

1. Schritt: | der Wert des MSB-Zählers #3 in den Akkumulator A und gleichzeitig der Wert des LSB-Zählers #3 in das LSB-Pufferregister geladen.
2. Schritt: | der Wert des LSB-Pufferregisters in den Akkumulator B übertragen.

### 5.1.2 Die Funktionen

Weiter oben wurden bereits die Betriebsarten beschrieben, in denen die Zähler arbeiten können:

- Im 16-bit-Modus besteht ein Zählzyklus aus (n+1) Taktzyklen, wobei n, 0<n<;216, der Wert der Auffangregister des Zählers ist.
- Im 2x8-bit-Modus besteht ein Zählzyklus aus (k+1)(m+1) Taktzyklen, wobei k und m die Werte des LSB- bzw. MSB-Auffangregisters des Zählers sind (0<k,m<28). Dabei sind zwei Spezialfälle zu berücksichtigen:
  - k=0: Der Ausgang O wechselt nach jedem Zählzyklus (der Länge m+1 Taktzyklen) seinen Zustand. Also wird ein symmetrisches Rechtecksignal (square wave) erzeugt.
  - k=m=0: Am Ausgang O erscheint ein Square Wave-Signal mit der halben Takt- frequenz des Zählers.
- Der Zähler arbeitet als sog. Timer, wenn er mit dem internen oder einem periodischen externen Takt betrieben wird.
- Der Zähler arbeitet als Ereigniszähler, wenn er mit einem externen (meist aperiodischen) Signal am Eingang #C getaktet wird.
- Der Zähler arbeitet im zyklischen Zählmodus, wenn sich am Ausgang O das Signal mit jedem Zählzyklus periodisch wiederholt.
- Der Zähler arbeitet im Single-Shot-Modus (Monoflop-Betrieb), wenn das Signal am Ausgang O einmalig nur während des 1. Zählzyklus nach der Initialisierung des Zählers erscheint. Dabei läuft der Zähler intern kontinuierlich weiter und erzeugt (falls so programmiert) weiterhin Interrupts beim Nulldurchgang.

5.1/6

Im Bild 5.1-4 sind die Ausgangsignale für die genannten Zählmodi dargestellt. Die Zahlen n,m,k haben dabei die oben angegebene Bedeutung. Zu beachten ist noch, daß der Takteingang #C mit der negativen Flanke von E ausgewertet wird und daher die externe Frequenz an #C kleiner als die halbe Frequenz von E sein soll.

Bild 5.1-4: | Die Ausgangssignale in den verschiedenen Betriebsarten |

Der externe Eingang #G (Gate) jedes Zählers wird bei jeder negativen Flanke des Taktsignals E abgefragt und kann zwei verschiedene Funktionen wahrnehmen:

- Als Steuereingang veranlaßt jede negative Flanke an #G die Initialisierung, d.h. das Laden des Zählers aus seinen Auffangregistern. Im zyklischen Zählmodus wird der Zähler nur solange dekrementiert, wie am Eingang #G ein L-Signal anliegt. Im Single-Shot-Modus bleibt eine Änderung des Gate-Signals zum H-Pegel ohne Auswirkung.
- Als Vergleichseingang erlaubt er, ein an diesem Eingang angelegtes digitales Signal zeitlich mit dem Zählzyklus zu vergleichen. Dabei wird der Zähler ebenfalls durch eine negative Flanke am Eingang #G initialisiert und gestartet.

5.1/7

Ist der Eingang #G als Vergleichseingang (Wave Measurement Mode) programmiert, so können die folgenden zwei Vergleiche durchgeführt werden.

- Im Frequenz-Vergleichsmodus wird die Dauer des Zählzyklus mit der Dauer einer Vollschwingung des Signals am Gate-Eingang #G verglichen.
- Im Pulsbreiten-Vergleichsmodus wird die Dauer des Zählzyklus mit der Breite des negativen Impulses des Signals am Eingang #G verglichen.

Das Bild 5.1-5 zeigt die vier möglichen Ergebnisse des Vergleiches.

Bild 5.1-5: | Zum Vergleich des Zählzyklus mit einem externen Signal |

Wahlweise führt das Ergebnis

- Zählzyklus > Vollschwingung oder
- Zählzyklus < Vollschwingung

im Frequenzvergleich,

- Zählzyklus > Impulsbreite oder
- Zählzyklus < Impulsbreite

im Pulsbreitenvergleich

5.1/8

zum Setzen des Interrupt-Flags im Statusregister und damit gegebenenfalls zu einer Unterbrechungsanforderung an den Prozessor.

Das letzte Unterscheidungsmerkmal der Betriebsarten besteht in den Bedingungen, die zu einer Initialisierung der Zähler, d.h. dem Laden aus ihren Auffangregistern führt.

- Im Frequenz- bzw. Pulsbreiten-Vergleichsmodus geschieht dies jeweils durch eine negative Flanke am Eingang #G.
- Im zyklischen oder Single-Shot-Betrieb geschieht dies ebenfalls durch eine negative Flanke am Eingang #G. Darüberhinaus wird es aber auch durch ein L-Signal am externen Rücksetzeingang (Reset) oder aber programmgesteuert (internes Rücksetzen, vgl. Bit 0 im Steuerregister CR#1, s.u.) veranlaßt. Zusätzlich kann gewählt werden, ob auch durch das Einschreiben eines neuen Wertes in die Auffangregister der Zähler eine Initialisierung durchgeführt wird oder nicht.

### 5.1.3 Der Registersatz

Das Statusregister

Im Bild 5.1-6 ist das zentrale Statusregister (SR) dargestellt, das für alle drei Zähler zuständig ist.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
INT | nicht benutzt | INT#3 | INT#2 | INT#1

Bild 5.1-6: Das Statusregister (Adresse: $F019)

Die drei unteren Bits sind als Interrupt-Flags den einzelnen Zählern zugeordnet: INT#i ist Interrupt-Flag von Zähler #i. Dieses Bit wird gesetzt, wenn der Zähler #i abgelaufen ist - unabhängig davon, ob eine Interruptanforderung für den Zähler #i im Steuerregister CR#i (s.u.) aktiviert ist oder nicht. Das Bit 7 (INT) wird als logische Verknüpfung aus den unteren drei Bits gewonnen. Es nimmt den logischen Wert 1 an, sobald eines dieser Bits und im Steuerwort des zugehörigen Zählers das Interrupt Enable Bit 6 (s.u.) gesetzt ist. Anhand des Bits 7 kann der Prozessor zunächst entscheiden, ob vom Baustein MC6840 überhaupt eine Programmunterbrechung angefordert wird. Anhand der Bits 0-2 (INT#i) kann er dann genauer feststellen, welcher Zähler diesen Interrupt wünscht. Das Rücksetzen des Interrupt-Flags eines Zählers geschieht durch eine der folgenden Aktionen:

- ein L-Signal am Reset-Eingang des Bausteins,
- programmgesteuert durch das Bit 0 im Steuerregister CR#1 (s.u., "internes Rück-setzen")
- durch das Lesen des Statusregisters (während das Interrupt-Flag gesetzt ist) und nachfolgendem Lesen des Wertes des Zählers,

  5.1/9

- durch das Einschreiben eines neuen Wertes in die Auffangregister des Zählers.

Die Interruptvektoren zu den Timern #1 - #3 des MC6840 finden Sie in der Tabelle im Anhang A zu KE3.

Das Steuerregister

In der folgenden Beschreibung der Funktion der Bits des Steuerregisters werden die Initialisierungen, die ohne Wahlmöglichkeiten stets durchgeführt werden, nicht mehr explizit aufgeführt. Im Bild 5.1-7 ist der Aufbau des Steuerregisters dargestellt.

Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
OE | IE | Modus, Interr.-Steuerung | ZM#3 | T |

Bild 5.1-7: Die Steuerregister CR#i des MC6840

- Bit 7: (Output-Enable-Bit)

  Bit7=0: | Ausgang O ist gesperrt, d.h. er liegt statisch auf L-Potential,
  Bit7=1: | Ausgang O aktiviert.

- Bit 6: (Interrupt-Enable-Bit)

  Bit6=0: | Interrupt vom Zähler gesperrt (disabled),
  Bit6=1: | Interrupt vom Zähler zugelassen (enabled).

- Bits 5-3: (Ausgabe-Modus und Interrupt-Steuerung)

  5 4 3
  0 0 0 | Zyklischer Zählbetrieb, Initialisierung durch Schreiben der Latches.
  0 0 1 | Frequenzvergleich: Interrupt, falls Zählzyklus > Vollschwingung an #G, Initialisierung durch Schreiben der Latches.
  0 1 0 | zyklischer Zählbetrieb, keine Initialisierung durch Schreiben der Latches.
  0 1 1 | Pulsbreitenvergleich: Interrupt, falls Zählzyklus > Pulsbreite an #G, keine Initialisierung durch Schreiben der Latches.
  1 0 0 | Single-Shot-Betrieb (Monoflop-Betrieb), Initialisierung durch Schreiben der Latches.
  1 0 1 | Frequenzvergleich: Interrupt, falls Zählzyklus < Vollschwingung an #G, Initialisierung durch Schreiben der Latches.
  1 1 0 | Single-Shot-Betrieb, keine Initialisierung durch Schreiben der Latches.
  1 1 1 | Pulsbreitenvergleich: Interrupt, falls Zählzyklus < Pulsbreite an #G, keine Initialisierung durch Schreiben der Latches.

  (Hinweis: Bit 4 steuert die Initialisierung durch Schreiben der Latches.)

  5.1/10

- Bit 2: (Zählmodus-Auswahlbit)

  Bit2=0: | 16-bit-Zählmodus,
  Bit2=1: | 2x8-bit-Zählmodus.

- Bit 1: (Taktauswahl-Bit)

  Bit1=0: | Zähler wird extern über den Eingang C getaktet,
  Bit1=1: | Zähler wird intern vom Systemtakt E getaktet.

- Bit 0:
  Das Bit 0 hat in allen drei Steueregistern CR#1, CR#2, CR#3 völlig unterschiedliche Funktionen:
  - Steuerregister CR#1: internes Rücksetzbit

    Bit0=0: | alle Zähler sind aktiviert,
    Bit0=1: | alle Zähler werden aus ihren Auffangregistern initialisiert (internes Rücksetzen).

  - Steuerregister CR#2: Steuerregister-Adreßbit

    Bit0=0: | CR#3 zum Schreiben vorselektiert,
    Bit0=1: | CR#1 zum Schreiben vorselektiert.

  - Steuerregister CR#3: Taktsteuerung für Zähler #3

    Bit0=0: | Takt wird unverändert zum Zählen benutzt,
    Bit0=1: | Takt wird auf 1/8 seiner Frequenz heruntergeteilt.

  Zum Schluß dieses Abschnittes folgen noch einige Bemerkungen zum Rücksetzen des Bausteins.

- Internes Rücksetzen:
  programmierbar durch Rücksetzen des Bit 0 im Steuerregister CR#1 des Zählers #1 (s.o.). Alle Zähler werden aus ihren Auffangregistern geladen, der Wert der Steuerregister bleibt unverändert.

- Externes Rücksetzen:
  durch ein L-Signal am Eingang RESET des MC6840.
  - Alle Zähler und ihre Auffangregister werden mit dem Wert $FFFF geladen,
  - alle Steuerregister und das Statusregister werden auf den Wert $00 gesetzt, außer Bit 0 in CR#1, d.h. alle Zähler sind deaktiviert!
  - alle Zählerausgänge (O1,O2,O3) und externen Takteingänge (C1,C2,C3) werden gesperrt.

| Inhalt KE5 |  | 5.2 Praktische Übungen MC6840 |