04.11.2013 Aufrufe

Mikrocontrollerprogrammierung in Assembler und C

Mikrocontrollerprogrammierung in Assembler und C

Mikrocontrollerprogrammierung in Assembler und C

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Kapitel 1<br />

Mikrocontroller-8051-Familie<br />

<strong>und</strong> AT89C51<br />

Was haben Analog Devices, Atmel, Cypress Semiconductor, Dallas Semiconductor,<br />

Goal, Hynix, Inf<strong>in</strong>eon, Intel, OKI, Philips, Silicon Labs, SMSC, STMicroelectronics,<br />

Synopsis, TDK, Temic, Texas Instruments <strong>und</strong> W<strong>in</strong>bond geme<strong>in</strong>? Sie alle bieten<br />

8051-basierte Mikrocontrollerbauste<strong>in</strong>e bzw. IP-Cores an!<br />

Aufgr<strong>und</strong> der großen Verbreitung dieser Mikroprozessorfamilie <strong>und</strong> damit verb<strong>und</strong>en<br />

mit großen Softwarebibliotheken gibt es auch e<strong>in</strong>e Vielzahl von synthetisierbaren<br />

Implementierungen. Diese s<strong>in</strong>d als so genannte IP-Cores <strong>in</strong> e<strong>in</strong>er<br />

Hardwarebeschreibungssprache wie beispielsweise VHDL frei <strong>und</strong> im Quelltext<br />

verfügbar. Sie eignen sich für den E<strong>in</strong>satz <strong>in</strong> FPGAs <strong>und</strong> anwendungsspezifischen<br />

<strong>in</strong>tegrierten Schaltungen (ASICs).<br />

1.1 E<strong>in</strong>führung<br />

Seit der E<strong>in</strong>führung des 8-Bit-Mikrocontrollers 8048 im Jahre 1976 von Intel, des<br />

ersten E<strong>in</strong>-Chip-Mikrocontrollers auf e<strong>in</strong>em e<strong>in</strong>zigen <strong>in</strong>tegrierten Bauste<strong>in</strong>, ist<br />

diese so vielseitig e<strong>in</strong>setzbare Schaltung durch Entwicklung e<strong>in</strong>er Reihe ähnlicher<br />

Bauste<strong>in</strong>e mit unterschiedlichen Zielsetzungen entwickelt worden. Zum Beispiel<br />

wurde beim Mikrocontroller 8049 sowohl die Programm- als auch die Datenspeicherkapazität<br />

gegenüber dem 8048 (oder se<strong>in</strong>er EPROM-Version 8748) verdoppelt.<br />

Für Anwendungen, bei denen nur externe Programmspeicherkapazität<br />

erforderlich ist, stehen die Mikrocontroller 8035 <strong>und</strong> 8039 zur Verfügung. Der<br />

kostengünstige Mikrocontroller 8021 ist für Anwendungen vorgesehen, die mit<br />

e<strong>in</strong>er ger<strong>in</strong>geren Anzahl von E<strong>in</strong>/Ausgabeleitungen auskommen <strong>und</strong> er arbeitet<br />

bei niedrigerer Geschw<strong>in</strong>digkeit mit e<strong>in</strong>er Teilmenge des 8048-Befehlsvorrats.<br />

Der Mikrocontroller 8051 <strong>und</strong> se<strong>in</strong>e Nachfolger s<strong>in</strong>d <strong>in</strong>zwischen e<strong>in</strong>e <strong>in</strong>dustrielle<br />

Standardschaltung geworden, die von zahlreichen Halbleiterherstellern angeboten<br />

<strong>und</strong> weltweit e<strong>in</strong>gesetzt werden. Von beiden Familien haben die Halbleiterhersteller<br />

zahlreiche Schaltkreise <strong>in</strong> der CMOS-Version zur Verfügung gestellt <strong>und</strong> entwickelt<br />

<strong>und</strong> CMOS-Versionen aller anderen Schaltungen sowie weitere Mikrocontroller, die<br />

sich durch zusätzliche anwenderorientierte Funktionen auszeichnen.<br />

Bei allen Herstellern s<strong>in</strong>d zahlreiche Mikrocontroller mit stark erhöhter Integrationsdichte<br />

verfügbar, die aufgr<strong>und</strong> ihrer hohen Leistungsfähigkeit neue Anwen-<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

27


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

dungsbereiche erschließt. Die Leistungsfähigkeit dieses Mikrocontrollers 8051 ist<br />

gegenüber dem 8048 beträchtlich gesteigert worden, <strong>in</strong>dem ca. 60 000 Transistoren<br />

auf die Chipfläche aufgebracht werden. Der 8051 gehört zur Mikrocontroller-<br />

Familie 8051, die auch die Mikrocontroller 8031 (ohne ROM) <strong>und</strong> 8751 (mit<br />

EPROM) umfasst. Die Mitglieder dieser Familie s<strong>in</strong>d die Mikrocontroller 8052<br />

<strong>und</strong> 8032, die sich durch Verdopplung der RAM-Kapazität auf 256 Bytes sowie –<br />

beim 8052 – durch Verdopplung der ROM-Kapazität auf 8 Kbyte auszeichnen (der<br />

8032 hat ke<strong>in</strong> ROM). Außerdem s<strong>in</strong>d diese beiden Mikrocontroller mit e<strong>in</strong>em<br />

zusätzlichen Timer mit speziellen Eigenschaften ausgerüstet.<br />

Ab 1980 kamen mehrere E<strong>in</strong>chip-Mikrocontroller aus der Familie 8051 auf den<br />

Markt. Der 83C152 <strong>und</strong> 83C252 von Intel, der 80C154 von OKI, der 83C552 von<br />

Philips/Valvo, der 82C451 von Philips/Signetics <strong>und</strong> 80512, 80515 <strong>und</strong> 80C517 von<br />

Siemens. Alle diese Mikrocontroller s<strong>in</strong>d mit e<strong>in</strong>em Watchdog-Timer, 8-Bit-Analog-/Digital-Wandler,<br />

Impulsweitenmodulation <strong>und</strong> e<strong>in</strong>er seriellen Schnittstelle<br />

nach I ² C ausgerüstet.<br />

Die E<strong>in</strong>chip-Mikrocontroller-Familie hat sehr viele Mitglieder hervorgebracht,<br />

doch weisen alle mehr oder weniger geme<strong>in</strong>same Merkmale auf:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

8-Bit-Prozessorkern mit e<strong>in</strong>heitlichem Befehlssatz<br />

m<strong>in</strong>destens 128 Bytes <strong>in</strong>ternes RAM<br />

externes RAM <strong>und</strong> ROM<br />

e<strong>in</strong>heitliches Adressierungsmodell für so genannte »Special Function<br />

Register« (SFR)<br />

Full-Duplex-UART<br />

fünf Interrupt-Quellen<br />

zwei Interrupt-Prioritäten<br />

diverse Timer<br />

Aufgr<strong>und</strong> der unterschiedlichen Befehlslängen von e<strong>in</strong>em bis zu drei Byte sowie<br />

den unterschiedlichen Ausführungszeiten für e<strong>in</strong>en Befehl handelt es sich e<strong>in</strong>deutig<br />

um e<strong>in</strong>e CISC-Architektur. Neben dem klassischen CISC-Mikrocontroller<br />

(complex <strong>in</strong>struction set computer), wie man diese bei den Mikroprozessoren <strong>in</strong><br />

der PC-Technik f<strong>in</strong>det, verwendet man immer mehr die modernen RISC-Mikrocontroller<br />

(reduced <strong>in</strong>struction set computer). Diese Mikrocontroller setzen e<strong>in</strong>en<br />

reduzierten Befehlssatz e<strong>in</strong>, der wesentlich effizienter ist <strong>und</strong> dadurch auch erheblich<br />

schneller das Programm abarbeitet. Trotzdem hat die CISC-Architektur erhebliche<br />

Vorteile <strong>in</strong> der Ausbildung <strong>und</strong> im Studium.<br />

E<strong>in</strong> Befehlszyklus entspricht <strong>in</strong> der ursprünglich von Intel entwickelten Struktur<br />

e<strong>in</strong>em bis drei Masch<strong>in</strong>enzyklen. E<strong>in</strong> Masch<strong>in</strong>enzyklus entspricht zwölf Taktzyklen.<br />

Heute übliche Varianten des 8051 kommen h<strong>in</strong>gegen meist mit zwei Taktzyklen<br />

pro Masch<strong>in</strong>enzyklus aus <strong>und</strong> damit ist bei gleicher Taktfrequenz e<strong>in</strong>e<br />

deutlich höhere Befehlsabarbeitung möglich.<br />

28<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

E<strong>in</strong>e Besonderheit des 8051 ist der Bitprozessor, der im bitadressierbaren Bereich<br />

e<strong>in</strong>e schnelle <strong>und</strong> e<strong>in</strong>fache Bitmanipulation erlaubt.<br />

1.1.1 Unterschiede <strong>in</strong> der Familie 8051<br />

Die <strong>in</strong> NMOS-Technologie (im Jahr 1976) gefertigten 8051 <strong>und</strong> 8031 von Intel <strong>und</strong><br />

den anderen Halbleiterherstellern wurden ab diesem Zeitpunkt <strong>in</strong> CMOS-Technik<br />

hergestellt. Auf technische Unterschiede der NMOS- <strong>und</strong> CMOS-Versionen bezüglich<br />

der Oszillator-Beschaltung <strong>und</strong> des Betriebs bei reduzierter Leistung wird noch<br />

e<strong>in</strong>gegangen. In Tabelle 1.1 s<strong>in</strong>d die Mikrocontroller der Familie 8051 aufgelistet.<br />

Weitere Unterschiede der e<strong>in</strong>zelnen Schaltungen s<strong>in</strong>d <strong>in</strong> den folgenden Ausführungen<br />

beschrieben. Oft wird die Bezeichnung 8051 auch als Oberbegriff für diese<br />

Schaltungen verwendet.<br />

NMOS-Varianten<br />

Typ ROM RAM Bemerkung<br />

<strong>in</strong>tern <strong>in</strong>tern<br />

8031 – 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen<br />

8032 – 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen<br />

8051 4096 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

8052 8192 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

8751 8192 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

EPROM als OTP oder mit UV-Fenster<br />

CMOS-Varianten<br />

Typ<br />

ROM<br />

<strong>in</strong>tern<br />

RAM<br />

<strong>in</strong>tern<br />

Bemerkung<br />

80C31 – 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen<br />

80C32 – 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen<br />

80C51 4096 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

80C52 8192 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

80C54 16384 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

80C58 32768 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

maskenprogrammierbares ROM<br />

87C51 8192 128 zwei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

EPROM als OTP oder mit UV-Fenster<br />

87C52 8192 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

EPROM als OTP oder mit UV-Fenster<br />

89C52 32768 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen,<br />

Flash-Speicher<br />

Tabelle 1.1: NMOS- <strong>und</strong> CMOS-Varianten der Familie 8051<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

29


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Darüber h<strong>in</strong>aus gibt es von verschiedenen Firmen erweiterte 8051-Mikrocontroller,<br />

z.B. von Siemens (heute Inf<strong>in</strong>eon) entwickelt <strong>und</strong> <strong>in</strong> NMOS-Technologie hergestellt,<br />

wie Tabelle 1.2 zeigt.<br />

Typ<br />

ROM<br />

<strong>in</strong>tern<br />

RAM<br />

<strong>in</strong>tern<br />

Bemerkung<br />

80515 8192 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen, PWM,<br />

8-fach A/D-Wandler, maskenprogrammierbares ROM<br />

80535 – 256 drei 16-Bit-Timer, e<strong>in</strong> UART, zwei externe Interruptquellen, PWM,<br />

8-fach A/D-Wandler<br />

Tabelle 1.2:<br />

8051-Familie von Siemens (heute Inf<strong>in</strong>eon)<br />

Die CMOS-Varianten der Inf<strong>in</strong>eon-Serie s<strong>in</strong>d funktionsgleich, allerd<strong>in</strong>gs nicht <strong>in</strong><br />

allen Varianten p<strong>in</strong>kompatibel.<br />

Weitere moderne 8051-kompatible Mikrocontroller, die <strong>in</strong> CMOS-Technologie mit<br />

Flash-Speicher hergestellt werden <strong>und</strong> e<strong>in</strong>e schnellere Befehlsverarbeitung zulassen<br />

s<strong>in</strong>d erhältlich. Tabelle 1.3 zeigt Typen von verschiedenen Herstellern.<br />

Hersteller Typ Flash<br />

<strong>in</strong>tern<br />

RAM<br />

<strong>in</strong>tern<br />

Bemerkung<br />

ATMEL AT89C2051 2048 128 nur 20 P<strong>in</strong>s, ke<strong>in</strong> externer Daten-/Adressbus,<br />

zwei 16-Bit-Timer, e<strong>in</strong> UART, e<strong>in</strong> Komparator,<br />

Flash-Speicher<br />

ATMEL AT89C4051 4096 128 nur 20 P<strong>in</strong>s, ke<strong>in</strong> externer Daten-/Adressbus,<br />

zwei 16-Bit-Timer, e<strong>in</strong> UART, e<strong>in</strong> Komparator,<br />

Flash-Speicher<br />

ATMEL AT89C51ED2 16384 256 bis zu sechs Ports (je nach Gehäusegröße),<br />

1792 Bytes <strong>in</strong>ternes MOVX-SRAM, RS232-<br />

Bootloader im ROM, 2048 Bytes, <strong>in</strong>ternes<br />

Daten-EEPROM, drei 16-Bit-Timer, e<strong>in</strong> UART,<br />

e<strong>in</strong> Komparator, zwei Stackpo<strong>in</strong>ter, PWM, SPI,<br />

Flash-Speicher<br />

MAXIM/<br />

DALLAS<br />

MAXIM/<br />

DALLAS<br />

Tabelle 1.3:<br />

DS89C430 16384 256 e<strong>in</strong> Taktzyklus pro Befehl, max. 33 MIPS bei 33<br />

MHz, 1 Kbyte <strong>in</strong>ternes MOVX-SRAM, RS232-<br />

Bootloader im ROM, 2048 Bytes, <strong>in</strong>ternes<br />

Daten-EEPROM, drei 16-Bit-Timer, e<strong>in</strong> UART,<br />

e<strong>in</strong> Komparator, zwei Stackpo<strong>in</strong>ter,<br />

Flash-Speicher<br />

DS89C450 65536 256 e<strong>in</strong> Taktzyklus pro Befehl, max. 33 MIPS bei 33<br />

MHz, 1 Kbyte <strong>in</strong>ternes MOVX-SRAM, RS232-<br />

Bootloader im ROM, 2048 Bytes, <strong>in</strong>ternes<br />

Daten-EEPROM, drei 16-Bit-Timer, e<strong>in</strong> UART,<br />

e<strong>in</strong> Komparator, zwei Stackpo<strong>in</strong>ter,<br />

Flash-Speicher<br />

8051-kompatible Mikrocontroller <strong>in</strong> CMOS-Technologie<br />

30<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

In der ursprünglichen Form des 8051 handelt es sich um e<strong>in</strong>e Harvard-Architektur,<br />

jedoch besitzen viele neuere 8051-Entwicklerboards e<strong>in</strong>e modifizierte Harvard-Architektur.<br />

Mit dieser Architektur wird e<strong>in</strong> Teil des XRAM (extended data<br />

RAM) mittels e<strong>in</strong>es Adressdecoders <strong>in</strong> den Programmspeicher gespiegelt. Dies<br />

ermöglicht e<strong>in</strong>er meist ab ROM laufenden Term<strong>in</strong>alsoftware, z.B. per serielle<br />

Schnittstelle kommende Software <strong>in</strong> den Programmspeicher zu laden <strong>und</strong> nach<br />

dem Übertragen auszuführen. Der Stack bef<strong>in</strong>det sich immer frei def<strong>in</strong>ierbar im<br />

<strong>in</strong>ternen RAM. Die Bytereihenfolge ist »Little Endian First«.<br />

1.1.2 Vom E<strong>in</strong>chip-Mikrocontroller 8048 zur 8051-Familie<br />

Die Architektur-Erweiterung der Mikrocontroller der Familie 8051 gegenüber dem<br />

<strong>in</strong>dustriellen Standard-E<strong>in</strong>chip-Mikrocontroller 8048 führt sowohl zu e<strong>in</strong>er Leistungserhöhung<br />

der Zentrale<strong>in</strong>heit (CPU) als auch zu e<strong>in</strong>er Erhöhung der<br />

Leistung, der Vielfalt <strong>und</strong> der Anzahl der auf dem Chip <strong>in</strong>tegrierten sonstigen E<strong>in</strong>heiten.<br />

Die Mikrocontroller der Familie 8051 s<strong>in</strong>d daher besonders für Anwendungen<br />

geeignet, die e<strong>in</strong>e große Anzahl von Funktionen auf dem Chip sowie e<strong>in</strong>e<br />

hohe Geschw<strong>in</strong>digkeit erfordern. Den Anwendern des 8048 stellen sie sich als<br />

aufwärts-kompatible Schaltungen mit stark erhöhter Leistungsfähigkeit <strong>und</strong><br />

Geschw<strong>in</strong>digkeit dar.<br />

Der 8051 ist e<strong>in</strong> 8-Bit-E<strong>in</strong>chip-Mikrocontroller hoher Leistungsfähigkeit, der für<br />

Anwendungen mit den größten Anforderungen geeignet ist, die von e<strong>in</strong>em derartigen<br />

Mikrocontroller bewältigt werden können. Se<strong>in</strong>e hohe Leistungsfähigkeit im<br />

Vergleich zu anderen Mikroprozessoren <strong>und</strong> Mikrocontrollern zeigt sich vor allem<br />

bei der Lösung schwieriger Realzeitaufgaben, z.B. im Bereich <strong>in</strong>dustrieller Steuerungen,<br />

<strong>in</strong> der Peripherie von Großrechenanlagen (als <strong>in</strong>telligente Schaltungen)<br />

oder für allgeme<strong>in</strong>e Aufgaben im Automobilbau, Haushaltsgeräten usw.<br />

Der 8051 be<strong>in</strong>haltet die Hardware-Merkmale, die Architekturerweiterungen sowie<br />

die Befehle, die e<strong>in</strong> leistungsstarker <strong>und</strong> kosteneffektiver Mikrocontroller für<br />

Anwendungen haben muss, die bis zu je 64-Kbyte-Programmspeicher- <strong>und</strong>/oder<br />

Datenspeicher-Kapazität erfordern. Mit diesen Eigenschaften wurde der 8051 zum<br />

Standard-Mikrocontroller <strong>in</strong> den achtziger Jahre <strong>und</strong> se<strong>in</strong>e Anwendung hält bis<br />

heute an.<br />

Abbildung 1.1 zeigt Anschlussschema, Logiksymbol <strong>und</strong> Blockdiagramm des<br />

Mikrocontrollers 8051. Die Funktionen der e<strong>in</strong>zelnen E<strong>in</strong>heiten werden noch<br />

erklärt. In Tabelle 1.4 f<strong>in</strong>den Sie die Anschlussbelegung der Mikrocontroller der<br />

Familie 8051.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

31


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.1: Anschlussschema, Logiksymbol <strong>und</strong> Blockdiagramm des Mikrocontrollers 8051<br />

Bezeichnung<br />

Anschluss<br />

E<strong>in</strong>- oder<br />

Ausgang<br />

Aktiv<br />

Funktion<br />

U SS (0 V) 20 Masseanschluss<br />

U CC (+5 V) 40 Anschluss für die Betriebsspannung<br />

Tabelle 1.4: Anschlussbelegung der Mikrocontroller der Familie 8051<br />

32<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

Bezeichnung<br />

P0.0 bis<br />

P0.7<br />

P1.0 bis<br />

P1.7<br />

P2.0 bis<br />

P2.7<br />

Tabelle 1.4:<br />

Anschluss<br />

E<strong>in</strong>- oder<br />

Ausgang<br />

Aktiv<br />

Funktion<br />

32 bis 39 E/A I/O Port 0 ist e<strong>in</strong> bidirektionaler 8-Bit-Open-<br />

Dra<strong>in</strong>-E/A-Port, der bis zu acht LS-TTL-Lasten<br />

aufnehmen oder bei Busoperationen<br />

treiben kann. Anschlüsse von Port 0, die<br />

e<strong>in</strong>e E<strong>in</strong>s be<strong>in</strong>halten, haben schwebendes<br />

Potential <strong>und</strong> stellen <strong>in</strong> diesem Zustand<br />

E<strong>in</strong>gänge hoher Impedanz dar. Port 0 ist<br />

auch der Anschluss für den im Multiplex-<br />

Verfahren arbeitenden, unteren Adressbus<br />

sowie den Datenbus, während auf e<strong>in</strong>en<br />

externen Speicher zugegriffen wird. In diesem<br />

Fall werden während der Ausgabe von<br />

E<strong>in</strong>sen starke <strong>in</strong>terne Pull-up-Widerstände<br />

verwendet. Port 0 gibt auch bestimmte<br />

Bytes zur Programmüberprüfung aus. Bei<br />

der Anwendung werden externe Pull-up-<br />

Widerstände benötigt.<br />

1 bis 8 E/A I/O Port 1 ist e<strong>in</strong> bidirektionaler 8-Bit-E/A-Port<br />

mit <strong>in</strong>ternen Pull-up-Widerständen. Se<strong>in</strong>e<br />

Ausgangspuffer können bis zu vier LS-TTL-<br />

Lasten aufnehmen oder abgeben. Die<br />

Anschlüsse von Port 1, <strong>in</strong> die E<strong>in</strong>sen<br />

geschrieben s<strong>in</strong>d, werden durch <strong>in</strong>terne<br />

Pull-up-Widerstände auf hohem Potential<br />

gehalten <strong>und</strong> können <strong>in</strong> diesem Zustand<br />

als E<strong>in</strong>gänge dienen. Werden die<br />

Anschlüsse von Port 1 bei Verwendung als<br />

E<strong>in</strong>gänge extern auf 0-Signal gezogen, so<br />

liefern sie wegen der <strong>in</strong>ternen Pull-up-<br />

Widerstände e<strong>in</strong>en Strom (I IL im Datenblatt).<br />

21 bis 28 E/A I/O Port 2 ist e<strong>in</strong> bidirektionaler 8-Bit-E/A-Port<br />

mit <strong>in</strong>ternen Pull-up-Widerständen. Se<strong>in</strong>e<br />

Ausgangspuffer können bis zu vier LS-TTL-<br />

Lasten aufnehmen oder abgeben. Port 2<br />

gibt das obere Adressbyte während des<br />

Zugriffs auf externe Speicher aus, die<br />

16-Bit-Adressen verwenden. In diesem Fall<br />

werden während der Ausgabe von E<strong>in</strong>sen<br />

starke <strong>in</strong>terne Pull-up-Widerstände verwendet.<br />

Zum Programmieren <strong>und</strong> bei der<br />

Programmüberprüfung des 8751 dient der<br />

Port 2 zur Aufnahme des höheren Adressbytes<br />

<strong>und</strong> von Steuersignalen, außerdem<br />

zur Programmüberprüfung beim 8051<br />

Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

33


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

34<br />

Bezeichnung<br />

P3.0 bis<br />

P3.7<br />

Anschluss E<strong>in</strong>- oder Aktiv Funktion<br />

Ausgang<br />

10 bis 17 E/A I/O Port 3 ist e<strong>in</strong> bidirektionaler 8-Bit-E/A-Port<br />

mit <strong>in</strong>ternen Pull-up-Widerständen. Se<strong>in</strong>e<br />

Ausgangspuffer können bis zu vier LS-<br />

TTL-Lasten aufnehmen oder abgeben.<br />

Die Anschlüsse von Port 3 werden alternativ<br />

auch für andere im Folgenden aufgeführte<br />

Funktionen verwendet.<br />

P3.0 10 E I/O RXD; E<strong>in</strong>gang für serielle Daten<br />

P3.1 11 A I/O TXD; Ausgang für serielle Daten<br />

P3.2 12 E 0 INT0; externer Interrupte<strong>in</strong>gang 0<br />

P3.3 13 E 0 INT1; externer Interrupte<strong>in</strong>gang 1<br />

P3.4 14 E 1 T0; externer E<strong>in</strong>gang für Zähler 0<br />

P3.5 15 E 1 T1; externer E<strong>in</strong>gang für Zähler 1<br />

P3.6 16 A 0 WR; Strobe-Signal zum Schreiben <strong>in</strong> den<br />

externen Datenspeicher<br />

P3.7 17 A 0 RD; Strobe-Signal zum Lesen aus dem<br />

externen Datenspeicher<br />

RST 9 E 0 Rücksetze<strong>in</strong>gang. Liegt an diesem<br />

Anschluss während zweier Masch<strong>in</strong>enzyklen<br />

e<strong>in</strong> 1-Signal <strong>und</strong> läuft der Taktgeber,<br />

so wird die Schaltung zurückgesetzt.<br />

ALE/<br />

PROG<br />

30 A I/O (Address Latch Enable), Ausgangsimpuls<br />

zur Zwischenspeicherung des unteren<br />

Adressbytes während des Zugriffs auf e<strong>in</strong>en<br />

externen Speicher. ALE wird mit konstanter<br />

Frequenz ( 1 / 6 der Oszillatorfrequenz) auch<br />

dann erzeugt, wenn auf den externen Speicher<br />

nicht zugegriffen wird. Es steht für<br />

e<strong>in</strong>en etwa benötigten externen Takt oder<br />

externe zeitliche Abläufe zur Verfügung.<br />

(Allerd<strong>in</strong>gs wird bei jedem Zugriff auf e<strong>in</strong>en<br />

externen Datenspeicher e<strong>in</strong> ALE-Impuls<br />

übersprungen.) Zum Programmieren des<br />

EPROM (8751) erhält dieser Anschluss den<br />

Programmierimpuls (PROG).<br />

PSEN 29 (Programm Store Enable). Strobe-Signal<br />

zum Lesen des externen Programmspeichers.<br />

Beim Lesen aus diesem Speicher<br />

wird PSEN zweimal während e<strong>in</strong>es jeden<br />

Masch<strong>in</strong>enzyklus aktiviert, jedoch erfolgt<br />

beim Zugriff auf e<strong>in</strong>en externen Datenspeicher<br />

ke<strong>in</strong>e Aktivierung. Auch wird<br />

PSEN beim Lesen aus dem <strong>in</strong>ternen Programmspeicher<br />

nicht aktiviert.<br />

Tabelle 1.4:<br />

Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

Bezeichnung<br />

EA/U PP 31 A 0 (External Access). Wenn EA auf 1-Signal<br />

gehalten wird, liest die CPU aus dem<br />

<strong>in</strong>ternen Programmspeicher, es sei denn,<br />

der Programmzähler überschreitet den<br />

Wert 0FFFH (beim 8051). Hält man EA<br />

jedoch auf 0-Signal, so wird die CPU<br />

gezwungen, unabhängig vom Wert des<br />

Programmzählers aus dem externen Programmspeicher<br />

zu lesen. Beim 8031 muss<br />

EA durch externe Verdrahtung auf 0<br />

gebracht werden. Zum Programmieren<br />

des EPROM (8751) wird die Programmierspannung<br />

U PP = 21 V an diesen<br />

Anschluss gelegt.<br />

XTAL1 19 E 0 E<strong>in</strong>gang zum <strong>in</strong>vertierenden Verstärker<br />

des Taktgenerators<br />

XTAL2 18 A Ausgang vom <strong>in</strong>vertierenden Verstärker<br />

des Taktgenerators<br />

Tabelle 1.4:<br />

1.1.3 Bussysteme<br />

Drei Bussysteme verb<strong>in</strong>den die drei Funktionse<strong>in</strong>heiten Mikrocontroller, Speicher<br />

(RAM <strong>und</strong> ROM), sowie die E<strong>in</strong>-/Ausgabebaugruppen, wie Abbildung 1.2 zeigt.<br />

<br />

<br />

<br />

Anschluss<br />

E<strong>in</strong>- oder<br />

Ausgang<br />

Aktiv<br />

Funktion<br />

Anschlussbelegung der Mikrocontroller der Familie 8051 (Forts.)<br />

Datenbus: Acht Leitungen, auf denen die Daten zwischen Mikrocontroller,<br />

Speichere<strong>in</strong>heiten (RAM <strong>und</strong> EPROM) <strong>und</strong> I/O-E<strong>in</strong>heiten übertragen werden.<br />

Der Datenbus kann <strong>in</strong> beide Richtungen übertragen (Zweiweg-Datenübertragung).<br />

Adressbus: 16 Leitungen, über die bestimmte Speicherplätze oder E<strong>in</strong>-/Ausgabebaugruppen<br />

ausgewählt werden (E<strong>in</strong>weg-Datenübertragung), wobei acht<br />

komb<strong>in</strong>ierte Leitungen auf dem Datenbus vorhanden s<strong>in</strong>d. Aus diesem Gr<strong>und</strong>e<br />

ist der ALE-Ausgang (Adress Latch Enable) für die Zwischenspeicherung<br />

der Adressen notwendig.<br />

Steuerbus: Sechs Leitungen, die dem Prozessorzustand entsprechende Steuersignale<br />

übertragen (E<strong>in</strong>weg-Datenübertragung)<br />

Speicher werden nicht nur zur Aufbewahrung von Befehlen (Anweisungen) benötigt.<br />

Es können auch Daten anfallen, die zur Durchführung e<strong>in</strong>es Programms<br />

erforderlich s<strong>in</strong>d. Es werden zwei Arten von Daten unterschieden: Zum e<strong>in</strong>en gibt<br />

es Daten, deren Wert sich nicht ändert wie z.B. die Zahl = 3,141..., Zahlen dieser<br />

Art heißen Konstanten. Zum anderen gibt es Daten, deren Werte sich ändern können.<br />

Diese veränderbaren Daten s<strong>in</strong>d Variablen.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

35


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.2:<br />

Bussysteme <strong>in</strong> e<strong>in</strong>em Mikrocontroller<br />

Der gesamte Speicher kann sich aus unterschiedlichen Bauste<strong>in</strong>en <strong>und</strong> Technologien<br />

zusammensetzen. Zum Speichern von unveränderlichen Daten benutzt man<br />

Speicherbauste<strong>in</strong>e, deren Inhalt sich nach dem Programmieren nicht mehr verändern<br />

lässt. Damit geht nach dem Abschalten der Betriebsspannung auch der<br />

Inhalt dieser Speicher nicht mehr verloren. Der Inhalt solcher Speicher kann während<br />

des Betriebs nur gelesen, nicht aber überschrieben werden. Speicher dieser<br />

Art werden als Nur-Lese-Speicher, Festwertspeicher oder Festspeicher bezeichnet.<br />

Die gebräuchliche Abkürzung ist ROM (Read Only Memory).<br />

Als Arbeitsspeicher für variable Daten s<strong>in</strong>d Speicherbauste<strong>in</strong>e erforderlich, <strong>in</strong><br />

denen sich auch während des Betriebs die Daten noch ändern lassen. Solche Speicher<br />

nennt man Schreib-Lese-Speicher, abgekürzt RAM (Random Access<br />

Memory).<br />

ROM- <strong>und</strong> RAM-Bauste<strong>in</strong>e arbeiten mit wahlfreiem Zugriff, was bedeutet, dass<br />

die Speicherplätze <strong>in</strong> beliebiger Reihenfolge ansprechbar <strong>und</strong> gleich schnell<br />

erreichbar s<strong>in</strong>d.<br />

1.1.4 Programmierung <strong>in</strong> <strong>Assembler</strong>sprache<br />

In diesem Abschnitt erhalten Sie e<strong>in</strong>e kurze Beschreibung des Mikrocontrollers<br />

als Gr<strong>und</strong>lage für die Programmierung <strong>in</strong> <strong>Assembler</strong>sprache.<br />

36<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

Im 8051 s<strong>in</strong>d folgende wesentliche Teile <strong>in</strong>tegriert:<br />

<br />

<br />

<br />

Mehrere Arbeitsregister zur Durchführung der Operationen <strong>und</strong> zur Adressierung<br />

Der Befehlszähler, der die Adresse des nächsten auszuführenden Befehls enthält<br />

Der Stackpo<strong>in</strong>ter, dessen Inhalt die Anfangsadresse des Stacks im Rahmen des<br />

Arbeitsspeichers def<strong>in</strong>iert. Durch diesen Stack wird die Verwendung von Unterprogrammen<br />

<strong>und</strong> Unterbrechungsprogrammen (Interrupt-Subrout<strong>in</strong>en)<br />

besonders erleichtert.<br />

Zu diesen, auf dem Mikrocontroller <strong>in</strong>tegrierten Funktionse<strong>in</strong>heiten kommen<br />

noch folgende Teile, über die der Programmierer unbed<strong>in</strong>gt Bescheid wissen<br />

muss:<br />

<br />

<br />

<br />

Der Programmspeicher (aufgebaut mit ROMs, PROMs, EPROMs oder Flash),<br />

<strong>in</strong> dem das Anwendungsprogramm oder die Konstanten des Mikrocomputers<br />

abgespeichert s<strong>in</strong>d <strong>und</strong> der byteweise adressiert wird<br />

Der Datenspeicher, der mit RAMs aufgebaut ist (Schreib-Lese-Speicher), <strong>in</strong><br />

dem die Momentan-Ergebnisse bzw. Daten des Mikrocomputers abgespeichert<br />

s<strong>in</strong>d <strong>und</strong> der ebenfalls byteweise adressiert wird<br />

Die E<strong>in</strong>gabe-Ausgabesteuerung, die aus Bauste<strong>in</strong>en besteht, über die der Mikroprozessor<br />

mit se<strong>in</strong>er Umgebung <strong>in</strong> Kontakt steht<br />

Im Mikrocontroller stehen e<strong>in</strong> 8-Bit-Akkumulator <strong>und</strong> mehrere 8-Bit-Zwischenregister<br />

zur Verfügung. Diese acht Register werden über die Ziffern 0 bis 7 <strong>in</strong> e<strong>in</strong>er<br />

Speicherbank angesprochen. Die Registerpaaranordnung ist:<br />

<br />

<br />

<br />

Der Befehlszähler ist e<strong>in</strong> dem Programmierer zugängliches 16-Bit-Register,<br />

das die Adresse des nächsten auszuführenden Befehls enthält.<br />

Der Stack ist e<strong>in</strong> Teil des Arbeitsspeichers (RAM), der vom Programmierer def<strong>in</strong>iert<br />

wird. In ihm s<strong>in</strong>d Daten oder Adressen gespeichert, die gegebenenfalls<br />

durch Stackoperationen aufgef<strong>und</strong>en werden können. E<strong>in</strong>e Reihe der Befehle<br />

s<strong>in</strong>d <strong>in</strong> der Lage, auf diesen Stack zuzugreifen, <strong>und</strong> erleichtern somit das Arbeiten<br />

mit Unterprogrammen <strong>und</strong> Unterbrechungen (Interrupts). Das Stackpo<strong>in</strong>terregister<br />

erlaubt dem Programmierer den Zugriff auf die Adressen des<br />

Stacks.<br />

Verb<strong>in</strong>dung zur Außenwelt stellt im System der Mikrocontroller über se<strong>in</strong>e<br />

maximal 256 E<strong>in</strong>gabe- <strong>und</strong> 256 Ausgabeports (Port = Kanal) her. Jeder dieser<br />

Ports verkehrt mit dem Mikrocontroller über Datenbytes, die entweder den Akkumulator<br />

setzen oder von ihm gesetzt werden. Jedem dieser Ports ist e<strong>in</strong>e<br />

Zahl zwischen 0 <strong>und</strong> 255 zugeordnet. Auf diese Zuordnung hat der Programmierer<br />

ke<strong>in</strong>en E<strong>in</strong>fluss.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

37


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

E<strong>in</strong> Programm besteht aus e<strong>in</strong>er Reihe von Befehlen. Jeder Befehl löst e<strong>in</strong>e elementare<br />

Operation, wie e<strong>in</strong>e Datenübertragung, e<strong>in</strong>e arithmetische oder logische<br />

Operation mit e<strong>in</strong>em Datenbyte bzw. -wort, oder e<strong>in</strong>e Änderung der Reihenfolge<br />

der auszuführenden Befehle aus. E<strong>in</strong> Programm wird als e<strong>in</strong>e Reihe von Bits<br />

dargestellt, die die Befehle des Programms repräsentieren <strong>und</strong> die wir hier mit<br />

hexadezimalen Ziffern symbolisieren. Die Speicheradresse des nächsten, auszuführenden<br />

Befehls steht im Befehlszähler (Program Counter). Vor der Ausführung<br />

e<strong>in</strong>es Befehls wird der Befehlszähler um 1 erhöht <strong>und</strong> enthält so die Adresse<br />

des nächstfolgenden Befehls. Das Programm läuft pr<strong>in</strong>zipiell sequenziell ab, bis<br />

e<strong>in</strong> Sprungbefehl (Jump, Call oder Return) ausgeführt wird, wobei der Befehlszähler<br />

auf e<strong>in</strong>e vom l<strong>in</strong>earen Ablauf abweichende Adresse gesetzt wird. Das Programm<br />

wird von dieser neuen Speicheradresse an wieder sequenziell fortgesetzt.<br />

Der Inhalt e<strong>in</strong>es Speicherplatzes gibt im Pr<strong>in</strong>zip ke<strong>in</strong>en H<strong>in</strong>weis darauf, ob das<br />

betreffende Byte e<strong>in</strong>en Befehl oder Daten darstellt. So entspricht beispielsweise<br />

der Hexadezimalcode 1FH dem Befehl RAR (schiebe den Inhalt des Akkumulators<br />

nach rechts, zyklisch, mit Übertrag), was aber ebenso gut den Datenwert 1FH<br />

(dezimal 31) darstellen kann. Es ist aber wichtig, <strong>in</strong> e<strong>in</strong>em Programm sicherzustellen,<br />

dass Daten nicht als Befehle <strong>in</strong>terpretiert werden <strong>und</strong> durch Trennung von<br />

Programm <strong>und</strong> Datenspeicher kann dies e<strong>in</strong>fach erreicht werden.<br />

Jedes Programm hat e<strong>in</strong>e Anfangsadresse, die auf das erste Byte des ersten auszuführenden<br />

Befehls h<strong>in</strong>deutet. Bevor der erste Befehl ausgeführt wird, wird der<br />

Befehlszähler automatisch auf die Adresse des nächsten (auszuführenden)<br />

Befehls gesetzt. Diese Prozedur wird für jeden Befehl des Programms wiederholt.<br />

Zur Darstellung e<strong>in</strong>es Befehls s<strong>in</strong>d e<strong>in</strong>, zwei oder drei Bytes nötig. In jedem Fall<br />

wird der Befehlszähler automatisch auf den Beg<strong>in</strong>n des nächsten Befehls gesetzt,<br />

wie das Beispiel <strong>in</strong> Tabelle 1.5 zeigt.<br />

Zur Vermeidung von Fehlern muss der Programmierer sicherstellen, dass auf<br />

e<strong>in</strong>en Befehl nicht e<strong>in</strong> Datenbyte folgt, soweit nach diesem Befehl noch e<strong>in</strong> weiterer<br />

Befehl zu erwarten ist. So wird z.B. im Byte 021EH e<strong>in</strong> Befehl erwartet, weil<br />

Befehl Nr. 8 nach Befehl Nr. 7 ausgeführt werden muss. Enthält Byte 021EH<br />

Daten, so kann das Programm nicht richtig ablaufen. Aus diesem Gr<strong>und</strong> dürfen<br />

Daten auf ke<strong>in</strong>en Fall zwischen Befehlen abgespeichert werden.<br />

Programmsprungbefehle verursachen e<strong>in</strong>en Sprung zu e<strong>in</strong>em Befehl, der an<br />

irgende<strong>in</strong>er Stelle im Speicher liegen kann. Die durch den Sprungbefehl angesprochene<br />

Adresse muss wiederum die Adresse e<strong>in</strong>es Befehls se<strong>in</strong>. Es muss also<br />

auch hier sichergestellt werden, dass das adressierte Byte ke<strong>in</strong>e Daten enthält, weil<br />

sonst das Programm nicht richtig ausgeführt werden kann.<br />

38<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

Speicheradresse Befehls-Nr. Inhalt des Befehlszählers<br />

0212 1 0213<br />

0213 2 0215<br />

0214<br />

0215 3 0216<br />

0216 4 0219<br />

0217<br />

0218<br />

0219 5 021B<br />

021A<br />

021B 6 021C<br />

021C 7 021F<br />

021D<br />

021E<br />

021F 8 0220<br />

0220 9 0221<br />

0221 10 0222<br />

Tabelle 1.5: Beispiel zum Setzen des Befehlszählers<br />

1.1.5 Speicheradressierung<br />

Die Adressierung ist e<strong>in</strong> besonders wesentlicher Teil beim Aufbau e<strong>in</strong>es Programms.<br />

Der Mikrocontroller bietet mehrere Möglichkeiten zur Adressierung:<br />

<br />

Bei der direkten Adressierung liefert der Befehl »explizit« e<strong>in</strong>e Speicheradresse.<br />

Der Befehl »lade den Inhalt der Speicheradresse 1F2A <strong>in</strong> den Akkumulator«<br />

ist e<strong>in</strong> Beispiel für den Befehl mit direkter Adressierung, wobei 1F2A die<br />

direkte Adresse ist. Im Speicher wird das folgendermaßen aussehen:<br />

Speicheradresse<br />

n<br />

3A<br />

n + 1 2A auszuführender Befehl<br />

n + 2<br />

1F<br />

Durch den Befehl werden drei Bytes im Speicher belegt, von denen das zweite<br />

<strong>und</strong> dritte direkt die Adresse enthält.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

39


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

<br />

Die Speicheradresse kann auch durch den Inhalt e<strong>in</strong>es Registerpaares spezifiziert<br />

se<strong>in</strong>.<br />

Für fast alle Befehle müssen hierbei die <strong>in</strong>ternen Register verwendet werden.<br />

E<strong>in</strong> E<strong>in</strong>bytebefehl, der den Akkumulator mit dem Inhalt der Speicheradresse<br />

1F2A lädt, sieht folgendermaßen aus:<br />

Speicher<br />

Register<br />

B<br />

Auszuführender Befehl 7E C<br />

Außerdem gibt es zwei Befehle, die das Register zur Adressierung verwenden. Wie<br />

oben erwähnt, enthält das erste Register des Paares die höherwertigen <strong>und</strong> das<br />

zweite Register die niederwertigen Stellen der Adresse.<br />

1F<br />

2A<br />

D<br />

E<br />

H<br />

L<br />

A<br />

<br />

<br />

Jeder beliebige Speicherplatz kann auch über den 16-Bit-Stackpo<strong>in</strong>ter adressiert<br />

werden. Es gibt nur zwei verschiedene Stackoperationen: das E<strong>in</strong>geben<br />

der Daten <strong>in</strong> den Stack, das als PUSH, <strong>und</strong> das Auslesen von Daten aus dem<br />

Stack, das als POP bezeichnet wird. Voraussetzung für die Operation PUSH ist<br />

selbstverständlich, dass sich der Stack <strong>in</strong> e<strong>in</strong>em RAM bef<strong>in</strong>det, da ja sonst ke<strong>in</strong><br />

E<strong>in</strong>schreiben <strong>in</strong> den Speicher durchgeführt werden kann.<br />

Durch jede PUSH-Operation werden 16 Datenbits aus e<strong>in</strong>em Registerpaar<br />

oder vom Befehlszähler <strong>in</strong> den Stack gebracht. Die Adresse des Speicherbereichs,<br />

auf den während des PUSH-Befehls zugegriffen wird, bestimmt man<br />

durch den Stackpo<strong>in</strong>ter <strong>in</strong> folgender Weise:<br />

die höchstwertigen acht Datenbits werden auf dem Speicherplatz abgespeichert,<br />

der durch den Stackpo<strong>in</strong>ter m<strong>in</strong>us 1 adressiert ist,<br />

die niedrigstwertigen acht Datenbits werden auf dem Speicherplatz abgespeichert,<br />

der durch den Stackpo<strong>in</strong>ter m<strong>in</strong>us 2 adressiert wird,<br />

der Inhalt des Stackpo<strong>in</strong>ters wird automatisch um 2 verr<strong>in</strong>gert.<br />

Im nachfolgenden Beispiel s<strong>in</strong>d die Verhältnisse für den Fall dargestellt, dass<br />

der Stackpo<strong>in</strong>ter 13A6H enthält, während das Register B6AH <strong>und</strong> das Register<br />

030H enthält:<br />

40<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

vor PUSH-Befehl Speicheradresse nach PUSH-Befehl<br />

SP FF 13A3 FF SP<br />

13A6 FF 13A4 30 13A4<br />

B FF 13A5 6A B<br />

6A FF 13A6 FF 6A<br />

C<br />

C<br />

30 30<br />

<br />

Durch jede POP-Operation werden acht Datenbits vom Stack <strong>in</strong> e<strong>in</strong> Registerpaar<br />

oder <strong>in</strong> den Befehlszähler gebracht. Die Speicheradresse, auf die durch die<br />

POP-Operation zugegriffen wird, wird durch folgende Verwendung des Stackpo<strong>in</strong>ters<br />

bestimmt:<br />

1) Das zweite Register oder die niedrigstwertigen acht Bits des Befehlszählers<br />

werden mit dem Inhalt der Speicherstelle geladen, auf die der Stackpo<strong>in</strong>ter<br />

zeigt.<br />

2) Das erste Register des Paares oder die höchstwertigen acht Bits des Befehlszählers<br />

werden mit dem Inhalt der Speicherstelle geladen, die durch den Stackpo<strong>in</strong>ter<br />

+1 adressiert wird.<br />

3) Der Stackpo<strong>in</strong>ter wird automatisch um 2 erhöht.<br />

Im folgenden Beispiel soll angenommen werden, dass der Stackpo<strong>in</strong>ter 1508H<br />

(Speicherstelle 1508H) den Wert 33H enthält <strong>und</strong> die Speicherstelle 1509H<br />

den Wert 0BH be<strong>in</strong>halten soll. E<strong>in</strong>e POP-Operation <strong>in</strong> das Registerpaar H<br />

würde folgendermaßen aussehen:<br />

vor POP-Befehl Speicheradresse nach POP-Befehl<br />

SP FF 1507 FF SP<br />

1508 33 1508 33 150A<br />

H 0B 1509 0B H<br />

FF FF 150A FF 0B<br />

L<br />

L<br />

FF 33<br />

Der Programmierer bestimmt den Wert des Stackpo<strong>in</strong>ters. Die Def<strong>in</strong>ition des<br />

Stackpo<strong>in</strong>ter-Inhalts vor irgende<strong>in</strong>er Stackoperation ist nötig, um e<strong>in</strong>e richtige<br />

Funktion des Programms zu gewährleisten.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

41


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Bei unmittelbarer Adressierung enthält der Befehl e<strong>in</strong>e Konstante. Der Befehl<br />

MOV A, 2AH »Lade den Akkumulator mit dem Wert 2AH« ist e<strong>in</strong> Beispiel für e<strong>in</strong>e<br />

solche unmittelbare Adressierung. Im Speicher hat dieser Befehl folgendes<br />

Aussehen:<br />

Speicher<strong>in</strong>halt<br />

3E Lade Akkumulator unmittelbar<br />

2A In den Akkumulator zu ladender Wert<br />

1.1.6 Unterprogramme <strong>und</strong> die Verwendung des Stacks<br />

für die Adressierung<br />

Zunächst soll kurz der Begriff »Unterprogramm« erläutert werden. Als Beispiel<br />

wollen wir die häufig nötige Operation des Multiplizierens verwenden. Der Mikrocontroller<br />

soll über ke<strong>in</strong>en Befehl für e<strong>in</strong>e Multiplikation verfügen, bietet aber die<br />

Möglichkeit, e<strong>in</strong> Byte zu e<strong>in</strong>em anderen zu addieren. Man könnte daher e<strong>in</strong>e<br />

Multiplikation ausführen, <strong>in</strong>dem man derartige Additionen mehrere Male h<strong>in</strong>tere<strong>in</strong>ander<br />

(je nach Größe des Multiplikators) ausführt. Will man e<strong>in</strong>e Multiplikation<br />

an mehreren Stellen des Programms durchführen, so müsste man an jeder<br />

dieser Stellen die ganze Reihe der eben genannten Befehle e<strong>in</strong>fügen. Dazu wäre<br />

natürlich sehr viel Speicherplatz nötig:<br />

Programm<br />

Multiplikationsrout<strong>in</strong>e<br />

Programm<br />

Multiplikationsrout<strong>in</strong>e<br />

Programm<br />

Multiplikationsrout<strong>in</strong>e<br />

usw.<br />

Da das Unterprogramm für Multiplikation immer gleich bleibt, ist es eigentlich<br />

überflüssig, es jedes Mal e<strong>in</strong>zufügen. Es ist viel besser, es nur abzuspeichern <strong>und</strong><br />

jedes Mal auszuführen, wenn es benötigt wird:<br />

Programm<br />

Programm<br />

Programm<br />

Multiplikationsrout<strong>in</strong>e<br />

42<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

E<strong>in</strong>e solche Rout<strong>in</strong>e nennt man e<strong>in</strong> Unterprogramm. Der Mikrocontroller bietet die<br />

Möglichkeit zum Aufruf von Unterprogrammen <strong>und</strong> zum Rücksprung <strong>in</strong> das<br />

Hauptprogramm. Im E<strong>in</strong>zelnen sieht der Programmablauf unter Verwendung<br />

von Unterprogrammen folgendermaßen aus:<br />

Hauptprogramm<br />

<br />

Aufrufbefehl<br />

nächster Befehl<br />

Unterprogramm<br />

<br />

(Pfeile bezeichnen Reihenfolge der Ausführung)<br />

Hierbei wird also während der Ausführung des Aufrufbefehls (z.B. CALL) die<br />

Adresse des folgenden Befehls (das ist der Inhalt des Befehlszählers) <strong>in</strong> den Stack<br />

gebracht <strong>und</strong> das Unterprogramm ausgeführt. Der letzte Befehl e<strong>in</strong>es Unterprogramms<br />

ist gewöhnlich e<strong>in</strong> Rücksprungbefehl (z.B. RET), der e<strong>in</strong>e Adresse vom<br />

Stack holt <strong>und</strong> <strong>in</strong> den Befehlszähler e<strong>in</strong>schreibt. Dadurch wird das Hauptprogramm<br />

bei dem auf den Aufrufbefehl folgenden Befehl fortgesetzt. Unterprogramme<br />

können beliebig geschachtelt se<strong>in</strong>. Die e<strong>in</strong>zige Grenze hierfür bildet der<br />

Speicherplatz, der für den Stack zur Verfügung steht. Dabei ist der Rückweg aus<br />

der Verschachtelung identisch mit der Reihenfolge der Aufrufe, auch wenn das<br />

Unterprogramm mehrmals aufgerufen wird.<br />

1.1.7 Register des Mikrocontrollers 8051<br />

Der Mikrocontroller 8051 verfügt über getrennte Adressierbereiche für den Programmspeicher<br />

<strong>und</strong> den Datenspeicher. Der externe Programmspeicher kann bis<br />

zu 64 Kbyte umfassen. Außerdem bef<strong>in</strong>den sich im ROM auf dem Chip des 8051<br />

weitere 4 Kbyte. Der Datenspeicher besteht aus e<strong>in</strong>em auf dem Chip bef<strong>in</strong>dlichen<br />

RAM von 128 Bytes. In e<strong>in</strong>em weiteren Adressierbereich von 128 Bytes s<strong>in</strong>d nur 21<br />

Bytes mit speziellen Funktionsregistern belegt. Außerdem kann die Schaltung auf<br />

bis zu 64 Kbyte e<strong>in</strong>es externen Datenspeichers zugreifen. Abbildung 1.4 zeigt die<br />

Blockschaltung des 8051.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

43


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.3: Blockschaltung des Mikrocontrollers 8051<br />

In Tabelle 1.6 s<strong>in</strong>d die 21 speziellen Funktionsregister mit ihren Kurzbezeichnungen<br />

sowie Speicherplätzen aufgeführt <strong>und</strong> anschließend kurz beschrieben. Die<br />

44<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

mit e<strong>in</strong>em Stern versehenen Register s<strong>in</strong>d sowohl byte- als auch bitadressierbar<br />

(11 Register mit Adressen, die durch 8 ohne Rest teilbar s<strong>in</strong>d).<br />

Kurzbezeichnung Register<br />

Adresse<br />

(für <strong>Assembler</strong>)<br />

Dezimal Hexadezimal<br />

ACC*) Akkumulator 224 E0<br />

B*) Register B 240 F0<br />

PSW*) Programmstatuswort 208 D0<br />

SP Stackpo<strong>in</strong>ter 129 81<br />

DPH Datenzeiger (DPTR) oberes Byte 131 83<br />

DPL Datenzeiger (DPTR) unteres Byte 130 82<br />

P0*) Port 0 128 80<br />

P1*) Port l 144 90<br />

P2*) Port 2 160 A0<br />

P3*) Port 3 176 B0<br />

IP*) Interrupt-Prioritätenregister 184 B8<br />

IE*) Interrupt-Freigaberegister 168 A8<br />

TMOD Zeitgeber/Zähler-Betriebsart-Register 137 89<br />

TCON*) Zeitgeber/Zähler-Steuerregister 136 88<br />

TH0 Zeitgeber/Zähler 0 (oberes Byte) 140 8C<br />

TL0 Zeitgeber/Zähler 0 (unteres Byte) 138 8A<br />

TH1 Zeitgeber/Zähler 1 (oberes Byte) 141 8D<br />

TL1 Zeitgeber/Zähler 1 (unteres Byte) 139 8B<br />

SCON*) serielles Steuerregister 152 98<br />

SBUF serieller Datenpuffer 153 99<br />

PCON Leistungsaufnahme-Steuerregister 135 87<br />

Tabelle 1.6: Spezielles Funktionsregister des 8051<br />

*): auch bitadressierbar<br />

Akkumulator (Register A): Das Register ACC ist der Akkumulator. In den mnemonischen<br />

Kurzbezeichnungen, die für Befehle mit Bezug auf den Akkumulator verwendet<br />

werden, wird der Akkumulator nur mit A bezeichnet.<br />

Register B: Das Register B wird beim Multiplizieren <strong>und</strong> Dividieren benötigt. Bei<br />

der Abarbeitung anderer Befehle kann es als weiterer schneller Hilfsspeicher dienen.<br />

Programmstatusregister: Das Programmstatusregister (PSW) enthält das <strong>in</strong> Tabelle<br />

1.7 beschriebene Programmstatuswort.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

45


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

CY AC F0 RS1 RS0 CV – P<br />

Symbol Bit-Speicherstelle Name <strong>und</strong> Bedeutung<br />

CY PSW.7 Übertragsbit<br />

AC PSW.6 Hilfsübertragsbit (für BCD-Operationen)<br />

F0 PSW.5 Kennzeichnungsbit 0 (steht dem Anwender für allgeme<strong>in</strong>e<br />

Zwecke zur Verfügung)<br />

RS1 PSW.4 Registerbank-Auswahlbits 1 bzw. 0. Werden durch<br />

RS0 PSW.3<br />

Software gesetzt oder gelöscht, um die Registerbank<br />

{<br />

auszuwählen, <strong>in</strong> der gearbeitet werden soll. *)<br />

OV PSW.2 Überlaufbit<br />

– PSW.1 <strong>in</strong> Reserve<br />

P PSW.0 Paritätsbit. Wird durch Hardware bei jedem Befehlszyklus<br />

gesetzt bzw. gelöscht, um e<strong>in</strong>e ungerade bzw.<br />

gerade Anzahl von E<strong>in</strong>sen im Akkumulator anzuzeigen<br />

(d.h. gerade Parität).<br />

*)Durch RS1 <strong>und</strong> RS0 wird diese Registerbank wie folgt festgelegt:<br />

RS1 RS0 Bank Speicherplätze<br />

0 0 0 00H bis 07H<br />

0 1 1 08H bis 0FH<br />

1 0 2 10H bis 17H<br />

1 1 3 18H bis 1FH<br />

Tabelle 1.7:<br />

Programmstatusregister<br />

Der Mikrocontroller hat fünf verschiedene Bed<strong>in</strong>gungsbits zur Verfügung, um das<br />

Resultat von Operationen zu kennzeichnen. Alle bis auf e<strong>in</strong>es (das Hilfs-Carrybit)<br />

können durch Befehle getestet werden, die den nachfolgenden Befehlsablauf<br />

bestimmen. An dieser Stelle wird vere<strong>in</strong>bart, dass e<strong>in</strong> Bit »gesetzt« ist, wenn es<br />

den Wert »1« hat, <strong>und</strong> »rückgesetzt« ist, wenn es den Wert »0« hat.<br />

<br />

Carrybit (Überlaufbit oder Übertragsbit): Das Carrybit CY wird durch verschiedene<br />

Befehle gesetzt <strong>und</strong> kann direkt abgefragt werden. Die Operationen, die<br />

das Carrybit verändern, s<strong>in</strong>d Addition, Subtraktion, zyklisches Schieben <strong>und</strong><br />

logische Operationen. So kann z.B. die Addition von zwei 1-Byte-Zahlen e<strong>in</strong>en<br />

Überlauf (Carry) an der höchsten Stelle hervorrufen.<br />

46<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.1<br />

E<strong>in</strong>führung<br />

Bit-Nr. 7 6 5 4 3 2 1 0<br />

AE = 1 0 1 0 1 1 1 0<br />

+74 = 0 1 1 1 0 1 0 0<br />

122 0 0 1 0 0 0 1 0<br />

Überlauf = 1, setzt Carrybit = 1<br />

<br />

E<strong>in</strong>e Addition mit Überlauf an der höchsten Stelle setzt das Carrybit. E<strong>in</strong>e<br />

Addition ohne Überlauf setzt das Carrybit zurück. Hier soll noch eigens darauf<br />

h<strong>in</strong>gewiesen werden, dass Addition, Subtraktion, zyklisches Schieben <strong>und</strong> logische<br />

Befehle das Carrybit <strong>in</strong> verschiedenartiger Weise behandeln.<br />

Hilfs-Carrybit (Hilfsüberlaufbit oder Hilfsübertragsbit): Das Hilfs-Carrybit AC<br />

zeigt den Überlauf aus dem ersten Halbbyte (Bit 3 des Datenbytes) an. Der<br />

Wert dieses Bits kann nicht direkt getestet werden, bee<strong>in</strong>flusst aber die Funktion<br />

des Befehls DAA.<br />

Die folgende Addition setzt das Hilfs-Carrybit <strong>und</strong> das Carrybit zurück:<br />

Bit-Nr. 7 6 5 4 3 2 1 0<br />

2E = 0 0 1 0 1 1 1 0<br />

+74 = 0 1 1 1 0 1 0 0<br />

A2 1 0 1 0 0 0 1 0<br />

Carrybit = 0 Hilfs-Carrybit = 1<br />

<br />

<br />

Das Hilfs-Carrybit wird durch Additions-, Subtraktions-, Inkrement-, Dekrement-<br />

<strong>und</strong> Vergleichsbefehle verändert.<br />

Signbit (Vorzeichenbit): Im Mikroprozessor ist gr<strong>und</strong>sätzlich ke<strong>in</strong> Vorzeichen<br />

e<strong>in</strong>es Datenbytes festgelegt; man kann daher e<strong>in</strong> Byte mit dem numerischen<br />

Wert 128 als plus 128 oder aber auch als m<strong>in</strong>us 128 <strong>in</strong>terpretieren. Zur Unterscheidung<br />

der beiden Möglichkeiten verwendet man das Bit 7 als Vorzeichen.<br />

Hat es den Wert 1, so wird die Zahl im Byte als negativ angesehen (von m<strong>in</strong>us 1<br />

bis m<strong>in</strong>us 128), hat Bit 7 den Wert 0, so wird die Zahl des Bytes als positive<br />

Zahl (von 0 bis plus 127) <strong>in</strong>terpretiert.<br />

Bei arithmetischen <strong>und</strong> logischen Operationen wird das Signbit dem Bit 7 des<br />

Ergebnisses gleichgesetzt; es kann dann als Bed<strong>in</strong>gungsbit abgefragt werden.<br />

Zerobit (Nullbit): Dieses Bed<strong>in</strong>gungsbit wird dann gesetzt, wenn das Ergebnis<br />

e<strong>in</strong>es arithmetischen oder logischen Befehls null ist. Das Zerobit wird rückgesetzt,<br />

wenn das Ergebnis dieses Befehls ungleich null ist.<br />

Ist das Ergebnis gleich null <strong>und</strong> das Carrybit gesetzt, so wird das Zerobit ebenfalls<br />

gesetzt.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

47


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Bit-Nr. 7 6 5 4 3 2 1 0<br />

1 0 1 0 0 1 1 1<br />

0 1 0 1 1 0 0 1<br />

1 0 0 0 0 0 0 0 0<br />

Überlauf<br />

von Bit 7<br />

<br />

Nullergebnis:<br />

Zerobit auf 1 gesetzt<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Paritybit (Paritätsbit): Nach arithmetischen <strong>und</strong> logischen Operationen wird e<strong>in</strong>e<br />

Paritätsprüfung vorgenommen. Die Anzahl der gesetzten Bits <strong>in</strong> e<strong>in</strong>em Byte<br />

wird dabei gezählt; ist das Ergebnis ungerade, wird das Paritybit zurückgesetzt,<br />

ist das Ergebnis gerade, wird das Paritybit gesetzt.<br />

Stackpo<strong>in</strong>ter: Der acht Bit breite Stackpo<strong>in</strong>ter (SP) wird <strong>in</strong>krementiert, bevor<br />

Daten während der Ausführung e<strong>in</strong>es PUSH- oder CALL-Befehls gespeichert<br />

werden. Während der Stack im Allgeme<strong>in</strong>en irgendwo im RAM (auf dem Chip)<br />

untergebracht se<strong>in</strong> kann, zeigt der Stackpo<strong>in</strong>ter nach e<strong>in</strong>em Rücksetzvorgang<br />

auf den Speicherplatz 07H. Dies veranlasst den Stackpo<strong>in</strong>ter, mit Speicherplatz<br />

08H zu starten.<br />

Datenzeiger: Der 16-Bit-Datenzeiger (DPTR) besteht aus den Registern DPH<br />

(oberes Byte) <strong>und</strong> DPL (unteres Byte). Er enthält e<strong>in</strong>e 16-Bit-Adresse <strong>und</strong> kann<br />

entweder als 16-Bit-Register oder als zwei unabhängige 8-Bit-Register arbeiten.<br />

Ports 0 bis 3: Die speziellen Funktionsregister P0, P1, P2 <strong>und</strong> P3 s<strong>in</strong>d die Zwischenspeicher.<br />

Zeitgeber-Register: Die Registerpaare TH0 <strong>und</strong> TL0 sowie TH1 <strong>und</strong> TL1 s<strong>in</strong>d<br />

16-Bit-Zählregister für die Zeitgeber/Zähler 0 bzw. 1.<br />

Serieller Datenpuffer: Der serielle Datenpuffer (SBUF) besteht eigentlich aus<br />

zwei separaten Registern, nämlich e<strong>in</strong>em Sende- <strong>und</strong> e<strong>in</strong>em Empfangspufferregister.<br />

Wenn Daten nach SBUF transportiert werden, so erfolgt dies <strong>in</strong> das<br />

Sendepufferregister; der Transport e<strong>in</strong>es Bytes nach SBUF löst dann die Übertragung<br />

<strong>in</strong> e<strong>in</strong>e externe E<strong>in</strong>heit aus. Werden Daten von SBUF geholt (von e<strong>in</strong>er<br />

E<strong>in</strong>heit auf dem Chip), so kommen sie aus dem Empfangspufferregister.<br />

Steuerregister: Die speziellen Funktionsregister IP, IE, TMOD, TCON, SCON<br />

<strong>und</strong> PCON enthalten Steuer- <strong>und</strong> Statusbits für das Interrupt-System, die Zeitgeber/Zähler<br />

<strong>und</strong> den seriellen Port. Sie werden <strong>in</strong> späteren Abschnitten beschrieben.<br />

1.2 Oszillator- <strong>und</strong> Taktgeberschaltung<br />

XTAL1 <strong>und</strong> XTAL2 s<strong>in</strong>d der E<strong>in</strong>gang <strong>und</strong> Ausgang e<strong>in</strong>es e<strong>in</strong>stufigen, auf dem<br />

Chip bef<strong>in</strong>dlichen Inverters, der zusammen mit externen Bauelementen (Abbildung<br />

1.4a) zur so genannten Pierce-Schaltung (Abbildung 1.4b) aufgebaut wird.<br />

48<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.2<br />

Oszillator- <strong>und</strong> Taktgeberschaltung<br />

Die Schaltung auf dem Chip sowie die Auswahl der externen Bauelemente zum<br />

Aufbau des Oszillators werden <strong>in</strong> den folgenden Abschnitten sowohl für die<br />

NMOS- als auch für die CMOS-Version des Mikrocontrollers beschrieben.<br />

Abb. 1.4:<br />

a: Beschaltung der Anschlüsse XTAL1 <strong>und</strong> XTAL2 mit e<strong>in</strong>em Quarz oder e<strong>in</strong>em<br />

keramischen Resonator sowie zwei Kondensatoren. Man achte auf kurze, direkte<br />

Masseverb<strong>in</strong>dung zwischen Mikrocontroller <strong>und</strong> Kondensatorfußpunkten.<br />

b: Pr<strong>in</strong>zip des Pierce-Oszillators<br />

In jedem Fall treibt der Oszillator den <strong>in</strong>ternen Taktgenerator. Dieser liefert die<br />

<strong>in</strong>ternen Taktsignale für die auf dem Chip bef<strong>in</strong>dlichen Schaltungen. Die Frequenz<br />

der <strong>in</strong>ternen Taktsignale beträgt die Hälfte der Oszillatorfrequenz <strong>und</strong> legt<br />

die <strong>in</strong>ternen Phasen, Schritte <strong>und</strong> Masch<strong>in</strong>enzyklen fest, die später noch beschrieben<br />

werden.<br />

Wie bei der NMOS-Version besteht auch die auf dem Chip des 80C51 bef<strong>in</strong>dliche<br />

Oszillatorschaltung (Abbildung 1.5) aus e<strong>in</strong>em e<strong>in</strong>stufigen l<strong>in</strong>earen Inverter, der<br />

zum Betrieb als quarzgesteuerter Oszillator mit positiver Reaktanz vorgesehen ist.<br />

Dennoch s<strong>in</strong>d e<strong>in</strong>ige wichtige Unterschiede vorhanden.<br />

E<strong>in</strong>er der Unterschiede besteht dar<strong>in</strong>, dass der Oszillator mittels Software abgeschaltet<br />

werden kann, <strong>in</strong>dem e<strong>in</strong> 1-Signal <strong>in</strong> das Bit PD im speziellen Funktionsregister<br />

PCON geschrieben wird. E<strong>in</strong> weiterer Unterschied ist durch die Tatsache<br />

gegeben, dass die <strong>in</strong>terne Taktschaltung des 80C51 durch Signale am Anschluss<br />

XTAL1 betrieben wird, während dies bei der NMOS-Version am Anschluss XTAL2<br />

erfolgt.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

49


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.5:<br />

Oszillatorschaltung auf dem Chip des Mikrocontrollers 80C51 (CMOS-Version)<br />

Der Rückkopplungswiderstand R f setzt sich aus parallel geschalteten n-Kanal- <strong>und</strong><br />

p-Kanal-Feldeffekttransistoren zusammen, die durch das Bit PD gesteuert werden,<br />

<strong>und</strong> zwar ist R f abgeschaltet, wenn PD = 1 ist. Die Dioden D l <strong>und</strong> D 2 , die als<br />

Klemmdioden für U CC (+5 V) <strong>und</strong> U SS (0 V) dienen, s<strong>in</strong>d parasitär zu dem aus<br />

Feldeffekttransistoren bestehenden Widerstand R f .<br />

Abb. 1.6:<br />

Funktionale Darstellung der Oszillatorschaltung auf dem Chip des 80C51 (CMOS-<br />

Version) im Zusammenspiel mit der äußeren Beschaltung<br />

50<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.2<br />

Oszillator- <strong>und</strong> Taktgeberschaltung<br />

Der Oszillator kann mit denselben externen Bauelementen wie die NMOS-Version<br />

aufgebaut werden, wie auch Abbildung 1.6 zeigt. Typische Werte s<strong>in</strong>d C 1 = C 2<br />

= 30 pF, wenn e<strong>in</strong> Quarz e<strong>in</strong>gesetzt wird, <strong>und</strong> C 1 = C 2 = 47 pF bei Verwendung<br />

e<strong>in</strong>es keramischen Resonators.<br />

Abb. 1.7:<br />

Anschluss e<strong>in</strong>es externen Taktgenerators an den 80C51 (CMOS-Version)<br />

Beim Betrieb der CMOS-Version (Abbildung 1.7) mit e<strong>in</strong>em externen Taktgenerator<br />

wird das externe Taktsignal an den Anschluss XTAL1 gelegt, während XTAL2<br />

unbeschaltet bleibt.<br />

E<strong>in</strong> Masch<strong>in</strong>enzyklus besteht aus sechs Schritten (zwölf Oszillatorperioden). Jeder<br />

Schritt wird e<strong>in</strong>geteilt <strong>in</strong> e<strong>in</strong>e Hälfte für Phase 1, während der Takt von Phase 1<br />

aktiv ist, <strong>und</strong> <strong>in</strong> e<strong>in</strong>e Hälfte für Phase 2, während der Takt von Phase 2 aktiv ist.<br />

Somit besteht e<strong>in</strong> Masch<strong>in</strong>enzyklus aus zwölf Oszillatorperioden. Jede Phase dauert<br />

e<strong>in</strong>e Oszillatorperiode, jeder Schritt zwei Oszillatorperioden. Im Allgeme<strong>in</strong>en<br />

f<strong>in</strong>den arithmetische <strong>und</strong> logische Operationen während Phase 1 statt, <strong>in</strong>terner<br />

Datentransfer (von e<strong>in</strong>em Register zum anderen) dagegen während Phase 2.<br />

Die Ausführung e<strong>in</strong>es 1-Zyklus-Befehls beg<strong>in</strong>nt, wenn der Befehlscode im<br />

Befehlsregister zwischengespeichert wird. Handelt es sich um e<strong>in</strong>en 2-Byte-<br />

Befehl, so wird das zweite Byte während desselben Masch<strong>in</strong>enzyklus gelesen.<br />

Handelt es sich dagegen um e<strong>in</strong>en 1-Byte-Befehl, so f<strong>in</strong>det zwar e<strong>in</strong> Speichervorgang<br />

statt, aber das gelesene Byte (nämlich der nächste Befehlscode) wird nicht<br />

beachtet <strong>und</strong> der Programmzähler nicht <strong>in</strong>krementiert.<br />

Die meisten Befehle des 8051 werden <strong>in</strong> e<strong>in</strong>em Zyklus ausgeführt. MUL (Multiplizieren)<br />

<strong>und</strong> DIV (Dividieren) s<strong>in</strong>d die e<strong>in</strong>zigen Befehle, die zur vollständigen Ausführung<br />

mehr als zwei Zyklen, nämlich vier, benötigen.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

51


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Im Allgeme<strong>in</strong>en werden während e<strong>in</strong>es Masch<strong>in</strong>enzyklus zwei Befehlscode-Bytes<br />

aus dem Programmspeicher geholt. Die e<strong>in</strong>zige Ausnahme hiervon besteht <strong>in</strong> der<br />

Ausführung e<strong>in</strong>es MOVX-Befehls. Bei diesem handelt es sich um e<strong>in</strong>en 1-Byte-2-<br />

Zyklen-Befehl, der auf den externen Datenspeicher zugreift. Dabei werden zwei<br />

Holvorgänge übersprungen, während der externe Datenspeicher adressiert <strong>und</strong><br />

abgefragt wird.<br />

1.3 Aufbau <strong>und</strong> Betrieb der Ports<br />

Alle vier Ports des 8051 können bidirektional betrieben werden. Port 0 erlaubt den<br />

Tristate-Zustand (»echter« bidirektionaler Port), während dies bei den Ports 1–3<br />

mit ihren <strong>in</strong>ternen Pull-up-Widerständen nicht der Fall ist (»quasi«-bidirektionale<br />

Ports). Jedem Port (Port 0–3) s<strong>in</strong>d acht Bit-Zwischenspeicher zugeordnet, die<br />

jeweils e<strong>in</strong> spezielles Funktionsregister (SFR) bilden. Für jeden Portanschluss gibt<br />

es e<strong>in</strong>en Ausgangstreiber <strong>und</strong> e<strong>in</strong>en E<strong>in</strong>gangspuffer.<br />

1.3.1 E<strong>in</strong>gangspuffer <strong>und</strong> Ausgangstreiber<br />

Die Ausgangstreiber von Port 0 <strong>und</strong> Port 2 sowie der E<strong>in</strong>gangspuffer von Port 0<br />

werden beim Zugriff auf den externen Speicher verwendet. Bei dieser Anwendung<br />

gibt Port 0 das untere Byte der externen Speicheradresse aus, im Zeitmultiplex mit<br />

dem zu schreibenden oder zu lesenden Byte. Port 2 gibt das obere Byte der externen<br />

Speicheradresse aus, wenn diese 16 Bit breit ist. Andernfalls geben die<br />

Anschlüsse an Port 2 auch weiterh<strong>in</strong> den Inhalt des speziellen Funktionsregisters<br />

P2 aus. Die Anschlüsse von Port 3 haben auch noch alternative Funktionen, wie<br />

aus Tabelle 1.8 zu ersehen ist.<br />

Portanschluss<br />

Alternative Funktionen<br />

P3.0 RXD (serieller Port, E<strong>in</strong>gang)<br />

P3.1 TXD (serieller Port, Ausgang)<br />

P3.2 INT0 (externer Interrupt)<br />

P3.3 INT1 (externer Interrupt)<br />

P3.4 T0 (Zeitgeber/Zähler 0, externer E<strong>in</strong>gang)<br />

P3.5 T1 (Zeitgeber/Zähler 1, externer E<strong>in</strong>gang)<br />

P3.6 WR (Strobe-Signal zum Schreiben <strong>in</strong> den externen Datenspeicher)<br />

P3.7 RD (Strobe-Signal zum Lesen aus dem externen Datenspeicher)<br />

Tabelle 1.8: Alternative Funktionen der Anschlüsse von Port 3<br />

Die alternative Funktion e<strong>in</strong>es Portanschlusses kann nur dann aktiviert werden,<br />

wenn der entsprechende Bit-Zwischenspeicher im speziellen Funktionsregister<br />

P3 e<strong>in</strong>e E<strong>in</strong>s enthält. Andernfalls bleibt der Portanschluss auf null stehen.<br />

52<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Tabelle 1.9 zeigt die Bitadressen im Registerspeicher:<br />

Adresse Funktion<br />

80H Port 0, Bit 0<br />

81H Port 0, Bit 1<br />

82H Port 0, Bit 2<br />

83H Port 0, Bit 3<br />

84H Port 0, Bit 4<br />

85H Port 0, Bit 5<br />

86H Port 0, Bit 6<br />

87H Port 0, Bit 7<br />

88H Timer 0,Interrupt, Type-Kontroll-Bit<br />

89H Timer 0, Interrupt, Edge-Flag<br />

8AH Timer 1, Interrupt, Type-Kontroll-Bit<br />

8BH Timer 1, Interrupt, Edge-Flag<br />

8CH Timer 0, Run Kontroll-Bit<br />

8DH Timer 0, Overflow-Flag<br />

8EH Timer 1, Run Kontroll-Bit<br />

8FH Timer 1, Overflow-Flag<br />

90H Port 1, Bit 0<br />

91H Port 1, Bit 1<br />

92H Port 1, Bit 2<br />

93H Port 1, Bit 3<br />

94H Port 1, Bit 4<br />

95H Port 1, Bit 5<br />

96H Port 1, Bit 6<br />

97H Port 1, Bit 7<br />

98H Receive Interrupt Flag<br />

99H Transmit Interrupt Flag<br />

9AH Receive Bit 8<br />

9BH Transmit Bit 8<br />

9CH Receiver Enable<br />

9DH Serial Mode Kontroll-Bit-2<br />

9EH Serial Mode Kontroll-Bit-1<br />

9FH Serial Mode Kontroll-Bit-0<br />

A0H Port 2, Bit 0<br />

Tabelle 1.9: Bitadressen im Registerspeicher<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

53


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Adresse Funktion<br />

A1H Port 2, Bit 1<br />

A2H Port 2, Bit 2<br />

A3H Port 2, Bit 3<br />

A4H Port 2, Bit 4<br />

A5H Port 2, Bit 5<br />

A6H Port 2, Bit 6<br />

A7H Port 2, Bit 7<br />

A8H Enable Externer Interrupt 0<br />

A9H Enable Timer 0 Interrupt<br />

AAH Enable Externer Interrupt 1<br />

ABH Enable Timer 1 Interrupt<br />

ACH Enable Senat Port Interrupt<br />

AFH Enable All Interrupts<br />

B0H Senat Port Receive P<strong>in</strong><br />

B1H Senat Port Transmit P<strong>in</strong><br />

B2H Interrupt 0 Input P<strong>in</strong><br />

B3H Interrupt 1 Input P<strong>in</strong><br />

B4H Timer/Counter 0 externes Flag<br />

B5H Timer/Counter 1 externes Flag<br />

B6H Write Data (für externes Memory)<br />

B7H Read Data (für externes Memory)<br />

B8H Priorität für externen Interrupt 0<br />

B9H Priorität für Timer 0 Interrupt<br />

BAH Priorität für externen Interrupt 1<br />

BBH Priorität für Timer 1 Interrupt<br />

BCH Priorität für seriellen Port Interrupt<br />

D0H Parity Flag<br />

D2H Overflag Flag<br />

D3H Register Bank Selektions-Bit 0<br />

D4H Register Bank Selektions-Bit 1<br />

D5H Flag 0<br />

D6H Auxilliary Carry Flag<br />

D7H Carry Flag<br />

E0H Akkumulator, Bit 0<br />

Tabelle 1.9: Bitadressen im Registerspeicher (Forts.)<br />

54<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Adresse Funktion<br />

E1H Akkumulator, Bit 1<br />

E2H Akkumulator, Bit 2<br />

E3H Akkumulator, Bit 3<br />

E4H Akkumulator, Bit 4<br />

E5H Akkumulator, Bit 5<br />

E6H Akkumulator, Bit 6<br />

E7H Akkumulator, Bit 7<br />

F0H Multiplikationsregister, Bit 0<br />

F1H Multiplikationsregister, Bit 1<br />

F2H Multiplikationsregister, Bit 2<br />

F3H Multiplikationsregister, Bit 3<br />

F4H Multiplikationsregister, Bit 4<br />

F5H Multiplikationsregister, Bit 5<br />

F6H Multiplikationsregister, Bit 6<br />

F7H Multiplikationsregister, Bit 7<br />

Tabelle 1.9:<br />

1.3.2 E/A-Struktur<br />

Bitadressen im Registerspeicher (Forts.)<br />

Die Blockschaltung arbeitet wie e<strong>in</strong> typischer Bit-Zwischenspeicher <strong>und</strong> dient als<br />

E/A-Puffer für die E/A-Struktur der vier Ports. Der Bit-Zwischenspeicher (e<strong>in</strong> Bit<br />

im speziellen Funktionsregister des Ports) stellt sich als Flipflop vom Typ D dar,<br />

das auf e<strong>in</strong>en Taktimpuls h<strong>in</strong> e<strong>in</strong>en Wert vom <strong>in</strong>ternen Bus übernimmt, wenn die<br />

Zentrale<strong>in</strong>heit e<strong>in</strong> Signal »Schreiben <strong>in</strong> den Zwischenspeicher« ausgegeben hat.<br />

Das Ausgangssignal 0 des Flipflops wird auf den <strong>in</strong>ternen Bus gebracht, wenn die<br />

Zentrale<strong>in</strong>heit e<strong>in</strong> Signal »Lesen aus dem Zwischenspeicher« ausgegeben hat; der<br />

Pegel direkt am Portanschluss wird dagegen dann auf den <strong>in</strong>ternen Bus gebracht,<br />

wenn die Zentrale<strong>in</strong>heit e<strong>in</strong> Signal »Lesen vom Portanschluss« ausgegeben hat.<br />

E<strong>in</strong>ige Befehle, mit denen Portwerte gelesen werden, aktivieren das Signal »Lesen<br />

aus dem Zwischenspeicher«, andere das Signal »Lesen vom Portanschluss«.<br />

Die Ports 1, 2 <strong>und</strong> 3 haben <strong>in</strong>terne Pull-up-Widerstände, Port 0 Open-Dra<strong>in</strong>-Ausgänge.<br />

Jede E/A-Leitung kann unabhängig von anderen als E<strong>in</strong>gang oder Ausgang<br />

dienen, jedoch dürfen die Ports 0 <strong>und</strong> Port 2 nicht als E/A-Leitungen für allgeme<strong>in</strong>e<br />

Zwecke benutzt werden, wenn sie als Adress-/Datenbus arbeiten. Bei Verwendung<br />

als E<strong>in</strong>gang muss der betreffende Bit-Zwischenspeicher des SFR e<strong>in</strong> 1-Signal enthalten,<br />

die den Ausgangstreiber (e<strong>in</strong>en Feldeffekttransistor) abschaltet. Bei den<br />

Ports 1, 2 <strong>und</strong> 3 wird der Portanschluss durch den <strong>in</strong>ternen Pull-up-Widerstand auf<br />

1-Signal gesetzt, kann aber durch e<strong>in</strong>e externe Quelle auf 0-Signal gezogen werden.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

55


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Port 0 unterscheidet sich dadurch von den übrigen Ports, dass er ke<strong>in</strong>e <strong>in</strong>ternen<br />

Pull-up-Widerstände hat. Der Pull-up-Feldeffekttransistor im Ausgangstreiber von<br />

Port P0 wird nur dann benutzt, wenn der Port während e<strong>in</strong>es Zugriffs auf externe<br />

Speicher E<strong>in</strong>sen ausgibt. Andernfalls ist der Pull-up-Feldeffekttransistor abgeschaltet.<br />

Folglich s<strong>in</strong>d die Leitungen von P0, die als Ausgangsleitungen dienen,<br />

vom Open-Dra<strong>in</strong>-Typ. Wird e<strong>in</strong>e E<strong>in</strong>s <strong>in</strong> den Bit-Zwischenspeicher geschrieben, so<br />

bleiben beide Ausgangs-Feldeffekttransistoren abgeschaltet, <strong>und</strong> der Anschluss<br />

liegt auf unbestimmtem Potential. In diesem Fall kann er als hochohmiger E<strong>in</strong>gang<br />

dienen. Da die Ports 1, 2 <strong>und</strong> 3 festgelegte Pull-up-Widerstände haben, werden<br />

sie oft als quasibidirektionale Ports bezeichnet. Wenn sie als E<strong>in</strong>gänge dienen<br />

sollen, nehmen sie den 1-Pegel an <strong>und</strong> erzeugen dann e<strong>in</strong>en Strom (I LL im Datenblatt),<br />

wenn sie auf 0-Pegel gezogen werden. Andererseits bezeichnet man Port 0<br />

als echten bidirektionalen Port, weil er unbestimmtes Potential aufweist, wenn er<br />

als E<strong>in</strong>gang betrieben wird.<br />

Durch Rücksetzen des 8051 werden E<strong>in</strong>sen <strong>in</strong> die Zwischenspeicher aller Ports<br />

geschrieben. Wird anschließend e<strong>in</strong>e Null <strong>in</strong> den Zwischenspeicher des Ports<br />

gebracht, so lässt sich dieser danach als E<strong>in</strong>gang wieder e<strong>in</strong>richten, <strong>in</strong>dem man<br />

e<strong>in</strong>e E<strong>in</strong>s <strong>in</strong> ihn schreibt.<br />

1.3.3 Schreiben <strong>in</strong> e<strong>in</strong>en Port<br />

Bei der Ausführung e<strong>in</strong>es Befehls, der den Wert im Zwischenspeicher e<strong>in</strong>es Ports<br />

ändert, erreicht der neue Wert den Ausgangsanschluss erst während Phase 1 des<br />

nächsten Masch<strong>in</strong>enzyklus.<br />

Wenn die Änderung e<strong>in</strong>en 0-1-Übergang (positive Flanke) <strong>in</strong> Port 1, 2 oder 3 erfordert,<br />

wird e<strong>in</strong> zusätzlicher Pull-up-Widerstand während desjenigen Zyklus e<strong>in</strong>geschaltet,<br />

<strong>in</strong> dem der Übergang erfolgt. Auf diese Weise wird die Übergangsgeschw<strong>in</strong>digkeit<br />

erhöht. Durch den zusätzlichen Pull-up-Widerstand fließt etwa der<br />

100-fache Strom wie durch den »normalen« Pull-up-Widerstand. Bei dieser Gelegenheit<br />

sollte bemerkt werden, dass die <strong>in</strong>ternen Pull-up-Widerstände Feldeffekttransistoren<br />

<strong>und</strong> ke<strong>in</strong>e l<strong>in</strong>earen Widerstände s<strong>in</strong>d.<br />

Beim Mikrocontroller 8051 (also bei der NMOS-Version) ist der »normale« (d.h.<br />

der stets vorhandene) Pull-up-Widerstand e<strong>in</strong> Transistor vom Verarmungstyp, bei<br />

dem Gate <strong>und</strong> Source zusammengeschaltet s<strong>in</strong>d. Der Transistor lässt über den<br />

Portanschluss etwa 0,25 mA fließen, wenn dieser mit Masse verb<strong>und</strong>en ist.<br />

Parallel zu diesem Transistor liegt e<strong>in</strong> Transistor vom Anreicherungstyp, der den<br />

oben beschriebenen zusätzlichen Pull-up-Widerstand darstellt <strong>und</strong> immer dann<br />

aktiv wird, wenn das betreffende Bit von null nach e<strong>in</strong>s übergeht. Solange der<br />

zusätzliche Transistor aktiv ist, liefert er e<strong>in</strong>en Strom von 30 mA an den Portanschluss,<br />

wenn dieser mit Masse verb<strong>und</strong>en ist.<br />

56<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Bei der CMOS-Version besteht der Pull-up-Widerstand aus drei p-Kanal-Feldeffekttransistoren.<br />

Man beachte, dass e<strong>in</strong> n-Kanal-Feldeffekttransistor e<strong>in</strong>geschaltet<br />

ist, wenn e<strong>in</strong> 1-Signal an se<strong>in</strong>em Gate liegt, <strong>und</strong> dann ausgeschaltet ist, wenn dort<br />

e<strong>in</strong> 0-Signal liegt. Bei p-Kanal-Feldeffekttransistoren ist es umgekehrt.<br />

Man beachte, dass bei der Ausgabe e<strong>in</strong>es 1-Signals am Portanschluss e<strong>in</strong> dort von<br />

e<strong>in</strong>er externen Quelle ankommender negativer Störimpuls den p-Kanal-Feldeffekttransistor<br />

3 ausschalten kann, wodurch der Portanschluss unbestimmtes<br />

Potential annimmt. Der p-Kanal-Feldeffekttransistor 2 stellt e<strong>in</strong>en sehr niederohmigen<br />

Pull-up-Widerstand dar, der immer dann e<strong>in</strong>geschaltet ist, wenn der<br />

n-Kanal-Feldeffekttransistor ausgeschaltet ist (typischer CMOS-Schaltungsaufbau).<br />

Durch ihn fließt nur ca. 1/10 des Stroms, der den p-Kanal-Feldeffekttransistor<br />

durchsetzt. Se<strong>in</strong>e Aufgabe besteht dar<strong>in</strong>, am Portanschluss e<strong>in</strong> 1-Signal<br />

wiederherzustellen, falls dort e<strong>in</strong> 1-Signal vorhanden war <strong>und</strong> dieses durch e<strong>in</strong>en<br />

externen Störimpuls verloren gegangen ist.<br />

Die Ausgangspuffer der Ports 1, 2 <strong>und</strong> 3 können je vier Low-Power-Schottky-TTL-<br />

E<strong>in</strong>gänge oder e<strong>in</strong>en normalen TTL-E<strong>in</strong>gang treiben. Diese Ports <strong>in</strong> der NMOS-<br />

Version lassen sich auf normale Weise durch jede TTL- oder NMOS-Schaltung<br />

treiben. Sowohl die NMOS- als auch die CMOS-Version können durch Open-Kollektor<br />

<strong>und</strong> durch Open-Dra<strong>in</strong>-Ausgänge getrieben werden, ohne dass externe Pullup-Widerstände<br />

erforderlich s<strong>in</strong>d.<br />

Die Ausgangspuffer von Port 0 können jeweils acht Low-Power-Schottky-TTL-E<strong>in</strong>gänge<br />

oder zwei normale TTL-E<strong>in</strong>gänge treiben. Sie erfordern jedoch externe Pullup-Widerstände,<br />

um NMOS-E<strong>in</strong>gänge zu treiben, außer wenn der Port als Adress-/<br />

Datenbus dient.<br />

1.3.4 Read-Modify-Write-Merkmale<br />

Es gibt gr<strong>und</strong>sätzlich zwei Möglichkeiten, e<strong>in</strong>en Port durch e<strong>in</strong>en Befehl zu lesen,<br />

<strong>und</strong> zwar entweder am Zwischenspeicher oder unmittelbar am Portanschluss. Der<br />

Befehlsvorrat des 8051 enthält Befehle der e<strong>in</strong>en <strong>und</strong> der anderen Art. Befehle, die<br />

den Zwischenspeicher lesen, s<strong>in</strong>d jene, durch die e<strong>in</strong> Wert gelesen, möglicherweise<br />

geändert <strong>und</strong> anschließend <strong>in</strong> den Zwischenspeicher zurückgeschrieben<br />

wird (so genannte Read-Modify-Write-Befehle). Bei diesen <strong>in</strong> Tabelle 1.10 aufgeführten<br />

Befehlen ist der Zieloperand e<strong>in</strong> Port oder e<strong>in</strong> Portbit.<br />

Befehl Beschreibung Beispiel<br />

ANL Logisches UND ANL P1,A<br />

ORL Logisches ODER ORL P2,A<br />

XRL Logisches Exklusiv-ODER XRL P3,A<br />

JBC Spr<strong>in</strong>ge, wenn Bit = 1 <strong>und</strong> lösche Bit JBC P1.1‚LABEL<br />

Tabelle 1.10: Befehle, die den Zwischenspeicher der Ports lesen (Read-Modify-Write-Befehle)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

57


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Befehl Beschreibung Beispiel<br />

CPL Komplementiere Bit CPL P3.0<br />

INC Inkrementiere INC P2<br />

DEC Dekrementiere DEC P2<br />

DJNZ Dekrementiere <strong>und</strong> spr<strong>in</strong>ge, falls nicht null DJNZ P3,LABEL<br />

MOV PX.Y,C Transportiere Übertragsbit nach Bit Y von Port C<br />

CLR PX.Y Lösche Bit Y von Port X<br />

SET PX.Y Setze Bit Y von Port X<br />

Tabelle 1.10: Befehle, die den Zwischenspeicher der Ports lesen (Read-Modify-Write-Befehle)<br />

Auf den ersten Blick ist nicht zu erkennen, dass auch die drei letzten Befehle dieser<br />

Tabelle Read-Modify-Write-Befehle s<strong>in</strong>d: Sie lesen das Portbyte (alle acht Bits),<br />

ändern das adressierte Bit <strong>und</strong> schreiben das neue Byte <strong>in</strong> den Zwischenspeicher<br />

zurück.<br />

Die Befehle verarbeiten deshalb die Werte des Zwischenspeichers <strong>und</strong> nicht die<br />

der Anschlüsse, weil die Spannungspegel an den Anschlüssen zu Fehl<strong>in</strong>terpretationen<br />

führen können. Zum Beispiel könnte der Port zum Treiben der Basis e<strong>in</strong>es<br />

Transistors dienen. Wird e<strong>in</strong> 1-Signal <strong>in</strong> die Bit-Speicherstelle geschrieben, so<br />

schaltet der Transistor e<strong>in</strong>. Wenn dann die Zentrale<strong>in</strong>heit dasselbe Portbit am<br />

Anschluss statt am Zwischenspeicher liest, wird sie die Basisspannung des Transistors<br />

lesen <strong>und</strong> diese als e<strong>in</strong> 0-Signal <strong>in</strong>terpretieren. Nur das Lesen des Zwischenspeichers<br />

anstelle des Anschlusses führt daher zum richtigen Wert, e<strong>in</strong>em<br />

1-Signal.<br />

1.3.5 Programmierung e<strong>in</strong>er E<strong>in</strong>gabeoperation<br />

Wie bei allen Mikrocontroller-Projekten muss auch bei Verwendung e<strong>in</strong>es Mikrocontrollers<br />

die nötige Entwicklungsumgebung verfügbar se<strong>in</strong>. Die Software von<br />

Multisim stellt e<strong>in</strong>e effiziente <strong>und</strong> leistungsfähige Entwicklungsumgebung für auf<br />

8051-Mikrocontroller basierende Anwendungen. Compiler <strong>und</strong> <strong>Assembler</strong> s<strong>in</strong>d<br />

aufe<strong>in</strong>ander abgestimmt. Sie bilden e<strong>in</strong>e homogene E<strong>in</strong>heit für die Softwareentwicklung<br />

<strong>und</strong> die erzeugten Objekt-Dateien s<strong>in</strong>d Intel-kompatibel.<br />

Somit können Object- <strong>und</strong> Symbol-Dateien komfortabel mit dem EMUL51-PC-<br />

Emulator weiterverarbeitet werden. Der C-Compiler erzeugt alle notwendigen<br />

Informationen zur Unterstützung des Source-Code-Debugg<strong>in</strong>gs. Das gesamte<br />

<strong>Assembler</strong>paket ist Intel-kompatibel <strong>und</strong> arbeitet unter dem Betriebssystem MS-<br />

DOS <strong>und</strong> W<strong>in</strong>dows. Es besteht aus:<br />

A51-Makroassembler L51-L<strong>in</strong>ker/Locater<br />

LIB51-Library-Manager OHS51-Objekt-Hex-Konverter<br />

58<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Der <strong>Assembler</strong> deckt die Masch<strong>in</strong>enbefehle des Mikrocontrollers 8051 ab.<br />

Der Makroassembler A51 erzeugt aus e<strong>in</strong>em 8051-<strong>Assembler</strong>sourcefile (Intel Mnemonics)<br />

e<strong>in</strong> relocatives Objektmodul <strong>und</strong> e<strong>in</strong> List-File. Er erlaubt symbolischen<br />

Zugriff auf die Architektur des 8051, z.B. RAM-Adressen, Bit-Adressen, E<strong>in</strong>/Ausgabeport.<br />

Ebenso wird die Architektur des 8052 <strong>und</strong> die gesamte Nachfolgefamilie<br />

berücksichtigt.<br />

Der L<strong>in</strong>ker/Locater L51 b<strong>in</strong>det die e<strong>in</strong>zelnen Module <strong>und</strong> bei Bedarf Teile aus<br />

Bibliotheken zusammen, erzeugt absolute Adressen <strong>und</strong> speichert diese Daten im<br />

Intel-Object-File-Format ab. Die Symbole <strong>und</strong> eventuell die Zeilennummer-Informationen<br />

vom C-Quellcode s<strong>in</strong>d im Objectfile enthalten. Zusätzlich kann e<strong>in</strong>e<br />

Crossreference-Liste <strong>und</strong> e<strong>in</strong>e Map-Datei erstellt werden.<br />

Für die Hochsprachenprogrammierung verfügt der L<strong>in</strong>ker/Locate L51 auch über<br />

e<strong>in</strong>e OVERLAY-Funktion, die den knappen <strong>in</strong>ternen Speicher der 8051-Mikrocontroller<br />

speziell verwaltet. Dabei werden Parameter <strong>und</strong> Variablen der e<strong>in</strong>zelnen<br />

Funktionen überlagert, wenn sich diese Funktionen nicht gegenseitig aufrufen.<br />

Dadurch wird der Speicherbedarf der Anwendungen um e<strong>in</strong> Vielfaches reduziert.<br />

L51 analysiert selbstständig die gegenseitigen Aufrufe sämtlicher Funktionen <strong>und</strong><br />

überlagert dann gezielt die zu diesen Funktionen gehörenden Daten <strong>und</strong> Bit-Segmente.<br />

Für den DEBUG-Betrieb kann diese Funktion abgeschaltet werden, um<br />

problemlos auf alle Werte zugreifen zu können.<br />

Der Object-Hex-Konverter OHS51 kann aus dieser Object-Datei e<strong>in</strong> Intel-Hex-File<br />

<strong>und</strong> e<strong>in</strong>e separate Symboldatei erzeugen.<br />

C ist e<strong>in</strong>e allgeme<strong>in</strong> e<strong>in</strong>setzbare Programmiersprache, die Code-Effizienz, strukturiertes<br />

Programmieren, komfortable Datenstrukturen <strong>und</strong> e<strong>in</strong>en reichhaltigen<br />

Satz von Operationen vere<strong>in</strong>igt. C ist ke<strong>in</strong>e Programmiersprache, die auf<br />

bestimmte Anwendungen spezialisiert ist. Durch die Möglichkeit, e<strong>in</strong> Programm<br />

<strong>in</strong> e<strong>in</strong>er Hochsprache zu formulieren, lässt sich e<strong>in</strong> Projekt <strong>in</strong> kürzerer Zeit mit<br />

ger<strong>in</strong>gerer Fehleranfälligkeit <strong>und</strong> besserer Wartungsmöglichkeit realisieren.<br />

Der C51-Crosscompiler entspricht dem Standard nach ANSI X3J11 <strong>und</strong> Kernighan<br />

& Ritchie. Er erzeugt Intel-kompatiblen 8051-Objectcode als Ergebnis. Diese<br />

Object-Dateien können mit <strong>Assembler</strong> oder PL/M-51-Objektmodulen komb<strong>in</strong>iert<br />

werden.<br />

Die Parameterübergabe an Funktionen erfolgt, wie bei PLM51, <strong>in</strong> festen Speicheradressen.<br />

Daher s<strong>in</strong>d Zugriffe auf Parameter extrem schnell <strong>und</strong> e<strong>in</strong>fach mit<br />

<strong>Assembler</strong> zu realisieren. Das E<strong>in</strong>b<strong>in</strong>den von <strong>Assembler</strong>-Unterprogrammen ist<br />

somit problemlos.<br />

Auch Interrupt-Prozeduren können mit C51 erstellt werden. Die Registerbank, die<br />

<strong>in</strong> der Interrupt-Prozedur verwendet werden soll, kann angegeben werden. Der<br />

Compiler generiert den für die Umschaltung erforderlichen Code.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

59


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Der C51-Compiler unterstützt vollständig die Architektur der 8051-Familie. Der<br />

une<strong>in</strong>geschränkte Zugriff auf sämtliche Hardware-Komponenten des Systems ist<br />

gewährleistet. Jede Variable kann durch Zuweisung des Speichertyps explizit platziert<br />

werden. Es werden fünf Speichertypen unterstützt, wie Tabelle 1.11 zeigt.<br />

data<br />

idata<br />

pdata<br />

xdata<br />

code<br />

Tabelle 1.11:<br />

Direkt adressierbarer <strong>in</strong>terner Datenspeicher. Ermöglicht den schnellsten Zugriff<br />

auf Variablen (128 Byte)<br />

Indirekt adressierbarer <strong>in</strong>terner Datenspeicher. Ermöglicht den schnellsten Zugriff<br />

auf Variablen (256 Byte)<br />

»Paged« (256 Byte) externer Datenspeicher <strong>und</strong> der Zugriff erfolgt mit dem Befehl<br />

MOVX@Ri<br />

Externer Datenspeicher (64 Kbyte) <strong>und</strong> der Zugriff erfolgt mit dem Befehl<br />

MOVX@DPTR<br />

Programmspeicher (64 Kbyte) <strong>und</strong> der Zugriff erfolgt mit dem Befehl<br />

MOVC@A+DPTR<br />

Unterstützung der Speichertypen im 8051/8052 <strong>und</strong> der erweiterten Familie<br />

Generell werden drei verschiedene Speichermodelle unterstützt, wie Tabelle 1.12<br />

zeigt.<br />

SMALL<br />

COMPACT<br />

LARGE<br />

Tabelle 1.12:<br />

Parameter <strong>und</strong> lokale Variablen werden im direkt adressierbaren <strong>in</strong>ternen<br />

Datenspeicher platziert (max. 120 Byte).<br />

Parameter <strong>und</strong> lokale Variablen werden im »paged« externen Datenspeicher<br />

platziert (max. 256 Byte).<br />

Parameter <strong>und</strong> lokale Variablen werden im externen Datenspeicher platziert<br />

(max. 64 Kbyte).<br />

Verschiedene Speichermodelle<br />

Der C51-Compiler unterstützt die nachfolgend aufgeführten Datentypen. Zusätzlich<br />

lassen sich die Variablen <strong>in</strong> Strukturen zusammenfassen. Außerdem können<br />

mehrdimensionale Felder gebildet werden. Die Adressierung von Variablen über<br />

Po<strong>in</strong>ter ist ebenso möglich wie der direkte Zugriff auf die »Special Function Register«<br />

(SFR), wie Tabelle 1.13 zeigt.<br />

Datentyp Größe Wertebereich<br />

bit 1 Bit 0 oder 1<br />

signed char 1 Byte –128 bis +127<br />

unsigned char 1 Byte 0 bis 255<br />

signed <strong>in</strong>t 2 Byte –32768 bis +32767<br />

unsigned <strong>in</strong>t 2 Byte 0 bis 65535<br />

Tabelle 1.13:<br />

Unterstützte Datentypen<br />

60<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Datentyp Größe Wertebereich<br />

signed long 4 Byte –2147483648 bis +21474483647<br />

unsigned long 4 Byte 0 bis 4294967295<br />

float 4 Byte +/– 1.176E-38 bis +/– 3.40E+38<br />

<strong>in</strong>ter 3 Byte Adresse e<strong>in</strong>er Variablen<br />

Tabelle 1.13:<br />

Unterstützte Datentypen (Forts.)<br />

Die Konvertierung der Datentypen beim Rechenvorgang erfolgt automatisch oder<br />

kann manuell durch C-Anweisungen gesteuert werden.<br />

Wenn Sie e<strong>in</strong>e Schaltung <strong>in</strong> Multisim aufbauen, müssen Sie zuerst den Button<br />

»MCU« anklicken. MultiMCU erlaubt es dem Schüler, Studenten <strong>und</strong> Auszubildenden,<br />

e<strong>in</strong>en Mikrocontroller, der <strong>in</strong> <strong>Assembler</strong> programmiert wurde, <strong>in</strong>nerhalb<br />

der SPICE-Umgebung e<strong>in</strong>zub<strong>in</strong>den. Wenn Sie den Button MCU PLATZIEREN<br />

anklicken, ersche<strong>in</strong>t Abbildung 1.8.<br />

Abb. 1.8:<br />

Fenster für die Auswahl der Mikrocontroller, RAM- <strong>und</strong> ROM-E<strong>in</strong>heiten<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

61


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

In dem Fenster kann man zwischen den Mikrocontrollern von Intel 8051/8052<br />

<strong>und</strong> von Mikrochip PIC16F84/16F84A wählen. Klickt man den Button »RAM« an,<br />

ersche<strong>in</strong>en verschiedene Versionen von 2 Kbyte oder 8 Kbyte. Wenn man den Button<br />

»ROM« anklickt, hat man die Auswahl von 16 Kbyte oder 32 Kbyte.<br />

Mit »OK« wird e<strong>in</strong> Mikrocontroller, e<strong>in</strong> RAM oder e<strong>in</strong> ROM <strong>in</strong> der Schaltung platziert.<br />

Danach ersche<strong>in</strong>t das Fenster von Abbildung 1.9.<br />

Abb. 1.9: MCU-Assistent – Schritt 1 von 3<br />

Mit dem MCU-ASSISTENT gibt man Arbeitsbereichspfad <strong>und</strong> Arbeitsbereichsnamen<br />

e<strong>in</strong>. Der Arbeitsbereichsname lautet Versuch1. Anschließend klickt man<br />

WEITER an. Es ersche<strong>in</strong>t Abbildung 1.10.<br />

Abb. 1.10: MCU-Assistent – Schritt 2 von 3<br />

Bei dem MCU-ASSISTENT – SCHRITT 2 VON 3 werden die wichtigsten Def<strong>in</strong>itionen<br />

für die Programmierung festgelegt. Mit dem Projekttyp legt man STANDARD fest<br />

62<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

oder man arbeitet mit e<strong>in</strong>er externen Hex-Datei. Unter PROGRAMMIERSPRACHE<br />

legt man fest, ob man <strong>in</strong> C oder <strong>in</strong> <strong>Assembler</strong> (BAUGRUPPE) programmieren<br />

möchte. Arbeitet man mit C, wird der HI-TECH C51-LITE-COMPILER festgelegt.<br />

Arbeitet man mit <strong>Assembler</strong> (BAUGRUPPE), wird der 8081/8052 METALINK-<br />

ASSEMBLER aufgerufen. Abschließend def<strong>in</strong>iert man noch den PROJEKTNAMEN<br />

mit Versuch1 <strong>und</strong> klickt WEITER an. Es ersche<strong>in</strong>t Abbildung 1.11.<br />

Abb. 1.11: MCU-Assistent – Schritt 3 von 3<br />

Bei dem MCU-ASSISTENT – SCHRITT 3 VON 3 fügt man e<strong>in</strong>e Quelldatei h<strong>in</strong>zu.<br />

Anschließend klickt man FERTIG STELLEN an. Im Schaltplan (Abbildung 1.12) bef<strong>in</strong>det<br />

sich der Mikrocontroller 8051.<br />

Abb. 1.12: Schaltplan mit dem Mikrocontroller 8051<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

63


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Aus der Bibliothek kann Taster, Widerstand, Masse <strong>und</strong> +U b geholt werden. Die<br />

Bauste<strong>in</strong>e s<strong>in</strong>d im Schaltplan zu platzieren <strong>und</strong> mit dem Mikrocontroller zu verb<strong>in</strong>den.<br />

Der Taster wird mit der PC-Leertaste e<strong>in</strong>- <strong>und</strong> ausgeschaltet. Die Hardware<br />

ist nun fertig <strong>und</strong> es kann mit der Programmierung <strong>in</strong> <strong>Assembler</strong> begonnen<br />

werden. Dazu klickt man den Button »MCU« an <strong>und</strong> das Fenster von Abbildung<br />

1.13 öffnet sich.<br />

Abb. 1.13:<br />

Aufruf des MCU-Code-Managers<br />

Wenn man den MCU-Code-Manager angeklickt hat, öffnet sich das Fenster von<br />

Abbildung 1.14. Hier lassen sich alle möglichen Funktionen e<strong>in</strong>stellen.<br />

Abb. 1.14:<br />

Fenster <strong>und</strong> E<strong>in</strong>stellmöglichkeiten des MCU-Code-Managers<br />

64<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Mit e<strong>in</strong>em Doppelklick auf den Pfad MAIN.ASM öffnet sich das Fenster von Abbildung<br />

1.15 <strong>und</strong> hier führt man die <strong>Assembler</strong>-Programmierung durch.<br />

Abb. 1.15:<br />

Fenster für die <strong>Assembler</strong>-Programmierung <strong>und</strong> Fenster für die Fehlermeldungen<br />

Um die <strong>Assembler</strong>-Programmierung für dieses kle<strong>in</strong>e Projekt durchführen zu<br />

können, muss man sich Port 1 genau betrachten.<br />

Port 1 hat <strong>in</strong>terne Pull-up-Widerstände. Jede E/A-Leitung kann unabhängig von<br />

anderen als E<strong>in</strong>gang oder Ausgang dienen. Bei Verwendung als E<strong>in</strong>gang muss der<br />

betreffende Bit-Zwischenspeicher des SFR e<strong>in</strong> 1-Signal enthalten, die den Ausgangstreiber<br />

(e<strong>in</strong>en Feldeffekttransistor) abschaltet. Bei Port 1 wird der Portanschluss<br />

durch den <strong>in</strong>ternen Pull-up-Widerstand auf 1-Signal gesetzt, kann aber<br />

durch e<strong>in</strong>e externe Quelle auf 0-Signal gezogen werden. Durch Rücksetzen des<br />

Mikrocontrollers 8051 werden 1-Signale <strong>in</strong> die Zwischenspeicher aller Ports<br />

geschrieben. Wird anschließend e<strong>in</strong> 0-Signal <strong>in</strong> den Zwischenspeicher des Ports<br />

gebracht, so lässt sich dieser danach als E<strong>in</strong>gang wieder e<strong>in</strong>richten, <strong>in</strong>dem man<br />

e<strong>in</strong> 1-Signal <strong>in</strong> ihn schreibt.<br />

In der ersten Zeile der <strong>Assembler</strong>-Programmierung steht<br />

MOV<br />

P1,#255<br />

Damit wird der E<strong>in</strong>gang des Ports P1 auf 1-Signal gesetzt. Wenn <strong>in</strong> e<strong>in</strong>er <strong>Assembler</strong>-Programmierung<br />

vor e<strong>in</strong>em Wert das Zeichen »#« angegeben wird, handelt es<br />

sich beim C51 um e<strong>in</strong>e Konstante. Danach folgt e<strong>in</strong>e Schleife <strong>und</strong><br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

65


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

MOV A,P1<br />

JMP Schleife<br />

In der Schleife wird der E<strong>in</strong>gang von Port P1 abgefragt <strong>und</strong> <strong>in</strong> den Akkumulator<br />

geschrieben. Wenn der Taster geschlossen ist, wird e<strong>in</strong> 0-Signal <strong>in</strong> den Akkumulator<br />

geschrieben, <strong>und</strong> ist der Taster offen, e<strong>in</strong> 1-Signal.<br />

Abb. 1.16:<br />

<strong>Assembler</strong>-Programmierung mit Fenster der Fehlerüberprüfung<br />

Abbildung 1.16 zeigt die <strong>Assembler</strong>-Programmierung mit dem Fenster für die<br />

Fehlerüberprüfung, wobei die Schaltung bereits simuliert wurde.<br />

Jetzt können Sie den Balken MC1.1 anklicken <strong>und</strong> die Schaltung ersche<strong>in</strong>t wieder<br />

im Bildschirm. Dann schaltet sich die noch laufende Simulation aus, erkennbar<br />

unten rechts im Bildschirm <strong>und</strong> so starten Sie erneut die Simulation. Es ersche<strong>in</strong>t<br />

e<strong>in</strong> Fenster, da die Projektkonfiguration jetzt nicht mehr aktuell ist, <strong>und</strong> Sie klicken<br />

auf JA. Das Fenster erlischt <strong>und</strong> Sie erhalten wieder das Fenster für die<br />

<strong>Assembler</strong>-Programmierung.<br />

66<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

In dem Fenster für die <strong>Assembler</strong>-Programmierung s<strong>in</strong>d oben l<strong>in</strong>ks <strong>in</strong> der zweiten<br />

Zeile e<strong>in</strong> grüner Pfeil, e<strong>in</strong> schwarzes Zweistrichsymbol, e<strong>in</strong> rotes Rechteck <strong>und</strong><br />

e<strong>in</strong> roter Kreis sichtbar. Mit dem grünen Pfeil führen Sie den Start oder die Fortsetzung<br />

der Simulation durch. Mit dem schwarzen Zweistrichsymbol lässt sich die<br />

Simulation anhalten. Durch das rote Rechteck wird die Simulation angehalten.<br />

Klickt man den roten Kreis an, wird nicht nur die Simulation bei der nächsten<br />

MCU-Anweisungsgrenze angehalten, sondern Sie rufen die Debugger auf.<br />

Wenn e<strong>in</strong> Programm auf Fehler untersucht wird, spricht man vom DEBUG (entwanzen).<br />

Dies ist e<strong>in</strong>e Bezeichnung für die Fehlersuche <strong>und</strong> Fehlerbehebung <strong>in</strong><br />

der Hardware <strong>und</strong> Software. Bei der Software ist das Debug-Programm e<strong>in</strong> Hilfsmittel<br />

für die Fehlersuche. Sie erlaubt das Setzen von Breakpo<strong>in</strong>ts, die E<strong>in</strong>zelbefehlsausführung,<br />

die Ausgabe von Register<strong>in</strong>halten bzw. Speicherabzügen (Dump)<br />

<strong>und</strong> das Verändern von Register- <strong>und</strong> Speicher<strong>in</strong>halten.<br />

Breakpo<strong>in</strong>ts s<strong>in</strong>d Unterbrechungspunkte im Betriebssystem <strong>und</strong> enthalten zur Testunterstützung<br />

die Debug-Programme. Diese ermöglichen, Unterbrechungspunkte<br />

im Programmablauf vorzugeben. E<strong>in</strong> Software-Breakpo<strong>in</strong>t ist e<strong>in</strong>e Adresse. E<strong>in</strong><br />

Hardware-Breakpo<strong>in</strong>t unterbricht das Programm, wenn sich an e<strong>in</strong>em ausgewählten<br />

Signal der Pegel ändert. Das Programm hält dann an der vorgegebenen Stelle<br />

an. Es ist so kontrollierbar, ob das Programm an dieser Stelle vorbeikommt. Es lassen<br />

sich gegebenenfalls an dieser Stelle Register- oder Speicher<strong>in</strong>halte überprüfen.<br />

Meist s<strong>in</strong>d mehrere Breakpo<strong>in</strong>ts setzbar.<br />

Abb. 1.17:<br />

Quelldatei-Debug-Auflistung<br />

Abbildung 1.17 zeigt die Quelldatei-Debug-Auflistung. Wenn man die e<strong>in</strong>zelnen<br />

Debugmöglichkeiten verlassen will, klickt man das Feld MC1.1 an <strong>und</strong> kommt so <strong>in</strong><br />

die Schaltung.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

67


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.18:<br />

Speicheransicht nach e<strong>in</strong>er Simulation<br />

Abbildung 1.18 zeigt die Speicheransicht von SFR, IRAM, IROM <strong>und</strong> XRAM. Das<br />

Special-Function-Register (SFR) liegt im Adressbereich 128 bis 255 (80H bis FFH).<br />

Auf die Adressen ist nur mittels direkt adressierter Befehle zuzugreifen. In diesem<br />

Bereich liegen alle Register, außer den Registerbänken <strong>und</strong> dem Befehlszähler.<br />

Von den im Mikrocontroller 8051 enthaltenen 21 SFR s<strong>in</strong>d 10 bitadressierbar. Das<br />

IRAM zeigt die Informationen des <strong>in</strong>ternen Schreib-Lese-Speichers <strong>und</strong> im<br />

Mikrocontroller 8051 s<strong>in</strong>d 128 Speicherzellen vorhanden. Das IROM zeigt die<br />

Informationen des <strong>in</strong>ternen Festwertspeichers an <strong>und</strong> hat 4 Kbyte. Das XRAM ist<br />

der externe Schreib-Lese-Speicher.<br />

Wenn man den grünen Pfeil anklickt, ersche<strong>in</strong>t Abbildung 1.18 <strong>und</strong> man sieht, der<br />

Akkumulator hat ke<strong>in</strong>e Informationen. Wenn das schwarze Zweistrichsymbol<br />

angeklickt wird, stoppt die Simulation <strong>und</strong> der Akkumulator zeigt den Wert an:<br />

1 1 1 1 1 1 1 0 Taster geschlossen<br />

1 1 1 1 1 1 1 1 Taster offen<br />

Sie können die Schaltfunktion ohne Probleme überprüfen.<br />

68<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

1.3.6 Zugriff auf externe Speicher<br />

Hierbei muss zwischen dem Zugriff auf den externen Programmspeicher <strong>und</strong><br />

dem Zugriff auf den externen Datenspeicher unterschieden werden. Beim Zugriff<br />

auf den externen Programmspeicher dient das Signal PSEN (program store<br />

enable) als Lese-Strobesignal, beim Zugriff auf den externen Datenspeicher werden<br />

RD (Read) oder WR (Write) (alternative Funktionen von P3.7 bzw. P3.6) als<br />

Lese- bzw. Schreib-Strobesignal verwendet. Abbildung 1.19 zeigt den Anschluss<br />

e<strong>in</strong>es Schreib-Lese-Speichers an den Mikrocontroller 8051.<br />

Abb. 1.19:<br />

Anschluss e<strong>in</strong>es Datenspeichers mit 8 Kbyte mit Speicheransicht<br />

Die Daten <strong>und</strong> Adressen von D 0 bis D 7 <strong>und</strong> von A 0 bis A 7 werden geme<strong>in</strong>sam über<br />

Port 0 ausgegeben. Die Datenleitungen liegen direkt an dem RAM an <strong>und</strong> die<br />

Adressenleitungen werden über den Bauste<strong>in</strong> 74373 zwischengespeichert. Der<br />

Bauste<strong>in</strong> 74373 ist e<strong>in</strong> 8-Bit-D-Latch mit Enable <strong>und</strong> Tri-State-Ausgängen. Tabelle<br />

1.14 zeigt die Funktionen.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

69


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

OC G D Q<br />

0 1 1 1<br />

0 1 0 0<br />

0 0 X Q<br />

1 X X Z<br />

Tabelle 1.14: Funktionen des TTL-Bauste<strong>in</strong>s 74373<br />

Der Steuere<strong>in</strong>gang OC (Output Control) ist <strong>in</strong> der Schaltung mit Masse verb<strong>und</strong>en<br />

<strong>und</strong> daher kann der Bauste<strong>in</strong> 74373 <strong>in</strong> der Schaltung immer arbeiten. Bei e<strong>in</strong>em<br />

1-Signal ist der Bauste<strong>in</strong> gesperrt <strong>und</strong> die Ausgänge weisen den hochohmigen<br />

Zustand auf. Hat der E<strong>in</strong>gang G (Gate oder Enable) e<strong>in</strong> 1-Signal, ist der Bauste<strong>in</strong><br />

74373 transparent, das heißt, die angelegte Information an dem D-E<strong>in</strong>gang wird<br />

direkt an den Q-Ausgang weitergegeben. Hat der E<strong>in</strong>gang G e<strong>in</strong> 0-Signal, werden<br />

die Informationen gespeichert.<br />

Statt des 74373 verwendet man den 74273, e<strong>in</strong> 8-Bit-D-Register mit Clear. Tabelle<br />

1.15 zeigt die Funktionen des TTL-Bauste<strong>in</strong>s 74273.<br />

Clear Clock D Q<br />

0 X X 0<br />

1 1 1<br />

1 0 0<br />

1 L X Q n<br />

Tabelle 1.15: Funktionen des TTL-Bauste<strong>in</strong>s 74273<br />

In den Kapiteln 3 <strong>und</strong> 4 wird dieser Bauste<strong>in</strong> <strong>in</strong> der Simulation verwendet. Für den<br />

richtigen Betrieb <strong>in</strong> der Praxis ist e<strong>in</strong> NICHT-Gatter für den Takt erforderlich.<br />

Das 8-Kbyte-RAM HM1-65642 hat für die Adressierung 13 E<strong>in</strong>gänge von A 0 bis A 12<br />

<strong>und</strong> daher können 8192 Speicherreihen zu je acht Bit angesprochen werden. Die<br />

gespeicherten Informationen <strong>in</strong> dem Bauste<strong>in</strong> liegen an den Datenausgängen DQ<br />

an, wenn die Bed<strong>in</strong>gungen für die Wahrheits-Tabelle 1.16 erfüllt s<strong>in</strong>d.<br />

E1 E2 G W DQ<br />

0 X X X Z<br />

X 1 X X Z<br />

1 X 1 X Z<br />

1 X 0 1 schreiben<br />

1 0 0 0 lesen<br />

Tabelle 1.16:<br />

Wahrheits-Tabelle für 8-Kbyte-RAM HM1-65642<br />

70<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

Der W-E<strong>in</strong>gang (Write oder schreiben) vom RAM ist mit dem WR-Ausgang des Mikrocontrollers<br />

verb<strong>und</strong>en. Der G-E<strong>in</strong>gang (Gate) vom RAM ist mit dem RD-E<strong>in</strong>gang<br />

(Read oder lesen) des Mikrocontrollers verb<strong>und</strong>en. Der E<strong>in</strong>gang E2 liegt an +5 V.<br />

Das 8-Kbyte-RAM HM1-65642 lässt sich adressieren, wenn sich E1 auf 0-Signal<br />

<strong>und</strong> E2 auf 1-Signal bef<strong>in</strong>den. E1 ist mit dem Ausgang des NOR-Gatters verb<strong>und</strong>en.<br />

Die drei E<strong>in</strong>gänge des NOR-Gatters liegen an A 13 , A 14 <strong>und</strong> A 15 . Es ergibt sich<br />

folgender Adressierbereich (Tabelle 1.17):<br />

A 15 A 14 A 13 Adressierbereich<br />

0 0 0 0000 bis 8191 0000 bis 1FFF<br />

0 0 1 8192 bis 16383 2000 bis 3FFF<br />

0 1 0 16384 bis 24575 4000 bis 5FFF<br />

0 1 1 24576 bis 32767 6000 bis 7FFF<br />

1 0 0 32768 bis 40959 8000 bis 9FFF<br />

1 0 1 40959 bis 49151 A000 bis BFFF<br />

1 1 0 49152 bis 57343 C000 bis DFFF<br />

1 1 1 57344 bis 65535 E000 bis FFFF<br />

Tabelle 1.17:<br />

Adressierbereich für das 8-Kbyte-RAM HM1-65642<br />

Durch die Adressierung ergibt sich e<strong>in</strong> Bereich <strong>in</strong> 8-Kbyte-Blöcken.<br />

Auf den externen Programmspeicher wird stets über e<strong>in</strong>e 16-Bit-Adresse zugegriffen,<br />

auf den externen Datenspeicher entweder über e<strong>in</strong>e 16-Bit-Adresse (MOVX<br />

@DPTR) oder e<strong>in</strong>e 8-Bit-Adresse (MOVX @Ri).<br />

Immer wenn e<strong>in</strong>e 16-Bit-Adresse verwendet wird, ersche<strong>in</strong>t das obere Adressbyte<br />

an Port 2, wo es für die Dauer des Lese- oder Schreibzyklus stehen bleibt. Wenn<br />

auf den Zyklus mit dem externen Speicher nicht e<strong>in</strong> weiterer derartiger Zyklus<br />

unmittelbar folgt, wird der unveränderte Inhalt des speziellen Funktionsregisters<br />

von Port 2 im nächsten Zyklus wieder ersche<strong>in</strong>en.<br />

Bei Verwendung e<strong>in</strong>er 8-Bit-Adresse (MOVX @Ri) bleibt der Inhalt des Zwischenspeichers<br />

von Port 2 während des gesamten Zyklus mit dem externen Speicher an<br />

den Anschlüssen von Port 2 erhalten. In jedem Fall ersche<strong>in</strong>t das untere Adressbyte<br />

im Zeitmultiplex mit dem Datenbyte an Port 0. Das Adress-/Datensignal<br />

treibt beide Feldeffekttransistoren <strong>in</strong> den Ausgangspuffern von Port 0. Daher s<strong>in</strong>d<br />

die Anschlüsse von Port 0 bei dieser Anwendung ke<strong>in</strong>e Open-Dra<strong>in</strong>-Ausgänge<br />

<strong>und</strong> erfordern somit ke<strong>in</strong>e externen Pull-up-Widerstände. Das Signal ALE<br />

(Address Latch Enable) soll dazu dienen, das Adressbyte <strong>in</strong> e<strong>in</strong>en externen Zwischenspeicher<br />

zu br<strong>in</strong>gen <strong>und</strong> das Adressbyte ist beim negativen Übergang von<br />

ALE gültig. In e<strong>in</strong>em Schreibzyklus ersche<strong>in</strong>t dann das zu schreibende Byte an<br />

Port 0, unmittelbar bevor WR aktiviert wird, <strong>und</strong> bleibt dort bis nach der Deaktivierung<br />

von WR stehen. Bei e<strong>in</strong>em Lesezyklus wird das ankommende Byte unmittelbar<br />

vor der Deaktivierung von RD an Port 0 entgegengenommen.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

71


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Während e<strong>in</strong>es jeden Zugriffs auf den externen Speicher schreibt die Zentrale<strong>in</strong>heit<br />

den Wert FFH <strong>in</strong> den Zwischenspeicher von Port 0 (d.h. <strong>in</strong> das betreffende<br />

spezielle Funktionsregister) <strong>und</strong> löscht damit die vorher vorhandene Information<br />

<strong>in</strong> diesem Register.<br />

Auf den externen Programmspeicher wird bei Erfüllung von wenigstens e<strong>in</strong>er der<br />

beiden Bed<strong>in</strong>gungen zugegriffen:<br />

1. Das Signal EA ist aktiv.<br />

2. Der Programmzähler (PC) enthält e<strong>in</strong>en Wert, der größer als 0FFFH ist.<br />

Dies macht es erforderlich, dass bei der Version ohne ROM (8031) die EA-E<strong>in</strong>heiten<br />

durch entsprechende Verdrahtung fest auf 0-Signal gelegt werden müssen, damit<br />

auf die unteren 4 Kbyte des externen Programmspeichers zugegriffen werden kann.<br />

Wenn die Zentrale<strong>in</strong>heit auf den externen Programmspeicher zugreift, s<strong>in</strong>d alle<br />

acht Anschlüsse von Port 2 <strong>in</strong> Ausgabe-Funktion <strong>und</strong> dürfen nicht für allgeme<strong>in</strong>e<br />

E/A-Zwecke verwendet werden. Wird der externe Programmspeicher angesprochen,<br />

so gibt Port 2 das obere Byte des Programmzählers aus, wird der externe<br />

Datenspeicher angesprochen <strong>und</strong> so stellt dieser Port entweder DPH oder den Wert<br />

des speziellen Funktionsregisters von Port 2 zur Verfügung. Dies ist davon abhängig,<br />

ob der Zugriff auf den externen Datenspeicher mit e<strong>in</strong>em Befehl MOVX @DPTR<br />

oder MOVX @Ri erfolgt.<br />

Abb. 1.20:<br />

Anschluss e<strong>in</strong>es Befehlsspeichers mit 8 Kbyte<br />

Abbildung 1.20 zeigt den Anschluss des Befehlsspeichers 27C64 mit 8 Kbyte an<br />

den Mikrocontroller. Die Daten <strong>und</strong> Adressen von D 0 bis D 7 <strong>und</strong> von A 0 bis A 7<br />

werden geme<strong>in</strong>sam über Port 0 ausgegeben. Die Datenleitungen liegen direkt an<br />

72<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.3<br />

Aufbau <strong>und</strong> Betrieb der Ports<br />

dem RAM an <strong>und</strong> die Adressenleitungen werden über den Bauste<strong>in</strong> 74373 zwischengespeichert.<br />

Die Steuerung für das EPROM 27C64 übernehmen die drei<br />

E<strong>in</strong>gänge PGM (Program Gate Memory), OE (Output Enable) <strong>und</strong> CE (Chip<br />

Enable). Der PGM-E<strong>in</strong>gang ist auf Masse gelegt <strong>und</strong> hat e<strong>in</strong> 0-Signal. Der<br />

EPROM-Bauste<strong>in</strong> wird freigegeben, wenn der CE-E<strong>in</strong>gang auf 0-Signal liegt. Der<br />

CE-E<strong>in</strong>gang ist direkt mit dem NOR-Ausgang verb<strong>und</strong>en <strong>und</strong> für den Adressierbereich<br />

gilt Tabelle 1.17. Der OE-E<strong>in</strong>gang wird mit dem PSEN-Ausgang verb<strong>und</strong>en<br />

<strong>und</strong> schaltet der Mikrocontroller se<strong>in</strong>en PSEN-Ausgang auf 0-Signal, gibt der<br />

EPROM-Bauste<strong>in</strong> se<strong>in</strong>e gespeicherten Informationen aus.<br />

1.3.7 Signal PSEN<br />

PSEN ist das Freigabesignal beim Zugriff auf den externen Programmspeicher; zum<br />

Lesen des <strong>in</strong>ternen Programmspeichers wird dieses Signal nicht aktiviert. Beim<br />

Zugriff der Zentrale<strong>in</strong>heit auf den externen Programmspeicher wird PSEN während<br />

e<strong>in</strong>es jeden Zyklus zweimal aktiviert (außer bei e<strong>in</strong>em MOVX-Befehl), <strong>und</strong> zwar<br />

unabhängig davon, ob das geholte Byte gerade für den momentan abzuarbeitenden<br />

Befehl benötigt wird oder nicht. Der zeitliche Verlauf des (aktivierten) Signals PSEN<br />

ist nicht derselbe wie von RD. E<strong>in</strong> vollständiger Zyklus von RD, e<strong>in</strong>schließlich Aktivierung<br />

<strong>und</strong> Deaktivierung von ALE <strong>und</strong> RD, dauert 12 Oszillatorperioden, e<strong>in</strong> vollständiger<br />

Zyklus von PSEN, e<strong>in</strong>schließlich Aktivierung <strong>und</strong> Deaktivierung von ALE<br />

<strong>und</strong> PSEN, jedoch nur sechs Oszillatorperioden. Die Impulsdiagramme für diese<br />

beiden Arten von Lesezyklen s<strong>in</strong>d zum Vergleich <strong>in</strong> Abbildung 1.21 dargestellt.<br />

1.3.8 Signal ALE<br />

Die Hauptaufgabe des Signals ALE besteht dar<strong>in</strong>, während des Zugriffs auf den<br />

externen Programmspeicher für die Aufnahme des unteren Adressbytes aus Port<br />

P0 <strong>in</strong> dem zugehörigen externen Zwischenspeicher zu sorgen. Hierfür wird ALE<br />

zweimal während e<strong>in</strong>es jeden Zyklus aktiviert. Dies geschieht auch dann, wenn<br />

der Zyklus ke<strong>in</strong>en externen Zugriff be<strong>in</strong>haltet. ALE fällt jedoch dann e<strong>in</strong>mal aus,<br />

wenn auf den externen Datenspeicher zugegriffen werden soll, <strong>und</strong> zwar fehlt das<br />

erste ALE-Signal des zweiten Zyklus e<strong>in</strong>es MOVX-Befehls. Daraus folgt, dass <strong>in</strong><br />

jedem System ohne externen Datenspeicher ALE stets mit e<strong>in</strong>er konstanten Frequenz<br />

von 1/6 der Oszillatorfrequenz auftritt <strong>und</strong> daher für externe Takt- oder<br />

Zeitgeberschaltungen verwendet werden kann.<br />

Bei e<strong>in</strong>igen Anwendungen kann es wünschenswert se<strong>in</strong>, e<strong>in</strong> Programm <strong>in</strong> demselben<br />

physischen Speicher abzulegen, der auch zum Speichern von Daten dient.<br />

Beim Mikrocontroller 8051 können die externen Programm- <strong>und</strong> Datenspeicherbereiche<br />

dadurch komb<strong>in</strong>iert werden, dass man e<strong>in</strong>e UND-Verknüpfung von<br />

PSEN <strong>und</strong> RD durchführt. Die UND-Verknüpfung (positive Logik) dieser beiden<br />

Signale erzeugt e<strong>in</strong> Lese-Strobesignal, das im aktiven Zustand auf 0-Signal ist <strong>und</strong><br />

für den komb<strong>in</strong>ierten Speicher verwendet werden kann. Da der PSEN-Zyklus kürzer<br />

als der RD-Zyklus ist, muss der externe Speicher schnell genug se<strong>in</strong>, um sich<br />

an den PSEN-Zyklus anpassen zu können.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

73


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.21:<br />

Impulsdiagramme zum Lesen aus dem externen Programmspeicher ohne MOVX-<br />

Befehl <strong>und</strong> mit MOVX-Befehl<br />

74<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.4<br />

Zeitgeber <strong>und</strong> Zähler im 8051<br />

1.4 Zeitgeber <strong>und</strong> Zähler im 8051<br />

Im 8051 s<strong>in</strong>d zwei 16-Bit-Zeitgeber/Zähler (0 <strong>und</strong> 1) <strong>in</strong>tegriert, die entweder als<br />

Zeitgeber oder Zähler sowie <strong>in</strong> vier Betriebsarten (0,1, 2 <strong>und</strong> 3) arbeiten können.<br />

Zu den Zeitgebern/Zählern gehören die speziellen Funktionsregister TMOD (Zeitgeber/Zähler-Betriebsartregister<br />

von Tabelle 1.18) <strong>und</strong> TCON (Zeitgeber/Zähler-<br />

Steuer/Statusregister von Tabelle 1.19). Sie dienen zur Festlegung von Funktion<br />

<strong>und</strong> Betriebsart bzw. zur Steuerung <strong>und</strong> Kennzeichnung der Zeitgeber/Zähler<br />

(z.B. für e<strong>in</strong>en Interrupt oder bei e<strong>in</strong>em Überlauf). Änderungen des Inhalts von<br />

TMOD oder TCON – sei es durch Hardware oder Software, abhängig von den e<strong>in</strong>zelnen<br />

Bits dieser Register – wirken sich ab S1P1 im ersten Zyklus des nächsten<br />

Befehls aus. Sämtliche Bits der genannten Register werden durch Rücksetzen<br />

gelöscht. Die genauen Funktionen der e<strong>in</strong>zelnen Bits dieser Register s<strong>in</strong>d aus<br />

Tabelle 1.18 <strong>und</strong> Tabelle 1.19 zu ersehen.<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

GATE C/T M1 M0 GATE C/T M1 M0<br />

<br />

<br />

Zeitgeber/Zähler 1 Zeitgeber/Zähler 0<br />

Kennzeichnungsbit Bit-Speicherstelle Funktion von GATE <strong>und</strong> C/T<br />

GATE TMOD.7.3 Steuerung durch e<strong>in</strong>e Logikschaltung. Wird<br />

es gesetzt, so ist der Zeitgeber/Zähler nur<br />

dann aktiviert, wenn der Anschluss INTx e<strong>in</strong><br />

1-Signal hat <strong>und</strong> das Steuerbit TRx gesetzt ist<br />

(x = 0,1). Ist GATE gelöscht, so wird der Zeitgeber/Zähler<br />

durch Setzen von TRx stets aktiviert.<br />

C/T TMOD.6.2 Festlegung, ob Betrieb als Zeitgeber oder<br />

Zähler erfolgt. Falls gelöscht, Betrieb als Zeitgeber<br />

(E<strong>in</strong>gangsimpulse vom <strong>in</strong>ternen Taktgeber).<br />

Falls gesetzt, Betrieb als Zähler<br />

(E<strong>in</strong>gangsimpulse vom Anschluss Tx).<br />

M1<br />

(TMOD.5.1)<br />

Tabelle 1.18:<br />

M0<br />

(TMOD.4.0)<br />

Betriebsart<br />

Funktion <strong>in</strong> der gewählten Betriebsart<br />

0 0 0 Die Bits 4 bis 0 stellen den Vorteiler dar<br />

(Division durch 32).<br />

0 1 1 THx <strong>und</strong> TLx s<strong>in</strong>d <strong>in</strong> Kaskade zum 16-Bit-<br />

Zeitgeber/Zähler zusammengeschaltet;<br />

e<strong>in</strong>en Vorteiler gibt es nicht.<br />

Zeitgeber/Zähler-Betriebsartregister (TMOD)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

75


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Tabelle 1.18:<br />

1 0 2 Der 8-Bit-Zeitgeber/Zähler THx mit automatischer<br />

Rückladung enthält e<strong>in</strong>en Wert, der<br />

nach TLx rückgeladen wird, wenn dort e<strong>in</strong><br />

Überlauf erfolgt.<br />

1 1 3 Zeitgeber/Zähler 0: TL0 ist e<strong>in</strong> 8-Bit-Zeitgeber/Zähler,<br />

der durch die Standard-Steuerbits<br />

von Zeitgeber/Zähler 0 gesteuert wird. TH0<br />

ist e<strong>in</strong> 8-Bit-Zeitgeber, der nur durch die<br />

Steuerbits von Zeitgeber/Zähler 1 gesteuert<br />

wird.<br />

1 1 3 Zeitgeber/Zähler 1: Dieser ist gestoppt.<br />

Zeitgeber/Zähler-Betriebsartregister (TMOD) (Forts.)<br />

Die Steuerbits C/T (TMOD.2 <strong>und</strong> TMOD.6) entscheiden darüber, ob die Zeitgeber/Zähler<br />

0 bzw. 1 als Zeitgeber bzw. Zähler betrieben werden. Wenn die E<strong>in</strong>heit<br />

als Zeitgeber (O/T = 0) arbeitet, wird ihr Register bei jedem Masch<strong>in</strong>enzyklus<br />

<strong>in</strong>krementiert, so dass diese praktisch gezählt werden. Da e<strong>in</strong> Masch<strong>in</strong>enzyklus<br />

aus 12 Oszillatorperioden besteht, beträgt die Zählrate 1/2 der Oszillatorfrequenz.<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0<br />

Kennzeichnungsbit Bit-Speicherstelle Funktion<br />

TF1 TCON.7 Kennzeichnungsbit für Überlauf von Zeitgeber/Zähler<br />

1. Wird beim Überlauf durch Hardware<br />

gesetzt <strong>und</strong> durch Hardware gelöscht,<br />

wenn der Prozessor e<strong>in</strong>e Interrupt-Rout<strong>in</strong>e<br />

anspr<strong>in</strong>gt.<br />

TR1 TCON.6 Steuerbit zur Inbetriebnahme von Zeitgeber/<br />

Zähler 1. Wird durch Software gesetzt/<br />

gelöscht, um Zeitgeber/Zähler 1 an- bzw.<br />

abzuschalten.<br />

TF0 TCON.5 Kennzeichnungsbit für Überlauf von Zeitgeber/Zähler<br />

0. Wird beim Überlauf durch<br />

Hardware gesetzt <strong>und</strong> durch Hardware<br />

gelöscht, wenn der Prozessor e<strong>in</strong>e Interrupt-<br />

Rout<strong>in</strong>e anspr<strong>in</strong>gt.<br />

TR0 TCON.4 Steuerbit zur Inbetriebnahme von Zeitgeber/<br />

Zähler 0. Wird durch Software gesetzt/<br />

gelöscht, um Zeitgeber/Zähler 0 an- bzw.<br />

abzuschalten.<br />

Tabelle 1.19:<br />

Zeitgeber/Zähler-Steuer/Statusregister (TCON)<br />

76<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.4<br />

Zeitgeber <strong>und</strong> Zähler im 8051<br />

IE1 TCON.3 Kennzeichnungsbit für externen Interrupt an<br />

INT1. Wird durch Hardware gesetzt, wenn<br />

e<strong>in</strong>e 1-0-Flanke zur Auslösung e<strong>in</strong>es externen<br />

Interrupts an INT1 erkannt wird, <strong>und</strong> bei der<br />

Ausführung des Interrupts gelöscht.<br />

IT1 TCON.2 Steuerbit für Interrupt an INT1. Wird durch<br />

Software gesetzt oder gelöscht, um entweder<br />

e<strong>in</strong>en flankenaktivierten (1-0-Übergang) oder<br />

e<strong>in</strong>en pegelaktivierten (aktiv 0-Signal) externen<br />

Interrupt zuzulassen.<br />

IE0 TCON.1 Kennzeichnungsbit für externen Interrupt an<br />

INT0. Wird durch Hardware gesetzt, wenn<br />

e<strong>in</strong>e 1-0-Flanke zur Auslösung e<strong>in</strong>es externen<br />

Interrupts an INT0 erkannt wird, <strong>und</strong> bei Ausführung<br />

des Interrupts gelöscht.<br />

IT0 TCON.0 Steuerbit für Interrupt an INT0. Wird durch<br />

Software gesetzt oder gelöscht, um entweder<br />

e<strong>in</strong>en flankenaktivierten (1-0-Übergang) oder<br />

e<strong>in</strong>en pegelaktivierten (aktiv 0-Signal) externen<br />

Interrupt zuzulassen.<br />

Tabelle 1.19:<br />

Zeitgeber/Zähler-Steuer/Statusregister (TCON) (Forts.)<br />

Arbeitet dieser als Zähler (C/T = 1), so wird das Register bei jeder 1-0-Flanke an<br />

dem entsprechenden externen Anschluss (T0 oder T1) <strong>in</strong>krementiert. Bei dieser<br />

Betriebsweise wird der externe Anschluss während des Zeitabschnitts S5P2 e<strong>in</strong>es<br />

jeden Masch<strong>in</strong>enzyklus abgefragt. Ergibt sich hierbei <strong>in</strong> e<strong>in</strong>em Zyklus 1-Signal<br />

<strong>und</strong> im nächsten 0-Signal, wird der Zähler <strong>in</strong>krementiert. Der neue Zählwert<br />

ersche<strong>in</strong>t im Register während des Zeitabschnitts S3P1 <strong>in</strong> dem Zyklus unmittelbar<br />

nach jenem, <strong>in</strong> dem der Übergang erkannt wurde. Da es zwei Masch<strong>in</strong>enzyklen<br />

(24 Oszillatorperioden) dauert, um e<strong>in</strong>e 1-0-Flanke (negativ) zu erkennen, beträgt<br />

die Zählrate maximal 1/24 der Oszillatorfrequenz. Bezüglich der Zyklen äußerer<br />

E<strong>in</strong>gangssignale gibt es ke<strong>in</strong>e Beschränkungen; um jedoch sicherzustellen, dass<br />

e<strong>in</strong> gegebener Pegel wenigstens e<strong>in</strong>mal abgefragt wird, bevor er sich ändert, sollte<br />

er m<strong>in</strong>destens bei e<strong>in</strong>em vollen Masch<strong>in</strong>enzyklus stehen bleiben.<br />

Außer der Möglichkeit, zwischen der Funktion als Zeitgeber oder Zähler zu wählen,<br />

gibt es noch vier verschiedene Betriebsarten, die durch die Bitpaare M1, M0 im<br />

speziellen Funktionsregister TMOD festgelegt werden. Die Betriebsarten 0, 1 <strong>und</strong> 2<br />

s<strong>in</strong>d bei beiden Zeitgebern/Zählern dieselben, Betriebsart 3 ist unterschiedlich.<br />

Die vier Betriebsarten werden im Folgenden beschrieben. Abbildung 1.22 zeigt<br />

den Mikrocontroller 8051 <strong>in</strong> e<strong>in</strong>er simulierten Schaltung mit externem Taktgeber<br />

<strong>und</strong> <strong>in</strong>terner Zählfunktion.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

77


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.22:<br />

Mikrocontroller 8051 mit externem Taktgeber <strong>und</strong> <strong>in</strong>terner Zählfunktion<br />

Betriebsart 0: Wie im vorigen Abschnitt dargelegt, ist die Betriebsart 0 beim Zeitgeber/Zähler<br />

0 <strong>und</strong> beim Zeitgeber/Zähler 1 identisch. Bei der zur Erläuterung<br />

dieser Betriebsart dienenden Abbildung 1.23 wird auf Zeitgeber/Zähler 1 Bezug<br />

genommen; für Zeitgeber/Zähler 0 s<strong>in</strong>d lediglich die Bezeichnungen T0, TF0,<br />

INT0, TL0 <strong>und</strong> TH0 anstelle der entsprechenden, zum Zeitgeber/Zähler 1 gehörenden<br />

Bezeichnungen e<strong>in</strong>zusetzen. Für die Zeitgeber/Zähler 0 <strong>und</strong> 1 gibt es je<br />

e<strong>in</strong> Bit GATE (TMOD.3 <strong>und</strong> TMOD.7).<br />

Abb. 1.23:<br />

Blockschaltung von Zeitgeber/Zähler <strong>in</strong> Betriebsart 0 (13-Bit-Zähler)<br />

In Betriebsart 0 verhält sich der Zeitgeber/Zähler 0 oder 1 wie der 8048-Zeitgeber,<br />

der e<strong>in</strong> 8-Bit-Zähler mit Vorteilung durch 32 ist. Wie Abbildung 1.23 zeigt, ist das<br />

78<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.4<br />

Zeitgeber <strong>und</strong> Zähler im 8051<br />

Zeitgeber/Zähler-Register <strong>in</strong> dieser Betriebsart e<strong>in</strong> 13-Bit-Register. Wenn bei der<br />

Zählung e<strong>in</strong> Überlauf vom Zustand »Nur E<strong>in</strong>sen« <strong>in</strong> den Zustand »Nur Nullen«<br />

erfolgt, setzt dieses Register das Zeitgeber-Interrupt-Kennzeichnungsbit TF1. Die<br />

Zählung am E<strong>in</strong>gang des Zeitgebers/Zählers 1 ist dann freigegeben, wenn TR1 = 1<br />

gesetzt ist <strong>und</strong> außerdem entweder GATE = 0 oder INT1 = 1 gilt. (Mit GATE = 1<br />

kann der Zeitgeber/Zähler über den externen E<strong>in</strong>gang INT1 gesteuert werden,<br />

wodurch Pulsbreitenmessungen erleichtert werden.)<br />

TR1 ist e<strong>in</strong> Steuerbit im speziellen Funktionsregister TCON (Tabelle 1.19) <strong>und</strong><br />

GATE ist e<strong>in</strong> Steuerbit im speziellen Funktionsregister TMOD (Tabelle 1.18).<br />

Das 13-Bit-Register besteht aus sämtlichen acht Bits des speziellen Funktionsregisters<br />

TH1 <strong>und</strong> den unteren fünf Bits des speziellen Funktionsregisters TL1. Die<br />

oberen Bits von TL1 s<strong>in</strong>d unbestimmt <strong>und</strong> sollten nicht beachtet werden. Durch<br />

Setzen des Kennzeichnungsbits »Inbetriebnahme« (TR1) werden die Register<br />

nicht gelöscht.<br />

Betriebsart 1: Betriebsart 1 ist mit Betriebsart 0 identisch, ausgenommen, dass das<br />

Zeitgeber/Zähler-Register <strong>in</strong> Betriebsart 1 im 16-Bit-Format betrieben wird.<br />

Betriebsart 2: Bei dieser Betriebsart wird das Zeitgeber/Zähler-Register zu e<strong>in</strong>em<br />

8-Bit-Zähler (TL1) mit automatischer Rückladung, wie <strong>in</strong> Abbildung 1.24 dargestellt<br />

ist. E<strong>in</strong> Überlauf von TL1 setzt nicht nur TF1‚ sondern lädt auch den Inhalt<br />

von TH1 nach TL1 zurück; TH1 wird vorher per Software e<strong>in</strong>gestellt. TH1 wird<br />

durch den Rückladevorgang nicht geändert.<br />

Abb. 1.24:<br />

Blockschaltung von Zeitgeber/Zähler <strong>in</strong> Betriebsart 2 (automatische Rückladung)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

79


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Betriebsart 2 von Zeitgeber/Zähler 1 <strong>und</strong> Betriebsart 2 von Zeitgeber/Zähler 0<br />

s<strong>in</strong>d gleich.<br />

Betriebsart 3: Wird Zeitgeber/Zähler 1 <strong>in</strong> Betriebsart 3 gebracht, so ändert sich se<strong>in</strong><br />

Inhalt nicht. In den anderen Betriebsarten lässt sich dies durch TR1 = 0 erreichen.<br />

Abb. 1.25:<br />

Blockschaltung des Zeitgebers/Zählers<br />

Zeitgeber/Zähler 0 <strong>in</strong> Betriebsart 3 richtet TL0 <strong>und</strong> TH0 als zwei getrennte Zähler<br />

e<strong>in</strong>. Abbildung 1.25 zeigt die Logik von Zeitgeber/Zähler 0 <strong>und</strong> 1 <strong>in</strong> dieser<br />

Betriebsart. Daraus ist ersichtlich, dass TL0 die Steuerbits C/T, GATE, TR0, INT0<br />

<strong>und</strong> TF0 von Zeitgeber/Zähler 0 verwendet <strong>und</strong> TH0 somit nur als Zeitgeber<br />

benutzt werden kann (Zählen von Masch<strong>in</strong>enzyklen). Dabei nimmt TH0 jetzt TR1<br />

<strong>und</strong> TF1 von Zeitgeber/Zähler 1 <strong>in</strong> Anspruch, so dass TH0 nun den Interrupt von<br />

Zeitgeber/Zähler 1 steuert.<br />

Betriebsart 3 ist für solche Anwendungen vorgesehen, die e<strong>in</strong>en weiteren 8-Bit-<br />

Zeitgeber oder -Zähler benötigen. Mit dem Zeitgeber/Zähler 0 <strong>in</strong> Betriebsart 3<br />

stellt sich der 8051 als Mikrocontroller mit drei Zeitgebern/Zählern dar. Bef<strong>in</strong>det<br />

sich Zeitgeber/Zähler 0 <strong>in</strong> Betriebsart 3, so lässt sich Zeitgeber/Zähler 1 e<strong>in</strong>- <strong>und</strong><br />

ausschalten, <strong>in</strong>dem man ihn aus se<strong>in</strong>er Betriebsart 3 herausnimmt bzw. ihn <strong>in</strong><br />

80<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.5<br />

Serielle Schnittstelle<br />

diese h<strong>in</strong>e<strong>in</strong>br<strong>in</strong>gt. Außerhalb Betriebsart 3 kann er dann vom seriellen Port als<br />

Baudratengenerator verwendet werden oder <strong>in</strong> jeder anderen Anwendung arbeiten,<br />

die ke<strong>in</strong>en Interrupt erfordert (TF1 ist für ihn jetzt nicht verfügbar).<br />

1.5 Serielle Schnittstelle<br />

Der serielle Port ist e<strong>in</strong> Vollduplex-Port, der also gleichzeitig senden <strong>und</strong> empfangen<br />

kann. Er ist außerdem empfängerseitig gepuffert, das heißt, er kann bereits<br />

mit dem Empfang e<strong>in</strong>es zweiten Bytes beg<strong>in</strong>nen, bevor das vorher empfangene<br />

Byte vom Empfängerregister gelesen wurde. Ist jedoch das erste Byte dann noch<br />

nicht gelesen, wenn das zweite Byte vollständig ist, so geht e<strong>in</strong>es der Bytes verloren.<br />

Sowohl das serielle Sender- als auch das Empfängerregister des Ports werden<br />

über das spezielle Funktionsregister SBUF angesprochen; Schreiben <strong>in</strong> SBUF lädt<br />

das Senderegister, <strong>und</strong> Lesen aus SBUF greift auf e<strong>in</strong> räumlich getrenntes Empfängerregister<br />

zu. Abbildung 1.26 zeigt die simulierte Schaltung e<strong>in</strong>er seriellen<br />

Schnittstelle mit dem Mikrocontroller 8051 <strong>und</strong> dem Schnittstellenbauste<strong>in</strong><br />

MAX232.<br />

Abb. 1.26:<br />

Simulierte Schaltung e<strong>in</strong>er seriellen Schnittstelle mit dem Mikrocontroller 8051 <strong>und</strong><br />

dem Schnittstellenbauste<strong>in</strong> MAX232<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

81


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

1.5.1 Betriebsarten des seriellen Ports<br />

Der serielle Port kann <strong>in</strong> e<strong>in</strong>er von vier Betriebsarten arbeiten, was durch das spezielle<br />

Funktionsregister SCON (Steuer- <strong>und</strong> Statusregister für den seriellen Port)<br />

vorgegeben wird. Außer den hierfür erforderlichen Bits zur Betriebsart-Auswahl<br />

enthält dieses Register auch das 9. Datenbit, das beim Senden <strong>und</strong> Empfangen<br />

bestimmte Funktionen erfüllt (TB8 bzw. RB8), sowie die Interrupt-Kennzeichnungsbits<br />

des seriellen Ports (TI <strong>und</strong> RI), e<strong>in</strong> Bit zur Empfangsfreigabe serieller<br />

Daten (REN) <strong>und</strong> e<strong>in</strong>e weitere Bitstelle. Die Funktionen der Bits <strong>in</strong> SCON s<strong>in</strong>d <strong>in</strong><br />

Tabelle 1.20 aufgelistet; <strong>in</strong> ihrem unteren Teil s<strong>in</strong>d die vier Betriebsarten des seriellen<br />

Ports angegeben. Abbildung 1.27 zeigt den Aufbau der Datenblöcke bei typischen<br />

Anwendungen mit Angabe der Betriebsarten. Diese werden im Folgenden<br />

näher beschrieben.<br />

Abb. 1.27:<br />

Aufbau typischer Datenblöcke für e<strong>in</strong>ige Anwendungen<br />

82<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.5<br />

Serielle Schnittstelle<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

SM0 SM1 SM2 REN TB8 RB8 TI RI<br />

Kennzeichnungsbit Bit-Speicherstelle Funktion<br />

SM0, SM1 SCON.6,7 siehe Seite 84<br />

SM2 SCON.5 Bit für Multiprozessor-Datenübertragung. Es<br />

gibt die Datenübertragung <strong>in</strong> e<strong>in</strong>em Multiprozessorsystem<br />

<strong>in</strong> den Betriebsarten 2 <strong>und</strong><br />

3 frei. Ist SM2 <strong>in</strong> den Betriebsarten 2 oder 3<br />

auf 1-Signal gesetzt, so wird RI nicht aktiviert,<br />

wenn das empfangene 9. Datenbit<br />

(RB8) den Wert Null hat. Ist SM2 <strong>in</strong> Betriebsart<br />

1 auf 1-Signal gesetzt, so wird RI nicht<br />

aktiviert, wenn ke<strong>in</strong> gültiges Stoppbit empfangen<br />

wurde. In Betriebsart 0 sollte SM2<br />

auf 0-Signal se<strong>in</strong>.<br />

REN SCON.4 Bit für Empfangsfreigabe. Wird durch Software<br />

gesetzt/gelöscht, um den Empfang serieller<br />

Daten zuzulassen/nicht zuzulassen.<br />

TB8 SCON.3 9. Datenbit, das <strong>in</strong> den Betriebsarten 2 <strong>und</strong> 3<br />

gesendet wird. Kann durch Software gesetzt<br />

oder gelöscht werden.<br />

RB8 SCON.2 9. Datenbit, das <strong>in</strong> den Betriebsarten 2 <strong>und</strong> 3<br />

empfangen wurde. Ist SM2 <strong>in</strong> Betriebsart 1<br />

auf null gesetzt, so stellt RB8 das empfangene<br />

Stoppbit dar. In Betriebsart 0 wird RB8<br />

nicht verwendet.<br />

TI SCON.1 Sende-Interrupt-Kennzeichnungsbit. Wird <strong>in</strong><br />

Betriebsart 0 durch Hardware am Ende der<br />

für das 8. Bit vorgesehenen Zeit gesetzt, bei<br />

den übrigen Betriebsarten am Anfang des<br />

Stoppbits. Dies gilt für jedes serielle Senden.<br />

Löschen muss durch Software erfolgen.<br />

RI SCON.0 Empfänger-Interrupt-Kennzeichnungsbit.<br />

Wird <strong>in</strong> Betriebsart 0 durch Hardware am<br />

Ende der für das 8. Bit vorgesehenen Zeit<br />

gesetzt, bei den übrigen Betriebsarten <strong>in</strong> der<br />

Mitte der für das Stoppbit vorgesehenen Zeit.<br />

Dies gilt für jeden seriellen Empfang. Ausnahmen<br />

werden zu SM2 erläutert. Löschen<br />

muss durch Software erfolgen.<br />

Tabelle 1.20: Steuer-/Statusregister des seriellen Ports (SCON)<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

83


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

SM0<br />

(SCON.7)<br />

SM1<br />

(SCON.6)<br />

Betriebsart<br />

Funktion <strong>in</strong> der gewählten Betriebsart<br />

0 0 0 E/A-Erweiterung durch Schieberegister,<br />

Baudrate 1/12 der Taktfrequenz<br />

0 1 1 8-Bit-UART, variable Baudrate<br />

1 0 2 9-Bit-UART, die Baudrate beträgt entweder<br />

1/32 oder 1/64 der Taktfrequenz<br />

1 1 3 9-Bit-UART, variable Baudrate<br />

Tabelle 1.20: Steuer-/Statusregister des seriellen Ports (SCON) (Forts.)<br />

Die Funktionen der Bits <strong>in</strong> SCON s<strong>in</strong>d <strong>in</strong> Tabelle 1.20 aufgelistet; <strong>in</strong> ihrem unteren<br />

Teil s<strong>in</strong>d die vier Betriebsarten des seriellen Ports angegeben. Abbildung 1.27<br />

zeigt den Aufbau der Datenblöcke bei typischen Anwendungen mit Angabe der<br />

Betriebsarten. Diese werden im Folgenden näher beschrieben.<br />

Betriebsart 0: Serielle Daten werden durch RXD sowohl empfangen als auch ausgegeben.<br />

TXD ist der Ausgang für den Schiebetaktimpuls. Es werden acht Datenbits<br />

empfangen oder ausgegeben, <strong>und</strong> zwar das niedrigstwertige Bit zuerst. Die Baudrate<br />

ist zu 1/12 der Oszillatorfrequenz festgelegt.<br />

1.5.2 Senden <strong>und</strong> Empfangen von Informationen<br />

Der Empfang von Daten wird durch die Bed<strong>in</strong>gungen REN = 1 <strong>und</strong> RI = 0 e<strong>in</strong>geleitet.<br />

Während S 6 P 2 des nächsten Masch<strong>in</strong>enzyklus schreibt die Steuere<strong>in</strong>heit RX<br />

die Bits 11111110 <strong>in</strong> das Empfänger-Schieberegister <strong>und</strong> aktiviert <strong>in</strong> der nächsten<br />

Taktphase das Signal »RECEIVE«.<br />

Sobald Datenbits von rechts h<strong>in</strong>e<strong>in</strong>geschoben werden, fallen E<strong>in</strong>sen nach l<strong>in</strong>ks<br />

heraus. Ist die Null, die ursprünglich <strong>in</strong> die Speicherstelle ganz rechts geladen<br />

worden war, ganz l<strong>in</strong>ks im Schieberegister angekommen, so wird die Steuere<strong>in</strong>heit<br />

RX veranlasst, e<strong>in</strong>e letzte Verschiebung um e<strong>in</strong>e Speicherstelle vorzunehmen<br />

<strong>und</strong> SBUF zu laden. Während S1P1 des 10. Masch<strong>in</strong>enzyklus nach dem Schreiben<br />

<strong>in</strong> SCON durch RI gelöscht wurde, wird »RECEIVE« deaktiviert <strong>und</strong> RI gesetzt.<br />

Betriebsart 1: Hier werden zehn Bits ausgegeben (über TXD) oder empfangen (über<br />

RXD): e<strong>in</strong> Startbit (0), acht Datenbits (das niedrigstwertige Bit zuerst) <strong>und</strong> e<strong>in</strong><br />

Stoppbit (1). Beim Empfang nimmt RB8 <strong>in</strong> SCON das Stoppbit auf. Die Baudrate<br />

wird durch die Überlaufrate von Zeitgeber 1 festgelegt.<br />

Die Ausgabe wird durch jeden Befehl e<strong>in</strong>geleitet, der SBUF als Zielregister verwendet.<br />

Das Signal »Schreiben <strong>in</strong> SBUF« lädt auch e<strong>in</strong> 1-Signal <strong>in</strong> die 9. Bitposition<br />

des Sender-Schieberegisters <strong>und</strong> teilt der Steuere<strong>in</strong>heit TX mit, dass e<strong>in</strong>e<br />

Ausgabe verlangt wird. Diese beg<strong>in</strong>nt dann während S1P1 desjenigen Masch<strong>in</strong>enzyklus,<br />

der auf den nächsten Überlauf des die Überläufe von Zeitgeber/Zähler 1<br />

84<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.5<br />

Serielle Schnittstelle<br />

durch 16 dividierenden Zählers folgt. Somit s<strong>in</strong>d die Bitzeiten <strong>in</strong> Bezug auf diesen<br />

Zähler synchronisiert, nicht <strong>in</strong> Bezug auf das Signal »Schreiben <strong>in</strong> SBUF«.<br />

Die Ausgabe beg<strong>in</strong>nt mit der Aktivierung von SEND, wodurch das Startbit an TXD<br />

ersche<strong>in</strong>t. E<strong>in</strong>e Bitzeit später wird DATA aktiviert, was zur Freigabe der auszugebenden<br />

Bits des Sender-Schieberegisters nach TXD führt. Der erste Schiebeimpuls<br />

tritt e<strong>in</strong>e Bitzeit danach auf.<br />

Sobald Datenbits nach rechts h<strong>in</strong>ausgeschoben werden, kommen Nullen von l<strong>in</strong>ks<br />

entsprechend den Taktimpulsen h<strong>in</strong>e<strong>in</strong>. Ist das höchstwertige Bit des Datenbytes<br />

am Ausgang des Schieberegisters angekommen, so bef<strong>in</strong>det sich e<strong>in</strong> 1-Signal, das<br />

ursprünglich <strong>in</strong> die 9. Speicherstelle geladen worden war, unmittelbar l<strong>in</strong>ks neben<br />

dem höchstwertigen Bit, <strong>und</strong> alle übrigen Speicherstellen l<strong>in</strong>ks davon enthalten<br />

nur Nullen. Diese Konstellation veranlasst die Steuere<strong>in</strong>heit TX, e<strong>in</strong>e letzte Verschiebung<br />

um e<strong>in</strong>e Speicherstelle vorzunehmen, danach SEND zu deaktivieren<br />

<strong>und</strong> TI zu setzen. Dies erfolgt beim 10. Überlauf des durch 16 dividierenden Zählers<br />

nach dem Signal »Schreiben <strong>in</strong> SBUF«.<br />

Der Empfang von Daten wird e<strong>in</strong>geleitet, sobald e<strong>in</strong> Übergang von 1 nach 0 an<br />

RXD entdeckt ist. Zu diesem Zweck erfolgt – unabhängig von der e<strong>in</strong>gestellten<br />

Baudrate – e<strong>in</strong>e 16-malige Abfrage von RXD. Ist e<strong>in</strong> Übergang entdeckt worden, so<br />

wird der durch 16 dividierende Zähler sofort zurückgesetzt <strong>und</strong> 1FFH <strong>in</strong> das Empfänger-Schieberegister<br />

geschrieben. Das Rücksetzen des durch 16 dividierenden<br />

Zählers führt zur Synchronisation se<strong>in</strong>er Überläufe mit den Zeiten, die für die<br />

ankommenden Bits zur Verfügung stehen.<br />

Die 16 Zählerschritte teilen jede Bitzeit <strong>in</strong> Sechzehntel e<strong>in</strong>. Während des 7., 8. <strong>und</strong><br />

9. Zählerschritts jeder Bitzeit überprüft der Bitdetektor den an RXD stehenden<br />

Wert. Der akzeptierte Wert ist derjenige, der bei wenigstens zwei der drei Abfragen<br />

festgestellt wurde. Dies geschieht zur Rauschunterdrückung. Beträgt der während<br />

der 1. Bitzeit akzeptierte Wert nicht null, so werden die Empfangsschaltungen<br />

zurückgesetzt, <strong>und</strong> die E<strong>in</strong>heit wartet auf e<strong>in</strong>en weiteren Übergang von 1 nach 0.<br />

Dies dient zur Rückweisung falscher Startbits. Ist das Startbit als gültig erkannt,<br />

wird es <strong>in</strong> das Empfänger-Schieberegister übernommen <strong>und</strong> danach ebenfalls der<br />

restliche Datenblock.<br />

Sobald Datenbits von rechts h<strong>in</strong>e<strong>in</strong>geschoben werden, fallen E<strong>in</strong>sen nach l<strong>in</strong>ks<br />

heraus. Ist das Startbit ganz l<strong>in</strong>ks im Schieberegister angekommen (bei Betriebsart<br />

1 e<strong>in</strong> 9-Bit-Register), so wird die Steuere<strong>in</strong>heit RX veranlasst, e<strong>in</strong>e letzte Verschiebung<br />

um e<strong>in</strong>e Speicherstelle vorzunehmen, SBUF mit RB8 zu laden sowie<br />

RI zu setzen. Das Signal zum Laden von SBUF <strong>und</strong> RB8 sowie zum Setzen von<br />

RI wird dann <strong>und</strong> nur dann erzeugt, wenn folgende Bed<strong>in</strong>gungen während der<br />

Erzeugung des letzten Schiebeimpulses erfüllt s<strong>in</strong>d:<br />

1. RI = 0<br />

2. entweder ist SM2 = 0 oder das empfangene Stoppbit = 1.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

85


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Ist e<strong>in</strong>e dieser zwei Bed<strong>in</strong>gungen nicht erfüllt, so ist der empfangene Block unwiederbr<strong>in</strong>glich<br />

verloren. Bei Erfüllung beider Bed<strong>in</strong>gungen nimmt RB8 das Stoppbit<br />

auf, SBUF die acht Datenbits, <strong>und</strong> RI wird aktiviert. Unabhängig davon, ob die<br />

obigen Bed<strong>in</strong>gungen erfüllt s<strong>in</strong>d oder nicht, beg<strong>in</strong>nt die E<strong>in</strong>heit zu dieser Zeit wieder,<br />

auf e<strong>in</strong>en Übergang von 1 nach 0 an RXD zu warten.<br />

Betriebsarten 2 <strong>und</strong> 3: Hier werden elf Bits ausgegeben (über TXD) oder empfangen<br />

(über RXD): e<strong>in</strong> Startbit mit 0-Signal gekennzeichnet, acht Datenbits (das<br />

niedrigstwertige Bit zuerst), e<strong>in</strong> programmierbares 9. Datenbit <strong>und</strong> e<strong>in</strong> Stoppbit<br />

mit 1-Signal gekennzeichnet. Soll ausgegeben werden, so kann dem 9. Datenbit<br />

(TB8) der Wert 0 oder 1 zugewiesen werden. Beim Empfang wird das 9. Datenbit<br />

von RB8 <strong>in</strong> SCON aufgenommen. In Betriebsart 2 beträgt die Baudrate entweder<br />

1/32 oder 1/64 der Oszillatorfrequenz, <strong>in</strong> Betriebsart 3 wird sie von der durch 16<br />

oder 32 dividierten Überlaufrate des Zeitgebers 1 festgelegt.<br />

Hierdurch ist e<strong>in</strong>e automatische Inbetriebnahme von Slave-Prozessoren durch<br />

e<strong>in</strong>e Adressblock-Erkennung möglich. Diese erfolgt mittels Interrupts, was zu<br />

e<strong>in</strong>er Vere<strong>in</strong>fachung des Datenaustausches zwischen den Mikrocontrollern (8051)<br />

führt. Die Ausgabe wird durch jeden Befehl e<strong>in</strong>geleitet, der SBUF als Zielregister<br />

verwendet. Das Signal »Schreiben <strong>in</strong> SBUF« lädt auch TB8 <strong>in</strong> die 9. Bitposition<br />

des Sender-Schieberegisters <strong>und</strong> teilt der Steuere<strong>in</strong>heit TX mit, dass e<strong>in</strong>e Ausgabe<br />

verlangt wird. Diese beg<strong>in</strong>nt dann während S1P1 desjenigen Masch<strong>in</strong>enzyklus, der<br />

auf den nächsten Überlauf <strong>in</strong> dem durch 16 dividierenden Zähler folgt. Somit s<strong>in</strong>d<br />

die Bitzeiten <strong>in</strong> Bezug auf diesen Zähler synchronisiert, nicht <strong>in</strong> Bezug auf das<br />

Signal »Schreiben <strong>in</strong> SBUF«.<br />

Die Ausgabe beg<strong>in</strong>nt mit der Aktivierung von SEND, wodurch das Startbit an TXD<br />

ersche<strong>in</strong>t. E<strong>in</strong>e Bitzeit später wird DATA aktiviert, was zur Freigabe des auszugebenden<br />

Bits des Sender-Schieberegisters nach TXD führt. Der erste Schiebeimpuls<br />

tritt e<strong>in</strong>e Bitzeit danach auf; er taktet e<strong>in</strong> 1-Signal (das Stoppbit) <strong>in</strong> die<br />

9. Bitposition des Schieberegisters. Danach werden nur Nullen h<strong>in</strong>e<strong>in</strong>getaktet.<br />

Sobald daher Datenbits nach rechts h<strong>in</strong>ausgeschoben werden, kommen Nullen<br />

von l<strong>in</strong>ks entsprechend den Taktimpulsen h<strong>in</strong>e<strong>in</strong>. Ist TB8 am Ausgang des Schieberegisters<br />

angekommen, so bef<strong>in</strong>det sich das Stoppbit unmittelbar l<strong>in</strong>ks daneben,<br />

<strong>und</strong> alle übrigen Speicherstellen l<strong>in</strong>ks davon enthalten nur Nullen. Diese<br />

Konstellation veranlasst die Steuere<strong>in</strong>heit TX, e<strong>in</strong>e letzte Verschiebung um e<strong>in</strong>e<br />

Speicherstelle vorzunehmen, danach SEND zu deaktivieren <strong>und</strong> TI zu setzen.<br />

Dies erfolgt beim 11. Überlauf des durch 16 dividierenden Zählers nach dem Signal<br />

»Schreiben <strong>in</strong> SBUF«.<br />

Der Empfang von Daten wird e<strong>in</strong>geleitet, sobald e<strong>in</strong> Übergang von 1 nach 0 (negative<br />

Flanke) an RXD entdeckt wurde. Zu diesem Zweck erfolgt – unabhängig von<br />

der e<strong>in</strong>gestellten Baudrate – e<strong>in</strong>e 16-malige Abfrage von RXD. Ist e<strong>in</strong> Übergang<br />

entdeckt worden, so wird der durch 16 dividierende Zähler sofort zurückgesetzt<br />

<strong>und</strong> 1FFH <strong>in</strong> das Empfangs-Schieberegister geschrieben.<br />

86<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.5<br />

Serielle Schnittstelle<br />

Während des 7., 8. <strong>und</strong> 9. Zählerschritts jeder Bitzeit überprüft der Bitdetektor den<br />

an RXD stehenden Wert. Der akzeptierte Wert ist derjenige, der bei wenigstens zwei<br />

der drei Abfragen festgestellt wurde. Beträgt der während der ersten Bitzeit akzeptierte<br />

Wert nicht null, so werden die Empfangsschaltungen zurückgesetzt, <strong>und</strong> die<br />

E<strong>in</strong>heit wartet auf e<strong>in</strong>en weiteren Übergang von 1 nach 0 (negative Flanke). Ist das<br />

Startbit als gültig erkannt, wird es <strong>in</strong> das Empfänger-Schieberegister übernommen<br />

<strong>und</strong> danach ebenfalls der restliche Datenblock.<br />

Sobald Datenbits von rechts h<strong>in</strong>e<strong>in</strong>geschoben werden, fallen E<strong>in</strong>sen nach l<strong>in</strong>ks<br />

heraus. Ist das Startbit ganz l<strong>in</strong>ks im Schieberegister angekommen (bei den<br />

Betriebsarten 2 <strong>und</strong> 3 e<strong>in</strong> 9-Bit-Register), so wird die Steuere<strong>in</strong>heit RX veranlasst,<br />

e<strong>in</strong>e letzte Verschiebung um e<strong>in</strong>e Speicherstelle vorzunehmen, SBUF <strong>und</strong> RB8 zu<br />

laden sowie RI zu setzen. Das Signal zum Laden von SBUF <strong>und</strong> RB8 sowie zum<br />

Setzen von RI wird dann <strong>und</strong> nur dann erzeugt, wenn folgende Bed<strong>in</strong>gungen<br />

während der Erzeugung des letzten Schiebeimpulses erfüllt s<strong>in</strong>d:<br />

1. RI = 0 <strong>und</strong><br />

2. entweder ist SM2 = 0 oder das empfangene 9. Datenbit = 1.<br />

Ist e<strong>in</strong>e dieser Bed<strong>in</strong>gungen nicht erfüllt, so ist der empfangene Block unwiederbr<strong>in</strong>glich<br />

verloren, <strong>und</strong> RI wird nicht gesetzt. Bei Erfüllung beider Bed<strong>in</strong>gungen<br />

nimmt RB8 das empfangene 9. Datenbit auf <strong>und</strong> SBUF die ersten acht Datenbits.<br />

Unabhängig davon, ob die obigen Bed<strong>in</strong>gungen erfüllt s<strong>in</strong>d oder nicht, beg<strong>in</strong>nt die<br />

E<strong>in</strong>heit e<strong>in</strong>e Bitzeit später erneut auf e<strong>in</strong>en Übergang von 1 nach 0 (negative<br />

Flanke) an RXD zu warten.<br />

Man beachte, dass der Wert des empfangenen Stoppbits ohne E<strong>in</strong>fluss auf SBUF,<br />

RB8 oder RI ist.<br />

1.5.3 Datenverkehr <strong>in</strong> Multiprozessorsystemen<br />

Die Betriebsarten 2 <strong>und</strong> 3 be<strong>in</strong>halten e<strong>in</strong>e spezielle Vorkehrung zum Datenverkehr<br />

<strong>in</strong> Multiprozessorsystemen. Bei diesen Betriebsarten werden neun Bits empfangen,<br />

wobei das 9. Bit von RB8 aufgenommen wird. Danach kommt das<br />

Stoppbit. Der Port kann so programmiert werden, dass nach Empfang des Stoppbits<br />

e<strong>in</strong> Interrupt des seriellen Ports nur dann ausgelöst wird, wenn RB8 = 1 ist.<br />

Dies wird durch Setzen von SM2 <strong>in</strong> SCON erreicht.<br />

E<strong>in</strong>e Möglichkeit zur Verwendung dieses Merkmals <strong>in</strong> Multiprozessorsystemen<br />

besteht <strong>in</strong> Folgendem: Wenn der Master-Mikrocontroller e<strong>in</strong>en Datenblock an<br />

e<strong>in</strong>en von mehreren Slaves übertragen will, sendet er zunächst e<strong>in</strong> Adressbyte aus,<br />

das den betreffenden Slave identifiziert. E<strong>in</strong> Adressbyte unterscheidet sich<br />

dadurch von e<strong>in</strong>em Datenbyte, dass das 9. Bit des Adressbytes e<strong>in</strong>e E<strong>in</strong>s enthält,<br />

das 9. Bit des Datenbytes dagegen e<strong>in</strong> 0-Signal. Ist SM2 = 1 gesetzt, so wird bei den<br />

Slaves ke<strong>in</strong> Interrupt durch e<strong>in</strong> Datenbyte ausgelöst, durch e<strong>in</strong> Adressbyte dagegen<br />

erfolgt e<strong>in</strong> Interrupt bei allen Slaves. Somit kann jeder Slave das empfangene<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

87


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Adressbyte daraufh<strong>in</strong> überprüfen, ob er adressiert wurde. Der adressierte Slave<br />

löscht se<strong>in</strong> Bit SM2 <strong>und</strong> trifft Vorbereitungen, um die ankommenden Datenbytes<br />

<strong>in</strong> Empfang zu nehmen. Die nicht adressierten Slaves lassen h<strong>in</strong>gegen ihre Bits<br />

SM2 gesetzt <strong>und</strong> fahren mit der Bearbeitung ihrer Aufgaben fort. Ankommende<br />

Datenbytes werden dabei nicht berücksichtigt.<br />

Abb. 1.28:<br />

Serieller Datenverkehr <strong>in</strong> e<strong>in</strong>em 8051-Multicontroller-System<br />

Die beschriebenen Vorgänge (Abbildung 1.28) lassen sich durch e<strong>in</strong> Protokoll für<br />

den seriellen Datenverkehr <strong>in</strong> Multicontroller-Systemen beschreiben:<br />

1. Der serielle Port e<strong>in</strong>es jeden Slaves ist per Hardware bereit, e<strong>in</strong>e Adresse entgegenzunehmen.<br />

Der Empfang e<strong>in</strong>es Adressblocks ruft e<strong>in</strong>en Interrupt hervor,<br />

wenn das Bit SM2 des Slaves auf 1-Signal gesetzt ist (e<strong>in</strong>en nur vom Adressblock<br />

ausgelösten Interrupt).<br />

2. Der Master übermittelt dann e<strong>in</strong>en Block, der die 8-Bit-Adresse desjenigen Slaves<br />

enthält, der die folgenden Anweisungen <strong>und</strong> Daten erhalten soll. Bei dem übermittelten<br />

Adressblock ist das 9. Datenbit (TB8) auf 1-Signal gesetzt.<br />

88<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.5<br />

Serielle Schnittstelle<br />

3. Nach dem Empfang des Adressblocks bewirkt der serielle Port jedes Slaves<br />

e<strong>in</strong>en Interrupt bei se<strong>in</strong>er Zentrale<strong>in</strong>heit. Diese vergleicht die empfangene<br />

Adresse mit der eigenen.<br />

4. Der adressierte, als Slave arbeitende 8051 setzt se<strong>in</strong> Bit SM2 auf 0-Signal zurück<br />

<strong>und</strong> erhält dadurch alle folgenden Informationen. Sämtliche anderen Slave-<br />

Mikrocontroller 8051 belassen ihr Bit SM2 im Zustand 1 <strong>und</strong> ignorieren somit<br />

alle weiteren Informationen, bis e<strong>in</strong>e neue Adresse ersche<strong>in</strong>t.<br />

5. Der Master überträgt nun die Steuer<strong>in</strong>formationen <strong>und</strong> Daten, die von dem vorher<br />

adressierten 8051 (der se<strong>in</strong> Bit SM2 auf null gesetzt hat) aufgenommen werden.<br />

In Betriebsart 0 bleibt das Bit SM2 wirkungslos, <strong>in</strong> Betriebsart 1 kann es zur<br />

Prüfung der Gültigkeit des Stoppbits dienen. Ist <strong>in</strong> Betriebsart 1 beim Empfang<br />

SM2 = 1, so wird der beim Empfang sonst auftretende Interrupt nicht aktiviert,<br />

bevor e<strong>in</strong> gültiges Stoppbit empfangen wurde.<br />

1.5.4 Baudraten (Übertragungsraten)<br />

Die Baudrate <strong>in</strong> Betriebsart 0 des Ports beträgt:<br />

Baudrate<br />

Betriebsart 0<br />

Oszillatorfrequenz<br />

<br />

12<br />

Die Baudrate <strong>in</strong> Betriebsart 2 hängt vom Wert des Bits SMOD im speziellen Funktionsregister<br />

PCON ab. Bei SMOD = 0 (Wert nach dem Rücksetzen) beträgt die<br />

Baudrate 1/64 der Oszillatorfrequenz, bei SMOD = 1 ist sie 1/32 der Oszillatorfrequenz.<br />

Also gilt:<br />

Baudrate<br />

Betriebsart 2<br />

<br />

2<br />

64<br />

SMOD<br />

Oszillatorfrequenz<br />

Wird Zeitgeber/Zähler 1 als Generator für die Baudrate verwendet, so s<strong>in</strong>d die<br />

Baudraten bei den Betriebsarten 1 <strong>und</strong> 3 durch die Überlaufraten dieses Zeitgebers/Zählers<br />

sowie durch den Wert von SMOD wie folgt festgelegt:<br />

Baudrate<br />

Betriebsarten1<strong>und</strong><br />

3<br />

SMOD<br />

2<br />

= ⋅Überlaufrate<br />

32<br />

Bei dieser Anwendung sollten Interrupts von Zeitgeber/Zähler 1 nicht zugelassen<br />

se<strong>in</strong>. Der Zeitgeber/Zähler kann entweder als Zeitgeber oder als Zähler arbeiten,<br />

<strong>und</strong> zwar <strong>in</strong> jeder der drei Betriebsarten, <strong>in</strong> denen er laufen kann. Bei den meisten<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

89


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

typischen Anwendungen arbeitet er als Zeitgeber mit automatischer Rückladung<br />

(oberes Halbbyte von TMOD ist 0010B). In diesem Fall ergibt sich die Baudrate aus:<br />

Baudrate<br />

Man kann mit dem Zeitgeber 1 sehr niedrige Baudraten erreichen, wenn man<br />

Interrupts bei diesem Zeitgeber zulässt, ihn so e<strong>in</strong>stellt, dass er als 16-Bit-Zeitgeber<br />

läuft (oberes Halbbyte von TMOD ist 0001B), <strong>und</strong> ihn somit als Zeitgeber mit<br />

16-Bit-Rückladung durch Software verwendet. Die Baudrate beträgt dann:<br />

Baudrate<br />

In Tabelle 1.21 s<strong>in</strong>d e<strong>in</strong>ige gebräuchliche Baudraten sowie Möglichkeiten zu ihrer<br />

Erzeugung unter Verwendung von Zeitgeber 1 angegeben.<br />

Baudrate<br />

(kBaud)<br />

Betriebsart<br />

des seriellen<br />

Ports<br />

Oszillatorfrequenz<br />

(MHz)<br />

SMOD Zeitgeber/Zähler 1<br />

C/T Betriebsart Rückladewert<br />

max. 1000 0 12 X X X X<br />

max. 375 2 12 1 X X X<br />

62,5 1,3 12 1 0 2 FFH<br />

19,2 1,3 11,059 1 0 2 FDH<br />

9,6 1,3 11,059 0 0 2 FDH<br />

4,8 1,3 11,059 0 0 2 FAH<br />

2,4 1,3 11,059 0 0 2 F4H<br />

1,2 1,3 11,059 0 0 2 E8H<br />

0,1375 1,3 11,986 0 0 2 1DH<br />

0,110 1,3 6 0 0 2 72H<br />

0,110 1,3 12 0 0 1 FEEBH<br />

Tabelle 1.21:<br />

Betriebsarten1<strong>und</strong><br />

3<br />

Betriebsarten1<strong>und</strong><br />

3<br />

SMOD<br />

2 Oszillatorfrequenz<br />

<br />

32 12 256 -TH1 <br />

SMOD<br />

2 Oszillatorfrequenz<br />

<br />

32 12 65536 - TH1,<br />

TH 0 <br />

Häufig verwendete, durch Zeitgeber/Zähler 1 erzeugte Baudraten<br />

1.6 Interrupt-Verarbeitung<br />

Dem Mikrocontroller 8051 s<strong>in</strong>d fünf Interrupt-Quellen zugeordnet, wie aus Abbildung<br />

1.29 zu ersehen ist. Jeder der externen Interrupts INT0 <strong>und</strong> INT1 kann entweder<br />

pegel- oder flankenaktiviert se<strong>in</strong>, was von den Bits IT0 <strong>und</strong> IT1 im Register<br />

TCON abhängt. Die Kennzeichnungsbits, die diese Interrupts dann auslösen, s<strong>in</strong>d<br />

90<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.6<br />

Interrupt-Verarbeitung<br />

IE0 <strong>und</strong> IE1 <strong>in</strong> TCON. Sie werden nur dann mittels Hardware beim Anspr<strong>in</strong>gen<br />

der Subrout<strong>in</strong>en-Adresse gelöscht, wenn der Interrupt flankenaktiviert war. Ist der<br />

Interrupt dagegen pegelaktiviert, dann ist es die anfordernde externe Quelle, die<br />

das Kennzeichnungsbit steuert <strong>und</strong> nicht die Hardware auf dem Chip.<br />

Abb. 1.29: Interrupt-Quellen des 8051<br />

Die Interrupts von Zeitgeber/Zähler 0 <strong>und</strong> 1 werden durch die Bits TF0 <strong>und</strong> TF1<br />

erzeugt, die durch e<strong>in</strong>en Überlauf <strong>in</strong> den entsprechenden Registern dieser Zeitgeber/Zähler<br />

gesetzt werden (ausgenommen Zeitgeber/Zähler 0 <strong>in</strong> Betriebsart 3).<br />

Bei e<strong>in</strong>em Zeitgeber/Zähler-Interrupt wird das ihn erzeugende Kennzeichnungsbit<br />

durch die Hardware auf dem Chip gelöscht, sobald die Subrout<strong>in</strong>en-Adresse<br />

angesprungen wurde.<br />

Der Interrupt des seriellen Ports wird durch e<strong>in</strong>e logische ODER-Verknüpfung<br />

von RI <strong>und</strong> TI hervorgerufen. Ke<strong>in</strong>es dieser Kennzeichnungsbits wird durch<br />

Hardware gelöscht, nachdem die Subrout<strong>in</strong>en-Adresse angesprungen wurde. In<br />

praktischen Fällen muss die Subrout<strong>in</strong>e im Allgeme<strong>in</strong>en darüber entscheiden, ob<br />

RI oder TI den Interrupt hervorgerufen hat, <strong>und</strong> das betreffende Bit muss dann<br />

mittels Software gelöscht werden.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

91


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

1.6.1 Interrupt-Register<br />

Alle Bits, die Interrupts erzeugen, können durch Software gesetzt oder gelöscht<br />

werden, <strong>und</strong> zwar mit derselben Auswirkung, als ob sie durch Hardware gesetzt<br />

oder gelöscht worden wären. Dies bedeutet, dass Interrupts mittels Software<br />

erzeugt oder anstehende Interrupts verh<strong>in</strong>dert werden können.<br />

Jede dieser Interrupt-Quellen kann e<strong>in</strong>zeln durch Setzen oder Löschen e<strong>in</strong>es Bits<br />

im speziellen Funktionsregister IE freigegeben oder nicht freigegeben werden<br />

(Tabelle 1.22). Man beachte, dass IE auch e<strong>in</strong> allgeme<strong>in</strong>es Nicht-Freigabebit (EA)<br />

enthält, mit dem alle Interrupts auf e<strong>in</strong>mal gesperrt werden können.<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

EA – – ET1 ES EX1 ET0 EX0<br />

Symbol Bit-Speicherstelle Funktion<br />

EA IE.7 kann alle Interrupts sperren. Ist EA = 0, wird ke<strong>in</strong> Interrupt<br />

zugelassen; ist EA = 1, wird jede Interrupt-Quelle<br />

<strong>in</strong>dividuell freigegeben oder nicht freigegeben, <strong>in</strong>dem<br />

ihr Freigabebit gesetzt bzw. gelöscht wird.<br />

- IE.6 <strong>in</strong> Reserve<br />

- IE.5 <strong>in</strong> Reserve<br />

ES IE.4 gibt Interrupts vom seriellen Port frei (ES = 1) oder<br />

nicht frei (ES = 0)<br />

ET1 IE.3 gibt Interrupts vom Überlauf des Zeitgebers/Zählers 1<br />

frei (ET1 = 1) oder nicht frei (ET1 = 0)<br />

EX1 IE.2 gibt externe Interrupts von Anschluss INT1 frei<br />

(EX1 = 1) oder nicht frei (EX1 = 0)<br />

ET0 IE.1 gibt Interrupts vom Überlauf des Zeitgebers/Zählers 0<br />

frei (ET0 = 1) oder nicht frei (ET0 = 0)<br />

EX0 IE.0 gibt externe Interrupts von Anschluss INT0 frei<br />

(EX0 = 1) oder nicht frei (EX0 = 0)<br />

Tabelle 1.22: Interrupt-Freigaberegister (IE)<br />

Jeder Interrupt-Quelle kann durch Programmieren e<strong>in</strong>e hohe oder niedrige Prioritätsstufe<br />

zugewiesen werden, <strong>in</strong>dem e<strong>in</strong> bestimmtes Bit im speziellen Funktionsregister<br />

IP (Tabelle 1.23) gesetzt oder gelöscht wird. E<strong>in</strong> Interrupt niedriger<br />

Priorität kann durch e<strong>in</strong>en Interrupt hoher Priorität unterbrochen werden, aber<br />

nicht durch e<strong>in</strong>en anderen Interrupt niedriger Priorität. E<strong>in</strong> Interrupt hoher Priorität<br />

kann durch e<strong>in</strong>e andere Interrupt-Quelle nicht unterbrochen werden.<br />

92<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.6<br />

Interrupt-Verarbeitung<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

- – – PS PT1 PX1 PT0 PX0<br />

Symbol Bit-Speicherstelle Funktion<br />

– IP.7 <strong>in</strong> Reserve<br />

- IP.6 <strong>in</strong> Reserve<br />

- IP.5 <strong>in</strong> Reserve<br />

PS IP.4 bestimmt die Prioritätsstufe des Interrupts des seriellen<br />

Ports. PS = 1 bedeutet die höhere Prioritätsstufe.<br />

PT1 IP.3 bestimmt die Prioritätsstufe des Interrupts von Zeitgeber/Zähler<br />

1. PT1 = 1 bedeutet die höhere Prioritätsstufe.<br />

PX1 IP.2 bestimmt die Prioritätsstufe des externen Interrupts von<br />

Anschluss INT1. PX1 = 1 bedeutet die höhere Prioritätsstufe.<br />

PT0 IP.1 bestimmt die Prioritätsstufe des Interrupts von Zeitgeber/Zähler<br />

0. PT0 = 1 bedeutet die höhere Prioritätsstufe<br />

PX0 IP.0 bestimmt die Prioritätsstufe des externen Interrupts von<br />

Anschluss INT0. PX0 = 0 bedeutet die höhere Prioritätsstufe.<br />

Tabelle 1.23:<br />

Interrupt-Prioritätenregister (IP)<br />

Falls Interrupt-Anforderungen verschiedener Prioritätsstufen gleichzeitig auftreten,<br />

wird die Interrupt-Anforderung der höheren Prioritätsstufe abgearbeitet.<br />

Ersche<strong>in</strong>en jedoch Interrupt-Anforderungen derselben Prioritätsstufe gleichzeitig,<br />

bestimmt e<strong>in</strong> <strong>in</strong>terner Auswahlprozess, welcher Interrupt abgearbeitet werden<br />

soll. Somit gibt es <strong>in</strong>nerhalb e<strong>in</strong>er Prioritätsstufe e<strong>in</strong>e weitere Prioritätsskala, die<br />

durch den <strong>in</strong>ternen Auswahlprozess bestimmt wird <strong>und</strong> folgende Reihenfolge<br />

festlegt, wie Tabelle 1.24 zeigt.<br />

Quelle Bit Priorität <strong>in</strong>nerhalb e<strong>in</strong>er Stufe<br />

Externer Interrupt 0 IE0 höchste<br />

Überlauf an Zeitgeber/Zähler 0<br />

Externer Interrupt 1<br />

Überlauf an Zeitgeber/Zähler 1<br />

TF0<br />

IE1<br />

TF1<br />

Serieller Port RI + TI niedrigste<br />

Tabelle 1.24: Reihenfolge der Interrupt-Anforderungen<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

93


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Es sei nochmals betont, dass die angegebene »Priorität <strong>in</strong>nerhalb e<strong>in</strong>er Stufe« nur<br />

dann zur Geltung kommt, wenn gleichzeitige Anforderungen derselben Prioritätsstufe<br />

vorliegen.<br />

1.6.2 Prioritäten der Interruptfolge<br />

Die Interrupt-Kennzeichnungsbits werden während e<strong>in</strong>es jeden Masch<strong>in</strong>enzyklus<br />

abgefragt <strong>und</strong> die Ergebnisse während des nächsten Masch<strong>in</strong>enzyklus e<strong>in</strong>er Priorität<br />

zugeordnet. War während des erstgenannten Zyklus e<strong>in</strong>es der Kennzeichnungsbits<br />

gesetzt, so wird dies im zweiten erkannt, <strong>und</strong> das Interrupt-System<br />

erzeugt den Befehl LCALL für die entsprechende Subrout<strong>in</strong>en-Adresse, vorausgesetzt,<br />

dass die Abarbeitung des durch Hardware erzeugten Befehls LCALL nicht<br />

durch e<strong>in</strong>e der folgenden Bed<strong>in</strong>gungen gesperrt ist:<br />

1. E<strong>in</strong> Interrupt gleicher oder höherer Priorität wird gerade abgearbeitet.<br />

2. Der gegenwärtige, der Zuordnung e<strong>in</strong>er Priorität dienende Masch<strong>in</strong>enzyklus ist<br />

nicht der letzte bei der Ausführung des gerade laufenden Befehls.<br />

3. Der gerade auszuführende Befehl ist RETI oder stellt e<strong>in</strong>en Zugriff auf das spezielle<br />

Funktionsregister IE oder IP dar.<br />

Jede dieser drei Bed<strong>in</strong>gungen blockiert den Befehl LCALL für die Interrupt-Rout<strong>in</strong>e.<br />

Bed<strong>in</strong>gung 2 stellt sicher, dass der gerade laufende Befehl vollständig abgearbeitet<br />

wird, bevor irgende<strong>in</strong>e Subrout<strong>in</strong>e angesprungen wird. Durch Bed<strong>in</strong>gung 3<br />

ist Folgendes gewährleistet: Wenn der gerade auszuführende Befehl RETI ist oder<br />

e<strong>in</strong>en Zugriff auf IE oder IP darstellt, wird wenigstens noch e<strong>in</strong> weiterer Befehl<br />

ausgeführt, bevor die Durchführung des Interrupts beg<strong>in</strong>nt.<br />

Die Zuordnung zu e<strong>in</strong>er Priorität wird <strong>in</strong> jedem Masch<strong>in</strong>enzyklus wiederholt, <strong>und</strong><br />

die verglichenen Werte s<strong>in</strong>d diejenigen, die während des vorangegangenen<br />

Masch<strong>in</strong>enzyklus vorhanden waren. Ist e<strong>in</strong> Interrupt-Kennzeichnungsbit gesetzt,<br />

das aber wegen e<strong>in</strong>er der obigen Sperrbed<strong>in</strong>gungen nicht bedient werden kann,<br />

<strong>und</strong> ist es bei Aufhebung der Sperrbed<strong>in</strong>gung nicht mehr gesetzt, so wird der<br />

zurückgewiesene Interrupt nicht mehr ausgeführt. Mit anderen Worten: Das System<br />

er<strong>in</strong>nert sich nicht daran, dass das Kennzeichnungsbit gesetzt war, aber nicht<br />

bedient wurde. Jeder Zyklus, <strong>in</strong> dem e<strong>in</strong>e Prioritätenzuordnung erfolgt, muss <strong>in</strong><br />

diesem S<strong>in</strong>n für sich betrachtet werden.<br />

Somit akzeptiert der Prozessor e<strong>in</strong>e Interrupt-Anforderung, <strong>in</strong>dem er durch den<br />

mittels Hardware erzeugten Befehl LCALL die entsprechende Subrout<strong>in</strong>e aufruft.<br />

In e<strong>in</strong>igen Fällen löscht er auch das Kennzeichnungsbit, das den Interrupt ausgelöst<br />

hat, <strong>in</strong> anderen Fällen nicht. Niemals löscht er das Kennzeichnungsbit des<br />

seriellen Ports; dies muss durch die Software des Anwenders erfolgen. Die Kennzeichnungsbits<br />

der externen Interrupts (IE0 <strong>und</strong> IE1) werden nur dann gelöscht,<br />

wenn der Interrupt flankenaktiviert war. Der mittels Hardware erzeugte Befehl<br />

veranlasst, dass der Inhalt des Programmzählers <strong>in</strong> den Stack übernommen wird<br />

94<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.6<br />

Interrupt-Verarbeitung<br />

(rettet jedoch nicht das Programmstatuswort) <strong>und</strong> lädt den Programmzähler mit<br />

e<strong>in</strong>er Adresse, die von der Interrupt-Quelle abhängt, wie Tabelle 1.25 zeigt.<br />

Interrupt-Quelle<br />

Externer Interrupt 0<br />

Überlauf des Zeitgebers/Zählers 0<br />

Externer Interrupt 1<br />

Überlauf des Zeitgebers/Zählers 1<br />

Serieller Port<br />

Tabelle 1.25: Startadressen für Interrupt-Rout<strong>in</strong>en<br />

Startadresse<br />

0003H<br />

000BH<br />

0013H<br />

001BH<br />

0023H<br />

Die Abarbeitung der Subrout<strong>in</strong>e setzt sich von dem angegebenen Speicherplatz<br />

aus fort, bis der Befehl RETI auftritt. Dieser <strong>in</strong>formiert den Prozessor darüber,<br />

dass die Interrupt-Rout<strong>in</strong>e beendet ist, holt dann die zwei oberen Bytes aus dem<br />

Stack <strong>und</strong> lädt damit den Programmzähler. Die weitere Ausführung des unterbrochenen<br />

Programms erfolgt dann von der Stelle aus, wo es aufgehört hatte.<br />

Man beachte, dass e<strong>in</strong> e<strong>in</strong>facher Befehl RET zwar auch die Programmausführung<br />

an das unterbrochene Programm zurückgibt, das Interrupt-Steuersystem jedoch<br />

<strong>in</strong> der Annahme belässt, dass der Interrupt weiterh<strong>in</strong> abgearbeitet wird.<br />

1.6.3 Externe Interrupt-Quellen<br />

Externe Quellen können e<strong>in</strong>en Interrupt entweder durch e<strong>in</strong> 0-Signal oder durch<br />

e<strong>in</strong>e negative Flanke von 1 nach 0 (pegelaktivierte oder flankenaktivierte Interrupts)<br />

auslösen, was durch Programmieren, d.h. durch Setzen oder Löschen von<br />

IT1 oder IT0 im Register TCON, festgelegt wird. Ist ITx = 0, wird e<strong>in</strong> externer<br />

Interrupt x durch Erkennen des 0-Signals am Anschluss INTx e<strong>in</strong>geleitet, ist dagegen<br />

ITx = 1, erfolgt die Interrupt-Auslösung durch Erkennen e<strong>in</strong>er Flanke des<br />

Pegels. In diesem Fall wird, wenn aufe<strong>in</strong>anderfolgende Abfragen von INTx e<strong>in</strong><br />

1-Signal <strong>in</strong> e<strong>in</strong>em Zyklus <strong>und</strong> von e<strong>in</strong>em 0-Signal im nächsten Zyklus ergeben<br />

haben, das Kennzeichnungsbit für externe Interrupt-Anforderungen IEx <strong>in</strong> TCON<br />

gesetzt. Dies löst dann den Interrupt aus.<br />

Da die externen Interrupt-Anschlüsse während e<strong>in</strong>es jeden Masch<strong>in</strong>enzyklus e<strong>in</strong>mal<br />

abgefragt werden, sollte e<strong>in</strong> E<strong>in</strong>gangssignal (1- oder 0-Signal) wenigstens<br />

zwölf Oszillatorperioden am E<strong>in</strong>gang anliegen, um e<strong>in</strong>e s<strong>in</strong>nvolle Abfrage zu<br />

gewährleisten. Wenn daher der externe Interrupt flankenaktiviert ist, muss die<br />

externe Quelle wenigstens e<strong>in</strong>en Zyklus e<strong>in</strong>es 1-Signals am entsprechenden<br />

Anschluss stehen lassen <strong>und</strong> danach wenigstens e<strong>in</strong>en Zyklus e<strong>in</strong>es 0-Signals,<br />

damit die Flanke erkannt <strong>und</strong> das Kennzeichnungsbit für externe Interrupt-Anforderungen<br />

IEx gesetzt werden kann. Ex wird durch die Zentrale<strong>in</strong>heit automatisch<br />

gelöscht, wenn die Interrupt-Rout<strong>in</strong>e aufgerufen ist.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

95


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Ist der externe Interrupt pegelaktiviert, muss die externe Quelle die Anforderung<br />

so lange aufrechterhalten, bis der angeforderte Interrupt tatsächlich erzeugt worden<br />

ist. Danach muss er die Anforderung deaktivieren, bevor die Interrupt-Rout<strong>in</strong>e<br />

abgearbeitet ist; andernfalls wird e<strong>in</strong> weiterer Interrupt erzeugt.<br />

Die Pegel an INT0 <strong>und</strong> INT1 werden <strong>in</strong>vertiert <strong>und</strong> während e<strong>in</strong>es jeden Masch<strong>in</strong>enzyklus<br />

<strong>in</strong> IE0 bzw. IE1 zwischengespeichert. Bis zum nächsten Masch<strong>in</strong>enzyklus<br />

erfolgt ke<strong>in</strong>e Zuordnung der gef<strong>und</strong>enen Werte zu Prioritäten durch die<br />

Schaltung. Liegt e<strong>in</strong>e Interrupt-Anforderung vor <strong>und</strong> lassen die sonstigen Bed<strong>in</strong>gungen<br />

die Annahme dieser Forderung zu, so ist e<strong>in</strong> mittels Hardware ausgelöster<br />

Subrout<strong>in</strong>en-Aufruf der gewünschten Interrupt-Rout<strong>in</strong>e der nächste auszuführende<br />

Befehl. Der Aufruf selbst nimmt zwei Zyklen <strong>in</strong> Anspruch. Somit vergehen<br />

m<strong>in</strong>imal drei vollständige Masch<strong>in</strong>enzyklen zwischen der Aktivierung e<strong>in</strong>er externen<br />

Interrupt-Anforderung <strong>und</strong> dem Ausführungsbeg<strong>in</strong>n des ersten Befehls der<br />

Interrupt-Rout<strong>in</strong>e.<br />

E<strong>in</strong>e längere Ansprechzeit ergibt sich dann, wenn die Interrupt-Anforderung<br />

durch e<strong>in</strong>e Bed<strong>in</strong>gung blockiert ist. Wird gerade e<strong>in</strong> Interrupt gleicher oder höherer<br />

Priorität abgearbeitet, so hängt die zusätzliche Wartezeit von der anderen Interrupt-Rout<strong>in</strong>e<br />

ab. Bef<strong>in</strong>det sich der gerade auszuführende Befehl nicht <strong>in</strong> se<strong>in</strong>em<br />

letzten Zyklus, so kann trotzdem die zusätzliche Wartezeit nicht mehr als drei<br />

Zyklen betragen, da die längsten Befehle (MUL <strong>und</strong> DIV) nun vier Zyklen lang<br />

s<strong>in</strong>d. Ist schließlich der gerade auszuführende Befehl RETI oder stellt er e<strong>in</strong>en<br />

Zugriff auf das spezielle Funktionsregister IE oder IP dar, so kann die zusätzliche<br />

Wartezeit nicht mehr als fünf Zyklen betragen (maximal e<strong>in</strong>en weiteren Zyklus,<br />

um den laufenden Befehl zu beenden, sowie vier Zyklen für den nächsten Befehl,<br />

falls es sich um MUL <strong>und</strong> DIV handelt).<br />

Somit beträgt die Ansprechzeit <strong>in</strong> e<strong>in</strong>em System mit e<strong>in</strong>em e<strong>in</strong>zelnen Interrupt<br />

stets mehr als drei <strong>und</strong> weniger als acht Zyklen.<br />

1.7 E<strong>in</strong>zelschrittbetrieb<br />

Die Interrupt-Struktur des 8051 gestattet E<strong>in</strong>zelschrittbetrieb mit sehr ger<strong>in</strong>gem<br />

zusätzlichem Softwareaufwand. Wie bereits dargelegt, wird e<strong>in</strong>e Interrupt-Anforderung<br />

so lange nicht bedient, wie e<strong>in</strong> Interrupt gleicher oder höherer Priorität<br />

läuft oder bis nach e<strong>in</strong>em Befehl RETI wenigstens e<strong>in</strong> weiterer Befehl ausgeführt<br />

worden ist. Somit kann, sobald e<strong>in</strong>e Interrupt-Rout<strong>in</strong>e begonnen hat, sie nicht<br />

erneut e<strong>in</strong>setzen, bevor nicht wenigstens e<strong>in</strong> Befehl des unterbrochenen Programms<br />

ausgeführt wurde. E<strong>in</strong>e Möglichkeit, diese Tatsache für den E<strong>in</strong>zelschrittbetrieb<br />

zu nutzen, besteht dar<strong>in</strong>, e<strong>in</strong>en der externen Interrupt-Anschlüsse (z.B.<br />

INT0) so zu programmieren, dass er pegelaktiviert ist. Die Interrupt-Rout<strong>in</strong>e wird<br />

dann mit folgender Codierung abgeschlossen:<br />

96<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.8<br />

Rücksetzen des 8051<br />

JNB P3.2,$ ;WARTE HIER, BIS INT0 HIGH IST<br />

JB P3.2,$ ;WARTE JETZT HIER, BIS INT0 LOW IST<br />

RETI<br />

;SPRINGE ZURUECK UND FUEHRE EINEN BEFEHL AUS<br />

Wird jetzt der Anschluss INT0 (gleich dem Anschluss P3.2) normalerweise auf<br />

0-Signal gehalten, so startet die Zentrale<strong>in</strong>heit die durch den externen Interrupt<br />

0 ausgelöste Rout<strong>in</strong>e <strong>und</strong> bleibt so lange <strong>in</strong> dieser, bis INT0 gepulst wird (von<br />

0- nach 1- <strong>und</strong> von dort nach 0-Signal). Dann führt die Zentrale<strong>in</strong>heit den Befehl<br />

RETI aus, geht <strong>in</strong>s Hauptprogramm zurück, führt dort e<strong>in</strong>en e<strong>in</strong>zigen Befehl aus<br />

<strong>und</strong> beg<strong>in</strong>nt sofort erneut mit der Rout<strong>in</strong>e des externen Interrupts 0, um auf den<br />

nächsten Impuls von P3.2 zu warten. Bei jedem Impuls an P3.2 führt die Zentrale<strong>in</strong>heit<br />

e<strong>in</strong>en Schritt des Hauptprogramms aus.<br />

1.8 Rücksetzen des 8051<br />

Der Anschluss RST stellt den Rücksetze<strong>in</strong>gang dar <strong>und</strong> ist E<strong>in</strong>gang e<strong>in</strong>es Schmitt-<br />

Triggers. E<strong>in</strong> Rücksetzvorgang lässt sich dadurch erreichen, dass man den Anschluss<br />

RST für wenigstens zwei Masch<strong>in</strong>enzyklen (24 Oszillatorperioden) auf e<strong>in</strong><br />

1-Signal br<strong>in</strong>gt, während der Oszillator läuft. Die Zentrale<strong>in</strong>heit reagiert darauf,<br />

<strong>in</strong>dem sie e<strong>in</strong>en <strong>in</strong>ternen Rücksetzvorgang e<strong>in</strong>leitet, <strong>und</strong> richtet auch die Anschlüsse<br />

ALE <strong>und</strong> PSEN als E<strong>in</strong>gänge e<strong>in</strong> (diese s<strong>in</strong>d bidirektional). Der <strong>in</strong>terne<br />

Rücksetzvorgang wird während e<strong>in</strong>es zweiten Zyklus ausgeführt, <strong>in</strong> dem RST e<strong>in</strong><br />

1-Signal hat, <strong>und</strong> so lange während e<strong>in</strong>es jeden Zyklus wiederholt, bis RST e<strong>in</strong><br />

0-Signal annimmt. Nach dem Rücksetzvorgang weisen die Register folgenden<br />

Inhalt auf, wie Tabelle 1.26 zeigt.<br />

PC 000H TMOD 00H<br />

ACC 00H TCON 00H<br />

B 00H TH0 00H<br />

PSW 00H TL0 00H<br />

SP 07H TH1 00H<br />

DPTR 0000H TL1 00H<br />

P0...P3 0FFH SCON 00H<br />

IP (XXX00000) SBUF unbestimmt<br />

IE (0XX00000) PCON (0XXX0000)<br />

Tabelle 1.26: Register<strong>in</strong>halt nach Rücksetzvorgang<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

97


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Das <strong>in</strong>terne RAM wird durch e<strong>in</strong>en Rücksetzvorgang nicht berührt. Wenn U CC<br />

e<strong>in</strong>geschaltet wird, ist der RAM-Inhalt unbestimmt, es sei denn, dass vorher e<strong>in</strong><br />

Betrieb mit reduzierter Leistung erfolgt ist.<br />

E<strong>in</strong> automatischer Rücksetzvorgang wird e<strong>in</strong>geleitet, wenn RST über e<strong>in</strong>en 10-F-<br />

Kondensator mit U CC (+5 V) <strong>und</strong> über e<strong>in</strong>en 8,2-k-Widerstand mit U CC verb<strong>und</strong>en<br />

wird (Abbildung 1.30). Voraussetzung für die E<strong>in</strong>leitung des Rücksetzvorgangs<br />

ist jedoch, dass die Anstiegszeit von U CC ca. 1 ms <strong>und</strong> dass die Zeit für die<br />

Inbetriebnahme des Taktgenerators 10 ms nicht überschreitet.<br />

Abb. 1.30:<br />

Pr<strong>in</strong>zipschaltung für Rücksetzen durch E<strong>in</strong>schalten<br />

Wenn die Spannung e<strong>in</strong>geschaltet wird, beg<strong>in</strong>nt der über RST fließende Strom<br />

den Kondensator aufzuladen. Die Spannung an RST ist gleich der Differenz zwischen<br />

U CC <strong>und</strong> der Kondensatorspannung. Diese Spannung nimmt von U CC aus<br />

ab, wenn sich der Kondensator auflädt. Je größer der Kondensator ist, desto langsamer<br />

nimmt die Spannung an RST ab. Diese Spannung muss e<strong>in</strong>e bestimmte<br />

M<strong>in</strong>destzeit oberhalb des unteren Schwellwerts des Schmitt-Triggers bleiben, um<br />

e<strong>in</strong>en vollständigen Rücksetzvorgang herbeizuführen; die erforderliche M<strong>in</strong>destzeit<br />

ist gleich der Zeit zur Inbetriebnahme des Taktgenerators plus zwei Masch<strong>in</strong>enzyklen.<br />

1.9 Betriebsarten mit reduzierter Leistungsaufnahme<br />

Bei Anwendungen, bei denen die Leistungsaufnahme e<strong>in</strong>en kritischen Gesichtspunkt<br />

darstellt, kann sowohl die NMOS- als auch die CMOS-Version mit reduzierter<br />

Leistung betrieben werden. Die CMOS-Version (80C51) lässt den Betrieb mit<br />

reduzierter Leistung (Idle- <strong>und</strong> Power-Down-Betriebsart) standardmäßig zu, bei<br />

der NMOS-Version (8051) ist der Betrieb mit reduzierter Leistung zwar auch möglich,<br />

aber nicht standardmäßig vorgesehen.<br />

98<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.9<br />

Betriebsarten mit reduzierter Leistungsaufnahme<br />

Die Betriebsart mit reduzierter Leistung gestattet es dem Anwender der NMOS-<br />

Version, die Betriebsspannung U CC auf 0 V zu reduzieren <strong>und</strong> dabei den Inhalt<br />

des RAM durch e<strong>in</strong>e Hilfsspannung am Anschluss RST zu retten. Zur Ausnutzung<br />

dieses Vorteils muss das Anwendersystem, sobald es e<strong>in</strong>en bevorstehenden<br />

Spannungsausfall erkennt, <strong>in</strong> irgende<strong>in</strong>er Weise e<strong>in</strong>en Interrupt bei dem Mikrocontroller<br />

anfordern. Hierdurch werden wichtige Betriebsdaten <strong>in</strong> das RAM auf<br />

dem Chip gerettet, <strong>und</strong> es wird die Spannungsversorgung über den Anschluss<br />

RST aufgenommen, bevor U CC unter se<strong>in</strong>en unteren Grenzwert abs<strong>in</strong>kt. Wenn die<br />

Betriebsspannung wiederkommt, muss die Hilfsspannung noch lange genug<br />

anliegen, damit e<strong>in</strong> Rücksetzvorgang erfolgen kann. Danach wird der normale<br />

Betrieb wieder aufgenommen.<br />

Bei der CMOS-Version gibt es zwei Betriebsarten mit reduzierter Leistung, die<br />

Idle- <strong>und</strong> die Power-Down-Betriebsart. Der E<strong>in</strong>gangsanschluss, über den die<br />

Stromversorgung bei reduzierter Leistung erfolgt, ist U CC . Abbildung 1.31 zeigt die<br />

<strong>in</strong>terne Schaltung, mit der diese Eigenschaften erreicht werden. Bei der Idle-<br />

Betriebsart (IDL = 1) arbeitet der Taktgenerator weiter, <strong>und</strong> die Bereiche Interrupt,<br />

serieller Port sowie Zeitgeber/Zähler werden weiterh<strong>in</strong> mit Taktimpulsen versorgt;<br />

nur die Zentrale<strong>in</strong>heit wird vom Takt abgetrennt. Bei der Power-Down-<br />

Betriebsart (PD = 1) wird der Taktgenerator stillgelegt. Die Idle- <strong>und</strong> die Power-<br />

Down-Betriebsart werden durch Setzen bestimmter Bits im speziellen Funktionsregister<br />

PCON aktiviert. Die Adresse dieses Registers ist 87H; die E<strong>in</strong>zelheiten s<strong>in</strong>d<br />

aus Tabelle 1.27 zu ersehen.<br />

Abb. 1.31:<br />

Schaltungsaufbau für den Betrieb mit reduzierter Leistung (Idle- <strong>und</strong> Power-Down-<br />

Betriebsart) beim 80C51<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

99


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

höchstwertiges<br />

Bit<br />

niedrigstwertiges<br />

Bit<br />

- – – PS PT1 PX1 PT0 PX0<br />

Symbol Bit-Speicherstelle Funktion<br />

SMOD PCON.7 verdoppelt die Übertragungsrate. Ist SMOD = 1, wird die<br />

Übertragungsrate verdoppelt, wenn der serielle Port <strong>in</strong><br />

den Betriebsarten 1, 2 oder 3 verwendet wird.<br />

PCON.6<br />

<strong>in</strong> Reserve<br />

PCON.5<br />

<strong>in</strong> Reserve<br />

PCON.4<br />

<strong>in</strong> Reserve<br />

GF1 PCON.3 Kennzeichnungsbit für allgeme<strong>in</strong>e Zwecke<br />

GF0 PCON.2 Kennzeichnungsbit für allgeme<strong>in</strong>e Zwecke<br />

PD PCON.1 Bit für Power-Down-Betriebsart, PD = 1*) aktiviert diese<br />

Betriebsart (CMOS-Version).<br />

IDL PCON.0 Bit für Idle-Betriebsart. DL = 1*) aktiviert diese Betriebsart.<br />

Tabelle 1.27: Steuerregister (PCON) für die Leistung<br />

*) S<strong>in</strong>d PD <strong>und</strong> IDL gleichzeitig auf 1-Signal gesetzt, hat PD Vorrang.<br />

Der Rücksetzwert von PCON ist bei der NMOS-Version 0XXXXXXXX, bei der<br />

CMOS-Version 0XXX0000.<br />

E<strong>in</strong> Befehl, der PCON.0 setzt, ist der letzte vor dem Übergang <strong>in</strong> die Idle-Betriebsart.<br />

Bei dieser Betriebsart wird der <strong>in</strong>terne Takt von der Zentrale<strong>in</strong>heit abgetrennt, aber<br />

nicht die Bereiche Interrupt, Zeitgeber/Zähler <strong>und</strong> serieller Port. Der Status der<br />

Zentrale<strong>in</strong>heit bleibt vollständig erhalten: Stackpo<strong>in</strong>ter, Programmzähler, Programmstatuswort,<br />

Akkumulator <strong>und</strong> alle anderen Register behalten ihre Werte<br />

während der Betriebsart. Die Portanschlüsse behalten die logischen Pegel, die sie<br />

bei der Aktivierung von Idle hatten. ALE <strong>und</strong> PSEN nehmen ihre <strong>in</strong>aktiven Pegel an.<br />

Es gibt zwei Möglichkeiten, den Idle-Betrieb zu beenden. Durch Aktivierung e<strong>in</strong>es<br />

beliebigen zugelassenen Interrupts wird PCON.0 mittels Hardware gelöscht, was<br />

zur Beendigung des Idle-Betriebs führt. Der Interrupt wird ausgeführt, <strong>und</strong> der<br />

nächste, auf RETI folgende Befehl folgt dem Befehl des Hauptprogramms, der<br />

den Mikrocontroller <strong>in</strong> die Idle-Betriebsart versetzte.<br />

Mit den Kennzeichnungsbits GF0 <strong>und</strong> GF1 ist es möglich anzuzeigen, ob e<strong>in</strong><br />

Interrupt während des normalen Betriebs oder während des Idle-Betriebs aufgetreten<br />

ist. Zum Beispiel kann e<strong>in</strong> Befehl, mit dem die Idle-Betriebsart aktiviert<br />

100<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.10<br />

Speicherorganisation <strong>und</strong> Adressierungsarten<br />

wird, auch e<strong>in</strong>es der beiden Kennzeichnungsbits setzen. Wird der Idle-Betrieb<br />

dann durch e<strong>in</strong>en Interrupt beendet, kann die Interrupt-Rout<strong>in</strong>e die Kennzeichnungsbits<br />

abfragen.<br />

Die andere Möglichkeit zur Beendigung des Idle-Betriebs besteht <strong>in</strong> e<strong>in</strong>em Rücksetzvorgang<br />

mittels Hardware. Da der Taktgenerator weitergearbeitet hat, braucht<br />

der Rücksetzvorgang mittels Hardware nur während zweier Masch<strong>in</strong>enzyklen (24<br />

Oszillatorperioden) aktiv gehalten zu werden, um ihn vollständig ablaufen zu<br />

lassen.<br />

Wird mit e<strong>in</strong>em Befehl PCON.1 gesetzt, so geht der Mikrocontroller sofort <strong>in</strong> die<br />

Power-Down-Betriebsart über. In dieser Betriebsart wird der Taktgenerator auf<br />

dem Chip angehalten, so dass alle funktionalen Abläufe gestoppt werden; das<br />

RAM auf dem Chip sowie die speziellen Funktionsregister behalten jedoch ihre<br />

Werte. An den Portanschlüssen stehen die <strong>in</strong> den entsprechenden speziellen<br />

Funktionsregistern enthaltenen Werte zur Verfügung. ALE <strong>und</strong> PSEN bef<strong>in</strong>den<br />

sich auf 0-Pegel.<br />

Die e<strong>in</strong>zige Möglichkeit, aus dem Power-Down-Betrieb wieder herauszukommen,<br />

besteht <strong>in</strong> e<strong>in</strong>em Rücksetzvorgang mittels Hardware. Dieser br<strong>in</strong>gt alle speziellen<br />

Funktionsregister <strong>in</strong> e<strong>in</strong>en def<strong>in</strong>ierten Anfangszustand, ändert aber den Inhalt des<br />

RAM auf dem Chip nicht.<br />

Bei der Power-Down-Betriebsart kann U CC herabgesetzt werden, um die Energieaufnahme<br />

auf e<strong>in</strong> M<strong>in</strong>imum zu reduzieren. Es muss jedoch darauf geachtet werden,<br />

dass U CC mit Sicherheit nicht verm<strong>in</strong>dert wird, bevor der Power-Down-<br />

Betrieb aufgenommen ist, <strong>und</strong> dass U CC se<strong>in</strong>en normalen Betriebswert wieder<br />

erreicht hat, bevor der Power-Down-Betrieb beendet ist. Der Rücksetzvorgang, der<br />

den Power-Down-Vorgang abschließt, setzt auch den Taktgeber <strong>in</strong> Betrieb. Der<br />

Rücksetzvorgang sollte nicht e<strong>in</strong>geleitet werden, bevor U CC den normalen<br />

Betriebswert wieder erreicht hat, <strong>und</strong> muss lange genug aktiviert bleiben, um dem<br />

Taktgeber die Wiederaufnahme <strong>und</strong> Stabilisierung se<strong>in</strong>es Betriebs zu ermöglichen<br />

(im Allgeme<strong>in</strong>en weniger als 10 ms).<br />

1.10 Speicherorganisation <strong>und</strong> Adressierungsarten<br />

Die Architektur der Mikrocontroller der Familie 8051 sieht Möglichkeiten vor, die<br />

Speicherkapazitäten sowohl auf dem Chip als auch außerhalb des Chips zu erweitern.<br />

Durch verschiedene Adressierungsmechanismen wird e<strong>in</strong> optimaler Befehlsvorrat<br />

erreicht.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

101


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Der 8051 hat im Pr<strong>in</strong>zip folgende Speicher-Adressierbereiche:<br />

<br />

<br />

<br />

<br />

64-Kbyte-Programmspeicher (extern)<br />

4-Kbyte-Programmspeicher (<strong>in</strong>tern)<br />

64-Kbyte-Datenspeicher (extern)<br />

256-Byte-Datenspeicher (<strong>in</strong>tern)<br />

In Abbildung 1.32 s<strong>in</strong>d die Adressierbereiche übersichtlich dargestellt.<br />

Abb. 1.32:<br />

Adressierbereiche des Programm- <strong>und</strong> Datenspeichers<br />

Der Programmspeicher-Adressierbereich besteht aus e<strong>in</strong>em <strong>in</strong>neren <strong>und</strong> e<strong>in</strong>em<br />

äußeren Teil. Wird der Anschluss EA auf 1-Signal gehalten, so greift die CPU auf<br />

den <strong>in</strong>ternen Programmspeicher zu, es sei denn, die Adresse ist höher als 0FFFH.<br />

Informationen aus den Speicherplätzen 1000H bis FFFFH werden aus dem externen<br />

Programmspeicher geholt. Hält man den Anschluss EA jedoch auf 0-Signal,<br />

so holt die CPU alle Befehle aus dem externen Programmspeicher. In jedem Fall<br />

erfolgt die Adressierung über den 16-Bit-Programmzähler.<br />

102<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.10<br />

Speicherorganisation <strong>und</strong> Adressierungsarten<br />

Die Speicherplätze 00 bis 23H im Programmspeicher werden für Interrupt-Rout<strong>in</strong>en<br />

verwendet; die Startadressen s<strong>in</strong>d aus Tabelle 1.17 zu ersehen. Der Datenspeicher-Adressierbereich<br />

besteht aus e<strong>in</strong>em <strong>in</strong>ternen <strong>und</strong> e<strong>in</strong>em externen Teil. Auf<br />

den externen Teil wird bei der Ausführung e<strong>in</strong>es MOVX-Befehls zugegriffen. Der<br />

<strong>in</strong>terne Datenspeicher besteht aus zwei getrennten Blöcken: den 128 Bytes des<br />

RAM <strong>und</strong> den 128 Bytes der speziellen Funktionsregister.<br />

Abb. 1.33:<br />

Adressierbereich des <strong>in</strong>ternen Datenspeichers<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

103


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.34:<br />

Adressen der bitadressierbaren Speicherstellen im RAM<br />

104<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.10<br />

Speicherorganisation <strong>und</strong> Adressierungsarten<br />

Abb. 1.35:<br />

Adressen der bitadressierbaren Speicherstellen im speziellen Funktionsregister<br />

(SFR)<br />

Abbildung 1.33 zeigt die Gliederung des <strong>in</strong>ternen Datenspeicher-Adressierbereichs.<br />

Vier 8-Registerbänke belegen die Speicherplätze 0 bis 31 im RAM-Bereich.<br />

Zu e<strong>in</strong>er bestimmten Zeit kann nur e<strong>in</strong>e dieser vier Bänke <strong>in</strong> Betrieb se<strong>in</strong> (über<br />

e<strong>in</strong> 2-Bit-Feld im Programmstatuswort). Die nächsten 16 Bytes, die Speicherplätze<br />

32 bis 47, enthalten 128 bitadressierbare Speicherstellen, deren Adressen <strong>in</strong> Abbil-<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

105


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

dung 1.34 angegeben s<strong>in</strong>d. Im Bereich des speziellen Funktionsregisters gibt es<br />

ebenfalls bitadressierbare Speicherstellen, die <strong>in</strong> Abbildung 1.35 dargestellt s<strong>in</strong>d.<br />

Man beachte, dass das Lesen aus nicht benutzten Speicherplätzen im <strong>in</strong>ternen<br />

Datenspeicher zu zufälligen Daten führt.<br />

1.11 Boole’scher Prozessor<br />

Der Boole’sche Prozessor stellt e<strong>in</strong>en <strong>in</strong>tegrierten Bitprozessor <strong>in</strong>nerhalb des 8051<br />

dar. Er hat se<strong>in</strong>en eigenen Befehlsvorrat, se<strong>in</strong>en eigenen Akkumulator (das Übertragsbit)<br />

sowie se<strong>in</strong>en eigenen bitadressierbaren Speicher (RAM) <strong>und</strong> E/A-Port.<br />

Die Bitverarbeitungsbefehle erlauben folgende Bitoperationen: Setzen; Löschen;<br />

Komplementieren; Spr<strong>in</strong>gen, wenn gesetzt; Spr<strong>in</strong>gen, wenn nicht gesetzt; Spr<strong>in</strong>gen;<br />

<strong>und</strong> dann Löschen sowie Transportieren vom <strong>und</strong> zum Übertragsbit. Adressierbare<br />

Bits oder ihre Komplemente können durch e<strong>in</strong>e logische Operation UND<br />

oder ODER mit dem Inhalt des Übertragsbits verknüpft werden <strong>und</strong> das Ergebnis<br />

wird zum Übertragsregister zurückgebracht.<br />

1.12 CMOS-Mikrocontroller-Familie AT89C51<br />

Die Eigenschaften <strong>und</strong> Funktionen von tragbaren Geräten werden ständig verbessert.<br />

Die K<strong>und</strong>en wollen die Leistungsfähigkeit ihrer Produkte erhöhen, was wiederum<br />

e<strong>in</strong>e höhere Rechenleistung erfordert. Gleichzeitig wird e<strong>in</strong> ger<strong>in</strong>gerer<br />

Leistungsverbrauch angestrebt. Im Mittelpunkt dieser entgegengesetzten Forderungen<br />

steht der Mikrocontroller – typischerweise e<strong>in</strong>er der größten Leistungsverbraucher<br />

<strong>in</strong> tragbaren Geräten.<br />

Es gibt zwar viele leistungssparende Prozessoren, aber ihre Leistungsfähigkeit ist<br />

oft e<strong>in</strong>geschränkt. Die Familie schneller Mikrocontroller von Dallas Semiconductor<br />

<strong>und</strong> Atmel stellt e<strong>in</strong>en guten Kompromiss zwischen Leistungsverbrauch <strong>und</strong><br />

Leistungsfähigkeit dar. Sie basiert auf der Architektur des 8051 – e<strong>in</strong>er der weltweit<br />

verbreitetsten Mikrocontroller. Die Entwicklungs<strong>in</strong>genieure wissen se<strong>in</strong>e e<strong>in</strong>fache<br />

Anwendung, die großzügig ausgelegte E<strong>in</strong>-/Ausgangsstruktur <strong>und</strong> die<br />

breite Akzeptanz zu schätzen. Mittlerweile hat er auch im Bereich der tragbaren<br />

Produkte Verbreitung gef<strong>und</strong>en, wo er <strong>in</strong> zahlreichen Anwendungen e<strong>in</strong>gesetzt<br />

wird.<br />

Der wichtigste Faktor bei der Bestimmung des Leistungsverbrauchs <strong>in</strong> e<strong>in</strong>er<br />

Schaltung mit Mikrocontroller ist die Taktfrequenz des Systems. Der Leistungsverbrauch<br />

komplementärer Metalloxidhalbleiterbauelemente (CMOS) ist der Taktfrequenz<br />

direkt proportional. Daraus folgt, dass e<strong>in</strong> Mikrocontroller unter dem<br />

Gesichtspunkt des Leistungsverbrauchs mit der ger<strong>in</strong>gstmöglichen Frequenz<br />

betrieben werden sollte.<br />

106<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.12<br />

CMOS-Mikrocontroller-Familie AT89C51<br />

Die typische Leistungskurve für e<strong>in</strong>en Mikrocontroller geht von 12 MHz <strong>und</strong> e<strong>in</strong>er<br />

Stromaufnahme von ca. 14 mA bis zu 22 mA bei 25 MHz, die allen Entwurfs<strong>in</strong>genieuren<br />

für tragbare Systeme bekannt ist. Der Kurve ist zu entnehmen, dass sich<br />

die Stromaufnahme, mit e<strong>in</strong>em DC-Offset, über der Frequenz l<strong>in</strong>ear verhält. Dieser<br />

Ruhestrom wird durch die statischen Schaltungsteile auf dem Chip, wie Komparatoren,<br />

Operationsverstärkern usw., verursacht. Obwohl es sich dabei um e<strong>in</strong>en<br />

relativ ger<strong>in</strong>gen Strom (< 1 mA) handelt, stellt er doch e<strong>in</strong>e konstante Belastung<br />

dar, die nicht vernachlässigt werden sollte.<br />

Jede Schaltung, die für e<strong>in</strong>en ger<strong>in</strong>gen Leistungsverbrauch ausgelegt ist, wird mit<br />

der ger<strong>in</strong>gstmöglichen Frequenz arbeiten. Die Festlegung der m<strong>in</strong>imalen Systemfrequenz<br />

<strong>und</strong> damit des m<strong>in</strong>imalen Leistungsverbrauchs hängt von mehreren<br />

Faktoren ab, e<strong>in</strong>schließlich des gewünschten Leistungsverhaltens <strong>und</strong> der Interrupt-Latenz.<br />

Unabhängig von den Kriterien bleibt das Ziel jedoch bestehen: die<br />

möglichst genaue Anpassung der Betriebsfrequenz des Bauste<strong>in</strong>s an die Leistungsanforderungen<br />

der Anwendung.<br />

1.12.1 Schneller CPU-Kern im AT89C51<br />

Das direkte Verfahren zur Reduzierung des Leistungsverbrauchs e<strong>in</strong>er Schaltung<br />

mit dem 8051 ist die Erhöhung der Rechenleistung des Mikrocontrollers. Die<br />

Gr<strong>und</strong>version des 8051 basierte auf der 12-Takt-Architektur mit zwei Abrufen pro<br />

Lesezyklus. Die Familie schneller Mikrocontroller arbeitet jedoch mit e<strong>in</strong>em Kern<br />

mit vier Takten oder e<strong>in</strong>em Takt pro Lesezyklus. Dies ist rechnerisch effizienter<br />

<strong>und</strong> erfordert weniger Taktzyklen zur Ausführung e<strong>in</strong>es Befehls. Daraus ergeben<br />

sich kürzere Ausführungszeiten <strong>und</strong> höhere maximale Taktfrequenzen.<br />

Gewöhnlich werden die Vorteile e<strong>in</strong>es schnellen Kerns h<strong>in</strong>sichtlich des Leistungsverhaltens<br />

betrachtet, sie wirken sich jedoch auch erheblich auf den Leistungsverbrauch<br />

aus. Wird die Befehlsausführung des Prozessors optimiert, wird weniger<br />

Zeit für die gleiche Aufgabe benötigt. Viele tragbare Produkte arbeiten im Stoßmodus,<br />

das heißt, auf kurze Aktivitätsperioden folgen längere Perioden der Inaktivität,<br />

wie z.B. bei der Aufzeichnung von Umweltdaten oder beim Lesen e<strong>in</strong>es<br />

Strichcodes. Durch die Reduzierung der Aktivitätszeit des Mikrocontrollers wird<br />

e<strong>in</strong>e entsprechende Reduzierung des Energieverbrauchs erreicht.<br />

E<strong>in</strong>e weitere Folge aus dem verbesserten Wirkungsgrad ist, dass sich das gleiche<br />

Leistungsverhalten bei reduzierter Taktfrequenz erreichen lässt. Arbeitet e<strong>in</strong> veränderter<br />

Kern mit vier anstatt zwölf Takten pro Zyklus, heißt das, dass der gleiche<br />

Leistungsumfang bei reduzierter Taktfrequenz bewältigt wird. Da der Leistungsverbrauch<br />

der Taktfrequenz direkt proportional ist, lässt er sich auf diese Art ohne<br />

Bee<strong>in</strong>trächtigung des Leistungsverhaltens reduzieren.<br />

Vergleicht man den Leistungsverbrauch von drei Mikrocontrollern, die die gleiche<br />

Aufgabe mit dem gleichen Leistungsverhalten ausführen, erkennt man die Unter-<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

107


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

schiede. Zwei Mikrocontroller s<strong>in</strong>d vom Standardbauste<strong>in</strong> 8051 abgeleitet <strong>und</strong><br />

arbeiten mit zwölf extern erzeugten Takten pro Abrufzyklus, während es sich beim<br />

dritten um e<strong>in</strong>en Mikrocontroller AT89C51 handelt, der mit vier Takten pro Abrufzyklus<br />

arbeitet. Für alle Bauste<strong>in</strong>e wurde der Stromverbrauch gemessen <strong>und</strong> verglichen,<br />

wobei für den AT89C51 für die Verbesserung des Leistungsverhaltens e<strong>in</strong><br />

konservativer Wert von 250 % angenommen wurde. Wie aus der Praxis bekannt<br />

ist, ergibt sich bei dem Kern mit reduzierten Taktperioden pro Masch<strong>in</strong>enzyklus<br />

e<strong>in</strong>e erhebliche Stromreduzierung bei gleichem Durchsatz, besonders bei höheren<br />

Leistungsdaten.<br />

E<strong>in</strong> weiteres Verfahren zur Leistungse<strong>in</strong>sparung ist die Integration peripherer<br />

Funktionen auf dem Chip. Beim Treiben e<strong>in</strong>es Signals außerhalb des Chips muss<br />

der signalerzeugende Schaltkreis die zum Treiben der externen Lasten erforderliche<br />

Schaltleistung aufbr<strong>in</strong>gen <strong>und</strong> die DC-Verluste ausgleichen. Unter Schaltleistung<br />

(P SW ) ist die bei e<strong>in</strong>er Signaländerung verbrauchte Leistung zu verstehen. Sie<br />

wird näherungsweise wie folgt errechnet:<br />

P SW<br />

C U<br />

T<br />

2<br />

Dabei ist C die Gesamtkapazität des Empfangsgatters des E<strong>in</strong>gangspuffers <strong>und</strong><br />

der Verb<strong>in</strong>dung zwischen den beiden Gates, <strong>und</strong> der Wert T ist die Taktperiode des<br />

Signals. E<strong>in</strong>e typische E<strong>in</strong>gangskapazität e<strong>in</strong>es CMOS-E<strong>in</strong>gangs ist 10 pF. Die<br />

Ermittlung des genauen Werts der Schaltleistung e<strong>in</strong>es Systems ist zwar schwierig,<br />

aber es liegt auf der Hand, dass jede zusätzliche externe Last oder jeder<br />

Anschluss, den der Mikrocontroller zu treiben hat, zusätzliche Leistung verbraucht.<br />

Systeme auf Mikrocontrollerbasis arbeiten normalerweise mit mehreren peripheren<br />

Schaltkreisen. Diese reichen von externen UARTs <strong>und</strong> E<strong>in</strong>schalt-Resets bis zu<br />

Watchdog-Timern. E<strong>in</strong>er der Vorteile der Produktfamilie AT89C51 besteht <strong>in</strong> der<br />

großen Anzahl der auf dem Chip <strong>in</strong>tegrierten peripheren Funktionen. Neben der<br />

Vere<strong>in</strong>fachung der Schaltung durch Elim<strong>in</strong>ierung von Bauteilen können <strong>in</strong>tegrierte<br />

periphere Funktionen auch den Leistungsverbrauch reduzieren. Im<br />

Gr<strong>und</strong>e kann man annehmen, dass die Kernfunktionen jedes peripheren Schaltkreises,<br />

sei er im Prozessor <strong>in</strong>tegriert oder nicht, die gleiche Leistung verbrauchen.<br />

Durch die Integration auf dem Chip werden jedoch die beim Treiben e<strong>in</strong>es<br />

externen Busses auftretenden Schaltleistungsverluste elim<strong>in</strong>iert.<br />

1.12.2 Interner Programmspeicher <strong>und</strong> <strong>in</strong>terner Datenspeicher<br />

E<strong>in</strong>e weitere Funktion des 8051, die üblicherweise nicht als peripher betrachtet<br />

wird, ist der Programmspeicher. Alle Bauste<strong>in</strong>e der Familie 8051 <strong>und</strong> AT89C51<br />

enthalten e<strong>in</strong>en chip<strong>in</strong>tegrierten Programmspeicher unterschiedlicher Kapazität.<br />

108<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.12<br />

CMOS-Mikrocontroller-Familie AT89C51<br />

Dies wird von vielen Anwendern gewünscht, um die Anzahl der Bauteile <strong>und</strong> den<br />

Platzbedarf zu reduzieren, es verlängert aber auch die Batterielebensdauer <strong>in</strong> tragbaren<br />

Systemen. Wie bereits erwähnt, wird der Leistungsverbrauch hier reduziert,<br />

da ke<strong>in</strong> externer Bus zu treiben ist. E<strong>in</strong> auf dem Chip <strong>in</strong>tegrierter Speicher ergibt<br />

noch e<strong>in</strong>e weitere Leistungse<strong>in</strong>sparung. Die 8051-Architektur erfordert den E<strong>in</strong>satz<br />

e<strong>in</strong>es Registers des Typs 74373 für das Demultiplexen des niederwertigen<br />

Adressbytes. E<strong>in</strong> Vergleich zwischen dem E<strong>in</strong>satz e<strong>in</strong>es <strong>in</strong>ternen <strong>und</strong> e<strong>in</strong>es externen<br />

Programmspeichers ergibt e<strong>in</strong>e Stromreduzierung von 45 mA bei 12 MHz auf<br />

16 mA. Beim ersten System wird e<strong>in</strong> schneller Mikrocontroller des Typs AT89C51<br />

mit e<strong>in</strong>em Register 74AC573 <strong>und</strong> e<strong>in</strong>em EPROM 27C256 mit e<strong>in</strong>er Zugriffszeit<br />

von 70 ns verwendet. Das zweite System benutzt den gleichen Mikrocontroller,<br />

arbeitet aber mit <strong>in</strong>ternem Speicher. Beide Systeme arbeiten mit 11,0592 MHz<br />

<strong>und</strong> führen e<strong>in</strong> kurzes Programm aus. Aus dem Versuch geht hervor, dass bei<br />

hohen Frequenzen durch Elim<strong>in</strong>ierung des externen EPROM <strong>und</strong> des Registers<br />

bis zu 49 mA e<strong>in</strong>gespart werden können.<br />

Wie bereits erwähnt, wird durch e<strong>in</strong>en chip<strong>in</strong>tegrierten Speicher anstelle e<strong>in</strong>es<br />

externen RAM Leistung gespart. Der erweiterte Scratchpad-Speicher der Bauste<strong>in</strong>familie<br />

80C32 (256 Bytes) reicht als Stack- <strong>und</strong> Datenspeicher <strong>in</strong> kle<strong>in</strong>en Programmen<br />

aus, wodurch e<strong>in</strong> externes RAM entfallen kann.<br />

Für Entwicklungen, die e<strong>in</strong>en größeren Datenspeicher oder e<strong>in</strong>en externen Stack<br />

erfordern, kann jedoch e<strong>in</strong> zusätzlicher SRAM-Speicher notwendig werden. Leistungssparende<br />

SRAMs s<strong>in</strong>d zwar verfügbar, aber es entstehen zusätzliche Leistungsverluste<br />

durch das 74373-Register <strong>und</strong> die kapazitiven Verluste beim Treiben<br />

des externen Busses. Dies lässt sich durch den E<strong>in</strong>satz von Bauste<strong>in</strong>en mit erweitertem<br />

auf dem Chip <strong>in</strong>tegrierten RAM vermeiden. Es soll der Leistungsverbrauch<br />

von zwei Systemen, bei denen das SRAM <strong>in</strong> den MOVX-Datenspeicher des 8051<br />

aufgenommen wurde, untersucht werden. Das erste System benutzt e<strong>in</strong>en schnellen<br />

Mikrocontroller des Typs AT89C51 mit e<strong>in</strong>em 74AC573-Register <strong>und</strong> e<strong>in</strong>em<br />

8-Kbyte-SRAM. Das zweite System benutzt den gleichen Mikrocontroller, aber<br />

1 Kbyte des <strong>in</strong>ternen MOVX-Datenspeichers. Beide Mikrocontroller arbeiten mit<br />

11,0592 MHz <strong>und</strong> führen e<strong>in</strong> kurzes Programm aus, das Lese- <strong>und</strong> Schreiboperationen<br />

im MOVX-Datenspeicherbereich vornimmt. Man kann feststellen, dass bei<br />

hohen Frequenzen durch Elim<strong>in</strong>ierung des externen SRAM <strong>und</strong> des Registers bis<br />

zu 9 mA gespart werden können.<br />

1.12.3 Taktquelle<br />

E<strong>in</strong>e weitere wichtige Systemkomponente h<strong>in</strong>sichtlich des Leistungsverbrauchs<br />

ist die Taktquelle. Standardschaltungen mit dem 8051 benutzen üblicherweise entweder<br />

e<strong>in</strong>en externen Quarz mit e<strong>in</strong>em <strong>in</strong>ternen Oszillatorverstärker oder e<strong>in</strong>en<br />

externen Quarzoszillator. Im letzteren Fall kann die Wellenform des Taktgebers<br />

den Leistungsverbrauch bee<strong>in</strong>flussen. Die E<strong>in</strong>gangsstufe des XTAL1-Anschlusses,<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

109


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

der die externen Taktsignale für den 8051 aufnimmt, arbeitet normalerweise mit<br />

komplementären Treiberstufen. Während der Übergänge des E<strong>in</strong>gangstaktgebers<br />

zwischen H-Pegel <strong>und</strong> L-Pegel werden kurzzeitig beide Treiber e<strong>in</strong>geschaltet, was<br />

e<strong>in</strong>en erheblichen Stromstoß verursacht. Bei e<strong>in</strong>em Rechtecksignal f<strong>in</strong>den die<br />

Übergänge praktisch sofort statt, was die Zeit des gleichzeitigen E<strong>in</strong>-Zustands beider<br />

Treiber m<strong>in</strong>imiert. Bei e<strong>in</strong>er Signalform mit langsameren Übergängen, wie<br />

z.B. e<strong>in</strong>em S<strong>in</strong>us- oder Dreiecksignal, s<strong>in</strong>d die Treiber für längere Zeit gleichzeitig<br />

e<strong>in</strong>geschaltet. Dies erhöht den Strom- <strong>und</strong> Leistungsverbrauch.<br />

Als Taktquelle wurde e<strong>in</strong> programmierbarer Signalgenerator für S<strong>in</strong>us-, Dreieck<strong>und</strong><br />

Rechtecksignale benutzt. Es wurde der Mittelwert von vier Bauste<strong>in</strong>en mit<br />

normaler <strong>und</strong> hoher Geschw<strong>in</strong>digkeit dargestellt. Der Vergleich zeigt, dass der<br />

Stromverbrauch der Anstiegs- <strong>und</strong> Abfallzeit der Taktwellenform direkt proportional<br />

ist. Das Dreiecksignal hat die längste Flanke <strong>und</strong> das Rechtecksignal die<br />

höchste. Für das Rechtecksignal ergibt sich e<strong>in</strong> um 0,75 mA ger<strong>in</strong>gerer mittlerer<br />

Strom als für das Dreiecksignal. Daraus folgt, dass der Stromverbrauch bei Schaltungen<br />

mit externem Taktgeber durch den E<strong>in</strong>satz von Oszillatoren mit kurzen<br />

Anstiegs- <strong>und</strong> Abfallzeiten reduziert werden kann. Bei ger<strong>in</strong>geren Frequenzen, wo<br />

die Übergänge mehr Zeit benötigen, ist dies von noch größerer Bedeutung.<br />

E<strong>in</strong>ige 8051-Derivate enthalten e<strong>in</strong>en chip<strong>in</strong>tegrierten R<strong>in</strong>goszillator. Dabei handelt<br />

es sich üblicherweise um h<strong>in</strong>tere<strong>in</strong>ander geschaltete Inverter, die e<strong>in</strong> Pulssignal<br />

durch die Schleife propagieren lassen. Dafür steht e<strong>in</strong>e <strong>in</strong>terne Taktquelle von<br />

ca. 2 MHz bis 4 MHz zur Ansteuerung des Bauste<strong>in</strong>s zur Verfügung. Da hier ke<strong>in</strong><br />

Quarz erforderlich ist, ist diese Taktquelle äußerst leistungssparend. Die Bewertung<br />

e<strong>in</strong>es schnellen Mikrocontrollers AT89C51 zeigt, dass beim Betrieb mit<br />

e<strong>in</strong>em R<strong>in</strong>goszillator e<strong>in</strong> Leistungsverhalten erreicht wird, das e<strong>in</strong>em 7-MHz-8051<br />

bei ca. 3,6 mA entspricht. Obwohl sie nicht die Stabilität e<strong>in</strong>es piezoelektrischen<br />

Quarzes aufweisen, s<strong>in</strong>d R<strong>in</strong>goszillatoren aufgr<strong>und</strong> ihres ger<strong>in</strong>gen Leistungsverbrauchs<br />

<strong>und</strong> der vernachlässigbaren E<strong>in</strong>schaltverzögerung e<strong>in</strong> wichtiger Faktor<br />

bei der Leistungse<strong>in</strong>sparung.<br />

Wie oben erläutert, ist die Betriebsfrequenz des Mikrocontrollers der bestimmende<br />

Faktor für se<strong>in</strong>en Leistungsverbrauch. Die Taktfrequenz des Systems ist<br />

zwar hauptsächlich e<strong>in</strong>e Hardwarefunktion, aber der 8051 besitzt die Fähigkeit,<br />

sie <strong>in</strong> bestimmten Grenzen zu steuern. Diese Methoden verlangsamen die<br />

Betriebsfrequenz des Bauste<strong>in</strong>s oder halten sie für den ganzen Bauste<strong>in</strong> oder für<br />

Teilschaltung an. Die herkömmliche 8051-Architektur benutzt zwei Modi zur<br />

Taktsteuerung: Leerlauf <strong>und</strong> Stopp.<br />

Der Stoppmodus ist der Zustand mit dem niedrigsten Leistungsverbrauch für den<br />

8051. Dabei wird der <strong>in</strong>terne Oszillatorverstärker <strong>und</strong> damit auch der Betrieb des<br />

Bauste<strong>in</strong>s angehalten. Die Aufhebung des Stoppmodus geschieht normalerweise<br />

durch e<strong>in</strong>en externen Reset. Bei e<strong>in</strong>igen Versionen ist die Aufhebung des Stoppmodus<br />

auch durch externe Interrupts möglich.<br />

110<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.12<br />

CMOS-Mikrocontroller-Familie AT89C51<br />

E<strong>in</strong>er der Nachteile des Stoppmodus besteht im Leistungsverbrauch während der<br />

»Totzeit«, d.h. der Anlaufperiode des Quarzes. E<strong>in</strong> Quarzoszillator basiert auf den<br />

Schw<strong>in</strong>gungen e<strong>in</strong>es Quarzes. Aufgr<strong>und</strong> physikalischer Eigenschaften benötigt<br />

die Quarzschw<strong>in</strong>gung e<strong>in</strong>e bestimmte Zeit, um e<strong>in</strong>e für den Betrieb genügende<br />

Amplitude zu erreichen. Diese Anlaufzeit ist immer erforderlich, unabhängig<br />

davon, ob e<strong>in</strong> externer Quarz <strong>und</strong> e<strong>in</strong> <strong>in</strong>terner Oszillatorverstärker oder e<strong>in</strong> externer<br />

Quarzoszillator verwendet wird. Sie kann, abhängig von den Eigenschaften<br />

des Quarzes <strong>und</strong> des dazugehörigen Verstärkers, 3 ms bis 12 ms betragen.<br />

Diese Anlaufzeit wirkt sich so aus, dass der Bauste<strong>in</strong> Leistung verbraucht, auch<br />

wenn er während dieser Zeit se<strong>in</strong>e eigentliche Funktion nicht ausführt. Geht der<br />

Bauste<strong>in</strong> häufig <strong>in</strong> den Stoppmodus oder verlässt diesen, um kurzzeitig andere<br />

Aufgaben auszuführen, kann dies Bedeutung erlangen. Ist die andere Aufgabe<br />

sehr kurz (


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

aufzunehmen, der auf das Setzen des Stoppbits folgt, anstatt vom Reset-Vektor<br />

neu zu starten. Dadurch braucht die Reset-Quelle nicht ermittelt zu werden, <strong>und</strong><br />

der Prozessor kann se<strong>in</strong>e Funktion <strong>in</strong> kürzerer Zeit aufnehmen.<br />

Der zweite Modus zur Taktsteuerung <strong>in</strong> der Architektur der Gr<strong>und</strong>version des<br />

8051 ist der »Idle-Mode« (Leerlaufmodus).<br />

Dabei wird der Betrieb der CPU angehalten, während die chip<strong>in</strong>ternen Timer <strong>in</strong><br />

Betrieb bleiben. In e<strong>in</strong>er Anwendung, wo Leistungse<strong>in</strong>sparungen wichtig s<strong>in</strong>d,<br />

dienen diese Timer dazu, den Bauste<strong>in</strong> periodisch hochzufahren, um e<strong>in</strong>e Aufgabe<br />

auszuführen oder abzufragen, ob dies erforderlich ist. Da die Standard-Timer<br />

des 8051 nur über 16 Bit verfügen, gestattet dies e<strong>in</strong>e maximale Timeout-Periode<br />

von 31 ms bei e<strong>in</strong>er Taktfrequenz von 16 MHz. Werden längere Perioden benötigt,<br />

s<strong>in</strong>d mehrere Timer-Überläufe erforderlich. Dadurch wird zusätzliche Leistung<br />

verbraucht, da der Bauste<strong>in</strong> ab <strong>und</strong> zu den vollen Betrieb aufnehmen muss, um<br />

e<strong>in</strong>en Zähler weiterzustellen, dabei aber ke<strong>in</strong>e eigentliche Funktion ausführt.<br />

S<strong>in</strong>d längere Perioden erforderlich, ist e<strong>in</strong> <strong>in</strong>terner Timer mit e<strong>in</strong>er längeren Periode<br />

e<strong>in</strong>zusetzen. E<strong>in</strong>ige Versionen der Familie 8051 enthalten e<strong>in</strong>en Watchdog-<br />

Timer, der auch benutzt werden kann, um den Bauste<strong>in</strong> aufzuwecken. Watchdog-<br />

Timer lassen sich für lange Timeout-Perioden (etwa bis zu 226 Taktzyklen) programmieren.<br />

Damit lässt sich e<strong>in</strong>e maximale Timeout-Periode von 4,2 Sek<strong>und</strong>en<br />

bei 16 MHz erreichen. Nehmen wir beispielsweise an, dass e<strong>in</strong>e Anwendung alle<br />

drei Sek<strong>und</strong>en aus e<strong>in</strong>em leistungssparenden Zustand hochzufahren ist, um e<strong>in</strong>e<br />

Aufgabe (Task) auszuführen. Werden dazu die <strong>in</strong>ternen Timer benutzt, müsste der<br />

Bauste<strong>in</strong> 96-mal den »Idle-Mode« verlassen, ohne e<strong>in</strong>e eigentliche Funktion auszuführen.<br />

Wird jedoch e<strong>in</strong> Watchdog-Timer mit e<strong>in</strong>er langen Timeout-Periode verwendet,<br />

verlässt der Bauste<strong>in</strong> den »Idle-Mode« nur e<strong>in</strong>mal, führt die Aufgabe aus<br />

<strong>und</strong> kehrt <strong>in</strong> den leistungssparenden Zustand zurück.<br />

E<strong>in</strong>e weitere Möglichkeit besteht im E<strong>in</strong>satz e<strong>in</strong>es Mikrocontrollers mit e<strong>in</strong>er Real-<br />

Time Clock (RTC). Der schnelle Mikrocontroller AT89C51 enthält e<strong>in</strong>e RTC, die<br />

e<strong>in</strong>e Alarmperiode von bis zu 24 St<strong>und</strong>en erzeugen kann. Der durch diesen Alarm<br />

erzeugte <strong>in</strong>terne Interrupt kann den Bauste<strong>in</strong> aus dem Idle-Mode oder aus dem<br />

Stoppmodus hochfahren. Die Verwendung e<strong>in</strong>er RTC zum Verlassen des Stoppmodus<br />

ist das effizienteste Verfahren zum Anhalten des Betriebs des Bauste<strong>in</strong>s<br />

für längere Zeit.<br />

1.12.4 Power-Management-Betriebsarten<br />

Obwohl der »Idle-Mode« den Leistungsverbrauch durch Anhalten der Programmausführung<br />

reduziert, arbeiten die <strong>in</strong>ternen Timer weiter mit der externen Taktfrequenz.<br />

Unter dem Gesichtspunkt, dass die Timer sich <strong>in</strong> e<strong>in</strong>em Standby-Zustand<br />

bef<strong>in</strong>den, entsteht dadurch e<strong>in</strong> erheblicher Leistungsverbrauch.<br />

112<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.12<br />

CMOS-Mikrocontroller-Familie AT89C51<br />

E<strong>in</strong>e bessere Lösung ist die Reduzierung der Taktfrequenz des gesamten Bauste<strong>in</strong>s.<br />

Dies kann mittels e<strong>in</strong>es <strong>in</strong>ternen Frequenzteilers geschehen, der die externe<br />

Taktfrequenz teilt, bevor sie auf die CPU gegeben wird. Dieses Pr<strong>in</strong>zip wird im<br />

schnellen Mikrocontroller AT89C51 angewandt. Dieser Bauste<strong>in</strong> arbeitet mit zwei<br />

Frequenzteilerfunktionen: Power-Management-Modus 1, der die Takte<strong>in</strong>gangsquelle<br />

durch 64 teilt, <strong>und</strong> Power-Management-Modus 2, der die Takte<strong>in</strong>gangsquelle<br />

durch 1024 teilt. Diese Modi werden durch Setzen der entsprechenden Bits<br />

<strong>in</strong> e<strong>in</strong>em speziellen Funktionsregister (SFR) aktiviert.<br />

E<strong>in</strong> Vergleich zwischen dem Taktteiler <strong>und</strong> den Steuermodi des schnellen Mikrocontrollers<br />

AT89C51 mit dem 8051 zeigt, dass der Stromverbrauch bei maximaler<br />

Frequenz (geteilt durch 4), im Power-Management-Modus 1 (geteilt durch 64), im<br />

Power-Management-Modus 2 (geteilt durch 1024), im »Idle-Mode« <strong>und</strong> im Stoppmodus<br />

s<strong>in</strong>kt. Wie erwartet, wird im Stoppmodus der ger<strong>in</strong>gste Strom aufgenommen,<br />

da hier der gesamte <strong>in</strong>terne Takt angehalten wird. E<strong>in</strong> <strong>in</strong>teressantes Ergebnis<br />

dieses Vergleichs ist, dass die beiden Power-Management-Modi weniger Strom<br />

verbrauchen als der »Idle-Mode«. Damit kann der Bauste<strong>in</strong> nicht nur Leistung<br />

sparen, sondern er kann auch kont<strong>in</strong>uierlich mit reduzierten Funktionen weiterlaufen.<br />

Bei der herkömmlichen Architektur des 8051 gab es bei jeglicher CPU-<br />

Aktivität nur »alles oder nichts«. Der Bauste<strong>in</strong> musste <strong>in</strong> jedem Fall mit der maximalen<br />

Leistungsfähigkeit arbeiten, selbst wenn dies nur für kurze Perioden erforderlich<br />

war. Dadurch wurde der Leistungsverbrauch unnötig erhöht. Durch die<br />

Anwendung der Power-Management-Modi (PMM) kann der Bauste<strong>in</strong> (<strong>und</strong> das<br />

System) se<strong>in</strong>en Leistungsverbrauch an die benötigte Rechenleistung anpassen.<br />

E<strong>in</strong>e mögliche Folge des E<strong>in</strong>satzes e<strong>in</strong>es <strong>in</strong>ternen Frequenzteilers ist e<strong>in</strong>e beträchtliche<br />

Erhöhung der Interrupt-Latenzen. Darüber h<strong>in</strong>aus würde das Verlangsamen<br />

der <strong>in</strong>ternen Timer die Fähigkeit der seriellen Ports des 8051 bee<strong>in</strong>trächtigen, die<br />

Standard-Baudrate zu erzeugen oder mit dieser zu synchronisieren. Dies könnte<br />

wiederum die Reaktion des Bauste<strong>in</strong>s auf externe Signale beh<strong>in</strong>dern. E<strong>in</strong>e Lösung<br />

dafür ist der E<strong>in</strong>bau e<strong>in</strong>er Funktion, die den Bauste<strong>in</strong> automatisch auf den vollen<br />

Betrieb hochfährt, wenn e<strong>in</strong> externer Interrupt oder die Aktivität e<strong>in</strong>es seriellen<br />

Ports festgestellt wird. E<strong>in</strong> solcher Mechanismus wurde <strong>in</strong> den AT89C51 implementiert.<br />

Es handelt sich dabei um die »Switchback«- Funktion, mit deren Hilfe der Bauste<strong>in</strong><br />

rasch auf externe Interrupts reagiert. Sofort nach der Bestätigung des<br />

Interrupts schaltet der Bauste<strong>in</strong> ohne Softwaree<strong>in</strong>griff automatisch auf die volle<br />

Frequenz (geteilt durch 4) zurück.<br />

Die seriellen Schnittstellen arbeiten auf ähnliche Weise. Wenn e<strong>in</strong>e fallende<br />

Flanke (Startbit) am Empfangse<strong>in</strong>gang der seriellen Schnittstelle ankommt, schaltet<br />

der Bauste<strong>in</strong> automatisch auf die volle Frequenz (geteilt durch 4) zurück. Da<br />

dies direkt am Anfang der Übertragung erfolgt, kann der Bauste<strong>in</strong> den Rest der<br />

Übertragung mit der vollen Frequenz empfangen. Bei der herkömmlichen 8051-<br />

Architektur konnten die seriellen Ports <strong>in</strong> e<strong>in</strong>er leistungssparenden Konfiguration<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

113


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

lediglich im »Idle-Mode« benutzt werden. Die Power-Management-Modi bieten<br />

hier e<strong>in</strong>e leistungssparende Alternative.<br />

In leistungssparenden Systemen ist es üblich, das System vom Stoppmodus aufzuwecken,<br />

bestimmte Aktivitäten auszuführen <strong>und</strong> dann zum Stoppmodus<br />

zurückzukehren. E<strong>in</strong>e Möglichkeit, den Leistungsverbrauch <strong>in</strong> derartigen Systemen<br />

zu reduzieren, ist die Erhöhung der Betriebsfrequenz. Auf den ersten Blick<br />

sche<strong>in</strong>t dies unserem Ziel entgegenzustehen. Während se<strong>in</strong>er Betriebszeit verbraucht<br />

der Bauste<strong>in</strong> mehr Leistung als e<strong>in</strong> mit niedrigerer Frequenz arbeitendes<br />

System. Der beim Betrieb des Systems verbrauchte Ruhestrom hängt jedoch nicht<br />

von der Frequenz ab. Beim endgültigen Systementwurf wird der Energieverbrauch<br />

üblicherweise e<strong>in</strong>geschätzt, um die Batterielebensdauer zu bestimmen.<br />

Diese Unterscheidung ist bei der Bewertung e<strong>in</strong>es leistungsfähigen Mikrocontrollers<br />

zu beachten, da dieser das Konzept von Zeit <strong>und</strong> Betriebsleistungsverbrauch<br />

vere<strong>in</strong>t. Ist das Produkt aus Leistungsverbrauch <strong>und</strong> Zeit für e<strong>in</strong> bestimmtes System<br />

kle<strong>in</strong>er, verbraucht dieses, unabhängig von den speziellen Bed<strong>in</strong>gungen,<br />

weniger Energie. In vielen Fällen lässt sich nachweisen, dass e<strong>in</strong> schneller Mikrocontroller<br />

den Energieverbrauch reduzieren kann, <strong>in</strong>dem er für kurze Perioden<br />

mit hoher Frequenz arbeitet, anstatt für längere Zeit langsamer zu laufen.<br />

Nehmen wir an, dass der AT89C51 nach dem Hochfahren aus dem Stoppmodus<br />

e<strong>in</strong>en I/O-Port lesen, e<strong>in</strong>e mathematische Berechnung ausführen, das Ergebnis an<br />

e<strong>in</strong>em anderen Port ausgeben muss <strong>und</strong> dass dies 500 Operationszyklen CPU-<br />

Zeit erfordert. Gemäß dem Vergleich beträgt der Stromverbrauch 12,4 mA bei<br />

10 MHz bzw. 34,6 mA bei 30 MHz. Aus e<strong>in</strong>em Vergleich geht hervor, dass beim<br />

Betrieb mit 30 MHz 6 % weniger Energie verbraucht wird, also erweist sich e<strong>in</strong>e<br />

höhere Betriebsfrequenz hier als effizienter.<br />

Bei vielen Anwendungen hängt die Hochfahrzeit aus dem Stoppmodus nicht nur<br />

von der Geschw<strong>in</strong>digkeit ab. Oftmals muss der Bauste<strong>in</strong> auf e<strong>in</strong>en peripheren<br />

Schaltkreis mit e<strong>in</strong>er festen Antwortzeit, wie z.B. e<strong>in</strong>en A/D-Wandler oder e<strong>in</strong>en<br />

Thermostat, zugreifen. In diesem Fall ist der Mikrocontroller mit e<strong>in</strong>er <strong>in</strong>tensiven<br />

Aktivität (Burst Activity) beschäftigt, normalerweise um e<strong>in</strong>en Prozess zu <strong>in</strong>itialisieren,<br />

worauf e<strong>in</strong>e Periode ger<strong>in</strong>ger oder sogar ke<strong>in</strong>er Aktivität folgt. Für e<strong>in</strong>en<br />

solchen Fall kann e<strong>in</strong>e Komb<strong>in</strong>ation verschiedener Leistungssparverfahren geeignet<br />

se<strong>in</strong>.<br />

Die Mikrocontroller der Familie 8051 gehören nach wie vor zu den weltweit verbreitetsten<br />

Prozessoren. Mit ihrem unkomplizierten E<strong>in</strong>satz <strong>und</strong> der relativ hohen<br />

Leistungsfähigkeit eignen sie sich ideal für viele Anwendungen, e<strong>in</strong>schließlich tragbarer<br />

<strong>und</strong> Handgeräte. Mit der E<strong>in</strong>führung schneller Mikrocontroller von Dallas<br />

Semiconductor <strong>und</strong> Atmel ergibt sich die Möglichkeit, den Leistungsverbrauch existierender<br />

8051-Schaltungen ohne kostenaufwendige Neuentwürfe zu reduzieren.<br />

114<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.13<br />

Programmierung des 8751<br />

Die Vorteile von leistungssparenden Mikrocontrollern lassen sich folgendermaßen<br />

zusammenfassen: E<strong>in</strong>e leistungsfähige CPU erlaubt e<strong>in</strong>e Verr<strong>in</strong>gerung der<br />

Prozessorfrequenz, wodurch die gleichen Leistungsmerkmale bei reduziertem<br />

Leistungsverbrauch erreicht werden. Andererseits lässt sich die Prozessorleistung<br />

e<strong>in</strong>es existierenden Systems verbessern, ohne den Leistungsverbrauch zu erhöhen.<br />

Bei dem schnellen Mikrocontroller s<strong>in</strong>d Funktionen wie Watchdog-Timer, zusätzliche<br />

UARTs <strong>und</strong> genaue Reset-Schaltkreise <strong>in</strong>tegriert. Externe Schaltkreise verbrauchen<br />

mehr Leistung.<br />

Die E<strong>in</strong>führung von zwei neuen leistungssparenden Modi bietet e<strong>in</strong>e bessere<br />

Alternative zum Idle Mode. Neben der Reduzierung des Stromverbrauchs ermöglichen<br />

Power-Management-Modi, wie sie im AT89C51 Anwendung f<strong>in</strong>den, dem<br />

Prozessor auch im leistungssparenden Modus die Ausführung bestimmter Funktionen,<br />

wie z.B. der Abfrage (Poll<strong>in</strong>g). Bei herkömmlichen 8051-Architekturen<br />

muss der Prozessor immer mit der maximalen Betriebsfrequenz arbeiten, selbst<br />

wenn nur e<strong>in</strong>e m<strong>in</strong>imale Verarbeitungsleistung benötigt wird.<br />

Durch die Komb<strong>in</strong>ation der Vorteile e<strong>in</strong>er programmierbaren Taktfrequenz <strong>und</strong><br />

e<strong>in</strong>es leistungsfähigen Kerns mit dem Stoppmodus kann e<strong>in</strong>e beträchtliche Leistungse<strong>in</strong>sparung<br />

erreicht werden. Es wurden Beispiele dafür gezeigt, wie der Leistungsverbrauch<br />

durch Anpassung der Taktfrequenz an die gewünschte Prozessorleistung<br />

reduziert werden kann.<br />

1.13 Programmierung des 8751<br />

Die Programmierung des AT89C51 basiert im Wesentlichen auf dem Mikrocontroller<br />

8751, der zur Programmspeicherung e<strong>in</strong> EPROM verwendet. Im AT89C51<br />

wird dagegen e<strong>in</strong> EEPROM oder Flash-EPROM verwendet.<br />

1.13.1 Programmierung des EPROM im 8751<br />

Der Mikrocontroller 8751 ist die EPROM-Schaltung der Mikrocontroller-Familie<br />

8051. Der Programmspeicher auf dem Chip kann also elektrisch programmiert<br />

<strong>und</strong> durch UV-Licht wieder gelöscht werden. Außerdem s<strong>in</strong>d beim 8751 Vorkehrungen<br />

getroffen, die e<strong>in</strong>en Zugriff auf den Inhalt des Programmspeichers von<br />

außen verh<strong>in</strong>dern können, so dass die Software gegen unberechtigte Verwendung<br />

geschützt ist.<br />

Bei der Programmierung muss der Mikrocontroller mit e<strong>in</strong>er Oszillatorfrequenz<br />

von 4 MHz bis 6 MHz arbeiten. Der Oszillator muss deshalb <strong>in</strong> Betrieb se<strong>in</strong>, weil<br />

der <strong>in</strong>terne Bus Adressen <strong>und</strong> Daten <strong>in</strong> die zuständigen Register transportieren<br />

soll. Die Adresse des zu programmierenden EPROM-Speicherplatzes wird an Port 1<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

115


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

<strong>und</strong> die Anschlüsse P2.0 bis P2.3 an Port 2 gelegt, während das Datenbyte an Port<br />

0 gelegt werden muss. Die Anschlüsse P2.4 bis P2.6 sowie PSEN sollten auf L-<br />

Pegel <strong>und</strong> die Anschlüsse P2.7 <strong>und</strong> RST auf H-Pegel gehalten werden. Hierbei<br />

handelt es sich um TTL-Pegel, ausgenommen RST, das 2,5 V für e<strong>in</strong>en H-Pegel<br />

erfordert. EA/U pp wird normalerweise auf H-Pegel gehalten <strong>und</strong> mit ±21 V<br />

gepulst. Während an EA/U pp 21 V liegen, wird der Anschluss ALE/PROG, der sich<br />

normalerweise auf H-Pegel bef<strong>in</strong>det, für 50 ms auf L-Pegel gepulst <strong>und</strong> danach<br />

EA/U pp wieder auf H-Pegel gelegt. Abbildung 1.36 zeigt die Funktion der<br />

Anschlüsse bei der Programmierung des 8751.<br />

Abb. 1.36: Programmierung des 8751<br />

Man beachte, dass am Anschluss EA/U pp zu ke<strong>in</strong>em Zeitpunkt e<strong>in</strong>e höhere Spannung<br />

als der angegebene Grenzwert U pp = 21,5 V liegen darf. Selbst e<strong>in</strong> schmaler<br />

Störimpuls oberhalb dieses Spannungspegels kann zu dauerhafter Beschädigung<br />

des Mikrocontrollers führen. Die Spannung U pp sollte geregelt <strong>und</strong> frei von Störimpulsen<br />

se<strong>in</strong>.<br />

Wenn das Programmsicherheitsbit nicht gesetzt ist, lässt sich der auf dem Chip<br />

bef<strong>in</strong>dliche Programmspeicher für Prüfzwecke lesen, <strong>und</strong> zwar auf Wunsch entweder<br />

während oder nach der Programmierung. In Abbildung 1.37 ist die hierfür<br />

erforderliche Beschaltung des 8751 angegeben. Sie ist dieselbe wie bei der Programmierung,<br />

ausgenommen, dass Anschluss P2.7 auf dem L-Pegel liegen muss<br />

oder als Lese-Strobe-E<strong>in</strong>gang (aktiver Zustand L-Pegel) verwendet wird.<br />

116<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.13<br />

Programmierung des 8751<br />

Abb. 1.37: Programmüberprüfung beim 8751<br />

Die Adresse des zu lesenden Programmspeicherplatzes wird an Port 1 <strong>und</strong> die<br />

Anschlüsse P2.0 bis P2.3 gelegt. Die anderen Anschlüsse von Port 2 <strong>und</strong> PSEN<br />

werden auf L-Pegel gehalten, ALE, EA <strong>und</strong> RST s<strong>in</strong>d auf H-Pegel zu halten. Der<br />

Inhalt des adressierten Speicherplatzes ersche<strong>in</strong>t an Port 0. Für diese Operation<br />

s<strong>in</strong>d externe Pull-up-Widerstände an Port 0 erforderlich.<br />

1.13.2 Programmsicherung<br />

Der 8751 enthält e<strong>in</strong> Sicherheitsbit, das, sobald es gesetzt ist, jeglichen externen<br />

elektrischen Zugriff zum Programmspeicher auf dem Chip verh<strong>in</strong>dert. Die<br />

Beschaltung <strong>und</strong> die Programmierung mit dem Sicherheitsbit s<strong>in</strong>d dieselben wie<br />

bei der normalen Programmierung, ausgenommen, dass Anschluss P2.6 auf dem<br />

H-Pegel gehalten wird. Abbildung 1.38 zeigt die Beschaltung. An den Anschlüssen<br />

von Port 0, Port 1 <strong>und</strong> P2.0 bis P2.3 von Port 2 kann jeder Pegel liegen.<br />

Sobald das Sicherheitsbit gesetzt ist, lässt es sich nur durch die vollständige<br />

Löschung des Programmspeichers deaktivieren. Solange es gesetzt ist, kann der<br />

<strong>in</strong>terne Programmspeicher nicht gelesen werden, die Schaltung kann nicht weiter<br />

programmiert werden, <strong>und</strong> sie kann nicht auf externe Programmspeicher zugreifen.<br />

Durch Löschung des EPROM <strong>und</strong> die damit verb<strong>und</strong>ene Deaktivierung des<br />

Sicherheitsbits wird die volle Funktionsfähigkeit der Schaltung wiederhergestellt.<br />

Sie lässt sich danach erneut programmieren.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

117


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Abb. 1.38: Setzen des Sicherheitsbits beim 8751<br />

Die Löschung des EPROM auf dem 8751 setzt e<strong>in</strong>, wenn der Chip Licht ausgesetzt<br />

wird, dessen Wellenlänge kle<strong>in</strong>er als 0,4 m ist. Da Licht dieser Wellenlängen von<br />

der Sonne <strong>und</strong> von fluoreszierenden Lichtquellen abgestrahlt wird, kann e<strong>in</strong>e<br />

(unbeabsichtigte) Löschung des EPROM erfolgen, wenn dieses e<strong>in</strong>er derartigen<br />

Quelle über e<strong>in</strong>en längeren Zeitraum (e<strong>in</strong>e Woche im Sonnenlicht, drei Jahre bei<br />

Zimmerbeleuchtung mit Leuchtstoffröhren) ausgesetzt wird. Wenn e<strong>in</strong>e solche<br />

Belichtung im Anwendungsfall möglich ist, empfiehlt es sich, das Fenster mit<br />

e<strong>in</strong>em für UV-Licht <strong>und</strong>urchlässigen Aufkleber abzudecken.<br />

Zur Löschung des EPROM auf dem 8751 wird empfohlen, es ultraviolettem Licht<br />

(0,2537 m) mit e<strong>in</strong>er Gesamtdosis von wenigstens 15 W/cm 2 auszusetzen. E<strong>in</strong>e<br />

20- bis 30-m<strong>in</strong>ütige Bestrahlung des 8751 mit e<strong>in</strong>er UV-Lampe, die 12 mW/cm 2<br />

abgibt, dürfte bei e<strong>in</strong>er Entfernung von ca. 2,5 cm zwischen Lampe <strong>und</strong> Chip zur<br />

Löschung ausreichen. Nach der Löschung bef<strong>in</strong>den sich alle Speicherstellen im<br />

Zustand 1.<br />

1.13.3 Programmierung des AT89C51<br />

Für die Programmierung des AT89C51 benötigt man e<strong>in</strong>e Entwicklungssoftware,<br />

die kostenlos bei Atmel aus dem Internet direkt zu laden ist, <strong>und</strong> e<strong>in</strong>en Programmer.<br />

Abbildung 1.39 zeigt die Hardware für e<strong>in</strong>en Programmer.<br />

Die Hardware besteht aus dem Mikrocontroller AT89C51, der Quarzschaltung mit<br />

fünf Bauteilen, dem MAX232 <strong>und</strong> dem 9-poligen Sub-Stecker. Über die serielle<br />

Schnittstelle werden die Daten vom PC zum Mikrocontroller übertragen. Zwischen<br />

dem Sub-Stecker <strong>und</strong> dem AT89C51 bef<strong>in</strong>det sich der MAX232, der die<br />

118<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313


1.13<br />

Programmierung des 8751<br />

Pegel auf entsprechendes Spannungsniveau umsetzt. Der MAX232 enthält die<br />

Pegelumsetzer <strong>und</strong> benötigt daher externe Kondensatoren, denn die Innenschaltung<br />

arbeitet mit mehreren Spannungskonvertern.<br />

Abb. 1.39:<br />

Hardware für e<strong>in</strong>en Programmer des AT89C51<br />

Der Mikrocontroller hat e<strong>in</strong>en Flash-Speicher <strong>und</strong> es gilt die Programmprozedur<br />

von Tabelle 1.28.<br />

Betriebsart RST PSEN ALE/PROG EA/U pp P2.6 P2.7 P3.6 P3.7<br />

Schreibdaten H L _ H/+12 V L H H H<br />

Lesedaten H L H H L L H H<br />

Schreibsperre<br />

Bit – 1 H L _ H/+12 V H H H H<br />

Bit – 2 H L _ H/+12 V H H L L<br />

Bit – 3 H L _ H/+12 V H L H L<br />

Bauste<strong>in</strong> löschen H L _* H/+12 V H L L L<br />

Lese Signaturbyte H L H H L L L L<br />

Tabelle 1.28: Programmierbetrieb des AT89C51<br />

*) Das Signal für den »Bauste<strong>in</strong> löschen« soll 10 ms als Impuls am<br />

PROG-E<strong>in</strong>gang anliegen.<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313<br />

119


Kapitel 1<br />

Mikrocontroller-8051-Familie <strong>und</strong> AT89C51<br />

Wenn das Programm assembliert ist <strong>und</strong> der <strong>Assembler</strong> ke<strong>in</strong>e Fehler be<strong>in</strong>haltet,<br />

kann mit der Programmierung des Mikrocontrollers AT89C51 begonnen werden.<br />

Für die ersten Versuche wird die Datenübertragung mit der seriellen Schnittstelle<br />

durchgeführt.<br />

120<br />

© des Titels »<strong>Mikrocontrollerprogrammierung</strong> <strong>in</strong> <strong>Assembler</strong> <strong>und</strong> C« (ISBN 978-3-8266-8313-8) 2013 by<br />

Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg. Nähere Informationen unter: http://www.mitp.de/8313

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!