| Inhalt KE5 | 5.2 Praktische Übungen MC6840 |
Im Praktikumsrechner ist als Zeitgeber-/Zähler-Baustein1) der Typ MC6840 eingesetzt, der von der Herstellerfirma Motorola mit dem Namen
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:
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 |
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 |
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:
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.
| 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. |
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. |
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:
Ist der Eingang #G als Vergleichseingang (Wave Measurement Mode) programmiert, so können die folgenden zwei Vergleiche durchgeführt werden.
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
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 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 | |||||||
| |||||||||||||||
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:
Die Interruptvektoren zu den Timern #1 - #3 des MC6840 finden Sie in der Tabelle im Anhang A zu KE3.
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 | |||||||
| |||||||||||||||
| Bit7=0: | Ausgang O ist gesperrt, d.h. er liegt statisch auf L-Potential, |
| Bit7=1: | Ausgang O aktiviert. |
| Bit6=0: | Interrupt vom Zähler gesperrt (disabled), |
| Bit6=1: | Interrupt vom Zähler zugelassen (enabled). |
| 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.)
| Bit2=0: | 16-bit-Zählmodus, |
| Bit2=1: | 2x8-bit-Zählmodus. |
| Bit1=0: | Zähler wird extern über den Eingang C getaktet, |
| Bit1=1: | Zähler wird intern vom Systemtakt E getaktet. |
| Bit0=0: | alle Zähler sind aktiviert, |
| Bit0=1: | alle Zähler werden aus ihren Auffangregistern initialisiert (internes Rücksetzen). |
| Bit0=0: | CR#3 zum Schreiben vorselektiert, |
| Bit0=1: | CR#1 zum Schreiben vorselektiert. |
| 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.
| Inhalt KE5 | 5.2 Praktische Übungen MC6840 |