Mikrocontrollerprogrammierung in Assembler und C

Transcription

Mikrocontrollerprogrammierung in Assembler und C
Kapitel 1
Mikrocontroller-8051-Familie
und AT89C51
Was haben Analog Devices, Atmel, Cypress Semiconductor, Dallas Semiconductor,
Goal, Hynix, Infineon, Intel, OKI, Philips, Silicon Labs, SMSC, STMicroelectronics, Synopsis, TDK, Temic, Texas Instruments und Winbond gemein? Sie alle bieten 8051-basierte Mikrocontrollerbausteine bzw. IP-Cores an!
Aufgrund der großen Verbreitung dieser Mikroprozessorfamilie und damit verbunden mit großen Softwarebibliotheken gibt es auch eine Vielzahl von synthetisierbaren Implementierungen. Diese sind als so genannte IP-Cores in einer
Hardwarebeschreibungssprache wie beispielsweise VHDL frei und im Quelltext
verfügbar. Sie eignen sich für den Einsatz in FPGAs und anwendungsspezifischen
integrierten Schaltungen (ASICs).
1.1
Einführung
Seit der Einführung des 8-Bit-Mikrocontrollers 8048 im Jahre 1976 von Intel, des
ersten Ein-Chip-Mikrocontrollers auf einem einzigen integrierten Baustein, ist
diese so vielseitig einsetzbare Schaltung durch Entwicklung einer Reihe ähnlicher
Bausteine mit unterschiedlichen Zielsetzungen entwickelt worden. Zum Beispiel
wurde beim Mikrocontroller 8049 sowohl die Programm- als auch die Datenspeicherkapazität gegenüber dem 8048 (oder seiner EPROM-Version 8748) verdoppelt. Für Anwendungen, bei denen nur externe Programmspeicherkapazität
erforderlich ist, stehen die Mikrocontroller 8035 und 8039 zur Verfügung. Der
kostengünstige Mikrocontroller 8021 ist für Anwendungen vorgesehen, die mit
einer geringeren Anzahl von Ein/Ausgabeleitungen auskommen und er arbeitet
bei niedrigerer Geschwindigkeit mit einer Teilmenge des 8048-Befehlsvorrats.
Der Mikrocontroller 8051 und seine Nachfolger sind inzwischen eine industrielle
Standardschaltung geworden, die von zahlreichen Halbleiterherstellern angeboten
und weltweit eingesetzt werden. Von beiden Familien haben die Halbleiterhersteller
zahlreiche Schaltkreise in der CMOS-Version zur Verfügung gestellt und entwickelt
und CMOS-Versionen aller anderen Schaltungen sowie weitere Mikrocontroller, die
sich durch zusätzliche anwenderorientierte Funktionen auszeichnen.
Bei allen Herstellern sind zahlreiche Mikrocontroller mit stark erhöhter Integrationsdichte verfügbar, die aufgrund ihrer hohen Leistungsfähigkeit neue Anwen-
27
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
dungsbereiche erschließt. Die Leistungsfähigkeit dieses Mikrocontrollers 8051 ist
gegenüber dem 8048 beträchtlich gesteigert worden, indem ca. 60 000 Transistoren auf die Chipfläche aufgebracht werden. Der 8051 gehört zur MikrocontrollerFamilie 8051, die auch die Mikrocontroller 8031 (ohne ROM) und 8751 (mit
EPROM) umfasst. Die Mitglieder dieser Familie sind die Mikrocontroller 8052
und 8032, die sich durch Verdopplung der RAM-Kapazität auf 256 Bytes sowie –
beim 8052 – durch Verdopplung der ROM-Kapazität auf 8 Kbyte auszeichnen (der
8032 hat kein ROM). Außerdem sind diese beiden Mikrocontroller mit einem
zusätzlichen Timer mit speziellen Eigenschaften ausgerüstet.
Ab 1980 kamen mehrere Einchip-Mikrocontroller aus der Familie 8051 auf den
Markt. Der 83C152 und 83C252 von Intel, der 80C154 von OKI, der 83C552 von
Philips/Valvo, der 82C451 von Philips/Signetics und 80512, 80515 und 80C517 von
Siemens. Alle diese Mikrocontroller sind mit einem Watchdog-Timer, 8-Bit-Analog-/Digital-Wandler, Impulsweitenmodulation und einer seriellen Schnittstelle
nach I²C ausgerüstet.
Die Einchip-Mikrocontroller-Familie hat sehr viele Mitglieder hervorgebracht,
doch weisen alle mehr oder weniger gemeinsame Merkmale auf:
쐽
쐽
쐽
쐽
쐽
쐽
쐽
쐽
8-Bit-Prozessorkern mit einheitlichem Befehlssatz
mindestens 128 Bytes internes RAM
externes RAM und ROM
einheitliches Adressierungsmodell für so genannte »Special Function
Register« (SFR)
Full-Duplex-UART
fünf Interrupt-Quellen
zwei Interrupt-Prioritäten
diverse Timer
Aufgrund der unterschiedlichen Befehlslängen von einem bis zu drei Byte sowie
den unterschiedlichen Ausführungszeiten für einen Befehl handelt es sich eindeutig um eine CISC-Architektur. Neben dem klassischen CISC-Mikrocontroller
(complex instruction set computer), wie man diese bei den Mikroprozessoren in
der PC-Technik findet, verwendet man immer mehr die modernen RISC-Mikrocontroller (reduced instruction set computer). Diese Mikrocontroller setzen einen
reduzierten Befehlssatz ein, der wesentlich effizienter ist und dadurch auch erheblich schneller das Programm abarbeitet. Trotzdem hat die CISC-Architektur erhebliche Vorteile in der Ausbildung und im Studium.
Ein Befehlszyklus entspricht in der ursprünglich von Intel entwickelten Struktur
einem bis drei Maschinenzyklen. Ein Maschinenzyklus entspricht zwölf Taktzyklen. Heute übliche Varianten des 8051 kommen hingegen meist mit zwei Taktzyklen pro Maschinenzyklus aus und damit ist bei gleicher Taktfrequenz eine
deutlich höhere Befehlsabarbeitung möglich.
28
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Eine Besonderheit des 8051 ist der Bitprozessor, der im bitadressierbaren Bereich
eine schnelle und einfache Bitmanipulation erlaubt.
1.1.1
Unterschiede in der Familie 8051
Die in NMOS-Technologie (im Jahr 1976) gefertigten 8051 und 8031 von Intel und
den anderen Halbleiterherstellern wurden ab diesem Zeitpunkt in CMOS-Technik
hergestellt. Auf technische Unterschiede der NMOS- und CMOS-Versionen bezüglich der Oszillator-Beschaltung und des Betriebs bei reduzierter Leistung wird noch
eingegangen. In Tabelle 1.1 sind die Mikrocontroller der Familie 8051 aufgelistet.
Weitere Unterschiede der einzelnen Schaltungen sind in den folgenden Ausführungen beschrieben. Oft wird die Bezeichnung 8051 auch als Oberbegriff für diese
Schaltungen verwendet.
NMOS-Varianten
Typ
ROM RAM Bemerkung
intern intern
8031
–
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen
8032
–
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen
8051
4096
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
8052
8192
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
8751
8192
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
EPROM als OTP oder mit UV-Fenster
CMOS-Varianten
Typ
ROM RAM Bemerkung
intern intern
80C31
–
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen
80C32
–
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen
80C51
4096
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
80C52
8192
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
80C58 32768 256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
maskenprogrammierbares ROM
87C51
8192
128
zwei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
EPROM als OTP oder mit UV-Fenster
87C52
8192
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
EPROM als OTP oder mit UV-Fenster
89C52 32768 256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen,
Flash-Speicher
80C54 16384
Tabelle 1.1:
NMOS- und CMOS-Varianten der Familie 8051
29
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Darüber hinaus gibt es von verschiedenen Firmen erweiterte 8051-Mikrocontroller, z.B. von Siemens (heute Infineon) entwickelt und in NMOS-Technologie hergestellt, wie Tabelle 1.2 zeigt.
Typ
ROM RAM Bemerkung
intern intern
80515
8192
80535 –
Tabelle 1.2:
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen, PWM,
8-fach A/D-Wandler, maskenprogrammierbares ROM
256
drei 16-Bit-Timer, ein UART, zwei externe Interruptquellen, PWM,
8-fach A/D-Wandler
8051-Familie von Siemens (heute Infineon)
Die CMOS-Varianten der Infineon-Serie sind funktionsgleich, allerdings nicht in
allen Varianten pinkompatibel.
Weitere moderne 8051-kompatible Mikrocontroller, die in CMOS-Technologie mit
Flash-Speicher hergestellt werden und eine schnellere Befehlsverarbeitung zulassen sind erhältlich. Tabelle 1.3 zeigt Typen von verschiedenen Herstellern.
Hersteller Typ
Flash RAM Bemerkung
intern intern
ATMEL
AT89C2051
2048
128
nur 20 Pins, kein externer Daten-/Adressbus,
zwei 16-Bit-Timer, ein UART, ein Komparator,
Flash-Speicher
ATMEL
AT89C4051
4096
128
nur 20 Pins, kein externer Daten-/Adressbus,
zwei 16-Bit-Timer, ein UART, ein Komparator,
Flash-Speicher
ATMEL
AT89C51ED2 16384
256
bis zu sechs Ports (je nach Gehäusegröße),
1792 Bytes internes MOVX-SRAM, RS232Bootloader im ROM, 2048 Bytes, internes
Daten-EEPROM, drei 16-Bit-Timer, ein UART,
ein Komparator, zwei Stackpointer, PWM, SPI,
Flash-Speicher
MAXIM/
DALLAS
DS89C430
16384
256
ein Taktzyklus pro Befehl, max. 33 MIPS bei 33
MHz, 1 Kbyte internes MOVX-SRAM, RS232Bootloader im ROM, 2048 Bytes, internes
Daten-EEPROM, drei 16-Bit-Timer, ein UART,
ein Komparator, zwei Stackpointer,
Flash-Speicher
MAXIM/
DALLAS
DS89C450
65536
256
ein Taktzyklus pro Befehl, max. 33 MIPS bei 33
MHz, 1 Kbyte internes MOVX-SRAM, RS232Bootloader im ROM, 2048 Bytes, internes
Daten-EEPROM, drei 16-Bit-Timer, ein UART,
ein Komparator, zwei Stackpointer,
Flash-Speicher
Tabelle 1.3:
8051-kompatible Mikrocontroller in CMOS-Technologie
30
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
In der ursprünglichen Form des 8051 handelt es sich um eine Harvard-Architektur, jedoch besitzen viele neuere 8051-Entwicklerboards eine modifizierte Harvard-Architektur. Mit dieser Architektur wird ein Teil des XRAM (extended data
RAM) mittels eines Adressdecoders in den Programmspeicher gespiegelt. Dies
ermöglicht einer meist ab ROM laufenden Terminalsoftware, z.B. per serielle
Schnittstelle kommende Software in den Programmspeicher zu laden und nach
dem Übertragen auszuführen. Der Stack befindet sich immer frei definierbar im
internen RAM. Die Bytereihenfolge ist »Little Endian First«.
1.1.2
Vom Einchip-Mikrocontroller 8048 zur 8051-Familie
Die Architektur-Erweiterung der Mikrocontroller der Familie 8051 gegenüber dem
industriellen Standard-Einchip-Mikrocontroller 8048 führt sowohl zu einer Leistungserhöhung der Zentraleinheit (CPU) als auch zu einer Erhöhung der
Leistung, der Vielfalt und der Anzahl der auf dem Chip integrierten sonstigen Einheiten. Die Mikrocontroller der Familie 8051 sind daher besonders für Anwendungen geeignet, die eine große Anzahl von Funktionen auf dem Chip sowie eine
hohe Geschwindigkeit erfordern. Den Anwendern des 8048 stellen sie sich als
aufwärts-kompatible Schaltungen mit stark erhöhter Leistungsfähigkeit und
Geschwindigkeit dar.
Der 8051 ist ein 8-Bit-Einchip-Mikrocontroller hoher Leistungsfähigkeit, der für
Anwendungen mit den größten Anforderungen geeignet ist, die von einem derartigen Mikrocontroller bewältigt werden können. Seine hohe Leistungsfähigkeit im
Vergleich zu anderen Mikroprozessoren und Mikrocontrollern zeigt sich vor allem
bei der Lösung schwieriger Realzeitaufgaben, z.B. im Bereich industrieller Steuerungen, in der Peripherie von Großrechenanlagen (als intelligente Schaltungen)
oder für allgemeine Aufgaben im Automobilbau, Haushaltsgeräten usw.
Der 8051 beinhaltet die Hardware-Merkmale, die Architekturerweiterungen sowie
die Befehle, die ein leistungsstarker und kosteneffektiver Mikrocontroller für
Anwendungen haben muss, die bis zu je 64-Kbyte-Programmspeicher- und/oder
Datenspeicher-Kapazität erfordern. Mit diesen Eigenschaften wurde der 8051 zum
Standard-Mikrocontroller in den achtziger Jahre und seine Anwendung hält bis
heute an.
Abbildung 1.1 zeigt Anschlussschema, Logiksymbol und Blockdiagramm des
Mikrocontrollers 8051. Die Funktionen der einzelnen Einheiten werden noch
erklärt. In Tabelle 1.4 finden Sie die Anschlussbelegung der Mikrocontroller der
Familie 8051.
31
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.1:
Anschlussschema, Logiksymbol und Blockdiagramm des Mikrocontrollers 8051
Bezeichnung
Anschluss
USS (0 V)
20
UCC (+5 V) 40
Tabelle 1.4:
Ein- oder
Ausgang
Aktiv
Funktion
Masseanschluss
Anschluss für die Betriebsspannung
Anschlussbelegung der Mikrocontroller der Familie 8051
32
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Bezeichnung
Anschluss
Ein- oder
Ausgang
Aktiv
Funktion
P0.0 bis
P0.7
32 bis 39
E/A
I/O
Port 0 ist ein bidirektionaler 8-Bit-OpenDrain-E/A-Port, der bis zu acht LS-TTL-Lasten aufnehmen oder bei Busoperationen
treiben kann. Anschlüsse von Port 0, die
eine Eins beinhalten, haben schwebendes
Potential und stellen in diesem Zustand
Eingänge hoher Impedanz dar. Port 0 ist
auch der Anschluss für den im MultiplexVerfahren arbeitenden, unteren Adressbus
sowie den Datenbus, während auf einen
externen Speicher zugegriffen wird. In diesem Fall werden während der Ausgabe von
Einsen starke interne Pull-up-Widerstände
verwendet. Port 0 gibt auch bestimmte
Bytes zur Programmüberprüfung aus. Bei
der Anwendung werden externe Pull-upWiderstände benötigt.
P1.0 bis
P1.7
1 bis 8
E/A
I/O
Port 1 ist ein bidirektionaler 8-Bit-E/A-Port
mit internen Pull-up-Widerständen. Seine
Ausgangspuffer können bis zu vier LS-TTLLasten aufnehmen oder abgeben. Die
Anschlüsse von Port 1, in die Einsen
geschrieben sind, werden durch interne
Pull-up-Widerstände auf hohem Potential
gehalten und können in diesem Zustand
als Eingänge dienen. Werden die
Anschlüsse von Port 1 bei Verwendung als
Eingänge extern auf 0-Signal gezogen, so
liefern sie wegen der internen Pull-upWiderstände einen Strom (IIL im Datenblatt).
P2.0 bis
P2.7
21 bis 28
E/A
I/O
Port 2 ist ein bidirektionaler 8-Bit-E/A-Port
mit internen Pull-up-Widerständen. Seine
Ausgangspuffer können bis zu vier LS-TTLLasten aufnehmen oder abgeben. Port 2
gibt das obere Adressbyte während des
Zugriffs auf externe Speicher aus, die
16-Bit-Adressen verwenden. In diesem Fall
werden während der Ausgabe von Einsen
starke interne Pull-up-Widerstände verwendet. Zum Programmieren und bei der
Programmüberprüfung des 8751 dient der
Port 2 zur Aufnahme des höheren Adressbytes und von Steuersignalen, außerdem
zur Programmüberprüfung beim 8051
Tabelle 1.4:
Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)
33
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Bezeichnung
Anschluss
Ein- oder
Ausgang
Aktiv
Funktion
P3.0 bis
P3.7
10 bis 17
E/A
I/O
Port 3 ist ein bidirektionaler 8-Bit-E/A-Port
mit internen Pull-up-Widerständen. Seine
Ausgangspuffer können bis zu vier LSTTL-Lasten aufnehmen oder abgeben.
Die Anschlüsse von Port 3 werden alternativ auch für andere im Folgenden aufgeführte Funktionen verwendet.
P3.0
10
E
I/O
RXD; Eingang für serielle Daten
P3.1
11
A
I/O
TXD; Ausgang für serielle Daten
P3.2
12
E
0
INT0; externer Interrupteingang 0
P3.3
13
E
0
INT1; externer Interrupteingang 1
P3.4
14
E
1
T0; externer Eingang für Zähler 0
P3.5
15
E
1
T1; externer Eingang für Zähler 1
P3.6
16
A
0
WR; Strobe-Signal zum Schreiben in den
externen Datenspeicher
P3.7
17
A
0
RD; Strobe-Signal zum Lesen aus dem
externen Datenspeicher
RST
9
E
0
Rücksetzeingang. Liegt an diesem
Anschluss während zweier Maschinenzyklen ein 1-Signal und läuft der Taktgeber,
so wird die Schaltung zurückgesetzt.
ALE/
PROG
30
A
I/O
(Address Latch Enable), Ausgangsimpuls
zur Zwischenspeicherung des unteren
Adressbytes während des Zugriffs auf einen
externen Speicher. ALE wird mit konstanter
Frequenz (1/6 der Oszillatorfrequenz) auch
dann erzeugt, wenn auf den externen Speicher nicht zugegriffen wird. Es steht für
einen etwa benötigten externen Takt oder
externe zeitliche Abläufe zur Verfügung.
(Allerdings wird bei jedem Zugriff auf einen
externen Datenspeicher ein ALE-Impuls
übersprungen.) Zum Programmieren des
EPROM (8751) erhält dieser Anschluss den
Programmierimpuls (PROG).
PSEN
29
Tabelle 1.4:
(Programm Store Enable). Strobe-Signal
zum Lesen des externen Programmspeichers. Beim Lesen aus diesem Speicher
wird PSEN zweimal während eines jeden
Maschinenzyklus aktiviert, jedoch erfolgt
beim Zugriff auf einen externen Datenspeicher keine Aktivierung. Auch wird
PSEN beim Lesen aus dem internen Programmspeicher nicht aktiviert.
Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)
34
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Bezeichnung
Anschluss
Ein- oder
Ausgang
Aktiv
Funktion
EA/UPP
31
A
0
(External Access). Wenn EA auf 1-Signal
gehalten wird, liest die CPU aus dem
internen Programmspeicher, es sei denn,
der Programmzähler überschreitet den
Wert 0FFFH (beim 8051). Hält man EA
jedoch auf 0-Signal, so wird die CPU
gezwungen, unabhängig vom Wert des
Programmzählers aus dem externen Programmspeicher zu lesen. Beim 8031 muss
EA durch externe Verdrahtung auf 0
gebracht werden. Zum Programmieren
des EPROM (8751) wird die Programmierspannung UPP = 21 V an diesen
Anschluss gelegt.
XTAL1
19
E
0
Eingang zum invertierenden Verstärker
des Taktgenerators
XTAL2
18
A
Tabelle 1.4:
1.1.3
Ausgang vom invertierenden Verstärker
des Taktgenerators
Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)
Bussysteme
Drei Bussysteme verbinden die drei Funktionseinheiten Mikrocontroller, Speicher
(RAM und ROM), sowie die Ein-/Ausgabebaugruppen, wie Abbildung 1.2 zeigt.
쐽
Datenbus: Acht Leitungen, auf denen die Daten zwischen Mikrocontroller,
Speichereinheiten (RAM und EPROM) und I/O-Einheiten übertragen werden.
Der Datenbus kann in beide Richtungen übertragen (Zweiweg-Datenübertragung).
쐽
Adressbus: 16 Leitungen, über die bestimmte Speicherplätze oder Ein-/Ausgabebaugruppen ausgewählt werden (Einweg-Datenübertragung), wobei acht
kombinierte Leitungen auf dem Datenbus vorhanden sind. Aus diesem Grunde ist der ALE-Ausgang (Adress Latch Enable) für die Zwischenspeicherung
der Adressen notwendig.
쐽
Steuerbus: Sechs Leitungen, die dem Prozessorzustand entsprechende Steuersignale übertragen (Einweg-Datenübertragung)
Speicher werden nicht nur zur Aufbewahrung von Befehlen (Anweisungen) benötigt. Es können auch Daten anfallen, die zur Durchführung eines Programms
erforderlich sind. Es werden zwei Arten von Daten unterschieden: Zum einen gibt
es Daten, deren Wert sich nicht ändert wie z.B. die Zahl  = 3,141..., Zahlen dieser
Art heißen Konstanten. Zum anderen gibt es Daten, deren Werte sich ändern können. Diese veränderbaren Daten sind Variablen.
35
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.2:
Bussysteme in einem Mikrocontroller
Der gesamte Speicher kann sich aus unterschiedlichen Bausteinen und Technologien zusammensetzen. Zum Speichern von unveränderlichen Daten benutzt man
Speicherbausteine, deren Inhalt sich nach dem Programmieren nicht mehr verändern lässt. Damit geht nach dem Abschalten der Betriebsspannung auch der
Inhalt dieser Speicher nicht mehr verloren. Der Inhalt solcher Speicher kann während des Betriebs nur gelesen, nicht aber überschrieben werden. Speicher dieser
Art werden als Nur-Lese-Speicher, Festwertspeicher oder Festspeicher bezeichnet.
Die gebräuchliche Abkürzung ist ROM (Read Only Memory).
Als Arbeitsspeicher für variable Daten sind Speicherbausteine erforderlich, in
denen sich auch während des Betriebs die Daten noch ändern lassen. Solche Speicher nennt man Schreib-Lese-Speicher, abgekürzt RAM (Random Access
Memory).
ROM- und RAM-Bausteine arbeiten mit wahlfreiem Zugriff, was bedeutet, dass
die Speicherplätze in beliebiger Reihenfolge ansprechbar und gleich schnell
erreichbar sind.
1.1.4
Programmierung in Assemblersprache
In diesem Abschnitt erhalten Sie eine kurze Beschreibung des Mikrocontrollers
als Grundlage für die Programmierung in Assemblersprache.
36
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Im 8051 sind folgende wesentliche Teile integriert:
쐽
Mehrere Arbeitsregister zur Durchführung der Operationen und zur Adressierung
쐽
Der Befehlszähler, der die Adresse des nächsten auszuführenden Befehls enthält
쐽
Der Stackpointer, dessen Inhalt die Anfangsadresse des Stacks im Rahmen des
Arbeitsspeichers definiert. Durch diesen Stack wird die Verwendung von Unterprogrammen und Unterbrechungsprogrammen (Interrupt-Subroutinen)
besonders erleichtert.
Zu diesen, auf dem Mikrocontroller integrierten Funktionseinheiten kommen
noch folgende Teile, über die der Programmierer unbedingt Bescheid wissen
muss:
쐽
Der Programmspeicher (aufgebaut mit ROMs, PROMs, EPROMs oder Flash),
in dem das Anwendungsprogramm oder die Konstanten des Mikrocomputers
abgespeichert sind und der byteweise adressiert wird
쐽
Der Datenspeicher, der mit RAMs aufgebaut ist (Schreib-Lese-Speicher), in
dem die Momentan-Ergebnisse bzw. Daten des Mikrocomputers abgespeichert
sind und der ebenfalls byteweise adressiert wird
쐽
Die Eingabe-Ausgabesteuerung, die aus Bausteinen besteht, über die der Mikroprozessor mit seiner Umgebung in Kontakt steht
Im Mikrocontroller stehen ein 8-Bit-Akkumulator und mehrere 8-Bit-Zwischenregister zur Verfügung. Diese acht Register werden über die Ziffern 0 bis 7 in einer
Speicherbank angesprochen. Die Registerpaaranordnung ist:
쐽
Der Befehlszähler ist ein dem Programmierer zugängliches 16-Bit-Register,
das die Adresse des nächsten auszuführenden Befehls enthält.
쐽
Der Stack ist ein Teil des Arbeitsspeichers (RAM), der vom Programmierer definiert wird. In ihm sind Daten oder Adressen gespeichert, die gegebenenfalls
durch Stackoperationen aufgefunden werden können. Eine Reihe der Befehle
sind in der Lage, auf diesen Stack zuzugreifen, und erleichtern somit das Arbeiten mit Unterprogrammen und Unterbrechungen (Interrupts). Das Stackpointerregister erlaubt dem Programmierer den Zugriff auf die Adressen des
Stacks.
쐽
Verbindung zur Außenwelt stellt im System der Mikrocontroller über seine
maximal 256 Eingabe- und 256 Ausgabeports (Port = Kanal) her. Jeder dieser
Ports verkehrt mit dem Mikrocontroller über Datenbytes, die entweder den Akkumulator setzen oder von ihm gesetzt werden. Jedem dieser Ports ist eine
Zahl zwischen 0 und 255 zugeordnet. Auf diese Zuordnung hat der Programmierer keinen Einfluss.
37
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Ein Programm besteht aus einer Reihe von Befehlen. Jeder Befehl löst eine elementare Operation, wie eine Datenübertragung, eine arithmetische oder logische
Operation mit einem Datenbyte bzw. -wort, oder eine Änderung der Reihenfolge
der auszuführenden Befehle aus. Ein Programm wird als eine Reihe von Bits
dargestellt, die die Befehle des Programms repräsentieren und die wir hier mit
hexadezimalen Ziffern symbolisieren. Die Speicheradresse des nächsten, auszuführenden Befehls steht im Befehlszähler (Program Counter). Vor der Ausführung eines Befehls wird der Befehlszähler um 1 erhöht und enthält so die Adresse
des nächstfolgenden Befehls. Das Programm läuft prinzipiell sequenziell ab, bis
ein Sprungbefehl (Jump, Call oder Return) ausgeführt wird, wobei der Befehlszähler auf eine vom linearen Ablauf abweichende Adresse gesetzt wird. Das Programm wird von dieser neuen Speicheradresse an wieder sequenziell fortgesetzt.
Der Inhalt eines Speicherplatzes gibt im Prinzip keinen Hinweis darauf, ob das
betreffende Byte einen Befehl oder Daten darstellt. So entspricht beispielsweise
der Hexadezimalcode 1FH dem Befehl RAR (schiebe den Inhalt des Akkumulators
nach rechts, zyklisch, mit Übertrag), was aber ebenso gut den Datenwert 1FH
(dezimal 31) darstellen kann. Es ist aber wichtig, in einem Programm sicherzustellen, dass Daten nicht als Befehle interpretiert werden und durch Trennung von
Programm und Datenspeicher kann dies einfach erreicht werden.
Jedes Programm hat eine Anfangsadresse, die auf das erste Byte des ersten auszuführenden Befehls hindeutet. Bevor der erste Befehl ausgeführt wird, wird der
Befehlszähler automatisch auf die Adresse des nächsten (auszuführenden)
Befehls gesetzt. Diese Prozedur wird für jeden Befehl des Programms wiederholt.
Zur Darstellung eines Befehls sind ein, zwei oder drei Bytes nötig. In jedem Fall
wird der Befehlszähler automatisch auf den Beginn des nächsten Befehls gesetzt,
wie das Beispiel in Tabelle 1.5 zeigt.
Zur Vermeidung von Fehlern muss der Programmierer sicherstellen, dass auf
einen Befehl nicht ein Datenbyte folgt, soweit nach diesem Befehl noch ein weiterer Befehl zu erwarten ist. So wird z.B. im Byte 021EH ein Befehl erwartet, weil
Befehl Nr. 8 nach Befehl Nr. 7 ausgeführt werden muss. Enthält Byte 021EH
Daten, so kann das Programm nicht richtig ablaufen. Aus diesem Grund dürfen
Daten auf keinen Fall zwischen Befehlen abgespeichert werden.
Programmsprungbefehle verursachen einen Sprung zu einem Befehl, der an
irgendeiner Stelle im Speicher liegen kann. Die durch den Sprungbefehl angesprochene Adresse muss wiederum die Adresse eines Befehls sein. Es muss also
auch hier sichergestellt werden, dass das adressierte Byte keine Daten enthält, weil
sonst das Programm nicht richtig ausgeführt werden kann.
38
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Speicheradresse
Befehls-Nr. Inhalt des Befehlszählers
0212
1
0213
0213
2
0215
0215
3
0216
0216
4
0219
5
021B
021B
6
021C
021C
7
021F
021F
8
0220
0220
9
0221
0221
10
0222
0214
0217
0218
0219
021A
021D
021E
Tabelle 1.5:
1.1.5
Beispiel zum Setzen des Befehlszählers
Speicheradressierung
Die Adressierung ist ein besonders wesentlicher Teil beim Aufbau eines Programms. Der Mikrocontroller bietet mehrere Möglichkeiten zur Adressierung:
쐽
Bei der direkten Adressierung liefert der Befehl »explizit« eine Speicheradresse. Der Befehl »lade den Inhalt der Speicheradresse 1F2A in den Akkumulator« ist ein Beispiel für den Befehl mit direkter Adressierung, wobei 1F2A die
direkte Adresse ist. Im Speicher wird das folgendermaßen aussehen:
Speicheradresse
n
3A
n + 1
2A
n + 2
1F
auszuführender Befehl
Durch den Befehl werden drei Bytes im Speicher belegt, von denen das zweite
und dritte direkt die Adresse enthält.
39
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
쐽
Die Speicheradresse kann auch durch den Inhalt eines Registerpaares spezifiziert sein.
Für fast alle Befehle müssen hierbei die internen Register verwendet werden.
Ein Einbytebefehl, der den Akkumulator mit dem Inhalt der Speicheradresse
1F2A lädt, sieht folgendermaßen aus:
Speicher
Register
B
Auszuführender Befehl  7E
C
D
E
1F
H
2A
L
A
Außerdem gibt es zwei Befehle, die das Register zur Adressierung verwenden. Wie
oben erwähnt, enthält das erste Register des Paares die höherwertigen und das
zweite Register die niederwertigen Stellen der Adresse.
쐽
Jeder beliebige Speicherplatz kann auch über den 16-Bit-Stackpointer adressiert werden. Es gibt nur zwei verschiedene Stackoperationen: das Eingeben
der Daten in den Stack, das als PUSH, und das Auslesen von Daten aus dem
Stack, das als POP bezeichnet wird. Voraussetzung für die Operation PUSH ist
selbstverständlich, dass sich der Stack in einem RAM befindet, da ja sonst kein
Einschreiben in den Speicher durchgeführt werden kann.
쐽
Durch jede PUSH-Operation werden 16 Datenbits aus einem Registerpaar
oder vom Befehlszähler in den Stack gebracht. Die Adresse des Speicherbereichs, auf den während des PUSH-Befehls zugegriffen wird, bestimmt man
durch den Stackpointer in folgender Weise:
쐽
die höchstwertigen acht Datenbits werden auf dem Speicherplatz abgespeichert, der durch den Stackpointer minus 1 adressiert ist,
쐽
die niedrigstwertigen acht Datenbits werden auf dem Speicherplatz abgespeichert, der durch den Stackpointer minus 2 adressiert wird,
쐽
der Inhalt des Stackpointers wird automatisch um 2 verringert.
Im nachfolgenden Beispiel sind die Verhältnisse für den Fall dargestellt, dass
der Stackpointer 13A6H enthält, während das Register B6AH und das Register
030H enthält:
40
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
vor PUSH-Befehl
쐽
Speicheradresse
nach PUSH-Befehl
SP
FF
13A3
FF
SP
13A6
FF
13A4
30
13A4
B
FF
13A5
6A
B
6A
FF
13A6
FF
6A
C
C
30
30
Durch jede POP-Operation werden acht Datenbits vom Stack in ein Registerpaar oder in den Befehlszähler gebracht. Die Speicheradresse, auf die durch die
POP-Operation zugegriffen wird, wird durch folgende Verwendung des Stackpointers bestimmt:
1) Das zweite Register oder die niedrigstwertigen acht Bits des Befehlszählers
werden mit dem Inhalt der Speicherstelle geladen, auf die der Stackpointer
zeigt.
2) Das erste Register des Paares oder die höchstwertigen acht Bits des Befehlszählers werden mit dem Inhalt der Speicherstelle geladen, die durch den Stackpointer +1 adressiert wird.
3) Der Stackpointer wird automatisch um 2 erhöht.
Im folgenden Beispiel soll angenommen werden, dass der Stackpointer 1508H
(Speicherstelle 1508H) den Wert 33H enthält und die Speicherstelle 1509H
den Wert 0BH beinhalten soll. Eine POP-Operation in das Registerpaar H
würde folgendermaßen aussehen:
vor POP-Befehl
SP
FF
Speicheradresse
1507
nach POP-Befehl
FF
SP
1508
33
1508
33
150A
H
0B
1509
0B
H
FF
FF
150A
FF
0B
L
L
FF
33
Der Programmierer bestimmt den Wert des Stackpointers. Die Definition des
Stackpointer-Inhalts vor irgendeiner Stackoperation ist nötig, um eine richtige
Funktion des Programms zu gewährleisten.
41
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Bei unmittelbarer Adressierung enthält der Befehl eine Konstante. Der Befehl
MOV A, 2AH »Lade den Akkumulator mit dem Wert 2AH« ist ein Beispiel für eine
solche unmittelbare Adressierung. Im Speicher hat dieser Befehl folgendes
Aussehen:
Speicherinhalt
3E

Lade Akkumulator unmittelbar
2A

In den Akkumulator zu ladender Wert
1.1.6
Unterprogramme und die Verwendung des Stacks
für die Adressierung
Zunächst soll kurz der Begriff »Unterprogramm« erläutert werden. Als Beispiel
wollen wir die häufig nötige Operation des Multiplizierens verwenden. Der Mikrocontroller soll über keinen Befehl für eine Multiplikation verfügen, bietet aber die
Möglichkeit, ein Byte zu einem anderen zu addieren. Man könnte daher eine
Multiplikation ausführen, indem man derartige Additionen mehrere Male hintereinander (je nach Größe des Multiplikators) ausführt. Will man eine Multiplikation an mehreren Stellen des Programms durchführen, so müsste man an jeder
dieser Stellen die ganze Reihe der eben genannten Befehle einfügen. Dazu wäre
natürlich sehr viel Speicherplatz nötig:
Programm
Multiplikationsroutine
Programm
Multiplikationsroutine
Programm
Multiplikationsroutine
usw.
Da das Unterprogramm für Multiplikation immer gleich bleibt, ist es eigentlich
überflüssig, es jedes Mal einzufügen. Es ist viel besser, es nur abzuspeichern und
jedes Mal auszuführen, wenn es benötigt wird:
Programm
Programm
Multiplikationsroutine
Programm
42
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Eine solche Routine nennt man ein Unterprogramm. Der Mikrocontroller bietet die
Möglichkeit zum Aufruf von Unterprogrammen und zum Rücksprung in das
Hauptprogramm. Im Einzelnen sieht der Programmablauf unter Verwendung
von Unterprogrammen folgendermaßen aus:
Hauptprogramm

Aufrufbefehl
Unterprogramm
nächster Befehl

(Pfeile bezeichnen Reihenfolge der Ausführung)
Hierbei wird also während der Ausführung des Aufrufbefehls (z.B. CALL) die
Adresse des folgenden Befehls (das ist der Inhalt des Befehlszählers) in den Stack
gebracht und das Unterprogramm ausgeführt. Der letzte Befehl eines Unterprogramms ist gewöhnlich ein Rücksprungbefehl (z.B. RET), der eine Adresse vom
Stack holt und in den Befehlszähler einschreibt. Dadurch wird das Hauptprogramm bei dem auf den Aufrufbefehl folgenden Befehl fortgesetzt. Unterprogramme können beliebig geschachtelt sein. Die einzige Grenze hierfür bildet der
Speicherplatz, der für den Stack zur Verfügung steht. Dabei ist der Rückweg aus
der Verschachtelung identisch mit der Reihenfolge der Aufrufe, auch wenn das
Unterprogramm mehrmals aufgerufen wird.
1.1.7
Register des Mikrocontrollers 8051
Der Mikrocontroller 8051 verfügt über getrennte Adressierbereiche für den Programmspeicher und den Datenspeicher. Der externe Programmspeicher kann bis
zu 64 Kbyte umfassen. Außerdem befinden sich im ROM auf dem Chip des 8051
weitere 4 Kbyte. Der Datenspeicher besteht aus einem auf dem Chip befindlichen
RAM von 128 Bytes. In einem weiteren Adressierbereich von 128 Bytes sind nur 21
Bytes mit speziellen Funktionsregistern belegt. Außerdem kann die Schaltung auf
bis zu 64 Kbyte eines externen Datenspeichers zugreifen. Abbildung 1.4 zeigt die
Blockschaltung des 8051.
43
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.3:
Blockschaltung des Mikrocontrollers 8051
In Tabelle 1.6 sind die 21 speziellen Funktionsregister mit ihren Kurzbezeichnungen sowie Speicherplätzen aufgeführt und anschließend kurz beschrieben. Die
44
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
mit einem Stern versehenen Register sind sowohl byte- als auch bitadressierbar
(11 Register mit Adressen, die durch 8 ohne Rest teilbar sind).
Kurzbezeichnung
(für Assembler)
Register
Adresse
Dezimal
Hexadezimal
ACC*)
Akkumulator
224
E0
B*)
Register B
240
F0
PSW*)
Programmstatuswort
208
D0
SP
Stackpointer
129
81
DPH
Datenzeiger (DPTR) oberes Byte
131
83
DPL
Datenzeiger (DPTR) unteres Byte
130
82
P0*)
Port 0
128
80
P1*)
Port l
144
90
P2*)
Port 2
160
A0
P3*)
Port 3
176
B0
IP*)
Interrupt-Prioritätenregister
184
B8
IE*)
Interrupt-Freigaberegister
168
A8
TMOD
Zeitgeber/Zähler-Betriebsart-Register
137
89
TCON*)
Zeitgeber/Zähler-Steuerregister
136
88
TH0
Zeitgeber/Zähler 0 (oberes Byte)
140
8C
TL0
Zeitgeber/Zähler 0 (unteres Byte)
138
8A
TH1
Zeitgeber/Zähler 1 (oberes Byte)
141
8D
TL1
Zeitgeber/Zähler 1 (unteres Byte)
139
8B
SCON*)
serielles Steuerregister
152
98
SBUF
serieller Datenpuffer
153
99
PCON
Leistungsaufnahme-Steuerregister
135
87
Tabelle 1.6:
Spezielles Funktionsregister des 8051
*): auch bitadressierbar
Akkumulator (Register A): Das Register ACC ist der Akkumulator. In den mnemonischen Kurzbezeichnungen, die für Befehle mit Bezug auf den Akkumulator verwendet werden, wird der Akkumulator nur mit A bezeichnet.
Register B: Das Register B wird beim Multiplizieren und Dividieren benötigt. Bei
der Abarbeitung anderer Befehle kann es als weiterer schneller Hilfsspeicher dienen.
Programmstatusregister: Das Programmstatusregister (PSW) enthält das in Tabelle
1.7 beschriebene Programmstatuswort.
45
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
höchstwertiges
Bit
niedrigstwertiges
Bit
CY
AC
F0
RS1
RS0
CV
–
P
Symbol
Bit-Speicherstelle
Name und Bedeutung
CY
PSW.7
Übertragsbit
AC
PSW.6
Hilfsübertragsbit (für BCD-Operationen)
F0
PSW.5
Kennzeichnungsbit 0 (steht dem Anwender für allgemeine Zwecke zur Verfügung)
RS1
PSW.4
RS0
PSW.3
{
Registerbank-Auswahlbits 1 bzw. 0. Werden durch
Software gesetzt oder gelöscht, um die Registerbank
auszuwählen, in der gearbeitet werden soll. *)
OV
PSW.2
Überlaufbit
–
PSW.1
in Reserve
P
PSW.0
Paritätsbit. Wird durch Hardware bei jedem Befehlszyklus gesetzt bzw. gelöscht, um eine ungerade bzw.
gerade Anzahl von Einsen im Akkumulator anzuzeigen
(d.h. gerade Parität).
*)Durch RS1 und RS0 wird diese Registerbank wie folgt festgelegt:
Tabelle 1.7:
RS1
RS0
Bank
Speicherplätze
0
0
0
00H bis 07H
0
1
1
08H bis 0FH
1
0
2
10H bis 17H
1
1
3
18H bis 1FH
Programmstatusregister
Der Mikrocontroller hat fünf verschiedene Bedingungsbits zur Verfügung, um das
Resultat von Operationen zu kennzeichnen. Alle bis auf eines (das Hilfs-Carrybit)
können durch Befehle getestet werden, die den nachfolgenden Befehlsablauf
bestimmen. An dieser Stelle wird vereinbart, dass ein Bit »gesetzt« ist, wenn es
den Wert »1« hat, und »rückgesetzt« ist, wenn es den Wert »0« hat.
쐽
Carrybit (Überlaufbit oder Übertragsbit): Das Carrybit CY wird durch verschiedene Befehle gesetzt und kann direkt abgefragt werden. Die Operationen, die
das Carrybit verändern, sind Addition, Subtraktion, zyklisches Schieben und
logische Operationen. So kann z.B. die Addition von zwei 1-Byte-Zahlen einen
Überlauf (Carry) an der höchsten Stelle hervorrufen.
46
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.1
Einführung
Bit-Nr.
7
6
5
4
3
2
1
0
AE =
+74 =
122
1
0
0
0
1
0
1
1
1
0
1
0
1
0
0
1
1
0
1
0
1
0
0
0
Überlauf = 1, setzt Carrybit = 1
Eine Addition mit Überlauf an der höchsten Stelle setzt das Carrybit. Eine
Addition ohne Überlauf setzt das Carrybit zurück. Hier soll noch eigens darauf
hingewiesen werden, dass Addition, Subtraktion, zyklisches Schieben und logische Befehle das Carrybit in verschiedenartiger Weise behandeln.
쐽
Hilfs-Carrybit (Hilfsüberlaufbit oder Hilfsübertragsbit): Das Hilfs-Carrybit AC
zeigt den Überlauf aus dem ersten Halbbyte (Bit 3 des Datenbytes) an. Der
Wert dieses Bits kann nicht direkt getestet werden, beeinflusst aber die Funktion des Befehls DAA.
Die folgende Addition setzt das Hilfs-Carrybit und das Carrybit zurück:
Bit-Nr.
7
6
5
4
3
2
1
0
2E =
+74 =
A2
0
0
1
0
1
0
1
1
1
0
1
0
1
0
0
1
1
0
1
0
1
0
0
0
Carrybit = 0
Hilfs-Carrybit = 1
Das Hilfs-Carrybit wird durch Additions-, Subtraktions-, Inkrement-, Dekrement- und Vergleichsbefehle verändert.
쐽
Signbit (Vorzeichenbit): Im Mikroprozessor ist grundsätzlich kein Vorzeichen
eines Datenbytes festgelegt; man kann daher ein Byte mit dem numerischen
Wert 128 als plus 128 oder aber auch als minus 128 interpretieren. Zur Unterscheidung der beiden Möglichkeiten verwendet man das Bit 7 als Vorzeichen.
Hat es den Wert 1, so wird die Zahl im Byte als negativ angesehen (von minus 1
bis minus 128), hat Bit 7 den Wert 0, so wird die Zahl des Bytes als positive
Zahl (von 0 bis plus 127) interpretiert.
Bei arithmetischen und logischen Operationen wird das Signbit dem Bit 7 des
Ergebnisses gleichgesetzt; es kann dann als Bedingungsbit abgefragt werden.
쐽
Zerobit (Nullbit): Dieses Bedingungsbit wird dann gesetzt, wenn das Ergebnis
eines arithmetischen oder logischen Befehls null ist. Das Zerobit wird rückgesetzt, wenn das Ergebnis dieses Befehls ungleich null ist.
Ist das Ergebnis gleich null und das Carrybit gesetzt, so wird das Zerobit ebenfalls gesetzt.
47
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Bit-Nr. 7
6
5
4
3
2
1
0
1
0
0
1
1
0
0
1
0
1
1
0
1
0
1
1
0
0
0
0
0
0
0
0
1
Überlauf
von Bit 7

Nullergebnis:
Zerobit auf 1 gesetzt
쐽
Paritybit (Paritätsbit): Nach arithmetischen und logischen Operationen wird eine
Paritätsprüfung vorgenommen. Die Anzahl der gesetzten Bits in einem Byte
wird dabei gezählt; ist das Ergebnis ungerade, wird das Paritybit zurückgesetzt,
ist das Ergebnis gerade, wird das Paritybit gesetzt.
쐽
Stackpointer: Der acht Bit breite Stackpointer (SP) wird inkrementiert, bevor
Daten während der Ausführung eines PUSH- oder CALL-Befehls gespeichert
werden. Während der Stack im Allgemeinen irgendwo im RAM (auf dem Chip)
untergebracht sein kann, zeigt der Stackpointer nach einem Rücksetzvorgang
auf den Speicherplatz 07H. Dies veranlasst den Stackpointer, mit Speicherplatz
08H zu starten.
쐽
Datenzeiger: Der 16-Bit-Datenzeiger (DPTR) besteht aus den Registern DPH
(oberes Byte) und DPL (unteres Byte). Er enthält eine 16-Bit-Adresse und kann
entweder als 16-Bit-Register oder als zwei unabhängige 8-Bit-Register arbeiten.
쐽
Ports 0 bis 3: Die speziellen Funktionsregister P0, P1, P2 und P3 sind die Zwischenspeicher.
쐽
Zeitgeber-Register: Die Registerpaare TH0 und TL0 sowie TH1 und TL1 sind
16-Bit-Zählregister für die Zeitgeber/Zähler 0 bzw. 1.
쐽
Serieller Datenpuffer: Der serielle Datenpuffer (SBUF) besteht eigentlich aus
zwei separaten Registern, nämlich einem Sende- und einem Empfangspufferregister. Wenn Daten nach SBUF transportiert werden, so erfolgt dies in das
Sendepufferregister; der Transport eines Bytes nach SBUF löst dann die Übertragung in eine externe Einheit aus. Werden Daten von SBUF geholt (von einer
Einheit auf dem Chip), so kommen sie aus dem Empfangspufferregister.
쐽
Steuerregister: Die speziellen Funktionsregister IP, IE, TMOD, TCON, SCON
und PCON enthalten Steuer- und Statusbits für das Interrupt-System, die Zeitgeber/Zähler und den seriellen Port. Sie werden in späteren Abschnitten beschrieben.
1.2
Oszillator- und Taktgeberschaltung
XTAL1 und XTAL2 sind der Eingang und Ausgang eines einstufigen, auf dem
Chip befindlichen Inverters, der zusammen mit externen Bauelementen (Abbildung 1.4a) zur so genannten Pierce-Schaltung (Abbildung 1.4b) aufgebaut wird.
48
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.2
Oszillator- und Taktgeberschaltung
Die Schaltung auf dem Chip sowie die Auswahl der externen Bauelemente zum
Aufbau des Oszillators werden in den folgenden Abschnitten sowohl für die
NMOS- als auch für die CMOS-Version des Mikrocontrollers beschrieben.
Abb. 1.4:
a: Beschaltung der Anschlüsse XTAL1 und XTAL2 mit einem Quarz oder einem
keramischen Resonator sowie zwei Kondensatoren. Man achte auf kurze, direkte
Masseverbindung zwischen Mikrocontroller und Kondensatorfußpunkten.
b: Prinzip des Pierce-Oszillators
In jedem Fall treibt der Oszillator den internen Taktgenerator. Dieser liefert die
internen Taktsignale für die auf dem Chip befindlichen Schaltungen. Die Frequenz der internen Taktsignale beträgt die Hälfte der Oszillatorfrequenz und legt
die internen Phasen, Schritte und Maschinenzyklen fest, die später noch beschrieben werden.
Wie bei der NMOS-Version besteht auch die auf dem Chip des 80C51 befindliche
Oszillatorschaltung (Abbildung 1.5) aus einem einstufigen linearen Inverter, der
zum Betrieb als quarzgesteuerter Oszillator mit positiver Reaktanz vorgesehen ist.
Dennoch sind einige wichtige Unterschiede vorhanden.
Einer der Unterschiede besteht darin, dass der Oszillator mittels Software abgeschaltet werden kann, indem ein 1-Signal in das Bit PD im speziellen Funktionsregister PCON geschrieben wird. Ein weiterer Unterschied ist durch die Tatsache
gegeben, dass die interne Taktschaltung des 80C51 durch Signale am Anschluss
XTAL1 betrieben wird, während dies bei der NMOS-Version am Anschluss XTAL2
erfolgt.
49
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.5:
Oszillatorschaltung auf dem Chip des Mikrocontrollers 80C51 (CMOS-Version)
Der Rückkopplungswiderstand Rf setzt sich aus parallel geschalteten n-Kanal- und
p-Kanal-Feldeffekttransistoren zusammen, die durch das Bit PD gesteuert werden,
und zwar ist Rf abgeschaltet, wenn PD = 1 ist. Die Dioden Dl und D2, die als
Klemmdioden für UCC (+5 V) und USS (0 V) dienen, sind parasitär zu dem aus
Feldeffekttransistoren bestehenden Widerstand Rf.
Abb. 1.6:
Funktionale Darstellung der Oszillatorschaltung auf dem Chip des 80C51 (CMOSVersion) im Zusammenspiel mit der äußeren Beschaltung
50
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.2
Oszillator- und Taktgeberschaltung
Der Oszillator kann mit denselben externen Bauelementen wie die NMOS-Version aufgebaut werden, wie auch Abbildung 1.6 zeigt. Typische Werte sind C1 = C2
= 30 pF, wenn ein Quarz eingesetzt wird, und C1 = C2 = 47 pF bei Verwendung
eines keramischen Resonators.
Abb. 1.7:
Anschluss eines externen Taktgenerators an den 80C51 (CMOS-Version)
Beim Betrieb der CMOS-Version (Abbildung 1.7) mit einem externen Taktgenerator wird das externe Taktsignal an den Anschluss XTAL1 gelegt, während XTAL2
unbeschaltet bleibt.
Ein Maschinenzyklus besteht aus sechs Schritten (zwölf Oszillatorperioden). Jeder
Schritt wird eingeteilt in eine Hälfte für Phase 1, während der Takt von Phase 1
aktiv ist, und in eine Hälfte für Phase 2, während der Takt von Phase 2 aktiv ist.
Somit besteht ein Maschinenzyklus aus zwölf Oszillatorperioden. Jede Phase dauert eine Oszillatorperiode, jeder Schritt zwei Oszillatorperioden. Im Allgemeinen
finden arithmetische und logische Operationen während Phase 1 statt, interner
Datentransfer (von einem Register zum anderen) dagegen während Phase 2.
Die Ausführung eines 1-Zyklus-Befehls beginnt, wenn der Befehlscode im
Befehlsregister zwischengespeichert wird. Handelt es sich um einen 2-ByteBefehl, so wird das zweite Byte während desselben Maschinenzyklus gelesen.
Handelt es sich dagegen um einen 1-Byte-Befehl, so findet zwar ein Speichervorgang statt, aber das gelesene Byte (nämlich der nächste Befehlscode) wird nicht
beachtet und der Programmzähler nicht inkrementiert.
Die meisten Befehle des 8051 werden in einem Zyklus ausgeführt. MUL (Multiplizieren) und DIV (Dividieren) sind die einzigen Befehle, die zur vollständigen Ausführung mehr als zwei Zyklen, nämlich vier, benötigen.
51
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Im Allgemeinen werden während eines Maschinenzyklus zwei Befehlscode-Bytes
aus dem Programmspeicher geholt. Die einzige Ausnahme hiervon besteht in der
Ausführung eines MOVX-Befehls. Bei diesem handelt es sich um einen 1-Byte-2Zyklen-Befehl, der auf den externen Datenspeicher zugreift. Dabei werden zwei
Holvorgänge übersprungen, während der externe Datenspeicher adressiert und
abgefragt wird.
1.3
Aufbau und Betrieb der Ports
Alle vier Ports des 8051 können bidirektional betrieben werden. Port 0 erlaubt den
Tristate-Zustand (»echter« bidirektionaler Port), während dies bei den Ports 1–3
mit ihren internen Pull-up-Widerständen nicht der Fall ist (»quasi«-bidirektionale
Ports). Jedem Port (Port 0–3) sind acht Bit-Zwischenspeicher zugeordnet, die
jeweils ein spezielles Funktionsregister (SFR) bilden. Für jeden Portanschluss gibt
es einen Ausgangstreiber und einen Eingangspuffer.
1.3.1
Eingangspuffer und Ausgangstreiber
Die Ausgangstreiber von Port 0 und Port 2 sowie der Eingangspuffer von Port 0
werden beim Zugriff auf den externen Speicher verwendet. Bei dieser Anwendung
gibt Port 0 das untere Byte der externen Speicheradresse aus, im Zeitmultiplex mit
dem zu schreibenden oder zu lesenden Byte. Port 2 gibt das obere Byte der externen Speicheradresse aus, wenn diese 16 Bit breit ist. Andernfalls geben die
Anschlüsse an Port 2 auch weiterhin den Inhalt des speziellen Funktionsregisters
P2 aus. Die Anschlüsse von Port 3 haben auch noch alternative Funktionen, wie
aus Tabelle 1.8 zu ersehen ist.
Portanschluss
Alternative Funktionen
P3.0
RXD (serieller Port, Eingang)
P3.1
TXD (serieller Port, Ausgang)
P3.2
INT0 (externer Interrupt)
P3.3
INT1 (externer Interrupt)
P3.4
T0 (Zeitgeber/Zähler 0, externer Eingang)
P3.5
T1 (Zeitgeber/Zähler 1, externer Eingang)
P3.6
WR (Strobe-Signal zum Schreiben in den externen Datenspeicher)
P3.7
RD (Strobe-Signal zum Lesen aus dem externen Datenspeicher)
Tabelle 1.8:
Alternative Funktionen der Anschlüsse von Port 3
Die alternative Funktion eines Portanschlusses kann nur dann aktiviert werden,
wenn der entsprechende Bit-Zwischenspeicher im speziellen Funktionsregister
P3 eine Eins enthält. Andernfalls bleibt der Portanschluss auf null stehen.
52
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Tabelle 1.9 zeigt die Bitadressen im Registerspeicher:
Adresse
Funktion
80H
Port 0, Bit 0
81H
Port 0, Bit 1
82H
Port 0, Bit 2
83H
Port 0, Bit 3
84H
Port 0, Bit 4
85H
Port 0, Bit 5
86H
Port 0, Bit 6
87H
Port 0, Bit 7
88H
Timer 0,Interrupt, Type-Kontroll-Bit
89H
Timer 0, Interrupt, Edge-Flag
8AH
Timer 1, Interrupt, Type-Kontroll-Bit
8BH
Timer 1, Interrupt, Edge-Flag
8CH
Timer 0, Run Kontroll-Bit
8DH
Timer 0, Overflow-Flag
8EH
Timer 1, Run Kontroll-Bit
8FH
Timer 1, Overflow-Flag
90H
Port 1, Bit 0
91H
Port 1, Bit 1
92H
Port 1, Bit 2
93H
Port 1, Bit 3
94H
Port 1, Bit 4
95H
Port 1, Bit 5
96H
Port 1, Bit 6
97H
Port 1, Bit 7
98H
Receive Interrupt Flag
99H
Transmit Interrupt Flag
9AH
Receive Bit 8
9BH
Transmit Bit 8
9CH
Receiver Enable
9DH
Serial Mode Kontroll-Bit-2
9EH
Serial Mode Kontroll-Bit-1
9FH
Serial Mode Kontroll-Bit-0
A0H
Port 2, Bit 0
Tabelle 1.9:
Bitadressen im Registerspeicher
53
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Adresse
Funktion
A1H
Port 2, Bit 1
A2H
Port 2, Bit 2
A3H
Port 2, Bit 3
A4H
Port 2, Bit 4
A5H
Port 2, Bit 5
A6H
Port 2, Bit 6
A7H
Port 2, Bit 7
A8H
Enable Externer Interrupt 0
A9H
Enable Timer 0 Interrupt
AAH
Enable Externer Interrupt 1
ABH
Enable Timer 1 Interrupt
ACH
Enable Senat Port Interrupt
AFH
Enable All Interrupts
B0H
Senat Port Receive Pin
B1H
Senat Port Transmit Pin
B2H
Interrupt 0 Input Pin
B3H
Interrupt 1 Input Pin
B4H
Timer/Counter 0 externes Flag
B5H
Timer/Counter 1 externes Flag
B6H
Write Data (für externes Memory)
B7H
Read Data (für externes Memory)
B8H
Priorität für externen Interrupt 0
B9H
Priorität für Timer 0 Interrupt
BAH
Priorität für externen Interrupt 1
BBH
Priorität für Timer 1 Interrupt
BCH
Priorität für seriellen Port Interrupt
D0H
Parity Flag
D2H
Overflag Flag
D3H
Register Bank Selektions-Bit 0
D4H
Register Bank Selektions-Bit 1
D5H
Flag 0
D6H
Auxilliary Carry Flag
D7H
Carry Flag
E0H
Akkumulator, Bit 0
Tabelle 1.9:
Bitadressen im Registerspeicher (Forts.)
54
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Adresse
Funktion
E1H
Akkumulator, Bit 1
E2H
Akkumulator, Bit 2
E3H
Akkumulator, Bit 3
E4H
Akkumulator, Bit 4
E5H
Akkumulator, Bit 5
E6H
Akkumulator, Bit 6
E7H
Akkumulator, Bit 7
F0H
Multiplikationsregister, Bit 0
F1H
Multiplikationsregister, Bit 1
F2H
Multiplikationsregister, Bit 2
F3H
Multiplikationsregister, Bit 3
F4H
Multiplikationsregister, Bit 4
F5H
Multiplikationsregister, Bit 5
F6H
Multiplikationsregister, Bit 6
F7H
Multiplikationsregister, Bit 7
Tabelle 1.9:
1.3.2
Bitadressen im Registerspeicher (Forts.)
E/A-Struktur
Die Blockschaltung arbeitet wie ein typischer Bit-Zwischenspeicher und dient als
E/A-Puffer für die E/A-Struktur der vier Ports. Der Bit-Zwischenspeicher (ein Bit
im speziellen Funktionsregister des Ports) stellt sich als Flipflop vom Typ D dar,
das auf einen Taktimpuls hin einen Wert vom internen Bus übernimmt, wenn die
Zentraleinheit ein Signal »Schreiben in den Zwischenspeicher« ausgegeben hat.
Das Ausgangssignal 0 des Flipflops wird auf den internen Bus gebracht, wenn die
Zentraleinheit ein Signal »Lesen aus dem Zwischenspeicher« ausgegeben hat; der
Pegel direkt am Portanschluss wird dagegen dann auf den internen Bus gebracht,
wenn die Zentraleinheit ein Signal »Lesen vom Portanschluss« ausgegeben hat.
Einige Befehle, mit denen Portwerte gelesen werden, aktivieren das Signal »Lesen
aus dem Zwischenspeicher«, andere das Signal »Lesen vom Portanschluss«.
Die Ports 1, 2 und 3 haben interne Pull-up-Widerstände, Port 0 Open-Drain-Ausgänge. Jede E/A-Leitung kann unabhängig von anderen als Eingang oder Ausgang
dienen, jedoch dürfen die Ports 0 und Port 2 nicht als E/A-Leitungen für allgemeine
Zwecke benutzt werden, wenn sie als Adress-/Datenbus arbeiten. Bei Verwendung
als Eingang muss der betreffende Bit-Zwischenspeicher des SFR ein 1-Signal enthalten, die den Ausgangstreiber (einen Feldeffekttransistor) abschaltet. Bei den
Ports 1, 2 und 3 wird der Portanschluss durch den internen Pull-up-Widerstand auf
1-Signal gesetzt, kann aber durch eine externe Quelle auf 0-Signal gezogen werden.
55
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Port 0 unterscheidet sich dadurch von den übrigen Ports, dass er keine internen
Pull-up-Widerstände hat. Der Pull-up-Feldeffekttransistor im Ausgangstreiber von
Port P0 wird nur dann benutzt, wenn der Port während eines Zugriffs auf externe
Speicher Einsen ausgibt. Andernfalls ist der Pull-up-Feldeffekttransistor abgeschaltet. Folglich sind die Leitungen von P0, die als Ausgangsleitungen dienen,
vom Open-Drain-Typ. Wird eine Eins in den Bit-Zwischenspeicher geschrieben, so
bleiben beide Ausgangs-Feldeffekttransistoren abgeschaltet, und der Anschluss
liegt auf unbestimmtem Potential. In diesem Fall kann er als hochohmiger Eingang dienen. Da die Ports 1, 2 und 3 festgelegte Pull-up-Widerstände haben, werden sie oft als quasibidirektionale Ports bezeichnet. Wenn sie als Eingänge dienen
sollen, nehmen sie den 1-Pegel an und erzeugen dann einen Strom (ILL im Datenblatt), wenn sie auf 0-Pegel gezogen werden. Andererseits bezeichnet man Port 0
als echten bidirektionalen Port, weil er unbestimmtes Potential aufweist, wenn er
als Eingang betrieben wird.
Durch Rücksetzen des 8051 werden Einsen in die Zwischenspeicher aller Ports
geschrieben. Wird anschließend eine Null in den Zwischenspeicher des Ports
gebracht, so lässt sich dieser danach als Eingang wieder einrichten, indem man
eine Eins in ihn schreibt.
1.3.3
Schreiben in einen Port
Bei der Ausführung eines Befehls, der den Wert im Zwischenspeicher eines Ports
ändert, erreicht der neue Wert den Ausgangsanschluss erst während Phase 1 des
nächsten Maschinenzyklus.
Wenn die Änderung einen 0-1-Übergang (positive Flanke) in Port 1, 2 oder 3 erfordert, wird ein zusätzlicher Pull-up-Widerstand während desjenigen Zyklus eingeschaltet, in dem der Übergang erfolgt. Auf diese Weise wird die Übergangsgeschwindigkeit erhöht. Durch den zusätzlichen Pull-up-Widerstand fließt etwa der
100-fache Strom wie durch den »normalen« Pull-up-Widerstand. Bei dieser Gelegenheit sollte bemerkt werden, dass die internen Pull-up-Widerstände Feldeffekttransistoren und keine linearen Widerstände sind.
Beim Mikrocontroller 8051 (also bei der NMOS-Version) ist der »normale« (d.h.
der stets vorhandene) Pull-up-Widerstand ein Transistor vom Verarmungstyp, bei
dem Gate und Source zusammengeschaltet sind. Der Transistor lässt über den
Portanschluss etwa 0,25 mA fließen, wenn dieser mit Masse verbunden ist.
Parallel zu diesem Transistor liegt ein Transistor vom Anreicherungstyp, der den
oben beschriebenen zusätzlichen Pull-up-Widerstand darstellt und immer dann
aktiv wird, wenn das betreffende Bit von null nach eins übergeht. Solange der
zusätzliche Transistor aktiv ist, liefert er einen Strom von 30 mA an den Portanschluss, wenn dieser mit Masse verbunden ist.
56
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Bei der CMOS-Version besteht der Pull-up-Widerstand aus drei p-Kanal-Feldeffekttransistoren. Man beachte, dass ein n-Kanal-Feldeffekttransistor eingeschaltet
ist, wenn ein 1-Signal an seinem Gate liegt, und dann ausgeschaltet ist, wenn dort
ein 0-Signal liegt. Bei p-Kanal-Feldeffekttransistoren ist es umgekehrt.
Man beachte, dass bei der Ausgabe eines 1-Signals am Portanschluss ein dort von
einer externen Quelle ankommender negativer Störimpuls den p-Kanal-Feldeffekttransistor 3 ausschalten kann, wodurch der Portanschluss unbestimmtes
Potential annimmt. Der p-Kanal-Feldeffekttransistor 2 stellt einen sehr niederohmigen Pull-up-Widerstand dar, der immer dann eingeschaltet ist, wenn der
n-Kanal-Feldeffekttransistor ausgeschaltet ist (typischer CMOS-Schaltungsaufbau). Durch ihn fließt nur ca. 1/10 des Stroms, der den p-Kanal-Feldeffekttransistor durchsetzt. Seine Aufgabe besteht darin, am Portanschluss ein 1-Signal
wiederherzustellen, falls dort ein 1-Signal vorhanden war und dieses durch einen
externen Störimpuls verloren gegangen ist.
Die Ausgangspuffer der Ports 1, 2 und 3 können je vier Low-Power-Schottky-TTLEingänge oder einen normalen TTL-Eingang treiben. Diese Ports in der NMOSVersion lassen sich auf normale Weise durch jede TTL- oder NMOS-Schaltung
treiben. Sowohl die NMOS- als auch die CMOS-Version können durch Open-Kollektor und durch Open-Drain-Ausgänge getrieben werden, ohne dass externe Pullup-Widerstände erforderlich sind.
Die Ausgangspuffer von Port 0 können jeweils acht Low-Power-Schottky-TTL-Eingänge oder zwei normale TTL-Eingänge treiben. Sie erfordern jedoch externe Pullup-Widerstände, um NMOS-Eingänge zu treiben, außer wenn der Port als Adress-/
Datenbus dient.
1.3.4 Read-Modify-Write-Merkmale
Es gibt grundsätzlich zwei Möglichkeiten, einen Port durch einen Befehl zu lesen,
und zwar entweder am Zwischenspeicher oder unmittelbar am Portanschluss. Der
Befehlsvorrat des 8051 enthält Befehle der einen und der anderen Art. Befehle, die
den Zwischenspeicher lesen, sind jene, durch die ein Wert gelesen, möglicherweise geändert und anschließend in den Zwischenspeicher zurückgeschrieben
wird (so genannte Read-Modify-Write-Befehle). Bei diesen in Tabelle 1.10 aufgeführten Befehlen ist der Zieloperand ein Port oder ein Portbit.
Befehl
Beschreibung
Beispiel
ANL
Logisches UND
ANL
P1,A
ORL
Logisches ODER
ORL
P2,A
XRL
Logisches Exklusiv-ODER
XRL
P3,A
JBC
Springe, wenn Bit = 1 und lösche Bit
JBC
P1.1‚LABEL
Tabelle 1.10: Befehle, die den Zwischenspeicher der Ports lesen (Read-Modify-Write-Befehle)
57
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Befehl
Beschreibung
Beispiel
CPL
Komplementiere Bit
CPL
P3.0
INC
Inkrementiere
INC
P2
DEC
Dekrementiere
DEC
P2
Dekrementiere und springe, falls nicht null
DJNZ
P3,LABEL
DJNZ
MOV
PX.Y,C
Transportiere Übertragsbit nach Bit Y von Port C
CLR
PX.Y
Lösche Bit Y von Port X
SET
PX.Y
Setze Bit Y von Port X
Tabelle 1.10: Befehle, die den Zwischenspeicher der Ports lesen (Read-Modify-Write-Befehle)
Auf den ersten Blick ist nicht zu erkennen, dass auch die drei letzten Befehle dieser Tabelle Read-Modify-Write-Befehle sind: Sie lesen das Portbyte (alle acht Bits),
ändern das adressierte Bit und schreiben das neue Byte in den Zwischenspeicher
zurück.
Die Befehle verarbeiten deshalb die Werte des Zwischenspeichers und nicht die
der Anschlüsse, weil die Spannungspegel an den Anschlüssen zu Fehlinterpretationen führen können. Zum Beispiel könnte der Port zum Treiben der Basis eines
Transistors dienen. Wird ein 1-Signal in die Bit-Speicherstelle geschrieben, so
schaltet der Transistor ein. Wenn dann die Zentraleinheit dasselbe Portbit am
Anschluss statt am Zwischenspeicher liest, wird sie die Basisspannung des Transistors lesen und diese als ein 0-Signal interpretieren. Nur das Lesen des Zwischenspeichers anstelle des Anschlusses führt daher zum richtigen Wert, einem
1-Signal.
1.3.5
Programmierung einer Eingabeoperation
Wie bei allen Mikrocontroller-Projekten muss auch bei Verwendung eines Mikrocontrollers die nötige Entwicklungsumgebung verfügbar sein. Die Software von
Multisim stellt eine effiziente und leistungsfähige Entwicklungsumgebung für auf
8051-Mikrocontroller basierende Anwendungen. Compiler und Assembler sind
aufeinander abgestimmt. Sie bilden eine homogene Einheit für die Softwareentwicklung und die erzeugten Objekt-Dateien sind Intel-kompatibel.
Somit können Object- und Symbol-Dateien komfortabel mit dem EMUL51-PCEmulator weiterverarbeitet werden. Der C-Compiler erzeugt alle notwendigen
Informationen zur Unterstützung des Source-Code-Debuggings. Das gesamte
Assemblerpaket ist Intel-kompatibel und arbeitet unter dem Betriebssystem MSDOS und Windows. Es besteht aus:
쐽
A51-Makroassembler
쐽
L51-Linker/Locater
쐽
LIB51-Library-Manager
쐽
OHS51-Objekt-Hex-Konverter
58
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Der Assembler deckt die Maschinenbefehle des Mikrocontrollers 8051 ab.
Der Makroassembler A51 erzeugt aus einem 8051-Assemblersourcefile (Intel Mnemonics) ein relocatives Objektmodul und ein List-File. Er erlaubt symbolischen
Zugriff auf die Architektur des 8051, z.B. RAM-Adressen, Bit-Adressen, Ein/Ausgabeport. Ebenso wird die Architektur des 8052 und die gesamte Nachfolgefamilie
berücksichtigt.
Der Linker/Locater L51 bindet die einzelnen Module und bei Bedarf Teile aus
Bibliotheken zusammen, erzeugt absolute Adressen und speichert diese Daten im
Intel-Object-File-Format ab. Die Symbole und eventuell die Zeilennummer-Informationen vom C-Quellcode sind im Objectfile enthalten. Zusätzlich kann eine
Crossreference-Liste und eine Map-Datei erstellt werden.
Für die Hochsprachenprogrammierung verfügt der Linker/Locate L51 auch über
eine OVERLAY-Funktion, die den knappen internen Speicher der 8051-Mikrocontroller speziell verwaltet. Dabei werden Parameter und Variablen der einzelnen
Funktionen überlagert, wenn sich diese Funktionen nicht gegenseitig aufrufen.
Dadurch wird der Speicherbedarf der Anwendungen um ein Vielfaches reduziert.
L51 analysiert selbstständig die gegenseitigen Aufrufe sämtlicher Funktionen und
überlagert dann gezielt die zu diesen Funktionen gehörenden Daten und Bit-Segmente. Für den DEBUG-Betrieb kann diese Funktion abgeschaltet werden, um
problemlos auf alle Werte zugreifen zu können.
Der Object-Hex-Konverter OHS51 kann aus dieser Object-Datei ein Intel-Hex-File
und eine separate Symboldatei erzeugen.
C ist eine allgemein einsetzbare Programmiersprache, die Code-Effizienz, strukturiertes Programmieren, komfortable Datenstrukturen und einen reichhaltigen
Satz von Operationen vereinigt. C ist keine Programmiersprache, die auf
bestimmte Anwendungen spezialisiert ist. Durch die Möglichkeit, ein Programm
in einer Hochsprache zu formulieren, lässt sich ein Projekt in kürzerer Zeit mit
geringerer Fehleranfälligkeit und besserer Wartungsmöglichkeit realisieren.
Der C51-Crosscompiler entspricht dem Standard nach ANSI X3J11 und Kernighan
& Ritchie. Er erzeugt Intel-kompatiblen 8051-Objectcode als Ergebnis. Diese
Object-Dateien können mit Assembler oder PL/M-51-Objektmodulen kombiniert
werden.
Die Parameterübergabe an Funktionen erfolgt, wie bei PLM51, in festen Speicheradressen. Daher sind Zugriffe auf Parameter extrem schnell und einfach mit
Assembler zu realisieren. Das Einbinden von Assembler-Unterprogrammen ist
somit problemlos.
Auch Interrupt-Prozeduren können mit C51 erstellt werden. Die Registerbank, die
in der Interrupt-Prozedur verwendet werden soll, kann angegeben werden. Der
Compiler generiert den für die Umschaltung erforderlichen Code.
59
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Der C51-Compiler unterstützt vollständig die Architektur der 8051-Familie. Der
uneingeschränkte Zugriff auf sämtliche Hardware-Komponenten des Systems ist
gewährleistet. Jede Variable kann durch Zuweisung des Speichertyps explizit platziert werden. Es werden fünf Speichertypen unterstützt, wie Tabelle 1.11 zeigt.
data
Direkt adressierbarer interner Datenspeicher. Ermöglicht den schnellsten Zugriff
auf Variablen (128 Byte)
idata
Indirekt adressierbarer interner Datenspeicher. Ermöglicht den schnellsten Zugriff
auf Variablen (256 Byte)
pdata
»Paged« (256 Byte) externer Datenspeicher und der Zugriff erfolgt mit dem Befehl
MOVX@Ri
xdata
Externer Datenspeicher (64 Kbyte) und der Zugriff erfolgt mit dem Befehl
MOVX@DPTR
code
Programmspeicher (64 Kbyte) und der Zugriff erfolgt mit dem Befehl
MOVC@A+DPTR
Tabelle 1.11: Unterstützung der Speichertypen im 8051/8052 und der erweiterten Familie
Generell werden drei verschiedene Speichermodelle unterstützt, wie Tabelle 1.12
zeigt.
SMALL
Parameter und lokale Variablen werden im direkt adressierbaren internen
Datenspeicher platziert (max. 120 Byte).
COMPACT
Parameter und lokale Variablen werden im »paged« externen Datenspeicher
platziert (max. 256 Byte).
LARGE
Parameter und lokale Variablen werden im externen Datenspeicher platziert
(max. 64 Kbyte).
Tabelle 1.12: Verschiedene Speichermodelle
Der C51-Compiler unterstützt die nachfolgend aufgeführten Datentypen. Zusätzlich lassen sich die Variablen in Strukturen zusammenfassen. Außerdem können
mehrdimensionale Felder gebildet werden. Die Adressierung von Variablen über
Pointer ist ebenso möglich wie der direkte Zugriff auf die »Special Function Register« (SFR), wie Tabelle 1.13 zeigt.
Datentyp
Größe
Wertebereich
bit
1 Bit
0 oder 1
signed char
1 Byte
–128 bis +127
unsigned char
1 Byte
0 bis 255
signed int
2 Byte
–32768 bis +32767
unsigned int
2 Byte
0 bis 65535
Tabelle 1.13: Unterstützte Datentypen
60
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Datentyp
Größe
signed long
Wertebereich
4 Byte
–2147483648 bis +21474483647
unsigned long
4 Byte
0 bis 4294967295
float
4 Byte
+/– 1.176E-38 bis +/– 3.40E+38
inter
3 Byte
Adresse einer Variablen
Tabelle 1.13: Unterstützte Datentypen (Forts.)
Die Konvertierung der Datentypen beim Rechenvorgang erfolgt automatisch oder
kann manuell durch C-Anweisungen gesteuert werden.
Wenn Sie eine Schaltung in Multisim aufbauen, müssen Sie zuerst den Button
»MCU« anklicken. MultiMCU erlaubt es dem Schüler, Studenten und Auszubildenden, einen Mikrocontroller, der in Assembler programmiert wurde, innerhalb
der SPICE-Umgebung einzubinden. Wenn Sie den Button MCU PLATZIEREN
anklicken, erscheint Abbildung 1.8.
Abb. 1.8:
Fenster für die Auswahl der Mikrocontroller, RAM- und ROM-Einheiten
61
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
In dem Fenster kann man zwischen den Mikrocontrollern von Intel 8051/8052
und von Mikrochip PIC16F84/16F84A wählen. Klickt man den Button »RAM« an,
erscheinen verschiedene Versionen von 2 Kbyte oder 8 Kbyte. Wenn man den Button »ROM« anklickt, hat man die Auswahl von 16 Kbyte oder 32 Kbyte.
Mit »OK« wird ein Mikrocontroller, ein RAM oder ein ROM in der Schaltung platziert. Danach erscheint das Fenster von Abbildung 1.9.
Abb. 1.9:
MCU-Assistent – Schritt 1 von 3
Mit dem MCU-ASSISTENT gibt man Arbeitsbereichspfad und Arbeitsbereichsnamen ein. Der Arbeitsbereichsname lautet Versuch1. Anschließend klickt man
WEITER an. Es erscheint Abbildung 1.10.
Abb. 1.10:
MCU-Assistent – Schritt 2 von 3
Bei dem MCU-ASSISTENT – SCHRITT 2 VON 3 werden die wichtigsten Definitionen
für die Programmierung festgelegt. Mit dem Projekttyp legt man STANDARD fest
62
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
oder man arbeitet mit einer externen Hex-Datei. Unter PROGRAMMIERSPRACHE
legt man fest, ob man in C oder in Assembler (BAUGRUPPE) programmieren
möchte. Arbeitet man mit C, wird der HI-TECH C51-LITE-COMPILER festgelegt.
Arbeitet man mit Assembler (BAUGRUPPE), wird der 8081/8052 METALINKASSEMBLER aufgerufen. Abschließend definiert man noch den PROJEKTNAMEN
mit Versuch1 und klickt WEITER an. Es erscheint Abbildung 1.11.
Abb. 1.11:
MCU-Assistent – Schritt 3 von 3
Bei dem MCU-ASSISTENT – SCHRITT 3 VON 3 fügt man eine Quelldatei hinzu.
Anschließend klickt man FERTIG STELLEN an. Im Schaltplan (Abbildung 1.12) befindet sich der Mikrocontroller 8051.
Abb. 1.12:
Schaltplan mit dem Mikrocontroller 8051
63
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Aus der Bibliothek kann Taster, Widerstand, Masse und +Ub geholt werden. Die
Bausteine sind im Schaltplan zu platzieren und mit dem Mikrocontroller zu verbinden. Der Taster wird mit der PC-Leertaste ein- und ausgeschaltet. Die Hardware ist nun fertig und es kann mit der Programmierung in Assembler begonnen
werden. Dazu klickt man den Button »MCU« an und das Fenster von Abbildung
1.13 öffnet sich.
Abb. 1.13:
Aufruf des MCU-Code-Managers
Wenn man den MCU-Code-Manager angeklickt hat, öffnet sich das Fenster von
Abbildung 1.14. Hier lassen sich alle möglichen Funktionen einstellen.
Abb. 1.14:
Fenster und Einstellmöglichkeiten des MCU-Code-Managers
64
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Mit einem Doppelklick auf den Pfad MAIN.ASM öffnet sich das Fenster von Abbildung 1.15 und hier führt man die Assembler-Programmierung durch.
Abb. 1.15:
Fenster für die Assembler-Programmierung und Fenster für die Fehlermeldungen
Um die Assembler-Programmierung für dieses kleine Projekt durchführen zu
können, muss man sich Port 1 genau betrachten.
Port 1 hat interne Pull-up-Widerstände. Jede E/A-Leitung kann unabhängig von
anderen als Eingang oder Ausgang dienen. Bei Verwendung als Eingang muss der
betreffende Bit-Zwischenspeicher des SFR ein 1-Signal enthalten, die den Ausgangstreiber (einen Feldeffekttransistor) abschaltet. Bei Port 1 wird der Portanschluss durch den internen Pull-up-Widerstand auf 1-Signal gesetzt, kann aber
durch eine externe Quelle auf 0-Signal gezogen werden. Durch Rücksetzen des
Mikrocontrollers 8051 werden 1-Signale in die Zwischenspeicher aller Ports
geschrieben. Wird anschließend ein 0-Signal in den Zwischenspeicher des Ports
gebracht, so lässt sich dieser danach als Eingang wieder einrichten, indem man
ein 1-Signal in ihn schreibt.
In der ersten Zeile der Assembler-Programmierung steht
MOV
P1,#255
Damit wird der Eingang des Ports P1 auf 1-Signal gesetzt. Wenn in einer Assembler-Programmierung vor einem Wert das Zeichen »#« angegeben wird, handelt es
sich beim C51 um eine Konstante. Danach folgt eine Schleife und
65
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
MOV A,P1
JMP Schleife
In der Schleife wird der Eingang von Port P1 abgefragt und in den Akkumulator
geschrieben. Wenn der Taster geschlossen ist, wird ein 0-Signal in den Akkumulator geschrieben, und ist der Taster offen, ein 1-Signal.
Abb. 1.16:
Assembler-Programmierung mit Fenster der Fehlerüberprüfung
Abbildung 1.16 zeigt die Assembler-Programmierung mit dem Fenster für die
Fehlerüberprüfung, wobei die Schaltung bereits simuliert wurde.
Jetzt können Sie den Balken MC1.1 anklicken und die Schaltung erscheint wieder
im Bildschirm. Dann schaltet sich die noch laufende Simulation aus, erkennbar
unten rechts im Bildschirm und so starten Sie erneut die Simulation. Es erscheint
ein Fenster, da die Projektkonfiguration jetzt nicht mehr aktuell ist, und Sie klicken auf JA. Das Fenster erlischt und Sie erhalten wieder das Fenster für die
Assembler-Programmierung.
66
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
In dem Fenster für die Assembler-Programmierung sind oben links in der zweiten Zeile ein grüner Pfeil, ein schwarzes Zweistrichsymbol, ein rotes Rechteck und
ein roter Kreis sichtbar. Mit dem grünen Pfeil führen Sie den Start oder die Fortsetzung der Simulation durch. Mit dem schwarzen Zweistrichsymbol lässt sich die
Simulation anhalten. Durch das rote Rechteck wird die Simulation angehalten.
Klickt man den roten Kreis an, wird nicht nur die Simulation bei der nächsten
MCU-Anweisungsgrenze angehalten, sondern Sie rufen die Debugger auf.
Wenn ein Programm auf Fehler untersucht wird, spricht man vom DEBUG (entwanzen). Dies ist eine Bezeichnung für die Fehlersuche und Fehlerbehebung in
der Hardware und Software. Bei der Software ist das Debug-Programm ein Hilfsmittel für die Fehlersuche. Sie erlaubt das Setzen von Breakpoints, die Einzelbefehlsausführung, die Ausgabe von Registerinhalten bzw. Speicherabzügen (Dump)
und das Verändern von Register- und Speicherinhalten.
Breakpoints sind Unterbrechungspunkte im Betriebssystem und enthalten zur Testunterstützung die Debug-Programme. Diese ermöglichen, Unterbrechungspunkte
im Programmablauf vorzugeben. Ein Software-Breakpoint ist eine Adresse. Ein
Hardware-Breakpoint unterbricht das Programm, wenn sich an einem ausgewählten Signal der Pegel ändert. Das Programm hält dann an der vorgegebenen Stelle
an. Es ist so kontrollierbar, ob das Programm an dieser Stelle vorbeikommt. Es lassen sich gegebenenfalls an dieser Stelle Register- oder Speicherinhalte überprüfen.
Meist sind mehrere Breakpoints setzbar.
Abb. 1.17:
Quelldatei-Debug-Auflistung
Abbildung 1.17 zeigt die Quelldatei-Debug-Auflistung. Wenn man die einzelnen
Debugmöglichkeiten verlassen will, klickt man das Feld MC1.1 an und kommt so in
die Schaltung.
67
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.18:
Speicheransicht nach einer Simulation
Abbildung 1.18 zeigt die Speicheransicht von SFR, IRAM, IROM und XRAM. Das
Special-Function-Register (SFR) liegt im Adressbereich 128 bis 255 (80H bis FFH).
Auf die Adressen ist nur mittels direkt adressierter Befehle zuzugreifen. In diesem
Bereich liegen alle Register, außer den Registerbänken und dem Befehlszähler.
Von den im Mikrocontroller 8051 enthaltenen 21 SFR sind 10 bitadressierbar. Das
IRAM zeigt die Informationen des internen Schreib-Lese-Speichers und im
Mikrocontroller 8051 sind 128 Speicherzellen vorhanden. Das IROM zeigt die
Informationen des internen Festwertspeichers an und hat 4 Kbyte. Das XRAM ist
der externe Schreib-Lese-Speicher.
Wenn man den grünen Pfeil anklickt, erscheint Abbildung 1.18 und man sieht, der
Akkumulator hat keine Informationen. Wenn das schwarze Zweistrichsymbol
angeklickt wird, stoppt die Simulation und der Akkumulator zeigt den Wert an:
11111110
Taster geschlossen
11111111
Taster offen
Sie können die Schaltfunktion ohne Probleme überprüfen.
68
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
1.3.6 Zugriff auf externe Speicher
Hierbei muss zwischen dem Zugriff auf den externen Programmspeicher und
dem Zugriff auf den externen Datenspeicher unterschieden werden. Beim Zugriff
auf den externen Programmspeicher dient das Signal PSEN (program store
enable) als Lese-Strobesignal, beim Zugriff auf den externen Datenspeicher werden RD (Read) oder WR (Write) (alternative Funktionen von P3.7 bzw. P3.6) als
Lese- bzw. Schreib-Strobesignal verwendet. Abbildung 1.19 zeigt den Anschluss
eines Schreib-Lese-Speichers an den Mikrocontroller 8051.
Abb. 1.19:
Anschluss eines Datenspeichers mit 8 Kbyte mit Speicheransicht
Die Daten und Adressen von D0 bis D7 und von A0 bis A7 werden gemeinsam über
Port 0 ausgegeben. Die Datenleitungen liegen direkt an dem RAM an und die
Adressenleitungen werden über den Baustein 74373 zwischengespeichert. Der
Baustein 74373 ist ein 8-Bit-D-Latch mit Enable und Tri-State-Ausgängen. Tabelle
1.14 zeigt die Funktionen.
69
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
OC
G
D
Q
0
1
1
1
0
1
0
0
0
0
X
Q
1
X
X
Z
Tabelle 1.14: Funktionen des TTL-Bausteins 74373
Der Steuereingang OC (Output Control) ist in der Schaltung mit Masse verbunden
und daher kann der Baustein 74373 in der Schaltung immer arbeiten. Bei einem
1-Signal ist der Baustein gesperrt und die Ausgänge weisen den hochohmigen
Zustand auf. Hat der Eingang G (Gate oder Enable) ein 1-Signal, ist der Baustein
74373 transparent, das heißt, die angelegte Information an dem D-Eingang wird
direkt an den Q-Ausgang weitergegeben. Hat der Eingang G ein 0-Signal, werden
die Informationen gespeichert.
Statt des 74373 verwendet man den 74273, ein 8-Bit-D-Register mit Clear. Tabelle
1.15 zeigt die Funktionen des TTL-Bausteins 74273.
Clear
Clock
D
Q
0
X
X
0
1

1
1
1

0
0
1
L
X
Qn
Tabelle 1.15: Funktionen des TTL-Bausteins 74273
In den Kapiteln 3 und 4 wird dieser Baustein in der Simulation verwendet. Für den
richtigen Betrieb in der Praxis ist ein NICHT-Gatter für den Takt erforderlich.
Das 8-Kbyte-RAM HM1-65642 hat für die Adressierung 13 Eingänge von A0 bis A12
und daher können 8192 Speicherreihen zu je acht Bit angesprochen werden. Die
gespeicherten Informationen in dem Baustein liegen an den Datenausgängen DQ
an, wenn die Bedingungen für die Wahrheits-Tabelle 1.16 erfüllt sind.
E1
E2
G
W
DQ
0
X
X
X
Z
X
1
X
X
Z
1
X
1
X
Z
1
X
0
1
schreiben
1
0
0
0
lesen
Tabelle 1.16: Wahrheits-Tabelle für 8-Kbyte-RAM HM1-65642
70
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
Der W-Eingang (Write oder schreiben) vom RAM ist mit dem WR-Ausgang des Mikrocontrollers verbunden. Der G-Eingang (Gate) vom RAM ist mit dem RD-Eingang
(Read oder lesen) des Mikrocontrollers verbunden. Der Eingang E2 liegt an +5 V.
Das 8-Kbyte-RAM HM1-65642 lässt sich adressieren, wenn sich E1 auf 0-Signal
und E2 auf 1-Signal befinden. E1 ist mit dem Ausgang des NOR-Gatters verbunden. Die drei Eingänge des NOR-Gatters liegen an A13, A14 und A15. Es ergibt sich
folgender Adressierbereich (Tabelle 1.17):
A15
A14
A13
Adressierbereich
0
0
0
0000 bis 8191  0000 bis 1FFF
0
0
1
8192 bis 16383  2000 bis 3FFF
0
1
0
16384 bis 24575  4000 bis 5FFF
0
1
1
24576 bis 32767  6000 bis 7FFF
1
0
0
32768 bis 40959  8000 bis 9FFF
1
0
1
40959 bis 49151  A000 bis BFFF
1
1
0
49152 bis 57343  C000 bis DFFF
1
1
1
57344 bis 65535  E000 bis FFFF
Tabelle 1.17: Adressierbereich für das 8-Kbyte-RAM HM1-65642
Durch die Adressierung ergibt sich ein Bereich in 8-Kbyte-Blöcken.
Auf den externen Programmspeicher wird stets über eine 16-Bit-Adresse zugegriffen, auf den externen Datenspeicher entweder über eine 16-Bit-Adresse (MOVX
@DPTR) oder eine 8-Bit-Adresse (MOVX @Ri).
Immer wenn eine 16-Bit-Adresse verwendet wird, erscheint das obere Adressbyte
an Port 2, wo es für die Dauer des Lese- oder Schreibzyklus stehen bleibt. Wenn
auf den Zyklus mit dem externen Speicher nicht ein weiterer derartiger Zyklus
unmittelbar folgt, wird der unveränderte Inhalt des speziellen Funktionsregisters
von Port 2 im nächsten Zyklus wieder erscheinen.
Bei Verwendung einer 8-Bit-Adresse (MOVX @Ri) bleibt der Inhalt des Zwischenspeichers von Port 2 während des gesamten Zyklus mit dem externen Speicher an
den Anschlüssen von Port 2 erhalten. In jedem Fall erscheint das untere Adressbyte im Zeitmultiplex mit dem Datenbyte an Port 0. Das Adress-/Datensignal
treibt beide Feldeffekttransistoren in den Ausgangspuffern von Port 0. Daher sind
die Anschlüsse von Port 0 bei dieser Anwendung keine Open-Drain-Ausgänge
und erfordern somit keine externen Pull-up-Widerstände. Das Signal ALE
(Address Latch Enable) soll dazu dienen, das Adressbyte in einen externen Zwischenspeicher zu bringen und das Adressbyte ist beim negativen Übergang von
ALE gültig. In einem Schreibzyklus erscheint dann das zu schreibende Byte an
Port 0, unmittelbar bevor WR aktiviert wird, und bleibt dort bis nach der Deaktivierung von WR stehen. Bei einem Lesezyklus wird das ankommende Byte unmittelbar vor der Deaktivierung von RD an Port 0 entgegengenommen.
71
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Während eines jeden Zugriffs auf den externen Speicher schreibt die Zentraleinheit den Wert FFH in den Zwischenspeicher von Port 0 (d.h. in das betreffende
spezielle Funktionsregister) und löscht damit die vorher vorhandene Information
in diesem Register.
Auf den externen Programmspeicher wird bei Erfüllung von wenigstens einer der
beiden Bedingungen zugegriffen:
1. Das Signal EA ist aktiv.
2. Der Programmzähler (PC) enthält einen Wert, der größer als 0FFFH ist.
Dies macht es erforderlich, dass bei der Version ohne ROM (8031) die EA-Einheiten
durch entsprechende Verdrahtung fest auf 0-Signal gelegt werden müssen, damit
auf die unteren 4 Kbyte des externen Programmspeichers zugegriffen werden kann.
Wenn die Zentraleinheit auf den externen Programmspeicher zugreift, sind alle
acht Anschlüsse von Port 2 in Ausgabe-Funktion und dürfen nicht für allgemeine
E/A-Zwecke verwendet werden. Wird der externe Programmspeicher angesprochen, so gibt Port 2 das obere Byte des Programmzählers aus, wird der externe
Datenspeicher angesprochen und so stellt dieser Port entweder DPH oder den Wert
des speziellen Funktionsregisters von Port 2 zur Verfügung. Dies ist davon abhängig, ob der Zugriff auf den externen Datenspeicher mit einem Befehl MOVX @DPTR
oder MOVX @Ri erfolgt.
Abb. 1.20: Anschluss eines Befehlsspeichers mit 8 Kbyte
Abbildung 1.20 zeigt den Anschluss des Befehlsspeichers 27C64 mit 8 Kbyte an
den Mikrocontroller. Die Daten und Adressen von D0 bis D7 und von A0 bis A7
werden gemeinsam über Port 0 ausgegeben. Die Datenleitungen liegen direkt an
72
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.3
Aufbau und Betrieb der Ports
dem RAM an und die Adressenleitungen werden über den Baustein 74373 zwischengespeichert. Die Steuerung für das EPROM 27C64 übernehmen die drei
Eingänge PGM (Program Gate Memory), OE (Output Enable) und CE (Chip
Enable). Der PGM-Eingang ist auf Masse gelegt und hat ein 0-Signal. Der
EPROM-Baustein wird freigegeben, wenn der CE-Eingang auf 0-Signal liegt. Der
CE-Eingang ist direkt mit dem NOR-Ausgang verbunden und für den Adressierbereich gilt Tabelle 1.17. Der OE-Eingang wird mit dem PSEN-Ausgang verbunden
und schaltet der Mikrocontroller seinen PSEN-Ausgang auf 0-Signal, gibt der
EPROM-Baustein seine gespeicherten Informationen aus.
1.3.7
Signal PSEN
PSEN ist das Freigabesignal beim Zugriff auf den externen Programmspeicher; zum
Lesen des internen Programmspeichers wird dieses Signal nicht aktiviert. Beim
Zugriff der Zentraleinheit auf den externen Programmspeicher wird PSEN während
eines jeden Zyklus zweimal aktiviert (außer bei einem MOVX-Befehl), und zwar
unabhängig davon, ob das geholte Byte gerade für den momentan abzuarbeitenden
Befehl benötigt wird oder nicht. Der zeitliche Verlauf des (aktivierten) Signals PSEN
ist nicht derselbe wie von RD. Ein vollständiger Zyklus von RD, einschließlich Aktivierung und Deaktivierung von ALE und RD, dauert 12 Oszillatorperioden, ein vollständiger Zyklus von PSEN, einschließlich Aktivierung und Deaktivierung von ALE
und PSEN, jedoch nur sechs Oszillatorperioden. Die Impulsdiagramme für diese
beiden Arten von Lesezyklen sind zum Vergleich in Abbildung 1.21 dargestellt.
1.3.8
Signal ALE
Die Hauptaufgabe des Signals ALE besteht darin, während des Zugriffs auf den
externen Programmspeicher für die Aufnahme des unteren Adressbytes aus Port
P0 in dem zugehörigen externen Zwischenspeicher zu sorgen. Hierfür wird ALE
zweimal während eines jeden Zyklus aktiviert. Dies geschieht auch dann, wenn
der Zyklus keinen externen Zugriff beinhaltet. ALE fällt jedoch dann einmal aus,
wenn auf den externen Datenspeicher zugegriffen werden soll, und zwar fehlt das
erste ALE-Signal des zweiten Zyklus eines MOVX-Befehls. Daraus folgt, dass in
jedem System ohne externen Datenspeicher ALE stets mit einer konstanten Frequenz von 1/6 der Oszillatorfrequenz auftritt und daher für externe Takt- oder
Zeitgeberschaltungen verwendet werden kann.
Bei einigen Anwendungen kann es wünschenswert sein, ein Programm in demselben physischen Speicher abzulegen, der auch zum Speichern von Daten dient.
Beim Mikrocontroller 8051 können die externen Programm- und Datenspeicherbereiche dadurch kombiniert werden, dass man eine UND-Verknüpfung von
PSEN und RD durchführt. Die UND-Verknüpfung (positive Logik) dieser beiden
Signale erzeugt ein Lese-Strobesignal, das im aktiven Zustand auf 0-Signal ist und
für den kombinierten Speicher verwendet werden kann. Da der PSEN-Zyklus kürzer als der RD-Zyklus ist, muss der externe Speicher schnell genug sein, um sich
an den PSEN-Zyklus anpassen zu können.
73
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.21:
Impulsdiagramme zum Lesen aus dem externen Programmspeicher ohne MOVXBefehl und mit MOVX-Befehl
74
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.4
Zeitgeber und Zähler im 8051
1.4
Zeitgeber und Zähler im 8051
Im 8051 sind zwei 16-Bit-Zeitgeber/Zähler (0 und 1) integriert, die entweder als
Zeitgeber oder Zähler sowie in vier Betriebsarten (0,1, 2 und 3) arbeiten können.
Zu den Zeitgebern/Zählern gehören die speziellen Funktionsregister TMOD (Zeitgeber/Zähler-Betriebsartregister von Tabelle 1.18) und TCON (Zeitgeber/ZählerSteuer/Statusregister von Tabelle 1.19). Sie dienen zur Festlegung von Funktion
und Betriebsart bzw. zur Steuerung und Kennzeichnung der Zeitgeber/Zähler
(z.B. für einen Interrupt oder bei einem Überlauf). Änderungen des Inhalts von
TMOD oder TCON – sei es durch Hardware oder Software, abhängig von den einzelnen Bits dieser Register – wirken sich ab S1P1 im ersten Zyklus des nächsten
Befehls aus. Sämtliche Bits der genannten Register werden durch Rücksetzen
gelöscht. Die genauen Funktionen der einzelnen Bits dieser Register sind aus
Tabelle 1.18 und Tabelle 1.19 zu ersehen.
höchstwertiges
Bit
M1
M0
GATE
C/T
M1
M0

















C/T

















GATE
niedrigstwertiges
Bit
Zeitgeber/Zähler 1
Zeitgeber/Zähler 0
Kennzeichnungsbit
Bit-Speicherstelle
Funktion von GATE und C/T
GATE
TMOD.7.3
Steuerung durch eine Logikschaltung. Wird
es gesetzt, so ist der Zeitgeber/Zähler nur
dann aktiviert, wenn der Anschluss INTx ein
1-Signal hat und das Steuerbit TRx gesetzt ist
(x = 0,1). Ist GATE gelöscht, so wird der Zeitgeber/Zähler durch Setzen von TRx stets aktiviert.
C/T
TMOD.6.2
Festlegung, ob Betrieb als Zeitgeber oder
Zähler erfolgt. Falls gelöscht, Betrieb als Zeitgeber (Eingangsimpulse vom internen Taktgeber). Falls gesetzt, Betrieb als Zähler
(Eingangsimpulse vom Anschluss Tx).
M1
(TMOD.5.1)
M0
(TMOD.4.0)
0
0
0
1
Betriebs- Funktion in der gewählten Betriebsart
art
0
1
Die Bits 4 bis 0 stellen den Vorteiler dar
(Division durch 32).
THx und TLx sind in Kaskade zum 16-Bit-
Zeitgeber/Zähler zusammengeschaltet;
einen Vorteiler gibt es nicht.
Tabelle 1.18: Zeitgeber/Zähler-Betriebsartregister (TMOD)
75
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
1
0
2
Der 8-Bit-Zeitgeber/Zähler THx mit automatischer Rückladung enthält einen Wert, der
nach TLx rückgeladen wird, wenn dort ein
Überlauf erfolgt.
1
1
3
Zeitgeber/Zähler 0: TL0 ist ein 8-Bit-Zeitgeber/Zähler, der durch die Standard-Steuerbits
von Zeitgeber/Zähler 0 gesteuert wird. TH0
ist ein 8-Bit-Zeitgeber, der nur durch die
Steuerbits von Zeitgeber/Zähler 1 gesteuert
wird.
1
1
3
Zeitgeber/Zähler 1: Dieser ist gestoppt.
Tabelle 1.18: Zeitgeber/Zähler-Betriebsartregister (TMOD) (Forts.)
Die Steuerbits C/T (TMOD.2 und TMOD.6) entscheiden darüber, ob die Zeitgeber/Zähler 0 bzw. 1 als Zeitgeber bzw. Zähler betrieben werden. Wenn die Einheit
als Zeitgeber (O/T = 0) arbeitet, wird ihr Register bei jedem Maschinenzyklus
inkrementiert, so dass diese praktisch gezählt werden. Da ein Maschinenzyklus
aus 12 Oszillatorperioden besteht, beträgt die Zählrate 1/2 der Oszillatorfrequenz.
höchstwertiges
Bit
TF1
niedrigstwertiges
Bit
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Kennzeichnungsbit
Bit-Speicherstelle
Funktion
TF1
TCON.7
Kennzeichnungsbit für Überlauf von Zeitgeber/Zähler 1. Wird beim Überlauf durch Hardware gesetzt und durch Hardware gelöscht,
wenn der Prozessor eine Interrupt-Routine
anspringt.
TR1
TCON.6
Steuerbit zur Inbetriebnahme von Zeitgeber/
Zähler 1. Wird durch Software gesetzt/
gelöscht, um Zeitgeber/Zähler 1 an- bzw.
abzuschalten.
TF0
TCON.5
Kennzeichnungsbit für Überlauf von Zeitgeber/Zähler 0. Wird beim Überlauf durch
Hardware gesetzt und durch Hardware
gelöscht, wenn der Prozessor eine InterruptRoutine anspringt.
TR0
TCON.4
Steuerbit zur Inbetriebnahme von Zeitgeber/
Zähler 0. Wird durch Software gesetzt/
gelöscht, um Zeitgeber/Zähler 0 an- bzw.
abzuschalten.
Tabelle 1.19: Zeitgeber/Zähler-Steuer/Statusregister (TCON)
76
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.4
Zeitgeber und Zähler im 8051
IE1
TCON.3
Kennzeichnungsbit für externen Interrupt an
INT1. Wird durch Hardware gesetzt, wenn
eine 1-0-Flanke zur Auslösung eines externen
Interrupts an INT1 erkannt wird, und bei der
Ausführung des Interrupts gelöscht.
IT1
TCON.2
Steuerbit für Interrupt an INT1. Wird durch
Software gesetzt oder gelöscht, um entweder
einen flankenaktivierten (1-0-Übergang) oder
einen pegelaktivierten (aktiv 0-Signal) externen Interrupt zuzulassen.
IE0
TCON.1
Kennzeichnungsbit für externen Interrupt an
INT0. Wird durch Hardware gesetzt, wenn
eine 1-0-Flanke zur Auslösung eines externen
Interrupts an INT0 erkannt wird, und bei Ausführung des Interrupts gelöscht.
IT0
TCON.0
Steuerbit für Interrupt an INT0. Wird durch
Software gesetzt oder gelöscht, um entweder
einen flankenaktivierten (1-0-Übergang) oder
einen pegelaktivierten (aktiv 0-Signal) externen Interrupt zuzulassen.
Tabelle 1.19: Zeitgeber/Zähler-Steuer/Statusregister (TCON) (Forts.)
Arbeitet dieser als Zähler (C/T = 1), so wird das Register bei jeder 1-0-Flanke an
dem entsprechenden externen Anschluss (T0 oder T1) inkrementiert. Bei dieser
Betriebsweise wird der externe Anschluss während des Zeitabschnitts S5P2 eines
jeden Maschinenzyklus abgefragt. Ergibt sich hierbei in einem Zyklus 1-Signal
und im nächsten 0-Signal, wird der Zähler inkrementiert. Der neue Zählwert
erscheint im Register während des Zeitabschnitts S3P1 in dem Zyklus unmittelbar
nach jenem, in dem der Übergang erkannt wurde. Da es zwei Maschinenzyklen
(24 Oszillatorperioden) dauert, um eine 1-0-Flanke (negativ) zu erkennen, beträgt
die Zählrate maximal 1/24 der Oszillatorfrequenz. Bezüglich der Zyklen äußerer
Eingangssignale gibt es keine Beschränkungen; um jedoch sicherzustellen, dass
ein gegebener Pegel wenigstens einmal abgefragt wird, bevor er sich ändert, sollte
er mindestens bei einem vollen Maschinenzyklus stehen bleiben.
Außer der Möglichkeit, zwischen der Funktion als Zeitgeber oder Zähler zu wählen, gibt es noch vier verschiedene Betriebsarten, die durch die Bitpaare M1, M0 im
speziellen Funktionsregister TMOD festgelegt werden. Die Betriebsarten 0, 1 und 2
sind bei beiden Zeitgebern/Zählern dieselben, Betriebsart 3 ist unterschiedlich.
Die vier Betriebsarten werden im Folgenden beschrieben. Abbildung 1.22 zeigt
den Mikrocontroller 8051 in einer simulierten Schaltung mit externem Taktgeber
und interner Zählfunktion.
77
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.22:
Mikrocontroller 8051 mit externem Taktgeber und interner Zählfunktion
Betriebsart 0: Wie im vorigen Abschnitt dargelegt, ist die Betriebsart 0 beim Zeitgeber/Zähler 0 und beim Zeitgeber/Zähler 1 identisch. Bei der zur Erläuterung
dieser Betriebsart dienenden Abbildung 1.23 wird auf Zeitgeber/Zähler 1 Bezug
genommen; für Zeitgeber/Zähler 0 sind lediglich die Bezeichnungen T0, TF0,
INT0, TL0 und TH0 anstelle der entsprechenden, zum Zeitgeber/Zähler 1 gehörenden Bezeichnungen einzusetzen. Für die Zeitgeber/Zähler 0 und 1 gibt es je
ein Bit GATE (TMOD.3 und TMOD.7).
Abb. 1.23:
Blockschaltung von Zeitgeber/Zähler in Betriebsart 0 (13-Bit-Zähler)
In Betriebsart 0 verhält sich der Zeitgeber/Zähler 0 oder 1 wie der 8048-Zeitgeber,
der ein 8-Bit-Zähler mit Vorteilung durch 32 ist. Wie Abbildung 1.23 zeigt, ist das
78
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.4
Zeitgeber und Zähler im 8051
Zeitgeber/Zähler-Register in dieser Betriebsart ein 13-Bit-Register. Wenn bei der
Zählung ein Überlauf vom Zustand »Nur Einsen« in den Zustand »Nur Nullen«
erfolgt, setzt dieses Register das Zeitgeber-Interrupt-Kennzeichnungsbit TF1. Die
Zählung am Eingang des Zeitgebers/Zählers 1 ist dann freigegeben, wenn TR1 = 1
gesetzt ist und außerdem entweder GATE = 0 oder INT1 = 1 gilt. (Mit GATE = 1
kann der Zeitgeber/Zähler über den externen Eingang INT1 gesteuert werden,
wodurch Pulsbreitenmessungen erleichtert werden.)
TR1 ist ein Steuerbit im speziellen Funktionsregister TCON (Tabelle 1.19) und
GATE ist ein Steuerbit im speziellen Funktionsregister TMOD (Tabelle 1.18).
Das 13-Bit-Register besteht aus sämtlichen acht Bits des speziellen Funktionsregisters TH1 und den unteren fünf Bits des speziellen Funktionsregisters TL1. Die
oberen Bits von TL1 sind unbestimmt und sollten nicht beachtet werden. Durch
Setzen des Kennzeichnungsbits »Inbetriebnahme« (TR1) werden die Register
nicht gelöscht.
Betriebsart 1: Betriebsart 1 ist mit Betriebsart 0 identisch, ausgenommen, dass das
Zeitgeber/Zähler-Register in Betriebsart 1 im 16-Bit-Format betrieben wird.
Betriebsart 2: Bei dieser Betriebsart wird das Zeitgeber/Zähler-Register zu einem
8-Bit-Zähler (TL1) mit automatischer Rückladung, wie in Abbildung 1.24 dargestellt ist. Ein Überlauf von TL1 setzt nicht nur TF1‚ sondern lädt auch den Inhalt
von TH1 nach TL1 zurück; TH1 wird vorher per Software eingestellt. TH1 wird
durch den Rückladevorgang nicht geändert.
Abb. 1.24: Blockschaltung von Zeitgeber/Zähler in Betriebsart 2 (automatische Rückladung)
79
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Betriebsart 2 von Zeitgeber/Zähler 1 und Betriebsart 2 von Zeitgeber/Zähler 0
sind gleich.
Betriebsart 3: Wird Zeitgeber/Zähler 1 in Betriebsart 3 gebracht, so ändert sich sein
Inhalt nicht. In den anderen Betriebsarten lässt sich dies durch TR1 = 0 erreichen.
Abb. 1.25:
Blockschaltung des Zeitgebers/Zählers
Zeitgeber/Zähler 0 in Betriebsart 3 richtet TL0 und TH0 als zwei getrennte Zähler
ein. Abbildung 1.25 zeigt die Logik von Zeitgeber/Zähler 0 und 1 in dieser
Betriebsart. Daraus ist ersichtlich, dass TL0 die Steuerbits C/T, GATE, TR0, INT0
und TF0 von Zeitgeber/Zähler 0 verwendet und TH0 somit nur als Zeitgeber
benutzt werden kann (Zählen von Maschinenzyklen). Dabei nimmt TH0 jetzt TR1
und TF1 von Zeitgeber/Zähler 1 in Anspruch, so dass TH0 nun den Interrupt von
Zeitgeber/Zähler 1 steuert.
Betriebsart 3 ist für solche Anwendungen vorgesehen, die einen weiteren 8-BitZeitgeber oder -Zähler benötigen. Mit dem Zeitgeber/Zähler 0 in Betriebsart 3
stellt sich der 8051 als Mikrocontroller mit drei Zeitgebern/Zählern dar. Befindet
sich Zeitgeber/Zähler 0 in Betriebsart 3, so lässt sich Zeitgeber/Zähler 1 ein- und
ausschalten, indem man ihn aus seiner Betriebsart 3 herausnimmt bzw. ihn in
80
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.5
Serielle Schnittstelle
diese hineinbringt. Außerhalb Betriebsart 3 kann er dann vom seriellen Port als
Baudratengenerator verwendet werden oder in jeder anderen Anwendung arbeiten, die keinen Interrupt erfordert (TF1 ist für ihn jetzt nicht verfügbar).
1.5
Serielle Schnittstelle
Der serielle Port ist ein Vollduplex-Port, der also gleichzeitig senden und empfangen kann. Er ist außerdem empfängerseitig gepuffert, das heißt, er kann bereits
mit dem Empfang eines zweiten Bytes beginnen, bevor das vorher empfangene
Byte vom Empfängerregister gelesen wurde. Ist jedoch das erste Byte dann noch
nicht gelesen, wenn das zweite Byte vollständig ist, so geht eines der Bytes verloren. Sowohl das serielle Sender- als auch das Empfängerregister des Ports werden
über das spezielle Funktionsregister SBUF angesprochen; Schreiben in SBUF lädt
das Senderegister, und Lesen aus SBUF greift auf ein räumlich getrenntes Empfängerregister zu. Abbildung 1.26 zeigt die simulierte Schaltung einer seriellen
Schnittstelle mit dem Mikrocontroller 8051 und dem Schnittstellenbaustein
MAX232.
Abb. 1.26: Simulierte Schaltung einer seriellen Schnittstelle mit dem Mikrocontroller 8051 und
dem Schnittstellenbaustein MAX232
81
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
1.5.1
Betriebsarten des seriellen Ports
Der serielle Port kann in einer von vier Betriebsarten arbeiten, was durch das spezielle Funktionsregister SCON (Steuer- und Statusregister für den seriellen Port)
vorgegeben wird. Außer den hierfür erforderlichen Bits zur Betriebsart-Auswahl
enthält dieses Register auch das 9. Datenbit, das beim Senden und Empfangen
bestimmte Funktionen erfüllt (TB8 bzw. RB8), sowie die Interrupt-Kennzeichnungsbits des seriellen Ports (TI und RI), ein Bit zur Empfangsfreigabe serieller
Daten (REN) und eine weitere Bitstelle. Die Funktionen der Bits in SCON sind in
Tabelle 1.20 aufgelistet; in ihrem unteren Teil sind die vier Betriebsarten des seriellen Ports angegeben. Abbildung 1.27 zeigt den Aufbau der Datenblöcke bei typischen Anwendungen mit Angabe der Betriebsarten. Diese werden im Folgenden
näher beschrieben.
Abb. 1.27:
Aufbau typischer Datenblöcke für einige Anwendungen
82
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.5
Serielle Schnittstelle
höchstwertiges
Bit
SM0
niedrigstwertiges
Bit
SM1
SM2
REN
TB8
RB8
TI
RI
Kennzeichnungsbit
Bit-Speicherstelle
Funktion
SM0, SM1
SCON.6,7
siehe Seite 84
SM2
SCON.5
Bit für Multiprozessor-Datenübertragung. Es
gibt die Datenübertragung in einem Multiprozessorsystem in den Betriebsarten 2 und
3 frei. Ist SM2 in den Betriebsarten 2 oder 3
auf 1-Signal gesetzt, so wird RI nicht aktiviert, wenn das empfangene 9. Datenbit
(RB8) den Wert Null hat. Ist SM2 in Betriebsart 1 auf 1-Signal gesetzt, so wird RI nicht
aktiviert, wenn kein gültiges Stoppbit empfangen wurde. In Betriebsart 0 sollte SM2
auf 0-Signal sein.
REN
SCON.4
Bit für Empfangsfreigabe. Wird durch Software gesetzt/gelöscht, um den Empfang serieller Daten zuzulassen/nicht zuzulassen.
TB8
SCON.3
9. Datenbit, das in den Betriebsarten 2 und 3
gesendet wird. Kann durch Software gesetzt
oder gelöscht werden.
RB8
SCON.2
9. Datenbit, das in den Betriebsarten 2 und 3
empfangen wurde. Ist SM2 in Betriebsart 1
auf null gesetzt, so stellt RB8 das empfangene Stoppbit dar. In Betriebsart 0 wird RB8
nicht verwendet.
TI
SCON.1
Sende-Interrupt-Kennzeichnungsbit. Wird in
Betriebsart 0 durch Hardware am Ende der
für das 8. Bit vorgesehenen Zeit gesetzt, bei
den übrigen Betriebsarten am Anfang des
Stoppbits. Dies gilt für jedes serielle Senden.
Löschen muss durch Software erfolgen.
RI
SCON.0
Empfänger-Interrupt-Kennzeichnungsbit.
Wird in Betriebsart 0 durch Hardware am
Ende der für das 8. Bit vorgesehenen Zeit
gesetzt, bei den übrigen Betriebsarten in der
Mitte der für das Stoppbit vorgesehenen Zeit.
Dies gilt für jeden seriellen Empfang. Ausnahmen werden zu SM2 erläutert. Löschen
muss durch Software erfolgen.
Tabelle 1.20: Steuer-/Statusregister des seriellen Ports (SCON)
83
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
SM0
(SCON.7)
SM1
(SCON.6)
Betriebs- Funktion in der gewählten Betriebsart
art
0
0
0
E/A-Erweiterung durch Schieberegister,
Baudrate 1/12 der Taktfrequenz
0
1
1
8-Bit-UART, variable Baudrate
1
0
2
9-Bit-UART, die Baudrate beträgt entweder
1/32 oder 1/64 der Taktfrequenz
1
1
3
9-Bit-UART, variable Baudrate
Tabelle 1.20: Steuer-/Statusregister des seriellen Ports (SCON) (Forts.)
Die Funktionen der Bits in SCON sind in Tabelle 1.20 aufgelistet; in ihrem unteren Teil sind die vier Betriebsarten des seriellen Ports angegeben. Abbildung 1.27
zeigt den Aufbau der Datenblöcke bei typischen Anwendungen mit Angabe der
Betriebsarten. Diese werden im Folgenden näher beschrieben.
Betriebsart 0: Serielle Daten werden durch RXD sowohl empfangen als auch ausgegeben. TXD ist der Ausgang für den Schiebetaktimpuls. Es werden acht Datenbits
empfangen oder ausgegeben, und zwar das niedrigstwertige Bit zuerst. Die Baudrate ist zu 1/12 der Oszillatorfrequenz festgelegt.
1.5.2
Senden und Empfangen von Informationen
Der Empfang von Daten wird durch die Bedingungen REN = 1 und RI = 0 eingeleitet. Während S6P2 des nächsten Maschinenzyklus schreibt die Steuereinheit RX
die Bits 11111110 in das Empfänger-Schieberegister und aktiviert in der nächsten Taktphase das Signal »RECEIVE«.
Sobald Datenbits von rechts hineingeschoben werden, fallen Einsen nach links
heraus. Ist die Null, die ursprünglich in die Speicherstelle ganz rechts geladen
worden war, ganz links im Schieberegister angekommen, so wird die Steuereinheit RX veranlasst, eine letzte Verschiebung um eine Speicherstelle vorzunehmen
und SBUF zu laden. Während S1P1 des 10. Maschinenzyklus nach dem Schreiben
in SCON durch RI gelöscht wurde, wird »RECEIVE« deaktiviert und RI gesetzt.
Betriebsart 1: Hier werden zehn Bits ausgegeben (über TXD) oder empfangen (über
RXD): ein Startbit (0), acht Datenbits (das niedrigstwertige Bit zuerst) und ein
Stoppbit (1). Beim Empfang nimmt RB8 in SCON das Stoppbit auf. Die Baudrate
wird durch die Überlaufrate von Zeitgeber 1 festgelegt.
Die Ausgabe wird durch jeden Befehl eingeleitet, der SBUF als Zielregister verwendet. Das Signal »Schreiben in SBUF« lädt auch ein 1-Signal in die 9. Bitposition des Sender-Schieberegisters und teilt der Steuereinheit TX mit, dass eine
Ausgabe verlangt wird. Diese beginnt dann während S1P1 desjenigen Maschinenzyklus, der auf den nächsten Überlauf des die Überläufe von Zeitgeber/Zähler 1
84
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.5
Serielle Schnittstelle
durch 16 dividierenden Zählers folgt. Somit sind die Bitzeiten in Bezug auf diesen
Zähler synchronisiert, nicht in Bezug auf das Signal »Schreiben in SBUF«.
Die Ausgabe beginnt mit der Aktivierung von SEND, wodurch das Startbit an TXD
erscheint. Eine Bitzeit später wird DATA aktiviert, was zur Freigabe der auszugebenden Bits des Sender-Schieberegisters nach TXD führt. Der erste Schiebeimpuls tritt eine Bitzeit danach auf.
Sobald Datenbits nach rechts hinausgeschoben werden, kommen Nullen von links
entsprechend den Taktimpulsen hinein. Ist das höchstwertige Bit des Datenbytes
am Ausgang des Schieberegisters angekommen, so befindet sich ein 1-Signal, das
ursprünglich in die 9. Speicherstelle geladen worden war, unmittelbar links neben
dem höchstwertigen Bit, und alle übrigen Speicherstellen links davon enthalten
nur Nullen. Diese Konstellation veranlasst die Steuereinheit TX, eine letzte Verschiebung um eine Speicherstelle vorzunehmen, danach SEND zu deaktivieren
und TI zu setzen. Dies erfolgt beim 10. Überlauf des durch 16 dividierenden Zählers nach dem Signal »Schreiben in SBUF«.
Der Empfang von Daten wird eingeleitet, sobald ein Übergang von 1 nach 0 an
RXD entdeckt ist. Zu diesem Zweck erfolgt – unabhängig von der eingestellten
Baudrate – eine 16-malige Abfrage von RXD. Ist ein Übergang entdeckt worden, so
wird der durch 16 dividierende Zähler sofort zurückgesetzt und 1FFH in das Empfänger-Schieberegister geschrieben. Das Rücksetzen des durch 16 dividierenden
Zählers führt zur Synchronisation seiner Überläufe mit den Zeiten, die für die
ankommenden Bits zur Verfügung stehen.
Die 16 Zählerschritte teilen jede Bitzeit in Sechzehntel ein. Während des 7., 8. und
9. Zählerschritts jeder Bitzeit überprüft der Bitdetektor den an RXD stehenden
Wert. Der akzeptierte Wert ist derjenige, der bei wenigstens zwei der drei Abfragen
festgestellt wurde. Dies geschieht zur Rauschunterdrückung. Beträgt der während
der 1. Bitzeit akzeptierte Wert nicht null, so werden die Empfangsschaltungen
zurückgesetzt, und die Einheit wartet auf einen weiteren Übergang von 1 nach 0.
Dies dient zur Rückweisung falscher Startbits. Ist das Startbit als gültig erkannt,
wird es in das Empfänger-Schieberegister übernommen und danach ebenfalls der
restliche Datenblock.
Sobald Datenbits von rechts hineingeschoben werden, fallen Einsen nach links
heraus. Ist das Startbit ganz links im Schieberegister angekommen (bei Betriebsart 1 ein 9-Bit-Register), so wird die Steuereinheit RX veranlasst, eine letzte Verschiebung um eine Speicherstelle vorzunehmen, SBUF mit RB8 zu laden sowie
RI zu setzen. Das Signal zum Laden von SBUF und RB8 sowie zum Setzen von
RI wird dann und nur dann erzeugt, wenn folgende Bedingungen während der
Erzeugung des letzten Schiebeimpulses erfüllt sind:
1. RI = 0
2. entweder ist SM2 = 0 oder das empfangene Stoppbit = 1.
85
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Ist eine dieser zwei Bedingungen nicht erfüllt, so ist der empfangene Block unwiederbringlich verloren. Bei Erfüllung beider Bedingungen nimmt RB8 das Stoppbit
auf, SBUF die acht Datenbits, und RI wird aktiviert. Unabhängig davon, ob die
obigen Bedingungen erfüllt sind oder nicht, beginnt die Einheit zu dieser Zeit wieder, auf einen Übergang von 1 nach 0 an RXD zu warten.
Betriebsarten 2 und 3: Hier werden elf Bits ausgegeben (über TXD) oder empfangen (über RXD): ein Startbit mit 0-Signal gekennzeichnet, acht Datenbits (das
niedrigstwertige Bit zuerst), ein programmierbares 9. Datenbit und ein Stoppbit
mit 1-Signal gekennzeichnet. Soll ausgegeben werden, so kann dem 9. Datenbit
(TB8) der Wert 0 oder 1 zugewiesen werden. Beim Empfang wird das 9. Datenbit
von RB8 in SCON aufgenommen. In Betriebsart 2 beträgt die Baudrate entweder
1/32 oder 1/64 der Oszillatorfrequenz, in Betriebsart 3 wird sie von der durch 16
oder 32 dividierten Überlaufrate des Zeitgebers 1 festgelegt.
Hierdurch ist eine automatische Inbetriebnahme von Slave-Prozessoren durch
eine Adressblock-Erkennung möglich. Diese erfolgt mittels Interrupts, was zu
einer Vereinfachung des Datenaustausches zwischen den Mikrocontrollern (8051)
führt. Die Ausgabe wird durch jeden Befehl eingeleitet, der SBUF als Zielregister
verwendet. Das Signal »Schreiben in SBUF« lädt auch TB8 in die 9. Bitposition
des Sender-Schieberegisters und teilt der Steuereinheit TX mit, dass eine Ausgabe
verlangt wird. Diese beginnt dann während S1P1 desjenigen Maschinenzyklus, der
auf den nächsten Überlauf in dem durch 16 dividierenden Zähler folgt. Somit sind
die Bitzeiten in Bezug auf diesen Zähler synchronisiert, nicht in Bezug auf das
Signal »Schreiben in SBUF«.
Die Ausgabe beginnt mit der Aktivierung von SEND, wodurch das Startbit an TXD
erscheint. Eine Bitzeit später wird DATA aktiviert, was zur Freigabe des auszugebenden Bits des Sender-Schieberegisters nach TXD führt. Der erste Schiebeimpuls tritt eine Bitzeit danach auf; er taktet ein 1-Signal (das Stoppbit) in die
9. Bitposition des Schieberegisters. Danach werden nur Nullen hineingetaktet.
Sobald daher Datenbits nach rechts hinausgeschoben werden, kommen Nullen
von links entsprechend den Taktimpulsen hinein. Ist TB8 am Ausgang des Schieberegisters angekommen, so befindet sich das Stoppbit unmittelbar links daneben, und alle übrigen Speicherstellen links davon enthalten nur Nullen. Diese
Konstellation veranlasst die Steuereinheit TX, eine letzte Verschiebung um eine
Speicherstelle vorzunehmen, danach SEND zu deaktivieren und TI zu setzen.
Dies erfolgt beim 11. Überlauf des durch 16 dividierenden Zählers nach dem Signal »Schreiben in SBUF«.
Der Empfang von Daten wird eingeleitet, sobald ein Übergang von 1 nach 0 (negative Flanke) an RXD entdeckt wurde. Zu diesem Zweck erfolgt – unabhängig von
der eingestellten Baudrate – eine 16-malige Abfrage von RXD. Ist ein Übergang
entdeckt worden, so wird der durch 16 dividierende Zähler sofort zurückgesetzt
und 1FFH in das Empfangs-Schieberegister geschrieben.
86
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.5
Serielle Schnittstelle
Während des 7., 8. und 9. Zählerschritts jeder Bitzeit überprüft der Bitdetektor den
an RXD stehenden Wert. Der akzeptierte Wert ist derjenige, der bei wenigstens zwei
der drei Abfragen festgestellt wurde. Beträgt der während der ersten Bitzeit akzeptierte Wert nicht null, so werden die Empfangsschaltungen zurückgesetzt, und die
Einheit wartet auf einen weiteren Übergang von 1 nach 0 (negative Flanke). Ist das
Startbit als gültig erkannt, wird es in das Empfänger-Schieberegister übernommen
und danach ebenfalls der restliche Datenblock.
Sobald Datenbits von rechts hineingeschoben werden, fallen Einsen nach links
heraus. Ist das Startbit ganz links im Schieberegister angekommen (bei den
Betriebsarten 2 und 3 ein 9-Bit-Register), so wird die Steuereinheit RX veranlasst,
eine letzte Verschiebung um eine Speicherstelle vorzunehmen, SBUF und RB8 zu
laden sowie RI zu setzen. Das Signal zum Laden von SBUF und RB8 sowie zum
Setzen von RI wird dann und nur dann erzeugt, wenn folgende Bedingungen
während der Erzeugung des letzten Schiebeimpulses erfüllt sind:
1. RI = 0 und
2. entweder ist SM2 = 0 oder das empfangene 9. Datenbit = 1.
Ist eine dieser Bedingungen nicht erfüllt, so ist der empfangene Block unwiederbringlich verloren, und RI wird nicht gesetzt. Bei Erfüllung beider Bedingungen
nimmt RB8 das empfangene 9. Datenbit auf und SBUF die ersten acht Datenbits.
Unabhängig davon, ob die obigen Bedingungen erfüllt sind oder nicht, beginnt die
Einheit eine Bitzeit später erneut auf einen Übergang von 1 nach 0 (negative
Flanke) an RXD zu warten.
Man beachte, dass der Wert des empfangenen Stoppbits ohne Einfluss auf SBUF,
RB8 oder RI ist.
1.5.3
Datenverkehr in Multiprozessorsystemen
Die Betriebsarten 2 und 3 beinhalten eine spezielle Vorkehrung zum Datenverkehr in Multiprozessorsystemen. Bei diesen Betriebsarten werden neun Bits empfangen, wobei das 9. Bit von RB8 aufgenommen wird. Danach kommt das
Stoppbit. Der Port kann so programmiert werden, dass nach Empfang des Stoppbits ein Interrupt des seriellen Ports nur dann ausgelöst wird, wenn RB8 = 1 ist.
Dies wird durch Setzen von SM2 in SCON erreicht.
Eine Möglichkeit zur Verwendung dieses Merkmals in Multiprozessorsystemen
besteht in Folgendem: Wenn der Master-Mikrocontroller einen Datenblock an
einen von mehreren Slaves übertragen will, sendet er zunächst ein Adressbyte aus,
das den betreffenden Slave identifiziert. Ein Adressbyte unterscheidet sich
dadurch von einem Datenbyte, dass das 9. Bit des Adressbytes eine Eins enthält,
das 9. Bit des Datenbytes dagegen ein 0-Signal. Ist SM2 = 1 gesetzt, so wird bei den
Slaves kein Interrupt durch ein Datenbyte ausgelöst, durch ein Adressbyte dagegen erfolgt ein Interrupt bei allen Slaves. Somit kann jeder Slave das empfangene
87
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Adressbyte daraufhin überprüfen, ob er adressiert wurde. Der adressierte Slave
löscht sein Bit SM2 und trifft Vorbereitungen, um die ankommenden Datenbytes
in Empfang zu nehmen. Die nicht adressierten Slaves lassen hingegen ihre Bits
SM2 gesetzt und fahren mit der Bearbeitung ihrer Aufgaben fort. Ankommende
Datenbytes werden dabei nicht berücksichtigt.
Abb. 1.28:
Serieller Datenverkehr in einem 8051-Multicontroller-System
Die beschriebenen Vorgänge (Abbildung 1.28) lassen sich durch ein Protokoll für
den seriellen Datenverkehr in Multicontroller-Systemen beschreiben:
1.
Der serielle Port eines jeden Slaves ist per Hardware bereit, eine Adresse entgegenzunehmen. Der Empfang eines Adressblocks ruft einen Interrupt hervor,
wenn das Bit SM2 des Slaves auf 1-Signal gesetzt ist (einen nur vom Adressblock ausgelösten Interrupt).
2. Der Master übermittelt dann einen Block, der die 8-Bit-Adresse desjenigen Slaves
enthält, der die folgenden Anweisungen und Daten erhalten soll. Bei dem übermittelten Adressblock ist das 9. Datenbit (TB8) auf 1-Signal gesetzt.
88
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.5
Serielle Schnittstelle
3. Nach dem Empfang des Adressblocks bewirkt der serielle Port jedes Slaves
einen Interrupt bei seiner Zentraleinheit. Diese vergleicht die empfangene
Adresse mit der eigenen.
4. Der adressierte, als Slave arbeitende 8051 setzt sein Bit SM2 auf 0-Signal zurück
und erhält dadurch alle folgenden Informationen. Sämtliche anderen SlaveMikrocontroller 8051 belassen ihr Bit SM2 im Zustand 1 und ignorieren somit
alle weiteren Informationen, bis eine neue Adresse erscheint.
5. Der Master überträgt nun die Steuerinformationen und Daten, die von dem vorher adressierten 8051 (der sein Bit SM2 auf null gesetzt hat) aufgenommen werden.
In Betriebsart 0 bleibt das Bit SM2 wirkungslos, in Betriebsart 1 kann es zur
Prüfung der Gültigkeit des Stoppbits dienen. Ist in Betriebsart 1 beim Empfang
SM2 = 1, so wird der beim Empfang sonst auftretende Interrupt nicht aktiviert,
bevor ein gültiges Stoppbit empfangen wurde.
1.5.4
Baudraten (Übertragungsraten)
Die Baudrate in Betriebsart 0 des Ports beträgt:
BaudrateBetriebsart 0 
Oszillatorfrequenz
12
Die Baudrate in Betriebsart 2 hängt vom Wert des Bits SMOD im speziellen Funktionsregister PCON ab. Bei SMOD = 0 (Wert nach dem Rücksetzen) beträgt die
Baudrate 1/64 der Oszillatorfrequenz, bei SMOD = 1 ist sie 1/32 der Oszillatorfrequenz. Also gilt:
BaudrateBetriebsart 2 
2 SMOD
 Oszillatorfrequenz
64
Wird Zeitgeber/Zähler 1 als Generator für die Baudrate verwendet, so sind die
Baudraten bei den Betriebsarten 1 und 3 durch die Überlaufraten dieses Zeitgebers/Zählers sowie durch den Wert von SMOD wie folgt festgelegt:
BaudrateBetriebsarten 1 und 3 =
2 SMOD
⋅ Überlaufrate
32
Bei dieser Anwendung sollten Interrupts von Zeitgeber/Zähler 1 nicht zugelassen
sein. Der Zeitgeber/Zähler kann entweder als Zeitgeber oder als Zähler arbeiten,
und zwar in jeder der drei Betriebsarten, in denen er laufen kann. Bei den meisten
89
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
typischen Anwendungen arbeitet er als Zeitgeber mit automatischer Rückladung
(oberes Halbbyte von TMOD ist 0010B). In diesem Fall ergibt sich die Baudrate aus:
BaudrateBetriebsarten 1 und 3 
2 SMOD Oszillatorfrequenz

32
12  256 - TH1 
Man kann mit dem Zeitgeber 1 sehr niedrige Baudraten erreichen, wenn man
Interrupts bei diesem Zeitgeber zulässt, ihn so einstellt, dass er als 16-Bit-Zeitgeber läuft (oberes Halbbyte von TMOD ist 0001B), und ihn somit als Zeitgeber mit
16-Bit-Rückladung durch Software verwendet. Die Baudrate beträgt dann:
BaudrateBetriebsarten 1 und 3 
2 SMOD
Oszillatorfrequenz

32 12 65536 - TH 1, TH 0  
In Tabelle 1.21 sind einige gebräuchliche Baudraten sowie Möglichkeiten zu ihrer
Erzeugung unter Verwendung von Zeitgeber 1 angegeben.
Baudrate
(kBaud)
Betriebsart
des seriellen
Ports
Oszillatorfrequenz
(MHz)
SMOD
max. 1000
0
12
X
max. 375
Zeitgeber/Zähler 1
C/T
Betriebsart
Rückladewert
X
X
X
2
12
1
X
X
X
62,5
1,3
12
1
0
2
FFH
19,2
1,3
11,059
1
0
2
FDH
9,6
1,3
11,059
0
0
2
FDH
4,8
1,3
11,059
0
0
2
FAH
2,4
1,3
11,059
0
0
2
F4H
1,2
1,3
11,059
0
0
2
E8H
0,1375
1,3
11,986
0
0
2
1DH
0,110
1,3
6
0
0
2
72H
0,110
1,3
12
0
0
1
FEEBH
Tabelle 1.21: Häufig verwendete, durch Zeitgeber/Zähler 1 erzeugte Baudraten
1.6
Interrupt-Verarbeitung
Dem Mikrocontroller 8051 sind fünf Interrupt-Quellen zugeordnet, wie aus Abbildung 1.29 zu ersehen ist. Jeder der externen Interrupts INT0 und INT1 kann entweder pegel- oder flankenaktiviert sein, was von den Bits IT0 und IT1 im Register
TCON abhängt. Die Kennzeichnungsbits, die diese Interrupts dann auslösen, sind
90
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.6
Interrupt-Verarbeitung
IE0 und IE1 in TCON. Sie werden nur dann mittels Hardware beim Anspringen
der Subroutinen-Adresse gelöscht, wenn der Interrupt flankenaktiviert war. Ist der
Interrupt dagegen pegelaktiviert, dann ist es die anfordernde externe Quelle, die
das Kennzeichnungsbit steuert und nicht die Hardware auf dem Chip.
Abb. 1.29: Interrupt-Quellen des 8051
Die Interrupts von Zeitgeber/Zähler 0 und 1 werden durch die Bits TF0 und TF1
erzeugt, die durch einen Überlauf in den entsprechenden Registern dieser Zeitgeber/Zähler gesetzt werden (ausgenommen Zeitgeber/Zähler 0 in Betriebsart 3).
Bei einem Zeitgeber/Zähler-Interrupt wird das ihn erzeugende Kennzeichnungsbit durch die Hardware auf dem Chip gelöscht, sobald die Subroutinen-Adresse
angesprungen wurde.
Der Interrupt des seriellen Ports wird durch eine logische ODER-Verknüpfung
von RI und TI hervorgerufen. Keines dieser Kennzeichnungsbits wird durch
Hardware gelöscht, nachdem die Subroutinen-Adresse angesprungen wurde. In
praktischen Fällen muss die Subroutine im Allgemeinen darüber entscheiden, ob
RI oder TI den Interrupt hervorgerufen hat, und das betreffende Bit muss dann
mittels Software gelöscht werden.
91
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
1.6.1
Interrupt-Register
Alle Bits, die Interrupts erzeugen, können durch Software gesetzt oder gelöscht
werden, und zwar mit derselben Auswirkung, als ob sie durch Hardware gesetzt
oder gelöscht worden wären. Dies bedeutet, dass Interrupts mittels Software
erzeugt oder anstehende Interrupts verhindert werden können.
Jede dieser Interrupt-Quellen kann einzeln durch Setzen oder Löschen eines Bits
im speziellen Funktionsregister IE freigegeben oder nicht freigegeben werden
(Tabelle 1.22). Man beachte, dass IE auch ein allgemeines Nicht-Freigabebit (EA)
enthält, mit dem alle Interrupts auf einmal gesperrt werden können.
höchstwertiges
Bit
EA
niedrigstwertiges
Bit
–
–
ET1
ES
EX1
ET0
EX0
Symbol
Bit-Speicherstelle
Funktion
EA
IE.7
kann alle Interrupts sperren. Ist EA = 0, wird kein Interrupt zugelassen; ist EA = 1, wird jede Interrupt-Quelle
individuell freigegeben oder nicht freigegeben, indem
ihr Freigabebit gesetzt bzw. gelöscht wird.
-
IE.6
in Reserve
-
IE.5
in Reserve
ES
IE.4
gibt Interrupts vom seriellen Port frei (ES = 1) oder
nicht frei (ES = 0)
ET1
IE.3
gibt Interrupts vom Überlauf des Zeitgebers/Zählers 1
frei (ET1 = 1) oder nicht frei (ET1 = 0)
EX1
IE.2
gibt externe Interrupts von Anschluss INT1 frei
(EX1 = 1) oder nicht frei (EX1 = 0)
ET0
IE.1
gibt Interrupts vom Überlauf des Zeitgebers/Zählers 0
frei (ET0 = 1) oder nicht frei (ET0 = 0)
EX0
IE.0
gibt externe Interrupts von Anschluss INT0 frei
(EX0 = 1) oder nicht frei (EX0 = 0)
Tabelle 1.22: Interrupt-Freigaberegister (IE)
Jeder Interrupt-Quelle kann durch Programmieren eine hohe oder niedrige Prioritätsstufe zugewiesen werden, indem ein bestimmtes Bit im speziellen Funktionsregister IP (Tabelle 1.23) gesetzt oder gelöscht wird. Ein Interrupt niedriger
Priorität kann durch einen Interrupt hoher Priorität unterbrochen werden, aber
nicht durch einen anderen Interrupt niedriger Priorität. Ein Interrupt hoher Priorität kann durch eine andere Interrupt-Quelle nicht unterbrochen werden.
92
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.6
Interrupt-Verarbeitung
höchstwertiges
Bit
-
niedrigstwertiges
Bit
–
–
PS
PT1
PX1
PT0
PX0
Symbol
Bit-Speicherstelle
Funktion
–
IP.7
in Reserve
-
IP.6
in Reserve
-
IP.5
in Reserve
PS
IP.4
bestimmt die Prioritätsstufe des Interrupts des seriellen
Ports. PS = 1 bedeutet die höhere Prioritätsstufe.
PT1
IP.3
bestimmt die Prioritätsstufe des Interrupts von Zeitgeber/Zähler 1. PT1 = 1 bedeutet die höhere Prioritätsstufe.
PX1
IP.2
bestimmt die Prioritätsstufe des externen Interrupts von
Anschluss INT1. PX1 = 1 bedeutet die höhere Prioritätsstufe.
PT0
IP.1
bestimmt die Prioritätsstufe des Interrupts von Zeitgeber/Zähler 0. PT0 = 1 bedeutet die höhere Prioritätsstufe
PX0
IP.0
bestimmt die Prioritätsstufe des externen Interrupts von
Anschluss INT0. PX0 = 0 bedeutet die höhere Prioritätsstufe.
Tabelle 1.23: Interrupt-Prioritätenregister (IP)
Falls Interrupt-Anforderungen verschiedener Prioritätsstufen gleichzeitig auftreten, wird die Interrupt-Anforderung der höheren Prioritätsstufe abgearbeitet.
Erscheinen jedoch Interrupt-Anforderungen derselben Prioritätsstufe gleichzeitig,
bestimmt ein interner Auswahlprozess, welcher Interrupt abgearbeitet werden
soll. Somit gibt es innerhalb einer Prioritätsstufe eine weitere Prioritätsskala, die
durch den internen Auswahlprozess bestimmt wird und folgende Reihenfolge
festlegt, wie Tabelle 1.24 zeigt.
Quelle
Bit
Priorität innerhalb einer Stufe
Externer Interrupt 0
IE0
höchste
Überlauf an Zeitgeber/Zähler 0
TF0
Externer Interrupt 1
IE1
Überlauf an Zeitgeber/Zähler 1
TF1
Serieller Port
RI + TI
niedrigste
Tabelle 1.24: Reihenfolge der Interrupt-Anforderungen
93
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Es sei nochmals betont, dass die angegebene »Priorität innerhalb einer Stufe« nur
dann zur Geltung kommt, wenn gleichzeitige Anforderungen derselben Prioritätsstufe vorliegen.
1.6.2 Prioritäten der Interruptfolge
Die Interrupt-Kennzeichnungsbits werden während eines jeden Maschinenzyklus
abgefragt und die Ergebnisse während des nächsten Maschinenzyklus einer Priorität zugeordnet. War während des erstgenannten Zyklus eines der Kennzeichnungsbits gesetzt, so wird dies im zweiten erkannt, und das Interrupt-System
erzeugt den Befehl LCALL für die entsprechende Subroutinen-Adresse, vorausgesetzt, dass die Abarbeitung des durch Hardware erzeugten Befehls LCALL nicht
durch eine der folgenden Bedingungen gesperrt ist:
1. Ein Interrupt gleicher oder höherer Priorität wird gerade abgearbeitet.
2. Der gegenwärtige, der Zuordnung einer Priorität dienende Maschinenzyklus ist
nicht der letzte bei der Ausführung des gerade laufenden Befehls.
3. Der gerade auszuführende Befehl ist RETI oder stellt einen Zugriff auf das spezielle Funktionsregister IE oder IP dar.
Jede dieser drei Bedingungen blockiert den Befehl LCALL für die Interrupt-Routine. Bedingung 2 stellt sicher, dass der gerade laufende Befehl vollständig abgearbeitet wird, bevor irgendeine Subroutine angesprungen wird. Durch Bedingung 3
ist Folgendes gewährleistet: Wenn der gerade auszuführende Befehl RETI ist oder
einen Zugriff auf IE oder IP darstellt, wird wenigstens noch ein weiterer Befehl
ausgeführt, bevor die Durchführung des Interrupts beginnt.
Die Zuordnung zu einer Priorität wird in jedem Maschinenzyklus wiederholt, und
die verglichenen Werte sind diejenigen, die während des vorangegangenen
Maschinenzyklus vorhanden waren. Ist ein Interrupt-Kennzeichnungsbit gesetzt,
das aber wegen einer der obigen Sperrbedingungen nicht bedient werden kann,
und ist es bei Aufhebung der Sperrbedingung nicht mehr gesetzt, so wird der
zurückgewiesene Interrupt nicht mehr ausgeführt. Mit anderen Worten: Das System erinnert sich nicht daran, dass das Kennzeichnungsbit gesetzt war, aber nicht
bedient wurde. Jeder Zyklus, in dem eine Prioritätenzuordnung erfolgt, muss in
diesem Sinn für sich betrachtet werden.
Somit akzeptiert der Prozessor eine Interrupt-Anforderung, indem er durch den
mittels Hardware erzeugten Befehl LCALL die entsprechende Subroutine aufruft.
In einigen Fällen löscht er auch das Kennzeichnungsbit, das den Interrupt ausgelöst hat, in anderen Fällen nicht. Niemals löscht er das Kennzeichnungsbit des
seriellen Ports; dies muss durch die Software des Anwenders erfolgen. Die Kennzeichnungsbits der externen Interrupts (IE0 und IE1) werden nur dann gelöscht,
wenn der Interrupt flankenaktiviert war. Der mittels Hardware erzeugte Befehl
veranlasst, dass der Inhalt des Programmzählers in den Stack übernommen wird
94
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.6
Interrupt-Verarbeitung
(rettet jedoch nicht das Programmstatuswort) und lädt den Programmzähler mit
einer Adresse, die von der Interrupt-Quelle abhängt, wie Tabelle 1.25 zeigt.
Interrupt-Quelle
Startadresse
Externer Interrupt 0
0003H
Überlauf des Zeitgebers/Zählers 0
000BH
Externer Interrupt 1
0013H
Überlauf des Zeitgebers/Zählers 1
001BH
Serieller Port
0023H
Tabelle 1.25: Startadressen für Interrupt-Routinen
Die Abarbeitung der Subroutine setzt sich von dem angegebenen Speicherplatz
aus fort, bis der Befehl RETI auftritt. Dieser informiert den Prozessor darüber,
dass die Interrupt-Routine beendet ist, holt dann die zwei oberen Bytes aus dem
Stack und lädt damit den Programmzähler. Die weitere Ausführung des unterbrochenen Programms erfolgt dann von der Stelle aus, wo es aufgehört hatte.
Man beachte, dass ein einfacher Befehl RET zwar auch die Programmausführung
an das unterbrochene Programm zurückgibt, das Interrupt-Steuersystem jedoch
in der Annahme belässt, dass der Interrupt weiterhin abgearbeitet wird.
1.6.3 Externe Interrupt-Quellen
Externe Quellen können einen Interrupt entweder durch ein 0-Signal oder durch
eine negative Flanke von 1 nach 0 (pegelaktivierte oder flankenaktivierte Interrupts) auslösen, was durch Programmieren, d.h. durch Setzen oder Löschen von
IT1 oder IT0 im Register TCON, festgelegt wird. Ist ITx = 0, wird ein externer
Interrupt x durch Erkennen des 0-Signals am Anschluss INTx eingeleitet, ist dagegen ITx = 1, erfolgt die Interrupt-Auslösung durch Erkennen einer Flanke des
Pegels. In diesem Fall wird, wenn aufeinanderfolgende Abfragen von INTx ein
1-Signal in einem Zyklus und von einem 0-Signal im nächsten Zyklus ergeben
haben, das Kennzeichnungsbit für externe Interrupt-Anforderungen IEx in TCON
gesetzt. Dies löst dann den Interrupt aus.
Da die externen Interrupt-Anschlüsse während eines jeden Maschinenzyklus einmal abgefragt werden, sollte ein Eingangssignal (1- oder 0-Signal) wenigstens
zwölf Oszillatorperioden am Eingang anliegen, um eine sinnvolle Abfrage zu
gewährleisten. Wenn daher der externe Interrupt flankenaktiviert ist, muss die
externe Quelle wenigstens einen Zyklus eines 1-Signals am entsprechenden
Anschluss stehen lassen und danach wenigstens einen Zyklus eines 0-Signals,
damit die Flanke erkannt und das Kennzeichnungsbit für externe Interrupt-Anforderungen IEx gesetzt werden kann. Ex wird durch die Zentraleinheit automatisch
gelöscht, wenn die Interrupt-Routine aufgerufen ist.
95
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Ist der externe Interrupt pegelaktiviert, muss die externe Quelle die Anforderung
so lange aufrechterhalten, bis der angeforderte Interrupt tatsächlich erzeugt worden ist. Danach muss er die Anforderung deaktivieren, bevor die Interrupt-Routine abgearbeitet ist; andernfalls wird ein weiterer Interrupt erzeugt.
Die Pegel an INT0 und INT1 werden invertiert und während eines jeden Maschinenzyklus in IE0 bzw. IE1 zwischengespeichert. Bis zum nächsten Maschinenzyklus erfolgt keine Zuordnung der gefundenen Werte zu Prioritäten durch die
Schaltung. Liegt eine Interrupt-Anforderung vor und lassen die sonstigen Bedingungen die Annahme dieser Forderung zu, so ist ein mittels Hardware ausgelöster
Subroutinen-Aufruf der gewünschten Interrupt-Routine der nächste auszuführende Befehl. Der Aufruf selbst nimmt zwei Zyklen in Anspruch. Somit vergehen
minimal drei vollständige Maschinenzyklen zwischen der Aktivierung einer externen Interrupt-Anforderung und dem Ausführungsbeginn des ersten Befehls der
Interrupt-Routine.
Eine längere Ansprechzeit ergibt sich dann, wenn die Interrupt-Anforderung
durch eine Bedingung blockiert ist. Wird gerade ein Interrupt gleicher oder höherer Priorität abgearbeitet, so hängt die zusätzliche Wartezeit von der anderen Interrupt-Routine ab. Befindet sich der gerade auszuführende Befehl nicht in seinem
letzten Zyklus, so kann trotzdem die zusätzliche Wartezeit nicht mehr als drei
Zyklen betragen, da die längsten Befehle (MUL und DIV) nun vier Zyklen lang
sind. Ist schließlich der gerade auszuführende Befehl RETI oder stellt er einen
Zugriff auf das spezielle Funktionsregister IE oder IP dar, so kann die zusätzliche
Wartezeit nicht mehr als fünf Zyklen betragen (maximal einen weiteren Zyklus,
um den laufenden Befehl zu beenden, sowie vier Zyklen für den nächsten Befehl,
falls es sich um MUL und DIV handelt).
Somit beträgt die Ansprechzeit in einem System mit einem einzelnen Interrupt
stets mehr als drei und weniger als acht Zyklen.
1.7
Einzelschrittbetrieb
Die Interrupt-Struktur des 8051 gestattet Einzelschrittbetrieb mit sehr geringem
zusätzlichem Softwareaufwand. Wie bereits dargelegt, wird eine Interrupt-Anforderung so lange nicht bedient, wie ein Interrupt gleicher oder höherer Priorität
läuft oder bis nach einem Befehl RETI wenigstens ein weiterer Befehl ausgeführt
worden ist. Somit kann, sobald eine Interrupt-Routine begonnen hat, sie nicht
erneut einsetzen, bevor nicht wenigstens ein Befehl des unterbrochenen Programms ausgeführt wurde. Eine Möglichkeit, diese Tatsache für den Einzelschrittbetrieb zu nutzen, besteht darin, einen der externen Interrupt-Anschlüsse (z.B.
INT0) so zu programmieren, dass er pegelaktiviert ist. Die Interrupt-Routine wird
dann mit folgender Codierung abgeschlossen:
96
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.8
Rücksetzen des 8051
JNB P3.2,$
JB
P3.2,$
RETI
;WARTE HIER, BIS INT0 HIGH IST
;WARTE JETZT HIER, BIS INT0 LOW IST
;SPRINGE ZURUECK UND FUEHRE EINEN BEFEHL AUS
Wird jetzt der Anschluss INT0 (gleich dem Anschluss P3.2) normalerweise auf
0-Signal gehalten, so startet die Zentraleinheit die durch den externen Interrupt
0 ausgelöste Routine und bleibt so lange in dieser, bis INT0 gepulst wird (von
0- nach 1- und von dort nach 0-Signal). Dann führt die Zentraleinheit den Befehl
RETI aus, geht ins Hauptprogramm zurück, führt dort einen einzigen Befehl aus
und beginnt sofort erneut mit der Routine des externen Interrupts 0, um auf den
nächsten Impuls von P3.2 zu warten. Bei jedem Impuls an P3.2 führt die Zentraleinheit einen Schritt des Hauptprogramms aus.
1.8
Rücksetzen des 8051
Der Anschluss RST stellt den Rücksetzeingang dar und ist Eingang eines SchmittTriggers. Ein Rücksetzvorgang lässt sich dadurch erreichen, dass man den Anschluss RST für wenigstens zwei Maschinenzyklen (24 Oszillatorperioden) auf ein
1-Signal bringt, während der Oszillator läuft. Die Zentraleinheit reagiert darauf,
indem sie einen internen Rücksetzvorgang einleitet, und richtet auch die Anschlüsse ALE und PSEN als Eingänge ein (diese sind bidirektional). Der interne
Rücksetzvorgang wird während eines zweiten Zyklus ausgeführt, in dem RST ein
1-Signal hat, und so lange während eines jeden Zyklus wiederholt, bis RST ein
0-Signal annimmt. Nach dem Rücksetzvorgang weisen die Register folgenden
Inhalt auf, wie Tabelle 1.26 zeigt.
PC
000H
TMOD
00H
ACC
00H
TCON
00H
B
00H
TH0
00H
PSW
00H
TL0
00H
SP
07H
TH1
00H
DPTR
0000H
TL1
00H
P0...P3
0FFH
SCON
00H
IP
(XXX00000)
SBUF
unbestimmt
IE
(0XX00000)
PCON
(0XXX0000)
Tabelle 1.26: Registerinhalt nach Rücksetzvorgang
97
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Das interne RAM wird durch einen Rücksetzvorgang nicht berührt. Wenn UCC
eingeschaltet wird, ist der RAM-Inhalt unbestimmt, es sei denn, dass vorher ein
Betrieb mit reduzierter Leistung erfolgt ist.
Ein automatischer Rücksetzvorgang wird eingeleitet, wenn RST über einen 10-FKondensator mit UCC (+5 V) und über einen 8,2-k-Widerstand mit UCC verbunden wird (Abbildung 1.30). Voraussetzung für die Einleitung des Rücksetzvorgangs ist jedoch, dass die Anstiegszeit von UCC ca. 1 ms und dass die Zeit für die
Inbetriebnahme des Taktgenerators 10 ms nicht überschreitet.
Abb. 1.30:
Prinzipschaltung für Rücksetzen durch Einschalten
Wenn die Spannung eingeschaltet wird, beginnt der über RST fließende Strom
den Kondensator aufzuladen. Die Spannung an RST ist gleich der Differenz zwischen UCC und der Kondensatorspannung. Diese Spannung nimmt von UCC aus
ab, wenn sich der Kondensator auflädt. Je größer der Kondensator ist, desto langsamer nimmt die Spannung an RST ab. Diese Spannung muss eine bestimmte
Mindestzeit oberhalb des unteren Schwellwerts des Schmitt-Triggers bleiben, um
einen vollständigen Rücksetzvorgang herbeizuführen; die erforderliche Mindestzeit ist gleich der Zeit zur Inbetriebnahme des Taktgenerators plus zwei Maschinenzyklen.
1.9
Betriebsarten mit reduzierter Leistungsaufnahme
Bei Anwendungen, bei denen die Leistungsaufnahme einen kritischen Gesichtspunkt darstellt, kann sowohl die NMOS- als auch die CMOS-Version mit reduzierter Leistung betrieben werden. Die CMOS-Version (80C51) lässt den Betrieb mit
reduzierter Leistung (Idle- und Power-Down-Betriebsart) standardmäßig zu, bei
der NMOS-Version (8051) ist der Betrieb mit reduzierter Leistung zwar auch möglich, aber nicht standardmäßig vorgesehen.
98
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.9
Betriebsarten mit reduzierter Leistungsaufnahme
Die Betriebsart mit reduzierter Leistung gestattet es dem Anwender der NMOSVersion, die Betriebsspannung UCC auf 0 V zu reduzieren und dabei den Inhalt
des RAM durch eine Hilfsspannung am Anschluss RST zu retten. Zur Ausnutzung dieses Vorteils muss das Anwendersystem, sobald es einen bevorstehenden
Spannungsausfall erkennt, in irgendeiner Weise einen Interrupt bei dem Mikrocontroller anfordern. Hierdurch werden wichtige Betriebsdaten in das RAM auf
dem Chip gerettet, und es wird die Spannungsversorgung über den Anschluss
RST aufgenommen, bevor UCC unter seinen unteren Grenzwert absinkt. Wenn die
Betriebsspannung wiederkommt, muss die Hilfsspannung noch lange genug
anliegen, damit ein Rücksetzvorgang erfolgen kann. Danach wird der normale
Betrieb wieder aufgenommen.
Bei der CMOS-Version gibt es zwei Betriebsarten mit reduzierter Leistung, die
Idle- und die Power-Down-Betriebsart. Der Eingangsanschluss, über den die
Stromversorgung bei reduzierter Leistung erfolgt, ist UCC. Abbildung 1.31 zeigt die
interne Schaltung, mit der diese Eigenschaften erreicht werden. Bei der IdleBetriebsart (IDL = 1) arbeitet der Taktgenerator weiter, und die Bereiche Interrupt,
serieller Port sowie Zeitgeber/Zähler werden weiterhin mit Taktimpulsen versorgt; nur die Zentraleinheit wird vom Takt abgetrennt. Bei der Power-DownBetriebsart (PD = 1) wird der Taktgenerator stillgelegt. Die Idle- und die PowerDown-Betriebsart werden durch Setzen bestimmter Bits im speziellen Funktionsregister PCON aktiviert. Die Adresse dieses Registers ist 87H; die Einzelheiten sind
aus Tabelle 1.27 zu ersehen.
Abb. 1.31:
Schaltungsaufbau für den Betrieb mit reduzierter Leistung (Idle- und Power-DownBetriebsart) beim 80C51
99
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
höchstwertiges
Bit
-
niedrigstwertiges
Bit
–
–
PS
PT1
PX1
PT0
PX0
Symbol
Bit-Speicherstelle
Funktion
SMOD
PCON.7
verdoppelt die Übertragungsrate. Ist SMOD = 1, wird die
Übertragungsrate verdoppelt, wenn der serielle Port in
den Betriebsarten 1, 2 oder 3 verwendet wird.
PCON.6
in Reserve
PCON.5
in Reserve
PCON.4
in Reserve
GF1
PCON.3
Kennzeichnungsbit für allgemeine Zwecke
GF0
PCON.2
Kennzeichnungsbit für allgemeine Zwecke
PD
PCON.1
Bit für Power-Down-Betriebsart, PD = 1*) aktiviert diese
Betriebsart (CMOS-Version).
IDL
PCON.0
Bit für Idle-Betriebsart. DL = 1*) aktiviert diese Betriebsart.
Tabelle 1.27: Steuerregister (PCON) für die Leistung
*) Sind PD und IDL gleichzeitig auf 1-Signal gesetzt, hat PD Vorrang.
Der Rücksetzwert von PCON ist bei der NMOS-Version 0XXXXXXXX, bei der
CMOS-Version 0XXX0000.
Ein Befehl, der PCON.0 setzt, ist der letzte vor dem Übergang in die Idle-Betriebsart.
Bei dieser Betriebsart wird der interne Takt von der Zentraleinheit abgetrennt, aber
nicht die Bereiche Interrupt, Zeitgeber/Zähler und serieller Port. Der Status der
Zentraleinheit bleibt vollständig erhalten: Stackpointer, Programmzähler, Programmstatuswort, Akkumulator und alle anderen Register behalten ihre Werte
während der Betriebsart. Die Portanschlüsse behalten die logischen Pegel, die sie
bei der Aktivierung von Idle hatten. ALE und PSEN nehmen ihre inaktiven Pegel an.
Es gibt zwei Möglichkeiten, den Idle-Betrieb zu beenden. Durch Aktivierung eines
beliebigen zugelassenen Interrupts wird PCON.0 mittels Hardware gelöscht, was
zur Beendigung des Idle-Betriebs führt. Der Interrupt wird ausgeführt, und der
nächste, auf RETI folgende Befehl folgt dem Befehl des Hauptprogramms, der
den Mikrocontroller in die Idle-Betriebsart versetzte.
Mit den Kennzeichnungsbits GF0 und GF1 ist es möglich anzuzeigen, ob ein
Interrupt während des normalen Betriebs oder während des Idle-Betriebs aufgetreten ist. Zum Beispiel kann ein Befehl, mit dem die Idle-Betriebsart aktiviert
100
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.10
Speicherorganisation und Adressierungsarten
wird, auch eines der beiden Kennzeichnungsbits setzen. Wird der Idle-Betrieb
dann durch einen Interrupt beendet, kann die Interrupt-Routine die Kennzeichnungsbits abfragen.
Die andere Möglichkeit zur Beendigung des Idle-Betriebs besteht in einem Rücksetzvorgang mittels Hardware. Da der Taktgenerator weitergearbeitet hat, braucht
der Rücksetzvorgang mittels Hardware nur während zweier Maschinenzyklen (24
Oszillatorperioden) aktiv gehalten zu werden, um ihn vollständig ablaufen zu
lassen.
Wird mit einem Befehl PCON.1 gesetzt, so geht der Mikrocontroller sofort in die
Power-Down-Betriebsart über. In dieser Betriebsart wird der Taktgenerator auf
dem Chip angehalten, so dass alle funktionalen Abläufe gestoppt werden; das
RAM auf dem Chip sowie die speziellen Funktionsregister behalten jedoch ihre
Werte. An den Portanschlüssen stehen die in den entsprechenden speziellen
Funktionsregistern enthaltenen Werte zur Verfügung. ALE und PSEN befinden
sich auf 0-Pegel.
Die einzige Möglichkeit, aus dem Power-Down-Betrieb wieder herauszukommen,
besteht in einem Rücksetzvorgang mittels Hardware. Dieser bringt alle speziellen
Funktionsregister in einen definierten Anfangszustand, ändert aber den Inhalt des
RAM auf dem Chip nicht.
Bei der Power-Down-Betriebsart kann UCC herabgesetzt werden, um die Energieaufnahme auf ein Minimum zu reduzieren. Es muss jedoch darauf geachtet werden, dass UCC mit Sicherheit nicht vermindert wird, bevor der Power-DownBetrieb aufgenommen ist, und dass UCC seinen normalen Betriebswert wieder
erreicht hat, bevor der Power-Down-Betrieb beendet ist. Der Rücksetzvorgang, der
den Power-Down-Vorgang abschließt, setzt auch den Taktgeber in Betrieb. Der
Rücksetzvorgang sollte nicht eingeleitet werden, bevor UCC den normalen
Betriebswert wieder erreicht hat, und muss lange genug aktiviert bleiben, um dem
Taktgeber die Wiederaufnahme und Stabilisierung seines Betriebs zu ermöglichen
(im Allgemeinen weniger als 10 ms).
1.10 Speicherorganisation und Adressierungsarten
Die Architektur der Mikrocontroller der Familie 8051 sieht Möglichkeiten vor, die
Speicherkapazitäten sowohl auf dem Chip als auch außerhalb des Chips zu erweitern. Durch verschiedene Adressierungsmechanismen wird ein optimaler Befehlsvorrat erreicht.
101
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Der 8051 hat im Prinzip folgende Speicher-Adressierbereiche:
쐽
64-Kbyte-Programmspeicher (extern)
쐽
4-Kbyte-Programmspeicher (intern)
쐽
64-Kbyte-Datenspeicher (extern)
쐽
256-Byte-Datenspeicher (intern)
In Abbildung 1.32 sind die Adressierbereiche übersichtlich dargestellt.
Abb. 1.32:
Adressierbereiche des Programm- und Datenspeichers
Der Programmspeicher-Adressierbereich besteht aus einem inneren und einem
äußeren Teil. Wird der Anschluss EA auf 1-Signal gehalten, so greift die CPU auf
den internen Programmspeicher zu, es sei denn, die Adresse ist höher als 0FFFH.
Informationen aus den Speicherplätzen 1000H bis FFFFH werden aus dem externen Programmspeicher geholt. Hält man den Anschluss EA jedoch auf 0-Signal,
so holt die CPU alle Befehle aus dem externen Programmspeicher. In jedem Fall
erfolgt die Adressierung über den 16-Bit-Programmzähler.
102
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.10
Speicherorganisation und Adressierungsarten
Die Speicherplätze 00 bis 23H im Programmspeicher werden für Interrupt-Routinen verwendet; die Startadressen sind aus Tabelle 1.17 zu ersehen. Der Datenspeicher-Adressierbereich besteht aus einem internen und einem externen Teil. Auf
den externen Teil wird bei der Ausführung eines MOVX-Befehls zugegriffen. Der
interne Datenspeicher besteht aus zwei getrennten Blöcken: den 128 Bytes des
RAM und den 128 Bytes der speziellen Funktionsregister.
Abb. 1.33:
Adressierbereich des internen Datenspeichers
103
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.34:
Adressen der bitadressierbaren Speicherstellen im RAM
104
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.10
Speicherorganisation und Adressierungsarten
Abb. 1.35:
Adressen der bitadressierbaren Speicherstellen im speziellen Funktionsregister
(SFR)
Abbildung 1.33 zeigt die Gliederung des internen Datenspeicher-Adressierbereichs. Vier 8-Registerbänke belegen die Speicherplätze 0 bis 31 im RAM-Bereich.
Zu einer bestimmten Zeit kann nur eine dieser vier Bänke in Betrieb sein (über
ein 2-Bit-Feld im Programmstatuswort). Die nächsten 16 Bytes, die Speicherplätze
32 bis 47, enthalten 128 bitadressierbare Speicherstellen, deren Adressen in Abbil-
105
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
dung 1.34 angegeben sind. Im Bereich des speziellen Funktionsregisters gibt es
ebenfalls bitadressierbare Speicherstellen, die in Abbildung 1.35 dargestellt sind.
Man beachte, dass das Lesen aus nicht benutzten Speicherplätzen im internen
Datenspeicher zu zufälligen Daten führt.
1.11
Boole’scher Prozessor
Der Boole’sche Prozessor stellt einen integrierten Bitprozessor innerhalb des 8051
dar. Er hat seinen eigenen Befehlsvorrat, seinen eigenen Akkumulator (das Übertragsbit) sowie seinen eigenen bitadressierbaren Speicher (RAM) und E/A-Port.
Die Bitverarbeitungsbefehle erlauben folgende Bitoperationen: Setzen; Löschen;
Komplementieren; Springen, wenn gesetzt; Springen, wenn nicht gesetzt; Springen; und dann Löschen sowie Transportieren vom und zum Übertragsbit. Adressierbare Bits oder ihre Komplemente können durch eine logische Operation UND
oder ODER mit dem Inhalt des Übertragsbits verknüpft werden und das Ergebnis
wird zum Übertragsregister zurückgebracht.
1.12 CMOS-Mikrocontroller-Familie AT89C51
Die Eigenschaften und Funktionen von tragbaren Geräten werden ständig verbessert. Die Kunden wollen die Leistungsfähigkeit ihrer Produkte erhöhen, was wiederum eine höhere Rechenleistung erfordert. Gleichzeitig wird ein geringerer
Leistungsverbrauch angestrebt. Im Mittelpunkt dieser entgegengesetzten Forderungen steht der Mikrocontroller – typischerweise einer der größten Leistungsverbraucher in tragbaren Geräten.
Es gibt zwar viele leistungssparende Prozessoren, aber ihre Leistungsfähigkeit ist
oft eingeschränkt. Die Familie schneller Mikrocontroller von Dallas Semiconductor und Atmel stellt einen guten Kompromiss zwischen Leistungsverbrauch und
Leistungsfähigkeit dar. Sie basiert auf der Architektur des 8051 – einer der weltweit verbreitetsten Mikrocontroller. Die Entwicklungsingenieure wissen seine einfache Anwendung, die großzügig ausgelegte Ein-/Ausgangsstruktur und die
breite Akzeptanz zu schätzen. Mittlerweile hat er auch im Bereich der tragbaren
Produkte Verbreitung gefunden, wo er in zahlreichen Anwendungen eingesetzt
wird.
Der wichtigste Faktor bei der Bestimmung des Leistungsverbrauchs in einer
Schaltung mit Mikrocontroller ist die Taktfrequenz des Systems. Der Leistungsverbrauch komplementärer Metalloxidhalbleiterbauelemente (CMOS) ist der Taktfrequenz direkt proportional. Daraus folgt, dass ein Mikrocontroller unter dem
Gesichtspunkt des Leistungsverbrauchs mit der geringstmöglichen Frequenz
betrieben werden sollte.
106
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.12
CMOS-Mikrocontroller-Familie AT89C51
Die typische Leistungskurve für einen Mikrocontroller geht von 12 MHz und einer
Stromaufnahme von ca. 14 mA bis zu 22 mA bei 25 MHz, die allen Entwurfsingenieuren für tragbare Systeme bekannt ist. Der Kurve ist zu entnehmen, dass sich
die Stromaufnahme, mit einem DC-Offset, über der Frequenz linear verhält. Dieser Ruhestrom wird durch die statischen Schaltungsteile auf dem Chip, wie Komparatoren, Operationsverstärkern usw., verursacht. Obwohl es sich dabei um einen
relativ geringen Strom (< 1 mA) handelt, stellt er doch eine konstante Belastung
dar, die nicht vernachlässigt werden sollte.
Jede Schaltung, die für einen geringen Leistungsverbrauch ausgelegt ist, wird mit
der geringstmöglichen Frequenz arbeiten. Die Festlegung der minimalen Systemfrequenz und damit des minimalen Leistungsverbrauchs hängt von mehreren
Faktoren ab, einschließlich des gewünschten Leistungsverhaltens und der Interrupt-Latenz. Unabhängig von den Kriterien bleibt das Ziel jedoch bestehen: die
möglichst genaue Anpassung der Betriebsfrequenz des Bausteins an die Leistungsanforderungen der Anwendung.
1.12.1 Schneller CPU-Kern im AT89C51
Das direkte Verfahren zur Reduzierung des Leistungsverbrauchs einer Schaltung
mit dem 8051 ist die Erhöhung der Rechenleistung des Mikrocontrollers. Die
Grundversion des 8051 basierte auf der 12-Takt-Architektur mit zwei Abrufen pro
Lesezyklus. Die Familie schneller Mikrocontroller arbeitet jedoch mit einem Kern
mit vier Takten oder einem Takt pro Lesezyklus. Dies ist rechnerisch effizienter
und erfordert weniger Taktzyklen zur Ausführung eines Befehls. Daraus ergeben
sich kürzere Ausführungszeiten und höhere maximale Taktfrequenzen.
Gewöhnlich werden die Vorteile eines schnellen Kerns hinsichtlich des Leistungsverhaltens betrachtet, sie wirken sich jedoch auch erheblich auf den Leistungsverbrauch aus. Wird die Befehlsausführung des Prozessors optimiert, wird weniger
Zeit für die gleiche Aufgabe benötigt. Viele tragbare Produkte arbeiten im Stoßmodus, das heißt, auf kurze Aktivitätsperioden folgen längere Perioden der Inaktivität, wie z.B. bei der Aufzeichnung von Umweltdaten oder beim Lesen eines
Strichcodes. Durch die Reduzierung der Aktivitätszeit des Mikrocontrollers wird
eine entsprechende Reduzierung des Energieverbrauchs erreicht.
Eine weitere Folge aus dem verbesserten Wirkungsgrad ist, dass sich das gleiche
Leistungsverhalten bei reduzierter Taktfrequenz erreichen lässt. Arbeitet ein veränderter Kern mit vier anstatt zwölf Takten pro Zyklus, heißt das, dass der gleiche
Leistungsumfang bei reduzierter Taktfrequenz bewältigt wird. Da der Leistungsverbrauch der Taktfrequenz direkt proportional ist, lässt er sich auf diese Art ohne
Beeinträchtigung des Leistungsverhaltens reduzieren.
Vergleicht man den Leistungsverbrauch von drei Mikrocontrollern, die die gleiche
Aufgabe mit dem gleichen Leistungsverhalten ausführen, erkennt man die Unter-
107
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
schiede. Zwei Mikrocontroller sind vom Standardbaustein 8051 abgeleitet und
arbeiten mit zwölf extern erzeugten Takten pro Abrufzyklus, während es sich beim
dritten um einen Mikrocontroller AT89C51 handelt, der mit vier Takten pro Abrufzyklus arbeitet. Für alle Bausteine wurde der Stromverbrauch gemessen und verglichen, wobei für den AT89C51 für die Verbesserung des Leistungsverhaltens ein
konservativer Wert von 250 % angenommen wurde. Wie aus der Praxis bekannt
ist, ergibt sich bei dem Kern mit reduzierten Taktperioden pro Maschinenzyklus
eine erhebliche Stromreduzierung bei gleichem Durchsatz, besonders bei höheren Leistungsdaten.
Ein weiteres Verfahren zur Leistungseinsparung ist die Integration peripherer
Funktionen auf dem Chip. Beim Treiben eines Signals außerhalb des Chips muss
der signalerzeugende Schaltkreis die zum Treiben der externen Lasten erforderliche Schaltleistung aufbringen und die DC-Verluste ausgleichen. Unter Schaltleistung (PSW) ist die bei einer Signaländerung verbrauchte Leistung zu verstehen. Sie
wird näherungsweise wie folgt errechnet:
PSW    C U 2
T
Dabei ist C die Gesamtkapazität des Empfangsgatters des Eingangspuffers und
der Verbindung zwischen den beiden Gates, und der Wert T ist die Taktperiode des
Signals. Eine typische Eingangskapazität eines CMOS-Eingangs ist 10 pF. Die
Ermittlung des genauen Werts der Schaltleistung eines Systems ist zwar schwierig, aber es liegt auf der Hand, dass jede zusätzliche externe Last oder jeder
Anschluss, den der Mikrocontroller zu treiben hat, zusätzliche Leistung verbraucht.
Systeme auf Mikrocontrollerbasis arbeiten normalerweise mit mehreren peripheren Schaltkreisen. Diese reichen von externen UARTs und Einschalt-Resets bis zu
Watchdog-Timern. Einer der Vorteile der Produktfamilie AT89C51 besteht in der
großen Anzahl der auf dem Chip integrierten peripheren Funktionen. Neben der
Vereinfachung der Schaltung durch Eliminierung von Bauteilen können integrierte periphere Funktionen auch den Leistungsverbrauch reduzieren. Im
Grunde kann man annehmen, dass die Kernfunktionen jedes peripheren Schaltkreises, sei er im Prozessor integriert oder nicht, die gleiche Leistung verbrauchen. Durch die Integration auf dem Chip werden jedoch die beim Treiben eines
externen Busses auftretenden Schaltleistungsverluste eliminiert.
1.12.2 Interner Programmspeicher und interner Datenspeicher
Eine weitere Funktion des 8051, die üblicherweise nicht als peripher betrachtet
wird, ist der Programmspeicher. Alle Bausteine der Familie 8051 und AT89C51
enthalten einen chipintegrierten Programmspeicher unterschiedlicher Kapazität.
108
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.12
CMOS-Mikrocontroller-Familie AT89C51
Dies wird von vielen Anwendern gewünscht, um die Anzahl der Bauteile und den
Platzbedarf zu reduzieren, es verlängert aber auch die Batterielebensdauer in tragbaren Systemen. Wie bereits erwähnt, wird der Leistungsverbrauch hier reduziert,
da kein externer Bus zu treiben ist. Ein auf dem Chip integrierter Speicher ergibt
noch eine weitere Leistungseinsparung. Die 8051-Architektur erfordert den Einsatz eines Registers des Typs 74373 für das Demultiplexen des niederwertigen
Adressbytes. Ein Vergleich zwischen dem Einsatz eines internen und eines externen Programmspeichers ergibt eine Stromreduzierung von 45 mA bei 12 MHz auf
16 mA. Beim ersten System wird ein schneller Mikrocontroller des Typs AT89C51
mit einem Register 74AC573 und einem EPROM 27C256 mit einer Zugriffszeit
von 70 ns verwendet. Das zweite System benutzt den gleichen Mikrocontroller,
arbeitet aber mit internem Speicher. Beide Systeme arbeiten mit 11,0592 MHz
und führen ein kurzes Programm aus. Aus dem Versuch geht hervor, dass bei
hohen Frequenzen durch Eliminierung des externen EPROM und des Registers
bis zu 49 mA eingespart werden können.
Wie bereits erwähnt, wird durch einen chipintegrierten Speicher anstelle eines
externen RAM Leistung gespart. Der erweiterte Scratchpad-Speicher der Bausteinfamilie 80C32 (256 Bytes) reicht als Stack- und Datenspeicher in kleinen Programmen aus, wodurch ein externes RAM entfallen kann.
Für Entwicklungen, die einen größeren Datenspeicher oder einen externen Stack
erfordern, kann jedoch ein zusätzlicher SRAM-Speicher notwendig werden. Leistungssparende SRAMs sind zwar verfügbar, aber es entstehen zusätzliche Leistungsverluste durch das 74373-Register und die kapazitiven Verluste beim Treiben
des externen Busses. Dies lässt sich durch den Einsatz von Bausteinen mit erweitertem auf dem Chip integrierten RAM vermeiden. Es soll der Leistungsverbrauch
von zwei Systemen, bei denen das SRAM in den MOVX-Datenspeicher des 8051
aufgenommen wurde, untersucht werden. Das erste System benutzt einen schnellen Mikrocontroller des Typs AT89C51 mit einem 74AC573-Register und einem
8-Kbyte-SRAM. Das zweite System benutzt den gleichen Mikrocontroller, aber
1 Kbyte des internen MOVX-Datenspeichers. Beide Mikrocontroller arbeiten mit
11,0592 MHz und führen ein kurzes Programm aus, das Lese- und Schreiboperationen im MOVX-Datenspeicherbereich vornimmt. Man kann feststellen, dass bei
hohen Frequenzen durch Eliminierung des externen SRAM und des Registers bis
zu 9 mA gespart werden können.
1.12.3 Taktquelle
Eine weitere wichtige Systemkomponente hinsichtlich des Leistungsverbrauchs
ist die Taktquelle. Standardschaltungen mit dem 8051 benutzen üblicherweise entweder einen externen Quarz mit einem internen Oszillatorverstärker oder einen
externen Quarzoszillator. Im letzteren Fall kann die Wellenform des Taktgebers
den Leistungsverbrauch beeinflussen. Die Eingangsstufe des XTAL1-Anschlusses,
109
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
der die externen Taktsignale für den 8051 aufnimmt, arbeitet normalerweise mit
komplementären Treiberstufen. Während der Übergänge des Eingangstaktgebers
zwischen H-Pegel und L-Pegel werden kurzzeitig beide Treiber eingeschaltet, was
einen erheblichen Stromstoß verursacht. Bei einem Rechtecksignal finden die
Übergänge praktisch sofort statt, was die Zeit des gleichzeitigen Ein-Zustands beider Treiber minimiert. Bei einer Signalform mit langsameren Übergängen, wie
z.B. einem Sinus- oder Dreiecksignal, sind die Treiber für längere Zeit gleichzeitig
eingeschaltet. Dies erhöht den Strom- und Leistungsverbrauch.
Als Taktquelle wurde ein programmierbarer Signalgenerator für Sinus-, Dreieckund Rechtecksignale benutzt. Es wurde der Mittelwert von vier Bausteinen mit
normaler und hoher Geschwindigkeit dargestellt. Der Vergleich zeigt, dass der
Stromverbrauch der Anstiegs- und Abfallzeit der Taktwellenform direkt proportional ist. Das Dreiecksignal hat die längste Flanke und das Rechtecksignal die
höchste. Für das Rechtecksignal ergibt sich ein um 0,75 mA geringerer mittlerer
Strom als für das Dreiecksignal. Daraus folgt, dass der Stromverbrauch bei Schaltungen mit externem Taktgeber durch den Einsatz von Oszillatoren mit kurzen
Anstiegs- und Abfallzeiten reduziert werden kann. Bei geringeren Frequenzen, wo
die Übergänge mehr Zeit benötigen, ist dies von noch größerer Bedeutung.
Einige 8051-Derivate enthalten einen chipintegrierten Ringoszillator. Dabei handelt es sich üblicherweise um hintereinander geschaltete Inverter, die ein Pulssignal durch die Schleife propagieren lassen. Dafür steht eine interne Taktquelle von
ca. 2 MHz bis 4 MHz zur Ansteuerung des Bausteins zur Verfügung. Da hier kein
Quarz erforderlich ist, ist diese Taktquelle äußerst leistungssparend. Die Bewertung eines schnellen Mikrocontrollers AT89C51 zeigt, dass beim Betrieb mit
einem Ringoszillator ein Leistungsverhalten erreicht wird, das einem 7-MHz-8051
bei ca. 3,6 mA entspricht. Obwohl sie nicht die Stabilität eines piezoelektrischen
Quarzes aufweisen, sind Ringoszillatoren aufgrund ihres geringen Leistungsverbrauchs und der vernachlässigbaren Einschaltverzögerung ein wichtiger Faktor
bei der Leistungseinsparung.
Wie oben erläutert, ist die Betriebsfrequenz des Mikrocontrollers der bestimmende Faktor für seinen Leistungsverbrauch. Die Taktfrequenz des Systems ist
zwar hauptsächlich eine Hardwarefunktion, aber der 8051 besitzt die Fähigkeit,
sie in bestimmten Grenzen zu steuern. Diese Methoden verlangsamen die
Betriebsfrequenz des Bausteins oder halten sie für den ganzen Baustein oder für
Teilschaltung an. Die herkömmliche 8051-Architektur benutzt zwei Modi zur
Taktsteuerung: Leerlauf und Stopp.
Der Stoppmodus ist der Zustand mit dem niedrigsten Leistungsverbrauch für den
8051. Dabei wird der interne Oszillatorverstärker und damit auch der Betrieb des
Bausteins angehalten. Die Aufhebung des Stoppmodus geschieht normalerweise
durch einen externen Reset. Bei einigen Versionen ist die Aufhebung des Stoppmodus auch durch externe Interrupts möglich.
110
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.12
CMOS-Mikrocontroller-Familie AT89C51
Einer der Nachteile des Stoppmodus besteht im Leistungsverbrauch während der
»Totzeit«, d.h. der Anlaufperiode des Quarzes. Ein Quarzoszillator basiert auf den
Schwingungen eines Quarzes. Aufgrund physikalischer Eigenschaften benötigt
die Quarzschwingung eine bestimmte Zeit, um eine für den Betrieb genügende
Amplitude zu erreichen. Diese Anlaufzeit ist immer erforderlich, unabhängig
davon, ob ein externer Quarz und ein interner Oszillatorverstärker oder ein externer Quarzoszillator verwendet wird. Sie kann, abhängig von den Eigenschaften
des Quarzes und des dazugehörigen Verstärkers, 3 ms bis 12 ms betragen.
Diese Anlaufzeit wirkt sich so aus, dass der Baustein Leistung verbraucht, auch
wenn er während dieser Zeit seine eigentliche Funktion nicht ausführt. Geht der
Baustein häufig in den Stoppmodus oder verlässt diesen, um kurzzeitig andere
Aufgaben auszuführen, kann dies Bedeutung erlangen. Ist die andere Aufgabe
sehr kurz (<5 ms), kann der Quarz während der Anlaufperiode mehr Leistung
verbrauchen als während der Ausführung der Aufgabe selbst. Wird mittels eines
Ringoszillators ein »Schnellstart« vom Stoppmodus ausgeführt, kann diese Verzögerung eliminiert werden. Damit wird der Leistungsverbrauch beim Verlassen des
Stoppmodus erheblich reduziert.
Vergleicht man den Betrieb zweier Systeme, die den Stoppmodus verlassen, um
eine kurze Aufgabe auszuführen, gibt es zwei Möglichkeiten: Der zweite Baustein
enthält einen internen Ringoszillator, während der erste mit einem herkömmlichen externen Quarz arbeitet. Bei diesem Baustein tritt die Anlaufperiode des
Quarzes auf. Während dieser Zeit verbraucht der Baustein weiterhin Leistung,
führt aber keine eigentliche Funktion aus. Beim zweiten Baustein handelt es sich
um einen schnellen Mikrocontroller des Typs AT89C51 mit einem internen Ringoszillator. Damit kann der Baustein sofort nach dem Verlassen des Stoppmodus
den Betrieb aufnehmen. In diesem Beispiel dauert die auszuführende Routine
weniger als 4 ms bei einer Frequenz von ca. 2 MHz. Der Leistungsverbrauch kann
beim Verlassen des Stoppmodus zur Ausführung kurzer Aufgaben durch den Einsatz eines Ringoszillators erheblich reduziert werden.
In einigen Anwendungen kann die Stabilität eines Quarzoszillators erst eine
kurze Zeit nach dem Verlassen des Stoppmodus gefordert sein. Auch in diesem
Fall bietet der Ringoszillator einen Vorteil. Sofort nach dem Verlassen des Stoppmodus sollte der Baustein den Quarzoszillator starten. Der Baustein kann dann,
während der Quarz anläuft, erforderliche Daten oder Register initialisieren. Die
meisten schnellen Mikrocontroller arbeiten mit einem Statusbit, das anzeigt, ob
der Quarz sich stabilisiert hat oder nicht. Ist die Initialisierungsroutine für den
Quarzoszillator abgelaufen, kann die Software das Statusbit abfragen und so feststellen, ob der Betrieb mit der genauen Taktfrequenz aufgenommen werden kann.
Ein weiteres Verfahren zur Reduzierung des Leistungsverbrauchs im Stoppmodus
ist, statt eines Resets einen Interrupt zum Verlassen des Stoppmodus zu benutzen. Dies gibt dem Prozessor die Möglichkeit, den Betrieb sofort mit dem Befehl
111
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
aufzunehmen, der auf das Setzen des Stoppbits folgt, anstatt vom Reset-Vektor
neu zu starten. Dadurch braucht die Reset-Quelle nicht ermittelt zu werden, und
der Prozessor kann seine Funktion in kürzerer Zeit aufnehmen.
Der zweite Modus zur Taktsteuerung in der Architektur der Grundversion des
8051 ist der »Idle-Mode« (Leerlaufmodus).
Dabei wird der Betrieb der CPU angehalten, während die chipinternen Timer in
Betrieb bleiben. In einer Anwendung, wo Leistungseinsparungen wichtig sind,
dienen diese Timer dazu, den Baustein periodisch hochzufahren, um eine Aufgabe auszuführen oder abzufragen, ob dies erforderlich ist. Da die Standard-Timer
des 8051 nur über 16 Bit verfügen, gestattet dies eine maximale Timeout-Periode
von 31 ms bei einer Taktfrequenz von 16 MHz. Werden längere Perioden benötigt,
sind mehrere Timer-Überläufe erforderlich. Dadurch wird zusätzliche Leistung
verbraucht, da der Baustein ab und zu den vollen Betrieb aufnehmen muss, um
einen Zähler weiterzustellen, dabei aber keine eigentliche Funktion ausführt.
Sind längere Perioden erforderlich, ist ein interner Timer mit einer längeren Periode einzusetzen. Einige Versionen der Familie 8051 enthalten einen WatchdogTimer, der auch benutzt werden kann, um den Baustein aufzuwecken. WatchdogTimer lassen sich für lange Timeout-Perioden (etwa bis zu 226 Taktzyklen) programmieren. Damit lässt sich eine maximale Timeout-Periode von 4,2 Sekunden
bei 16 MHz erreichen. Nehmen wir beispielsweise an, dass eine Anwendung alle
drei Sekunden aus einem leistungssparenden Zustand hochzufahren ist, um eine
Aufgabe (Task) auszuführen. Werden dazu die internen Timer benutzt, müsste der
Baustein 96-mal den »Idle-Mode« verlassen, ohne eine eigentliche Funktion auszuführen. Wird jedoch ein Watchdog-Timer mit einer langen Timeout-Periode verwendet, verlässt der Baustein den »Idle-Mode« nur einmal, führt die Aufgabe aus
und kehrt in den leistungssparenden Zustand zurück.
Eine weitere Möglichkeit besteht im Einsatz eines Mikrocontrollers mit einer RealTime Clock (RTC). Der schnelle Mikrocontroller AT89C51 enthält eine RTC, die
eine Alarmperiode von bis zu 24 Stunden erzeugen kann. Der durch diesen Alarm
erzeugte interne Interrupt kann den Baustein aus dem Idle-Mode oder aus dem
Stoppmodus hochfahren. Die Verwendung einer RTC zum Verlassen des Stoppmodus ist das effizienteste Verfahren zum Anhalten des Betriebs des Bausteins
für längere Zeit.
1.12.4 Power-Management-Betriebsarten
Obwohl der »Idle-Mode« den Leistungsverbrauch durch Anhalten der Programmausführung reduziert, arbeiten die internen Timer weiter mit der externen Taktfrequenz. Unter dem Gesichtspunkt, dass die Timer sich in einem Standby-Zustand
befinden, entsteht dadurch ein erheblicher Leistungsverbrauch.
112
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.12
CMOS-Mikrocontroller-Familie AT89C51
Eine bessere Lösung ist die Reduzierung der Taktfrequenz des gesamten Bausteins. Dies kann mittels eines internen Frequenzteilers geschehen, der die externe
Taktfrequenz teilt, bevor sie auf die CPU gegeben wird. Dieses Prinzip wird im
schnellen Mikrocontroller AT89C51 angewandt. Dieser Baustein arbeitet mit zwei
Frequenzteilerfunktionen: Power-Management-Modus 1, der die Takteingangsquelle durch 64 teilt, und Power-Management-Modus 2, der die Takteingangsquelle durch 1024 teilt. Diese Modi werden durch Setzen der entsprechenden Bits
in einem speziellen Funktionsregister (SFR) aktiviert.
Ein Vergleich zwischen dem Taktteiler und den Steuermodi des schnellen Mikrocontrollers AT89C51 mit dem 8051 zeigt, dass der Stromverbrauch bei maximaler
Frequenz (geteilt durch 4), im Power-Management-Modus 1 (geteilt durch 64), im
Power-Management-Modus 2 (geteilt durch 1024), im »Idle-Mode« und im Stoppmodus sinkt. Wie erwartet, wird im Stoppmodus der geringste Strom aufgenommen, da hier der gesamte interne Takt angehalten wird. Ein interessantes Ergebnis
dieses Vergleichs ist, dass die beiden Power-Management-Modi weniger Strom
verbrauchen als der »Idle-Mode«. Damit kann der Baustein nicht nur Leistung
sparen, sondern er kann auch kontinuierlich mit reduzierten Funktionen weiterlaufen. Bei der herkömmlichen Architektur des 8051 gab es bei jeglicher CPUAktivität nur »alles oder nichts«. Der Baustein musste in jedem Fall mit der maximalen Leistungsfähigkeit arbeiten, selbst wenn dies nur für kurze Perioden erforderlich war. Dadurch wurde der Leistungsverbrauch unnötig erhöht. Durch die
Anwendung der Power-Management-Modi (PMM) kann der Baustein (und das
System) seinen Leistungsverbrauch an die benötigte Rechenleistung anpassen.
Eine mögliche Folge des Einsatzes eines internen Frequenzteilers ist eine beträchtliche Erhöhung der Interrupt-Latenzen. Darüber hinaus würde das Verlangsamen
der internen Timer die Fähigkeit der seriellen Ports des 8051 beeinträchtigen, die
Standard-Baudrate zu erzeugen oder mit dieser zu synchronisieren. Dies könnte
wiederum die Reaktion des Bausteins auf externe Signale behindern. Eine Lösung
dafür ist der Einbau einer Funktion, die den Baustein automatisch auf den vollen
Betrieb hochfährt, wenn ein externer Interrupt oder die Aktivität eines seriellen
Ports festgestellt wird. Ein solcher Mechanismus wurde in den AT89C51 implementiert. Es handelt sich dabei um die »Switchback«- Funktion, mit deren Hilfe der Baustein rasch auf externe Interrupts reagiert. Sofort nach der Bestätigung des
Interrupts schaltet der Baustein ohne Softwareeingriff automatisch auf die volle
Frequenz (geteilt durch 4) zurück.
Die seriellen Schnittstellen arbeiten auf ähnliche Weise. Wenn eine fallende
Flanke (Startbit) am Empfangseingang der seriellen Schnittstelle ankommt, schaltet der Baustein automatisch auf die volle Frequenz (geteilt durch 4) zurück. Da
dies direkt am Anfang der Übertragung erfolgt, kann der Baustein den Rest der
Übertragung mit der vollen Frequenz empfangen. Bei der herkömmlichen 8051Architektur konnten die seriellen Ports in einer leistungssparenden Konfiguration
113
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
lediglich im »Idle-Mode« benutzt werden. Die Power-Management-Modi bieten
hier eine leistungssparende Alternative.
In leistungssparenden Systemen ist es üblich, das System vom Stoppmodus aufzuwecken, bestimmte Aktivitäten auszuführen und dann zum Stoppmodus
zurückzukehren. Eine Möglichkeit, den Leistungsverbrauch in derartigen Systemen zu reduzieren, ist die Erhöhung der Betriebsfrequenz. Auf den ersten Blick
scheint dies unserem Ziel entgegenzustehen. Während seiner Betriebszeit verbraucht der Baustein mehr Leistung als ein mit niedrigerer Frequenz arbeitendes
System. Der beim Betrieb des Systems verbrauchte Ruhestrom hängt jedoch nicht
von der Frequenz ab. Beim endgültigen Systementwurf wird der Energieverbrauch üblicherweise eingeschätzt, um die Batterielebensdauer zu bestimmen.
Diese Unterscheidung ist bei der Bewertung eines leistungsfähigen Mikrocontrollers zu beachten, da dieser das Konzept von Zeit und Betriebsleistungsverbrauch
vereint. Ist das Produkt aus Leistungsverbrauch und Zeit für ein bestimmtes System kleiner, verbraucht dieses, unabhängig von den speziellen Bedingungen,
weniger Energie. In vielen Fällen lässt sich nachweisen, dass ein schneller Mikrocontroller den Energieverbrauch reduzieren kann, indem er für kurze Perioden
mit hoher Frequenz arbeitet, anstatt für längere Zeit langsamer zu laufen.
Nehmen wir an, dass der AT89C51 nach dem Hochfahren aus dem Stoppmodus
einen I/O-Port lesen, eine mathematische Berechnung ausführen, das Ergebnis an
einem anderen Port ausgeben muss und dass dies 500 Operationszyklen CPUZeit erfordert. Gemäß dem Vergleich beträgt der Stromverbrauch 12,4 mA bei
10 MHz bzw. 34,6 mA bei 30 MHz. Aus einem Vergleich geht hervor, dass beim
Betrieb mit 30 MHz 6 % weniger Energie verbraucht wird, also erweist sich eine
höhere Betriebsfrequenz hier als effizienter.
Bei vielen Anwendungen hängt die Hochfahrzeit aus dem Stoppmodus nicht nur
von der Geschwindigkeit ab. Oftmals muss der Baustein auf einen peripheren
Schaltkreis mit einer festen Antwortzeit, wie z.B. einen A/D-Wandler oder einen
Thermostat, zugreifen. In diesem Fall ist der Mikrocontroller mit einer intensiven
Aktivität (Burst Activity) beschäftigt, normalerweise um einen Prozess zu initialisieren, worauf eine Periode geringer oder sogar keiner Aktivität folgt. Für einen
solchen Fall kann eine Kombination verschiedener Leistungssparverfahren geeignet sein.
Die Mikrocontroller der Familie 8051 gehören nach wie vor zu den weltweit verbreitetsten Prozessoren. Mit ihrem unkomplizierten Einsatz und der relativ hohen
Leistungsfähigkeit eignen sie sich ideal für viele Anwendungen, einschließlich tragbarer und Handgeräte. Mit der Einführung schneller Mikrocontroller von Dallas
Semiconductor und Atmel ergibt sich die Möglichkeit, den Leistungsverbrauch existierender 8051-Schaltungen ohne kostenaufwendige Neuentwürfe zu reduzieren.
114
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.13
Programmierung des 8751
Die Vorteile von leistungssparenden Mikrocontrollern lassen sich folgendermaßen zusammenfassen: Eine leistungsfähige CPU erlaubt eine Verringerung der
Prozessorfrequenz, wodurch die gleichen Leistungsmerkmale bei reduziertem
Leistungsverbrauch erreicht werden. Andererseits lässt sich die Prozessorleistung
eines existierenden Systems verbessern, ohne den Leistungsverbrauch zu erhöhen.
Bei dem schnellen Mikrocontroller sind Funktionen wie Watchdog-Timer, zusätzliche UARTs und genaue Reset-Schaltkreise integriert. Externe Schaltkreise verbrauchen mehr Leistung.
Die Einführung von zwei neuen leistungssparenden Modi bietet eine bessere
Alternative zum Idle Mode. Neben der Reduzierung des Stromverbrauchs ermöglichen Power-Management-Modi, wie sie im AT89C51 Anwendung finden, dem
Prozessor auch im leistungssparenden Modus die Ausführung bestimmter Funktionen, wie z.B. der Abfrage (Polling). Bei herkömmlichen 8051-Architekturen
muss der Prozessor immer mit der maximalen Betriebsfrequenz arbeiten, selbst
wenn nur eine minimale Verarbeitungsleistung benötigt wird.
Durch die Kombination der Vorteile einer programmierbaren Taktfrequenz und
eines leistungsfähigen Kerns mit dem Stoppmodus kann eine beträchtliche Leistungseinsparung erreicht werden. Es wurden Beispiele dafür gezeigt, wie der Leistungsverbrauch durch Anpassung der Taktfrequenz an die gewünschte Prozessorleistung reduziert werden kann.
1.13 Programmierung des 8751
Die Programmierung des AT89C51 basiert im Wesentlichen auf dem Mikrocontroller 8751, der zur Programmspeicherung ein EPROM verwendet. Im AT89C51
wird dagegen ein EEPROM oder Flash-EPROM verwendet.
1.13.1 Programmierung des EPROM im 8751
Der Mikrocontroller 8751 ist die EPROM-Schaltung der Mikrocontroller-Familie
8051. Der Programmspeicher auf dem Chip kann also elektrisch programmiert
und durch UV-Licht wieder gelöscht werden. Außerdem sind beim 8751 Vorkehrungen getroffen, die einen Zugriff auf den Inhalt des Programmspeichers von
außen verhindern können, so dass die Software gegen unberechtigte Verwendung
geschützt ist.
Bei der Programmierung muss der Mikrocontroller mit einer Oszillatorfrequenz
von 4 MHz bis 6 MHz arbeiten. Der Oszillator muss deshalb in Betrieb sein, weil
der interne Bus Adressen und Daten in die zuständigen Register transportieren
soll. Die Adresse des zu programmierenden EPROM-Speicherplatzes wird an Port 1
115
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
und die Anschlüsse P2.0 bis P2.3 an Port 2 gelegt, während das Datenbyte an Port
0 gelegt werden muss. Die Anschlüsse P2.4 bis P2.6 sowie PSEN sollten auf LPegel und die Anschlüsse P2.7 und RST auf H-Pegel gehalten werden. Hierbei
handelt es sich um TTL-Pegel, ausgenommen RST, das 2,5 V für einen H-Pegel
erfordert. EA/Upp wird normalerweise auf H-Pegel gehalten und mit ±21 V
gepulst. Während an EA/Upp 21 V liegen, wird der Anschluss ALE/PROG, der sich
normalerweise auf H-Pegel befindet, für 50 ms auf L-Pegel gepulst und danach
EA/Upp wieder auf H-Pegel gelegt. Abbildung 1.36 zeigt die Funktion der
Anschlüsse bei der Programmierung des 8751.
Abb. 1.36:
Programmierung des 8751
Man beachte, dass am Anschluss EA/Upp zu keinem Zeitpunkt eine höhere Spannung als der angegebene Grenzwert Upp = 21,5 V liegen darf. Selbst ein schmaler
Störimpuls oberhalb dieses Spannungspegels kann zu dauerhafter Beschädigung
des Mikrocontrollers führen. Die Spannung Upp sollte geregelt und frei von Störimpulsen sein.
Wenn das Programmsicherheitsbit nicht gesetzt ist, lässt sich der auf dem Chip
befindliche Programmspeicher für Prüfzwecke lesen, und zwar auf Wunsch entweder während oder nach der Programmierung. In Abbildung 1.37 ist die hierfür
erforderliche Beschaltung des 8751 angegeben. Sie ist dieselbe wie bei der Programmierung, ausgenommen, dass Anschluss P2.7 auf dem L-Pegel liegen muss
oder als Lese-Strobe-Eingang (aktiver Zustand L-Pegel) verwendet wird.
116
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.13
Programmierung des 8751
Abb. 1.37:
Programmüberprüfung beim 8751
Die Adresse des zu lesenden Programmspeicherplatzes wird an Port 1 und die
Anschlüsse P2.0 bis P2.3 gelegt. Die anderen Anschlüsse von Port 2 und PSEN
werden auf L-Pegel gehalten, ALE, EA und RST sind auf H-Pegel zu halten. Der
Inhalt des adressierten Speicherplatzes erscheint an Port 0. Für diese Operation
sind externe Pull-up-Widerstände an Port 0 erforderlich.
1.13.2 Programmsicherung
Der 8751 enthält ein Sicherheitsbit, das, sobald es gesetzt ist, jeglichen externen
elektrischen Zugriff zum Programmspeicher auf dem Chip verhindert. Die
Beschaltung und die Programmierung mit dem Sicherheitsbit sind dieselben wie
bei der normalen Programmierung, ausgenommen, dass Anschluss P2.6 auf dem
H-Pegel gehalten wird. Abbildung 1.38 zeigt die Beschaltung. An den Anschlüssen
von Port 0, Port 1 und P2.0 bis P2.3 von Port 2 kann jeder Pegel liegen.
Sobald das Sicherheitsbit gesetzt ist, lässt es sich nur durch die vollständige
Löschung des Programmspeichers deaktivieren. Solange es gesetzt ist, kann der
interne Programmspeicher nicht gelesen werden, die Schaltung kann nicht weiter
programmiert werden, und sie kann nicht auf externe Programmspeicher zugreifen. Durch Löschung des EPROM und die damit verbundene Deaktivierung des
Sicherheitsbits wird die volle Funktionsfähigkeit der Schaltung wiederhergestellt.
Sie lässt sich danach erneut programmieren.
117
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Abb. 1.38:
Setzen des Sicherheitsbits beim 8751
Die Löschung des EPROM auf dem 8751 setzt ein, wenn der Chip Licht ausgesetzt
wird, dessen Wellenlänge kleiner als 0,4 m ist. Da Licht dieser Wellenlängen von
der Sonne und von fluoreszierenden Lichtquellen abgestrahlt wird, kann eine
(unbeabsichtigte) Löschung des EPROM erfolgen, wenn dieses einer derartigen
Quelle über einen längeren Zeitraum (eine Woche im Sonnenlicht, drei Jahre bei
Zimmerbeleuchtung mit Leuchtstoffröhren) ausgesetzt wird. Wenn eine solche
Belichtung im Anwendungsfall möglich ist, empfiehlt es sich, das Fenster mit
einem für UV-Licht undurchlässigen Aufkleber abzudecken.
Zur Löschung des EPROM auf dem 8751 wird empfohlen, es ultraviolettem Licht
(0,2537 m) mit einer Gesamtdosis von wenigstens 15 W/cm2 auszusetzen. Eine
20- bis 30-minütige Bestrahlung des 8751 mit einer UV-Lampe, die 12 mW/cm2
abgibt, dürfte bei einer Entfernung von ca. 2,5 cm zwischen Lampe und Chip zur
Löschung ausreichen. Nach der Löschung befinden sich alle Speicherstellen im
Zustand 1.
1.13.3 Programmierung des AT89C51
Für die Programmierung des AT89C51 benötigt man eine Entwicklungssoftware,
die kostenlos bei Atmel aus dem Internet direkt zu laden ist, und einen Programmer. Abbildung 1.39 zeigt die Hardware für einen Programmer.
Die Hardware besteht aus dem Mikrocontroller AT89C51, der Quarzschaltung mit
fünf Bauteilen, dem MAX232 und dem 9-poligen Sub-Stecker. Über die serielle
Schnittstelle werden die Daten vom PC zum Mikrocontroller übertragen. Zwischen dem Sub-Stecker und dem AT89C51 befindet sich der MAX232, der die
118
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
1.13
Programmierung des 8751
Pegel auf entsprechendes Spannungsniveau umsetzt. Der MAX232 enthält die
Pegelumsetzer und benötigt daher externe Kondensatoren, denn die Innenschaltung arbeitet mit mehreren Spannungskonvertern.
Abb. 1.39:
Hardware für einen Programmer des AT89C51
Der Mikrocontroller hat einen Flash-Speicher und es gilt die Programmprozedur
von Tabelle 1.28.
Betriebsart
RST
PSEN
Schreibdaten
H
L
Lesedaten
H
EA/Upp
P2.6
P2.7
P3.6
P3.7
_
H/+12 V
L
H
H
H
L
H
H
L
L
H
H
Bit – 1
H
L
_
H/+12 V
H
H
H
H
Bit – 2
H
L
_
H/+12 V
H
H
L
L
Bit – 3
H
L
_
H/+12 V
H
L
H
L
Baustein löschen
H
L
_*
H/+12 V
H
L
L
L
Lese Signaturbyte
H
L
H
H
L
L
L
L
Schreibsperre
ALE/PROG
Tabelle 1.28: Programmierbetrieb des AT89C51
*) Das Signal für den »Baustein löschen« soll 10 ms als Impuls am
PROG-Eingang anliegen.
119
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313
Kapitel 1
Mikrocontroller-8051-Familie und AT89C51
Wenn das Programm assembliert ist und der Assembler keine Fehler beinhaltet,
kann mit der Programmierung des Mikrocontrollers AT89C51 begonnen werden.
Für die ersten Versuche wird die Datenübertragung mit der seriellen Schnittstelle
durchgeführt.
120
© des Titels »Mikrocontrollerprogrammierung in Assembler und C« (ISBN 978-3-8266-8313-8) 2013 by
Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313