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