Mikrocontrollerprogrammierung in Assembler und C
Mikrocontrollerprogrammierung in Assembler und C
Mikrocontrollerprogrammierung in Assembler und C
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