Mikrocomputertechnik mit der 8051-Controller Familie 3. neu bearbeitete Auflage
Jürgen Walter
Mikrocomputertechnik mit der 8051-Controller Familie Hardware, Assembler, C 3. neu bearbeitete Auflage
123
Prof. Dipl.-Ing. Jürgen Walter HS Karlsruhe Fachgebiet Mechatronik Moltkestr. 30 76133 Karlsruhe
[email protected] ISBN 978-3-540-66758-2
e-ISBN 978-3-540-69465-6
DOI 10.1007/978-3-540-69465-6 Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. © 2008, 1996, 1994 Springer-Verlag Berlin Heidelberg Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechtsgesetzes. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Satz: Digitale Druckvorlage des Autors Herstellung: le-tex publishing services oHG, Leipzig Einbandgestaltung: eStudioCalamar S.L., F. Steinen-Broo, Girona, Spanien Gedruckt auf säurefreiem Papier 987654321 springer.com
Vorwort zur dritten Auflage Der 8051-Controller ist aufgrund seiner weiten Verbreitung besonders als Modellsystem für die Mikrocomputertechnik geeignet. Dieses Buch führt in die technischen Grundlagen dieses Prozessorsystems, die Assembler- und C-Programmierung mit Anwendungen, sowie die Hardwareentwicklung ein. Die beiliegende CD-ROM enthält ein voll funktionales Entwicklungspaket mit Simulator, Assembler und C-Compiler. Für die zweite Auflage wurde das Softwarepaket um ein Lehrprogramm erweitert, mit dem die Grundlagen der Digitaltechnik repetiert und dynamische Abläufe anschaulich dargestellt werden können. Mit seinem didaktischen Aufbau, den verständlichen Erklärungen, den Übungsaufgaben, den mitgelieferten Übungs- und Entwicklungsprogrammen wendet sich dieses Lernpaket vor allem an die praxisorientierten Ingenieure und Studenten. Für die dritte Auflage wurde die CD-ROM durch Programme für die wichtige praktische Anwendung erweitert. Karlsruhe 8. Oktober 2007 Jürgen Walter
Vorwort zur zweiten Auflage Als Autor bin ich erfreut über die Resonanz, die dieses Buch mit CD gefunden hat. Das Lehrangebot wurde auf der CD zusätzlich durch ein CBT (Computer Based Training) ergänzt. Insbesondere können Sie hier interaktiv mit Hilfe des Rechners in Ihrer eigenen Lerngeschwindigkeit arbeiten. Die Software zum Debuggen von Programmen wurde auf die WindowsOberfläche umgestellt. Ein Programm zur Pulsweitenmodulation ergänzt die verschiedenen Programmbeispiele. Durch die Einrichtung eines FTP-Servers an der FH Karlsruhe können Sie die aktuellsten Programme über Internet abrufen. Die Adresse ist: http://WWW.FH-Karlsruhe.de/ . Auf der ersten Seite befindet sich eine Volltextsuche an der Sie als Stichwort „8051“ eingeben sollten. Karlsruhe 2. März 1996 Jürgen Walter
Vorwort zur ersten Auflage Es ist mir eine große Freude, als Hochschuldidaktiker das Vorwort zu dieser gelungenen Einführung in die µ-Computertechnik zu schreiben. Um die Vorzüge dieses Buches zu illustrieren, ist eine kurze Betrachtung des Lernprozesses erforderlich. Traditionelles Lernen besteht in dem Versuch, eine komplexe Informationsfülle - etwa in einer Vorlesung oder aus einem Buch - aufzunehmen. Je passiver dies geschieht, desto geringer sind die Aussichten für einen nachhaltigen Lernerfolg. Nach Möglichkeit sollte das "Schlucken" der Inhalte bereits mit einem "Kauvorgang" (z.B. in Form einer strukturierten Mitschrift oder eigenen Markierungen bzw. Kommentaren im Buchtext verbunden werden. Nach der Aufnahme der Information muss diese in einem zweiten Schritt "verdaut" werden. Hiermit ist der Prozess gemeint, in welchem eine Vernetzung der neuen Begriffe, Theorieelemente und Sachverhalte mit dem Vorwissen des Studenten erfolgt. Da jeder Studierende andere Vorkenntnisse und Vorerfahrungen sowie einen anderen Lernstil hat, gestaltet sich dieser Arbeitsvorgang sehr individuell. In jedem Fall aber ist er ein aktiver Prozess, in dessen Verlauf die alte Wissensstruktur so umgebildet werden muss, dass sich die neuen Wissenselemente einfügen. Jede Frage und jeder kognitive Konflikt, der in dieser Phase auftaucht, kann als Brückenkopf zu der gewünschten Vernetzung beitragen. Jede abgeblockte oder verdrängte Frage aber ist eine vertane Chance zu einer solchen Brückenbildung, zur Vernetzung zwischen erschlossenen und noch unerschlossenen Wissenselementen. Hier liegt die große Bedeutung von Diskussionen fachlicher Inhalte in kleinen Gruppen. Unvernetztes Wissen "haftet nicht", bleibt "oberflächlicher Wissenslack", der vielleicht noch in der Prüfung "glänzen" mag, aber schon bei geringen Herausforderungen "abblättert" und nicht von Dauer ist. Ein geeigneter Test auf die Vernetzungstiefe hingegen ist die Fähigkeit, einem Mitstudierenden auch komplexe Sachverhalte in einfacher, alltagsnaher Sprache darzustellen. Vor der eigentlichen Bewährungsprobe steht das erworbene Wissen dann im dritten Schritt, der Anwendung auf einen neuen Aufgabentyp mit unbekannter Lösung. Hier muss der Student selbständig unter verschiedenen Strategien auswählen und bekannte Wissenselemente praxisbezogen
VII
kombinieren. Wie wir essen und verdauen, um mit der in körperliche Energie verwandelten Nahrung konkret Arbeit zu verrichten, so eignen wir uns Wissen an, um mit seiner Hilfe auch neuartige Probleme in den Griff zu bekommen. Dabei muss sich die neue Wissensstruktur in Aktion bewähren und erst in dieser Funktion hat Wissen sein Ziel erreicht. Wozu dieser Exkurs? Das vorliegende Buch trägt den Anforderungen aktiven Lernens, die hier formuliert wurden, in besonderer Weise Rechnung. Es macht nicht nur in systematischer Weise mit den wichtigsten Grundtatsachen der µ-Computertechnik vertraut, es tut dies auch in einer sehr alltagsnahen Sprache und so ausführlich, dass der Leser stets folgen kann und ihm berüchtigte Phrasen der Art "wie man leicht sieht ..." erspart bleiben. Er wird terminologisch und inhaltlich dort "abgeholt", wo er als Neuling in seinem Wissen steht. Der Clou des Buches jedoch ist die Tatsache, das es mittels der dem Buch beigefügten CD konsequent von den Möglichkeiten moderner Datentechnik zur Unterstützung aktiven Lernens Gebrauch macht. Die Idee, Assembler, C-Compiler und Simulator für einen 8051/80535-Controller auf einem modernen Datenträger mitzuliefern, macht aus der Kombination von Buch und CD ein komplettes µ-Computer-Labor. Ausführliche Beispiele und zahlreiche praktische Hinweise befähigen den Leser, selbständig und aktiv in die faszinierenden Anwendungsmöglichkeiten des µ-Controllers einzusteigen. Didaktisch besonders hervorzuheben ist, dass sich am Bildschirm die Programmstruktur gleichzeitig auf zwei Ebenen (Quellcode, Assembler) verfolgen und zugleich die Auswirkung jedes einzelnen Befehls beobachten lässt. Damit wird das Programmieren eines µ-Controllers in vorbildlicher Weise transparent. Beeindruckt hat mich, mit welchem Engagement und welcher hohen Sachkompetenz Studierende, die in die Technik der µ-Computer nach dem hier realisierten Konzept eingeführt wurden, komplizierte Steuerungsaufgaben in Studienprojekten bewältigt haben. Die für eine profunde Wissensverarbeitung erforderlichen Diskussionen und der Transfer des Wissens auf neuartige Problemstellungen haben die Arbeit der Teams in hohem Maße beflügelt und die individuellen Lernerfolge durch selbständig gewonnene Erfahrung nachhaltig abgestützt. Ich möchte das Buch Studenten und Dozenten wärmstens empfehlen. Den letztgenannten bietet es den zusätzlichen Vorteil, dass der Dozent die
VIII
Grafiken und Programme auf der mitgelieferten CD als Quelle und Ausgangsbasis für die Erstellung eigener Unterlagen verwenden kann. Karlsruhe 27. Oktober 1994
Hans-Peter Voss Leiter der Geschäftsstelle für Hochschuldidaktik
Danksagung Das vorliegende Buch konnte nur durch die tatkräftige Mithilfe der Studenten und Kollegen entstehen. Besonders möchte ich die Anregungen von Herrn W. Müller und Herrn W. Marx hervorheben. Prof. O. Onnen sowie Herrn Prof. D. Girke unterstützten durch ihre Anregungen das Vorhaben. Prof. G. Danner ermöglichte als Leiter des Labors für Automatisierungstechnik den Aufbau des Labors zur Einführung in die µ-Computertechnik mit den µ-Controllern der 8051-Familie. Herr B. Beck hatte maßgeblichen Anteil an der Entwicklung der EURO_535-Karte. Die Firmen Siemens, Intel, Hitex und Keil ermöglichten erst durch Ihre großzügige Unterstützung in Form von Datenbüchern, Assembler zur Evaluation, Kommunikationssoftware, Simulator und C-Compiler zur Evaluation das Gelingen des kombinierten Studiums. Die Studienkommission für Hochschuldidaktik an Fachhochschulen in Baden-Württemberg unterstützte durch ihr Wirken dieses Konzept an verschiedenen Hochschulen und Fachbereichen. Prof. Dr.-Ing. W. Fischer sei als Vorsitzendem dieser Kommission und als Rektor für das angenehme Hochschulklima gedankt. Frau A. Scholl M.A. möchte ich recht herzlich für die unermüdlichen Korrekturarbeiten danken. Die Zusammenarbeit mit Personen aus anderen Fachgebieten, wie beispielsweise der Germanistik habe ich sehr genossen und kann diese nur weiterempfehlen. Herrn Dr. D. Merkle und Herrn B. Huhn vom Springer-Verlag gilt hier ebenfalls mein Dank. Diese Arbeit wurde in hervorragender Weise von Frau Eva Hestermann-Beyerle in der dritten Auflage fortgesetzt. Anregungen und Hinweise aus dem Leserkreis zur Weiterentwicklung der Lehre nehme ich gerne entgegen. Karlsruhe 11. November 2007 Jürgen Walter
Inhaltsverzeichnis 1 1.1 1.2 1.3 1.4 1.5
Einführung Zielsetzung und Methode Einführung in die µ-Computertechnik Erläuterungen zum Sprachgebrauch: Englisch - Deutsch Begriffsbestimmung µ-Computer und µ-Controller Turingmaschine
1 1 2 4 5 6
2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8
Die Peripherie des µ-Controllers Das D-Kippglied - D-Flip-Flop Tri-State-Ausgang Register Latch Empfehlungen für digitale Schaltungen Adress-Decoder Bus Schaltplan EURO_535 Karte
11 11 16 17 18 19 21 23 27
3 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.3 3.4 3.5 3.6 3.7 3.7.1 3.7.2 3.7.3
Aufbau von µ-Controllern der 8051-Familie Pin-Definitionen und Funktionstabelle Prinzipieller Aufbau eines 8051-Ports. Port 0 Port 1 Port 2 Port 3 Blockdiagramm 8051 - 8051A Aufbau des klassischen Digitalrechners Blockdiagramm 80C515/C535 Adressbereiche 8051 Timingberechnungen für 80535-Speicher 16K-EPROM an 80535 Timingberechnung 32K-RAM am 80C535 RAM-Berechnung für die EURO_535-Karte
30 31 32 35 37 37 38 39 42 45 46 47 50 57 58
4 4.1 4.2 4.3
Assembler für die 8051-Controller-Familie Erstellen eines einfachen Assemblerprogramms Debuggen – Test und Fehlerbeseitigung Test des EIN_AUS-Programms mit dem Simulator
61 67 71 72
XI
4.4 4.5 4.6 4.7 4.8 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.6 4.9.7 4.10 4.10.1 4.10.2 4.10.3 4.10.4 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18
Test des EIN_AUS-Programms mit EURO_535 Entwicklungsprozess für ein µ-Controller-Programm Prototyp Software Design Die Speicherbereiche des 8051 / 80535 ASM 51 Macro Assembler Die Assembler-Anweisungen im Detail Vereinbarungen für Symbole und Syntax Speicherbereich Initialisierung und Reservierung Die Registerbänke 0 bis 3 Der Programmspeicherbereich Der interne Datenspeicher Der externe Datenspeicher Die Bit-Adressen Segmente Relative Segmente Absolute Segmente Assembler-Anweisungen ORG - END Quellcode-Anweisungen für den Linker Assembler-Steueranweisungen (Assembler Controls ) Stack Special Function Register Program Status Word Die Befehle für die 8051 µ-Controller-Familie Der System Reset Der Stromsparmodus Watchdog Timer
74 79 81 82 83 85 85 85 86 87 88 89 90 90 91 92 92 92 93 95 96 96 99 105 106 107
5 5.1 5.2 5.2.1 5.2.2 5.3 5.3.1 5.4 5.4.1 5.4.2 5.5 5.5.1 5.5.2 5.5.3 5.5.4
Projekte mit Assembler gelöst Standardkopf für Assemblerprogramme Blinklicht mit vorgegebener Blinkfrequenz Timer / Counter - Zeitgeber / Zähler des 8051 Interrupt-System des 8051 / 80535 Projekt A/D-Wandlung Wesentliche Daten des A/D-Wandlers im 80535 Projekt Serielle Schnittstelle Die serielle Schnittstelle im Detail Die Baudrate Projekt Effektivwertmesser Erweiterungen - Wiederverwendung der Software Modularisierung Vereinfachung der Aufgabenstellung Timer 2
108 110 111 111 114 126 126 133 138 139 141 142 142 144 145
XII
5.6 5.7
Der Linker Projekt Effektivwertmesser mit dem Linker erzeugt
161 161
6 6.1 6.1.1 6.1.2 6.1.3 6.2 6.2.1 6.2.2
C für die 8051-Familie Einführung in den C-Compiler Das Programm EIN_AUS Test des EIN_AUS Programms in C mit dem Simulator Test des EIN_AUS Programmes in C in Hardware-Umgebung Die Eigenschaften des C-51-Compilers Die Datentypen des C-51-Compilers Speichertypen und Speichermodelle
175 176 176 179 182 182 183 184
7 7.1 7.2 7.3 7.4 7.5
Projekte in C gelöst Standardkopf für Programme in C Blinklicht mit vorgegebener Blinkfrequenz Projekt A/D-Wandlung Die serielle Schnittstelle in C Das Programm Effektivwert in C
186 187 188 193 196 198
8 8.1 8.1.1 8.1.2 8.2 8.2.1 8.2.2
Prozessorarchitekturen im Überblick Grundstrukturen und Einteilung von µ-Prozessoren 80x86-Prozessoren Signalprozessoren Derivate der 8051-Controller-Familie C515C-Controller 8051-Derivat C8051F340
200 200 203 207 212 213 214
9 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13
Entwicklung von µ-Computer-Hardware Klärung der Anforderungen Abschätzung der CPU-Belastung - Datenflüsse Wahl der CPU Blockschaltbild der Karte Schaltplan Stückliste - Bezugsquellen Schnittstellen Layout - Bestückungsplan Fertigungsunterlagen Fehlerfindung, Diagnose Lieferumfang Software - Liste verfügbarer Software Weiterentwicklungswünsche , Verbesserungen
217 218 221 223 224 225 226 228 230 231 232 232 233 234
XIII
10 10.1 10.2 10.3 10.4
Übungsaufgaben Übungsklausur 1 Übungsklausur 2 Übungsklausur 3 Übungsklausur 4
236 236 247 259 271
11 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.3 11.4
Anhang Zusammenstellung der Register von 8051/80535 REG8051.PDF REG535.PDF Datei REGISTER DECLARATIONS FOR 80535 mit Erklärungen EURO_535.h Installation der Software Hilfreiche Bücher zum Aufarbeiten der Grundlagen Vortragsfolien
284 284 284 287 291 298 301 303 303
Literaturverzeichnis
304
Bildverzeichnis
305
Tabellenverzeichnis
308
Stichwortverzeichnis
310
1 Einführung
1.1
Zielsetzung und Methode
Wie lernen Sie, schnell und effektiv, Aufgaben mit Hilfe von µControllern zu lösen? Diese und viele weitere Fragen beantwortet das vorliegende Buch. Wissen „auf Vorrat“, welches nicht zur Anwendung kommt, wird dabei auf das Notwendigste beschränkt. Hier wird auf ähnliche Art und Weise vorgegangen wie beim Erlernen eines Musikinstruments. Klavier spielen lernen Sie ausschließlich am Klavier. Den Assembler, C-Compiler und Simulator für einen 8051/80535-Controller - nämlich das "Klavier" - erhalten Sie gemeinsam mit diesem Buch in Form einer CD (Compact Disc). Damit können Sie sich umfassend und vollständig in die µ-Computertechnik einarbeiten. Durch die Verwendung von professionellen "Light-Versionen" können Sie die gesamte Entwicklungsumgebung beherrschen. Alle Wege der Entwicklung von µ-Computer-Systemen stehen Ihnen somit offen, auch ohne neue Bedienungsanleitungen erarbeiten zu müssen. Anhand der EURO_535-Karte, ein erweiterbares µ-Controller-Grundsystem, wird ein weiterer, in Laborversuchen getesteter und bewährter Weg aufgezeigt. Alle Bilder des vorliegenden Buches sind auf der beigelegten CD verfügbar. Dozenten können diese Bilder in Form von Folien benutzen. Falls Sie bestimmte Sachverhalte hervorheben wollen, können Sie die Bilder in Powerpoint bearbeiten. Kapitel 1 gibt eine allgemeine Einführung in das Themengebiet. Die wesentlichen Grundlagen der Digitaltechnik für µ-Controller werden in Kapitel 2 gelegt. Von der Peripherie kommend, steigen Sie immer tiefer in die „Geheimnisse“ der µ-Computertechnik ein. Dieser Weg wird in Kapitel 3 fortgesetzt, in dem der µ-Controllerbaustein zunächst von außen und dann immer detaillierter betrachtet wird. Das erste Programm und dessen Test erfolgt in Kapitel 4. Anhand der Projekte des Kapitels 5 studieren Sie die Befehle und die Verwendung der in den µ-Controller eingebauten Einheiten. Die Mächtigkeit einer Hochsprache und die vereinfachte Softwareentwicklung wird durch die Bearbeitung der gleichen Projekte mit der Sprache C in den Kapiteln 6 und 7 aufgezeigt. Das anschließende Kapitel 8
2
zeigt verschiedene Prozessorarchitekturen auf. Die enorme Vielfalt der 8051-Derivate ermöglicht Ihnen, immer den richtigen Controller für Ihre Aufgabenstellung auszuwählen. Das methodische Vorgehen bei der Entwicklung von µ-ControllerHardware beschreibt Kapitel 9. Die Vorbereitungen für die Entwicklung in Form einer Anforderungsliste werden in diesem Kapitel besonders hervorgehoben. Mit Hilfe der Übungsaufgaben in Kapitel 10 können Sie Ihr erworbenes Wissen zuverlässig überprüfen. Ich wünsche Ihnen viel Spaß mit dem µ-Controller. 1.2
Einführung in die µ-Computertechnik
Die µ-Computertechnik erscheint vielen Einsteigern als eine Trödelbude von Detailwissen ohne Struktur. Verstärkt wird dieser Eindruck durch die Schwierigkeiten im Umgang mit den unterschiedlichen Ebenen in Hardware und Software. Genaue Kenntnisse über diese Ebenen sind daher für das Verstehen der µ-Computertechnik von zentraler Bedeutung. Die nachfolgende Tabelle zeigt diese Ebenen auf. In den anschließenden Kapiteln werden die einzelnen Ebenen studiert, erläutert und die einzelnen Fachgebiete gegeneinander abgegrenzt. Tabelle 1.1 Die Ebenen in vereinfachter Darstellung Ebene Intelligente Programme, Maschinen
Beispiel PDA, Schrift-, Spracherkennung, Turing Test Anwenderprogramme Word, Excel, Maple Programmieren mit Objekten Visual Basic, Toolbook Objektorientierte Hochsprachen C++, Small-Talk, C# Compiler, Interpreter, Linker MSC, C, Pascal, Basic, Lisp... Betriebssystem DOS, Unix, XP, Vista, Mac OS X Maschineninstruktionen - Assembler MOV A,@R0 µ-Controller, DSP 80535, DSP 21020 Zähler, Timer, FIFOs, Input-Output, 8253, 7202, 8251, 8255 µ-Prozessor, Arithmetik-Prozessor... 8085, 80486, 68000, 80387 µ-Programm Steuerwerk Register, Adress- und Datenwege 74F374, A0...A31, D0....D15 Gatter, Flip-Flops Nand, Nor, D-Flip-Flop Transistoren, Widerstände, Kondensatoren BC107, 1kY, 20 µF
Lassen Sie sich von der Vielzahl der Ebenen nicht erschrecken. Nach dem Studium dieses Buches und der darin aufgeführten Software sollten Sie diese Tabelle erneut betrachten. Die aufeinander aufbauenden Gebiete erscheinen dann für Sie logisch, ja sogar zwangsläufig. Sie werden dann
1 Einführung
3
schnell entdecken, dass die Ebenen nicht nur aufeinander aufbauen, sondern sind auch miteinander verzahnt sind. Eine weitere interessante Fragestellung ist: "In welcher Ebene ist der Zugang am leichtesten?" Während vieler Diskussionen mit Studierenden ergaben sich verschiedene Antworten auf diese Frage. Ein möglicher Weg ist, das Buch nicht linear zu lesen. Lineares Lesen heißt, dass eine Ebene auf der anderen aufbaut. Bei einem nicht linearen Studium können Sie beispielsweise sofort mit Kapitel 3 beginnen. Schon bei dem Versuch, die einzelnen Ebenen in einer Tabelle darzustellen wird deutlich, dass bestimmte Sachverhalte auf diese Weise nicht berücksichtigt werden. Dagegen bietet sich folgende Darstellung an: Intelligente Programme
EXCEL, Winword, AUTOCAD, Maple
Anwenderprogramme
.NET, Visual Basic, Toolbook, Hypercard
Programmieren mit Objekten Objektorientierte Hochsprachen
C++
Compiler, Interpreter, Linker
TPW
Turbo C
Maschineninstruktionen, Assembler µ-Controller
PDA, Schriften-, Spracherkennung
MSC
MOV A,@I0
INT 21
8051, 80535
Zähler, Timer, FIFOs, Input Output
8253
SMALL TALK
PASCAL
IF NOT MV MR=MR+MX0*MY0(UU)
Signalprozessoren
8251
7202
µ-Programm
LINK
8085
21020, 96002
80486 68030
1101 0011 0011 1111
Register, Adress-, Daten- und Controlwege Gatter, Flip-Flops
&
>1
Transistoren, Widerstände, Kondensatoren
Abb. 1.1 Ebenen-Problematik
Die µ-Computertechnik befasst sich mit 7 verschiedenen Ebenen v "Gatter, Flip-Flop" bis "Compiler, Linker, Interpreter". Gleichzeitig erklären die verschiedenen Ebenen die Problematik des Einstiegs in das Gebiet der µ-Computertechnik. Auf welcher Ebene ist der Einstieg am sinnvollsten? Wie werden Aufgabenstellungen mit µ-Controllern am besten gelöst? Zunächst erfolgt eine Abstimmung bezüglich der Sprache zwischen dem Autor und dem Leser. Infolge des Mediums "Buch", man könnte auch "Read-Only-Paper" sagen, ist eine einseitige Kommunikation vorgegeben.
4
Es stört das Buch sehr wenig, wenn Sie ihm freche Antworten geben. Machen Sie sich deshalb beim Studium Notizen. Hierdurch wandeln Sie das "Read-Only-Paper" in ein "Read-Write-Paper". Nach einigen Erklärungen zum Sprachgebrauch werden wir sehr abstrakt auf der höchsten Ebene der µ-Computertechnik einsteigen. Die gesamte µ-Computertechnik wird zunächst theoretisch erklärt. Leider ist jedoch das Beherrschen der Theorie in der µ-Computertechnik genauso „wirkungsvoll“ wie beim Klavier spielen. Theorie des Klavierspiels: Sie müssen bestimmte Tasten zum richtigen Zeitpunkt mit der gewünschten Stärke und der angegebenen Dauer anschlagen. Sie müssen also nur vier Dinge beherzigen. Diese Theorie können Sie verstanden haben und in einer Prüfung wiedergeben. Trotzdem können Sie als Einsteiger noch nicht einmal "Hänschen Klein" spielen. Sie müssen üben, üben, üben..... 1.3
Erläuterungen zum Sprachgebrauch: Englisch - Deutsch
In diesem Buch werden sowohl englische als auch deutsche Fachausdrücke verwendet. Für das Verständnis der jeweiligen Ausdrücke ist es sehr wichtig, die Übersetzung in die jeweilige Sprache zu kennen. Eine "normale" Übersetzung kann in den meisten Fällen nicht vorgenommen werden. Durch das Verwenden von englischen Ausdrücken wird unmittelbar klar, dass es sich um einen Fachausdruck handelt. Es werden deshalb nicht alle Fachausdrücke zwanghaft übersetzt, sondern die für das Verständnis notwendigen Formulierungen und Bedeutungen dem Studierenden näher gebracht. Als Beispiel dient der Ausdruck Stack. Dieser wird häufig mit "Stapelspeicher" übersetzt. Ein Stapel ist - nach dem deutschen Wörterbuch Wahrig - ein aufgeschichteter Haufen. Ein Speicher ist auch Lagerhaus, Raum, Behälter. Folglich handelt es sich um ein Lagerhaus mit aufgeschichteten Haufen. Für das Verständnis sind solche Übersetzungen irreführend, da weder die Struktur noch die Zugriffsart für einen Stack aus dieser Übersetzung hervorgeht. Ich werde deshalb von einem Stack reden und lieber diesen Fachausdruck erklären. Eine sinnvolle Übersetzung für den englischen Ausdruck File ist dagegen das deutsche Kurzwort Datei, entstanden aus den beiden Worten Daten und Kartei. Es handelt sich demnach um eine Sammlung sachlich zusammengehöriger Daten. Anstatt zwanghaft "einzudeutschen", sollten Sie das technische Englisch als Vorteil für die sprachliche Eindeutigkeit nutzen.
1 Einführung
1.4
5
Begriffsbestimmung µ-Computer und µ-Controller
Der Begriff Mikrocomputer ist ein Kompositum: µ ~ Mikro = 1 Millionstel, von griechisch mikros = klein - Computer - engl., von lat. computare = berechnen. Die folgenden Ausdrücke sind mit dem Wort µ-Computer verbunden: ‚ kleiner leistungsfähiger Computer ‚ PC, Laptop, Notebook, Palm, iTouch, PDA, µ-Controller ‚ urspr. menschlicher oder maschineller Rechner ‚ heute Synonym für programmgesteuerte Rechenautomaten Computer lassen sich in drei Klassen unterteilen: ‚ Analogcomputer ‚ Digitalcomputer ‚ Hybridrechner Die wesensbestimmenden Charakteristiken für den µ-Computer sind: ‚ austauschbares Programm ‚ Universalität ‚ kann beliebig wohldefinierten Automaten simulieren ‚ Selbstbezüglichkeit - auf dem µ-Computer können Programme entwickelt werden, die wiederum auf demselben µ-Computer lauffähig sind. ‚ Approximation einer Turingmaschine Als µ-Computer wird im üblichen Sprachgebrauch ein µ-Prozessor mit verschiedenen Chips auf einer Platine sowie einer Ein- und Ausgabeeinheit bezeichnet. Chip
µ-Prozessor
µ-Prozessor
Chip
µ-Controller
Timer µ-Prozessor
Interrupt Schnittstellen Ausgabeeinheit c:>
Platine Chips
µ-Computer
Chip µ-Prozessor
Timer Interrupt Schnittstellen
Eingabeeinheit Tastatur
Abb. 1.2 µ-Prozessor, µ-Controller, µ-Computer
6
Beim µ-Controller sind die verschiedenen peripheren Einheiten und der µ-Prozessor auf einem gemeinsamen Chip integriert. Die Fertigungstechnik ermöglicht inzwischen, ganze µ-Computer in Form eines PCs in Checkkartengröße zu realisieren. Die Bezeichnung PC (Personal Computer) möchte ich in diesem Zusammenhang ebenfalls klären. Die Vision des PCs von Steve Jobs war, dass jede Person einen ihr zugeordneten PC besitzt. Die Bezeichnung Personal Computer beschreibt daher vor allem die individuelle Zuordnung eines Computers zu einer Person. Ein PC mehreren Personen zuzuordnen, zieht einen nicht vertretbaren Wartungsaufwand nach sich. Fazit: Kein Pool, sondern jedem Studierenden sein Laptop inklusive Software. 1.5
Turingmaschine
Der britische Mathematiker Alan Turing (1912-1954) schrieb 1950 seine Überlegungen zum "Turing Test" in seinem Aufsatz "Maschinelle Rechner und Intelligenz" nieder [Hofstadter; Gödel, Escher, Bach]. Darin geht es um die Frage, ob es denkende Maschinen gibt. Aus mathematischer Sicht gehören solche Fragestellungen in die Automatentheorie und die Theorie der Berechenbarkeit. Sie brauchen keine Befürchtungen zu haben, dass ich diese abstrakte Theorie erklären möchte, aber gerade Alan Turing beweist, dass solche Theorien nicht allein durch Nachdenken entstehen, sondern durch jahrelange praktische Beschäftigung, der daraus gewonnenen Erfahrung und den Umgang mit daraus resultierenden verwandten Fragestellungen. Alan Turing knackte während des zweiten Weltkrieges den Code der Verschlüsselungsmaschine "Enigma". Da dort zwei Codierungsschichten verwendet und Änderungen an der Maschine vorgenommen wurden, musste die Codierung immer wieder neu entschlüsselt werden. Durch diese Arbeit wurde Turing angeregt, zu untersuchen, wie Maschinen Denkvorgänge imitieren könnten. Seine Theorie entstand folglich aus den konkret zu lösenden Problemen und nicht aufgrund abstrakter Ideen. Eine sehr aktuelle Fragestellung: Unterhalten Sie sich am Telefon mit einem Automaten oder einem Menschen? Die theoretische Maschine von Turing besitzt alle wesentlichen Teile, die einen Computer charakterisieren. Turingberechenbare Funktionen Eine Funktion heißt turingberechenbar, wenn man eine Turingmaschine angeben kann, die aus dem Argument x in endlich vielen Schritten den Funktionswert f(x) berechnet. Die Verarbeitung der Werte erfolgt durch eine extrem lange Folge, wird aber durch einfache Rechenoperationen durchgeführt. Der gegensätzliche Fall wäre die Verarbeitung der Werte in einem Schritt.
1 Einführung
7
Die Turingmaschine ist eine theoretische Maschine mit folgenden Charakteristiken: ‚ ‚ ‚ ‚
Speichermedium Band unendlich langes Band Beliebig viele Zustände Z Zeichen E1....En ( E>=2) Ei ,Z j E k,Z l
Übergangstabelle Maschinentafel SchreibLeseKopf
* hgfedcba
hgfedcba 76543210 743210
76543210
E
Abb. 1.3 Turingmaschine
Operationen Schreib-Lese-Kopf Schreiben Lesen Sonderoperationen als Pseudozeichen ‚ E0 » Löschen » identisch mit ‚ * » Rechenschritte beenden ‚ L » Linksverschiebung des Bandes um ein Zeichen ‚ R » Rechtsverschiebung des Bandes um ein Zeichen ‚ ‚
Zwei wesentliche Realisationsmöglichkeiten von Rechenmaschinen beziehungsweise Rechenautomaten möchte ich Ihnen im nachfolgenden vorstellen: Schaltwerk und Schaltnetz. Schaltwerk Durch eine zeitliche Aufeinanderfolge von einfachen Rechenschritten werden komplizierte Operationen durchgeführt. Daraus ergeben sich folgende Konsequenzen: ‚ Das Zeitproblem digitaler Informationsverarbeitung ‚ Notwendigkeit von Speicherplatz?
8
Schaltnetz Durch gleichzeitige Eingabe des Befehls und der Daten erhält man unmittelbar am Ausgang das Ergebnis. Schaltwerk
+
2
5
5 7
Schaltnetz
2
7
+
Abb. 1.4 Schaltnetz - Schaltwerk
Aufgabe Funktioniert ein Taschenrechner ähnlich einem Schaltnetz oder ähnlich einem Schaltwerk? Lösung Da die Tasten "5" und "2" nicht gleichzeitig betätigt werden können, muss es sich um ein Schaltwerk handeln. Diese sehr abstrakte Beschreibung eines Rechenautomaten verlasse ich gerne und gehe zu einer anschaulicheren Darstellung der µComputertechnik über. Hierzu die Fotografie eines µ-Controllers und seine technische Darstellung:
Abb. 1.5 µ-Controller als Fotografie und als technische Darstellung
1 Einführung
9
Die einzelnen Anschlüsse des µ-Controllers sind bei dieser Bauform an den vier Kanten des Chips herausgeführt. In der technischen Darstellung werden die einzelnen Anschlüsse nummeriert und bezeichnet. Eine Einkerbung markiert den Anschluss mit der Nummer 1. Der Herstellername und die Bausteinbezeichnung befinden sich in der Mitte des Chips. Aus den weiteren Bezeichnungen gehen die verwendete Technik und die Gehäuseform hervor. Je nach Einsatzgebiet verändern sich die Umgebungsbedingungen wie z. B. Temperatur oder Feuchtigkeit und damit die jeweiligen Anforderungen an den Baustein. Zu jeder Bauform eines µ-Controllers gibt es das dazugehörige Datenblatt, auf dem die Spezifikationen genau festgelegt sind. Erinnern Sie sich an die Theorie des Klavierspiels? Sie müssen bestimmte Tasten zum richtigen Zeitpunkt mit der gewünschten Stärke und der angegebenen Dauer anschlagen. Ähnlich verhält es sich bei dem gezeigten Baustein mit seiner Vielzahl von Anschlüssen, auch Pins genannt. Die Theorie des µ-Controller Chips Sie müssen bestimmte Pins zum richtigen Zeitpunkt mit der angegebenen Dauer auf "1"- oder "0"-Pegel legen. Es ist also einfacher als beim Klavier spielen, da in der Digitaltechnik die Kategorie "Stärke" entfällt. Der Spannung zwischen 0V und 0,8V ist bei der TTL-Technik (Transistor-Transistor-Logik) der logische Pegel "0" zugeordnet. Der Spannung zwischen 2,4 und 5 V ist der Pegel "1" zugeordnet. Zwischen 0,8V und 2,4V liegt eine „verbotene Zone“. Bei Messungen in TTL-Schaltungen sind Ausgang und Eingang von Bausteinen in den meisten Fällen zusammengeschaltet. Die Zuordnung von Pegel zu logischem Zustand entspricht dann den vorher genannten Werten. Durch die unterschiedlichen Pegel an Ausgang und Eingang eines ICs entsteht eine zusätzliche Sicherheit bei TTL-Technik von 0,4 V. Bei CMOS-Technik beträgt dieser Störspannungsabstand 1 V. Zur Erklärung dieses Sachverhaltes bei der TTL-Technik, auch im Vergleich zur C-MOS-Technik, dient das nachfolgende Bild:
10 U/V TTL
TTL
CMOS
5 4,5V
4
H
CMOS
H
H
H 3,5 V
3 2,4V 2
2,0 V 1,5 V
1
0,8 V
0,4V L Ausgang
L Eingang
0,5V
L Ausgang
L Eingang
Abb. 1.6 TTL Pegel am Eingang und Ausgang
Beachten Sie bitte den Ebenenwechsel, der mit den eben vorgenommenen Schritten erfolgte. Sie bewegen sich jetzt auf der untersten Ebene den Transistoren bzw. der Elektrotechnik mit dem Teilgebiet der Halbleitertechnik. Ordnen Sie also bestimmten Spannungspegeln einen logischen Wert zu, bewegen Sie sich automatisch in der Gatter - Flip-Flop - Ebene. Wiederholen Sie bitte noch einmal die "Theorie des µ-ControllerChips". Auffällig bei dieser Theorie ist die doppelte Betonung der Zeit. Bei der Erklärung des Schaltwerks wurde bereits das Zeitproblem der digitalen Informationsverarbeitung erläutert. Um dieses Zeitproblem zu studieren, verändert man die Perspektive aus der der µ-Prozessors betrachtet wird und bewegt sich gewissermaßen in den µ-Prozessor hinein. Hierdurch wechselt man von der µ-Prozessor-Ebene auf die Flip-Flop-Ebene. Der letzte Teil in der "Theorie des µ-Controller-Chips" - "1"- oder "0"Pegel - besagt, dass dann das Ziel erreicht ist, wenn ein Bit, d.h. die kleinste Informationseinheit zu einem beliebigen Zeitpunkt gesetzt und zurückgesetzt werden kann. Ist ein Bit mit 1 oder 0 in einen Baustein zu schreiben und kann dieses Bit auch gelesen werden, muss der Baustein einen Speicher für den Zustand dieses Bits haben. Gesucht wird also ein Baustein, in den man ein Bit einschreiben und ein Bit herauslesen kann. Weiterhin soll der Baustein beim Einschalten einen definierten Zustand einnehmen. Sind alle beschriebenen Operationen mit diesem Bit durchführbar, können beliebige Systeme durch Erweiterung auf 8 Bit » 1 Byte, 16 Bit » 1 Word, 32 Bit » Double Word und 64 Bit entwickelt werden.
2 Die Peripherie des µ-Controllers
Die beschriebene Zeitproblematik der digitalen Informationsverarbeitung hat wichtigste Konsequenzen für die Entwicklung von digitaler µ-ComputerHardware. Um dies zu unterstreichen, sei die Frage gestellt: "Was sind die drei wichtigsten Dinge bei der Entwicklung von digitaler µ-Computerhardware?“ Die Antwort: "1. Timing; 2. Timing; 3. Timing.“ 2.1
Das D-Kippglied - D-Flip-Flop Pin 14 = Vcc /S 4 D
2
C
3
5
Q Kenn-
74F74
zeichnung 6 1
Q
/R
Pin 1
Pin 7 = GND
Abb. 2.1 Logisches Symbol für D-Kippglied und Fotografie
S Set Setzen R C Clock Takt D Q Out Ausgang / oder Querstrich über Zeichen = Verneinung
Reset Date
Rücksetzen Daten
Normalerweise ist bei allen TTL-Bausteinen - von oben gesehen - der Pin unterhalb der Kennzeichnung der Pin mit der Nummer 1. Am rechten Rand unten befindet sich GND (Ground = Masse) und am linken Rand oben Vcc = Versorgungsspannung + 5V. In einem Baustein befinden sich zwei D-Kippglieder. Wahrheitstabelle für D-Kippglied Synonyme: Funktionstabelle, Wahrheitstafel, Truth Table, Function Table Die Wahrheitstabelle beschreibt die rein logischen Zusammenhänge. Sie zeigt keinerlei zeitliche Zusammenhänge auf.
12 Tabelle 2.1 Wahrheitstabelle D-Flip-Flop (Motorola) /Set L H L H H H H H
Eingänge /Reset H L L H H H H H
Clock X X X
L H
Daten X X X H L X X X
Ausgänge Q H L H* H L
/Q L H H* L H
kein Wechsel kein Wechsel kein Wechsel
kein Wechsel kein Wechsel kein Wechsel
L Low-Pegel »0V H High-Pegel »5V Rising Edge » steigende Flanke x undefined - don´t care » nicht definierter Zustand * Vorsicht, bei jeder Bausteinfamilie anders Impulsdiagramm für D-Kippglied Synonyme: Zeitdiagramm, Timing, Signal-Zeit-Plan ‚ Das Impulsdiagramm ist eine Darstellungsform, in der alle kritischen Vorgänge optimal dargestellt werden können. ‚ Es handelt sich um die zeichnerische Darstellung des zeitabhängigen Zusammenhangs zwischen Eingangsvariablen und Ausgangsvariablen. ‚ Exakt diese Darstellung erhalten Sie bei der Verwendung eines Logikanalysators. 1 µs
T=C D /Set
/Reset
Q * * Falls /Set und /Reset gleichzeitig auf H gehen ( Einschalten ), ist der Zustand für Q nicht definiert !
Abb. 2.2 Impulsdiagramm für D-Flip-Flop (Funktion)
t
2 Die Peripherie des µ-Controllers
13
In diesem Zeitdiagramm ist auf der x-Achse die Zeit und auf der y-Achse der Pegel eingetragen. In digitalen Systemen ohne Peripherie werden alle weiteren Signale vom Takt angeregt. Dieser Systemtakt stellt gewissermaßen das Herz des Systems dar. Vom Takt leiten sich alle weiteren Signale ab. Deshalb wird im Bild 2.7 für die Funktion das Set-Signal vom Clock abgeleitet und daher nach dem Clock-Signal anliegen. Weiterhin ist eine Zeitbedingung für den Clock vorhanden, wenn /Set von LOW nach HIGH geschaltet wird. Diese Zeit wird als Recovery Time (Aufdeck-Zeit) bezeichnet. Aufgabe Um eine Vorstellung von der Zeit „1 µs“ zu erhalten, berechnen Sie bitte den Weg, den ein elektrisches Signal in dieser Zeit zurücklegen kann. Die elektrische Signal-Geschwindigkeit beträgt auf Leiterplatten infolge des Dielektrikums näherungsweise 200 000 000 m/s und beträgt somit 2/3 der Lichtgeschwindigkeit. Lösung s = v * t = 2*108 m/s * 1*10-6s = 200 m Innerhalb der Zeit, in der ein einfacher µ-Prozessor eine Operation durchführt, kann der schnellste physikalische Vorgang, die Ausbreitung von Licht, nur 300 m zurücklegen. Das elektrische Signal kann sich über 200 m ausbreiten. Machen Sie sich diese Tatsache immer wieder bewusst. Kehren wir nach diesem Exkurs über die Zeit zurück zur Erklärung des Impulsdiagramms. An der ersten gestrichelten Linie befindet sich eine kritische Stelle. Befindet sich /Set vor dem Clock C auf "H", müsste aufgrund der auf "L" liegenden Datenleitung das Ausgangssignal auf "L" gehen. Bei dieser zeitlichen Auflösung reicht das einfache Impulsdiagramm für das Funktionsverständnis nicht aus. Eine bessere Zeitauflösung ergibt das verfeinerte Impulsdiagramm mit Schaltzeiten. Zunächst werden hierfür das Clock-Signal und die Reaktion des Ausgangs genauer untersucht. tr
Clock
tf V CC
90% 50% 10% t
GND w 1/ f
t
PLH
max t
PHL
Q oder /Q t
t TLH
THL
Abb. 2.3 verfeinertes Impulsdiagramm -Timing- für Clock von D-Flip-Flop
14 Tabelle 2.2 Erklärung der Abkürzungen für Timing D-Flip-Flop Abkürz- Erklärung ung englisch tw time width tPLH tPHL fmax tr tTLH tTHL
Bedeutung Impulsbreite des Clocks, bei symmetrischem Signal ist die Clockperiodendauer doppelt so lang wie die Impulsbreite Ausbreitungszeit des Signals bzw.Signallaufzeit bis der Ausgang aufgrund einer Änderung des Clocks und des D-Eingangs wirksam wird
time propagation low - high high - low max frequency rise time Output rise time low - high Output fall time high - low
Maximale Frequenz Anstiegszeit Anstiegsgeschwindigkeit des Ausgangs Abfallgeschwindigkeit des Ausgangs
t
/Set oder /Reset
V CC
w
50% t
Q oder /Q
50%
Q oder /Q
50% t
PHL
t PLH
rec V
Clock
50% GND
Abb. 2.4 Verfeinertes Impulsdiagramm für Setzen - Rücksetzen - Ausgang Q
Aufgrund der von Bausteinfamilie zu Bausteinfamilie unterschiedlichen Zeit trec kann sich im Bild "Impulsdiagramm für die Funktion" der Datenausgang Q bei gleichzeitigem Anliegen der steigenden Flanke von Clock und /Set ändern. Diese Zeit ist abhängig von der verwendeten TTL-Familie. Geläufige Familien sind HCT, FACT, TTL, LS. Wichtige Unterschiede liegen im gewählten Fertigungsverfahren und im Material. Das wichtigste, verfeinerte Impulsdiagramm, das auch bei µ-Computern für den Speicherzugriff eine entscheidende Rolle spielt, ist das Impulsdiagramm für die Datenleitung. Dieses gibt Auskunft über die Zeit, die Daten vor und nach der Übernahme-Flanke anstehen müssen.
2 Die Peripherie des µ-Controllers
15
gültig
Daten t
t
h
su
V CC
Clock
50% GND
Abb. 2.5 Verfeinertes Impulsdiagramm für Daten - Clock
Diese Zeitberechnung für die minimalen und maximalen Werte der Zeiten, die für die Datenleitung gelten, spielt eine zentrale Rolle bei der Auswahl der Speicherbausteine für ein µ-Prozessorsystem. Die minimalen und maximalen Werte entstehen aufgrund der Exemplarstreuungen. Wichtigste Zeit-Werte für FACT-Familie (Fast Advanced CMOS TTLkompatibel) sind: Tabelle 2.3 FACT Logikbausteine (aus Datenbuch für FACT-Bausteine) Symbol Vcc GND tr, tf tw fmax tPLH tPHL tsu th trec
Parameter Min Versorgungsspannung 4,5 Gleichspannungsein/-ausgang 0 Typische Eingangsanstieg und -abfallzeit (4,5 V) Kleinste Impulsweite für Takt - Clock 3 Größte Taktfrequenz 145 Propagation Delay Verzögerungszeit für L zu 3 H Propagation Delay Verzögerung für H zu L 3 Setup time, Daten für Clock 1 Hold time, Clock zu Daten -0,5 Recovery Time, Set oder Reset Inactive -2,5 Clock
Typ 5
Max 5,5 Vcc
Unit V V ns/V
5 9,5
ns MHz ns
10 3 1,0 0
ns ns ns ns
40 200 5,5 6 0
Um den Pegel am D-Eingang sicher zu übernehmen, muss der Pegel mindestens 3ns vorher anliegen und mindestens 1ns nach der steigenden Flanke des Clocks gehalten werden. Aufgabe Führen Sie die Berechnung für die Wegstrecke, die Licht innerhalb einer Nanosekunde zurücklegen kann, durch. (Hinweis: Das Ergebnis liegt im cm-Bereich.)
16
Aufgabe Zeichnen Sie das Timing für ein rückgekoppeltes D-Flip-Flop. Der /QAusgang (Das Zeichen "/" bedeutet die Verneinung) führt auf den D-Eingang. Am Clock-Eingang liegt ein Rechtecksignal mit der Frequenz von 10 MHz an. 2.2
Tri-State-Ausgang
Ein Ausgang, der drei Zustände L (low), H (high) und Z (hochohmig) aufweist, wird als Tri-State-Ausgang bezeichnet. Diese drei Zustände eines Ausgangs benötigt man beim Zusammenführen von mehreren Ausgängen auf eine gemeinsame Leitung. Eine Logik bewirkt, dass immer nur ein Ausgang auf die gemeinsame Leitung geschaltet wird. Die anderen Ausgänge müssen sich dann im hochohmigen Zustand befinden. Die auf der Leitung liegende Information in Form des High- oder Low-Pegels gelangt an die entsprechenden Eingänge anderer Bausteine. Auf einem Chip befinden sich vier 3-State Buffers. /OE 1 D
2
3
Y
Abb. 2.6 Logisches Diagramm für 3-State-Ausgang und Fotografie Tabelle 2.4 und 2.5 Wahrheitstabelle für 3-State-Register 74125 / 74126 Eingänge D 0 1 x
74125 Ausgang /OE Y 0 0 0 1 1 Z
Eingänge D 0 1 x
74126 OE 1 1 0
Ausgang Y 0 1 Z
Für den Aufbau von Schaltungen mit diesen Bausteinen 74125 müssen natürlich auch die Werte des Signal-Zeit-Planes eingehalten werden. Diese Durchlaufzeiten betragen bei LS-Bausteinen und HC-Bausteinen bei Temperaturen, die geringer als 85° C sind ca. 20ns. Der Ausgang kann bei diesen Bausteinen durch 15 LS-Bausteine belastet werden. In HC-Technik können auch nicht invertierende 3-State-Buffer bezogen werden. Die Wahrheitstafel kehrt sich damit für den /OE-Steuereingang um.
2 Die Peripherie des µ-Controllers
2.3
17
Register
Ein Register besteht aus acht flankengetriggerten D-Flip-Flops. Die Steuerung von /Set und /Reset ist nicht möglich. Die Ausgänge sind 3-StateAusgänge mit den Zuständen: H, L, Hochohmig. Diese Bausteine werden sehr häufig in µ-Controller-Schaltungen eingesetzt. D0 CP
CP
D
Q
/Q
/OE
O0
Abb. 2.7 Logisches Diagramm 3-State-Register
Bei einer steigenden Flanke am CP - Clock Pin wird die am D0-Eingang stehende Information im Flip-Flop gespeichert. Am Ausgang beeinflusst der Zustand des /OE Pins die Umschaltung des Ausgangs von hochohmig in niederohmig. Der Baustein speichert und ändert eine Bitkombination auf Anforderung. Die Information liegt am Ausgang an. D0
D2
D1
D3
D4
D5
D6
D7
CP
CP Q
D /Q
CP Q
D
CP
D
CP
D
CP
D
CP
D
CP
D
CP
D
/Q
Q
/Q
Q
/Q
Q
/Q
Q
/Q
Q
/Q
Q
/Q
/OE O0
O1
O2
O3
O4
O5
O6
O7
Abb. 2.8 Interner Aufbau des 3-State-Register 74F374
Innerhalb eines Schaltplanes wird normalerweise das logische Symbol verwendet. Das logische Symbol wurde aus der Bibliothek des CAD-Programms "Eagle" kopiert. CAD-Programme (Computer Aided Design) unterstützen die Erstellung des Schaltplans und entflechten die Leiterbahnführung von Platinen.
18
Abb. 2.9 Logisches Symbol für das 3-State-Register und Fotografie
Für acht Dateneingänge und acht Datenausgänge sowie einen Pin für die Datenübernahme und Freigabe des Ausgangs ergeben sich 18 Pins. Mit der Versorgungsspannung und Masse gibt es somit 20 Anschlüsse am Chip. Tabelle 2.6 Wahrheitstafel für Register
/OE L L H
2.4
Eingänge Clock
X
Daten Dn H L X
Ausgänge Qn H L Z
H » hoher Spannungspegel L » niederer Spannungspegel X » beliebig- don't care Z » hochohmiger Ausgang » L zu H Flanke
Latch
Im Gegensatz zum Register speichert das Latch nicht mit der steigenden Flanke, sondern die Übernahme der am Dateneingang stehenden Daten erfolgt mit H-Pegel am LE-Signal (Latch enable). Ist der Ausgang auf /OE = L (Output Enable = niedriger Spannungspegel) und LE = H, werden die anstehenden Daten unmittelbar durchgeschaltet. Ist LE = L werden die bisher angestandenen Daten im Latch zwischengespeichert.
Abb. 2.10 Logisches Symbol für das 3-State-Register und Fotografie
2 Die Peripherie des µ-Controllers
19
Tabelle 2.7 Wahrheitstafel Latch /OE L L L H
Eingänge LE H H L X
Daten Dn H L X X
Ausgänge Qn H L NO CHANGE Z
H = hoher Spannungspegel L = niederer Spgs.- pegel X = beliebig - don't care Z = hochohmiger Ausgang NO CHANGE = keine Änderung
Das Latch 74573 und das Latch 74373 sind funktionell identisch, lediglich die Pin-Belegung unterscheidet sich. Der Unterschied zwischen Latch und Register liegt in der Datenübernahme: ‚ Beim Latch erfolgt eine pegelabhängige Datenübernahme ‚ Beim Register erfolgt eine flankenabhängige Datenübernahme 2.5
Empfehlungen für digitale Schaltungen
0. Timing, Timing, Timing 1. Gleiche Familie Beim Aufbau von µ-Computer Hardware wird dringend angeraten, innerhalb eines Systems immer die gleiche Familie - Bausteinsorte (F, TTL, CMOS) - zu verwenden. 2. FAN-Out Der FAN-Out, d.h. die Anzahl der steuerbaren Eingänge pro Ausgang, ist zu beachten. 3. Kein unbeschalteter Eingang Es darf kein offener Eingang in der Schaltung vorhanden sein. 4. Diagnose Für die Überwachung sollten einfache Diagnosepunkte vorhanden sein, z.B. Ausgänge von Flip-Flops, LED für Versorgung. Mit diesen Empfehlungen und den wenigen Bausteinen, die bisher aufgeführt wurden, können wir bereits eine kleine Hardware aufbauen, mit der Daten von System 1 zu System 2 übergeben werden.
20
Vcc
System 1 1010 0101
Schreibe1
/OE
Vcc /OE_L1
Register
CP_L1
Vcc /OE_S2
Register
CP_S2
Vcc Lese2
/RD
xxxx xxxx
System 2
Abb. 2.11 Blockbild für einfache Datenübergabe von System 1 zu System 2
Die Beschreibung des Ablaufs der Datenübergabe erfolgt in einer SchrittTabelle. Hierin bedeutet: ein = Schalter betätigt aus = Schalter nicht betätigt Tabelle 2.8 Datenübergabe Schritt Nr. 1 2 3 4 5 6 7 8 9 10 11 12
Schreibe1 aus ein ein ein aus aus aus aus aus aus aus aus
CP_L1 aus aus ein aus aus aus aus aus aus aus aus aus
/OE_L1 aus aus aus aus aus ein ein ein aus aus aus aus
CP_S2 aus aus aus aus aus aus ein aus aus aus aus aus
/OE_S2 aus aus aus aus aus aus aus aus aus ein ein aus
Lese2 aus aus aus aus aus aus aus aus aus aus ein aus
Daten-Ort System 1 vor Register 1 vor Register 1 Übernahme in Register 1 auf Bus vor Register 2 Übernahme vor System2 vor System2 in System 2
2 Die Peripherie des µ-Controllers
21
Natürlich muss die Datenübergabe auch in die andere Richtung funktionieren. Das System wird auf ein bidirektionales System erweitert (= Datenflüsse in beide Richtungen möglich). Vcc
System 1 Lese1
/RD
Schreibe1
1010 0101
/WR
Vcc
Vcc
/OE_L1
Register
CP_L1
/OE_S1
Register
CP_S1
Vcc
Vcc
/OE_L2
Register
CP_L2
/OE_S2
Register
CP_S2
Vcc
Lese2 Schreibe2
/RD 0011 1100 /WR
System 2
Abb. 2.12 Blockbild für bidirektionale Datenübergabe von System 1 zu System 2
Die Schritte in der Tabelle für die Datenübergabe von Register 1 nach Register 2 vollzieht später das Steuerwerk im µ-Prozessor nach, so dass der Programmierer diese einzelnen Schritte nicht immer wieder selbst programmieren muss. Aufgabe Erstellen Sie die Tabelle bei Übergabe von System 2 nach System 1. 2.6
Adress-Decoder
Die Bestimmung, welcher Systemteil angesprochen wird, kann natürlich nicht mit einem Schalter erfolgen. Um verschiedenste Bausteine anzusprechen, werden die einzelnen Signale mit einem Schaltnetz, dem Decoder, erzeugt.
22
Abb. 2.13 Logisches Symbol eines 1 aus 4 Decoders und Fotografie Tabelle 2.9 Pin Namen Pin A0,A1 /E /O0,/O1,/O2,/O3
Bedeutung Adress Inputs Enable Inputs Outputs
Die Bezeichnungen im Bild und die Pin-Namen in der Tabelle stimmen nicht überein. Falls Sie praktisch arbeiten, verwenden Sie Datenbücher verschiedener Hersteller und verschiedene Computerprogramme für das Layout, mit unterschiedlichen Pin-Bezeichnungen. In dem vorliegenden Fall wurde das logische Symbol dem CAD-Programm "Eagle" entnommen und die PinNamen einem Datenbuch von Motorola. Sie erkennen, dass die Eingänge A, B des logischen Symbols den Pin-Namen A0, A1, der Steuereingang G dem PinNamen /E Enable Inputs und die Ausgänge Y0, Y1, Y2, Y3 den Ausgängen A0, A1, A2, A3 zuzuordnen sind. Tabelle 2.10 Wahrheitstabelle für einen Adressdecoder (Baustein 74LS139) /E H L L L L
Inputs A1 X L L H H
A0 X L H L H
/O0 H L H H H
Outputs /O1 H H L H H
/O2 H H H L H
/O3 H H H H L
Wichtig ist die gegenseitige Verriegelung der Ausgänge, um zu gewährleisten, dass verschiedene Treiberbausteine nicht zeitgleich Daten auf den Datenbus legen. Dies würde dann einen Kurzschluss verursachen, wenn die Ausgänge der beiden Treiber unterschiedliches Potential hätten. Für eine Adressdecodierung können auch andere Bausteine programmiert werden. Beispielsweise ein PROM (Programmable Read Only Memory/Nur-LeseSpeicher), ein PAL (Program Array Logic) oder GAL (Wiederbeschreibbare Array Logic).
2 Die Peripherie des µ-Controllers
23
Ein Adressdecoder hat die Aufgabe, aus der anliegenden Bitkombination der Adressleitungen den entsprechenden Baustein zu wählen. Liegen vier Adressleitungen vor, können 16 Bausteine ausgewählt werden. Sind 10 Adressleitungen dekodiert, können folglich 1024 Bausteine angewählt werden. Dies ist beispielsweise beim alten AT-Bus im I/O-Bereich ~ Input-Output-Bereich der Fall. 2.7
Bus
In den bisherigen Ausführungen wurden die acht Datenleitungen zu einem dicken Pfeil zusammengefasst dargestellt. Dies ist der Datenbus. Bei einem 8Bit-Rechner handelt es sich um einen Datenbus mit 8 Leitungen entsprechend bei einem 16-Bit-Rechner um 16 Leitungen usw. Bei unserem einfachen System haben wir nur eine Speicheradresse pro System. Haben wir aber mehrere Speicheradressen, müssen wir diese ebenfalls adressieren. Dazu dienen die Adressleitungen. Die Anzahl der Adressleitungen ergibt den Adressbus. Ein 8Bit-Rechner kann beispielsweise 16 Adressleitungen haben. Hiermit lassen sich 216 = 65 536 Bytes ansprechen. Mit den Schaltern werden in unserem einfachen System zur Datenübergabe zwei Aufgaben realisiert: 1. Betätigen des Schalters gibt den Befehl zum Schreiben oder Lesen. 2. Bei Drücken des entsprechenden Schalters wird der Schalter selbst "adressiert", d.h. ausgewählt. Man kann auch sagen, der Ort bzw. die Adresse wählt den Schalter aus, bzw. die Betätigung des Schalters führt zu der entsprechenden Funktion. Trennen wir diese beiden Aufgaben in zwei Leitungen auf, so erhalten wir eine Adressleitung und eine Steuerleitung. Die Adressleitungen werden zu einem Adressbus zusammengefasst. Entsprechend fassen wir die Steuerleitungen Read/Write zu einem Steuerbus bzw. Controlbus zusammen. Zusätzlich kann ein solches System über den Speicher hinaus auch noch I/O-Leitungen, den I/O-Bus zum Ansprechen von Peripherie haben. Prinzipiell funktioniert die Adressierung wie bei den Speichern. Der Unterschied, ob ein Speicherzugriff oder ein I/O-Zugriff erfolgt, ist am Zustand der I/O-Leitung erkennbar. Das Wort Bus bedeutet im weitesten Sinne eine beliebige Anzahl von Leitungen. Aufgrund der Datenart auf dieser Leitung gibt es weitere Unterscheidungen zwischen Adressbus, Datenbus, Controlbus, I/O-Bus. Zusätzlich können die Leitungen zu unterschiedlicher Zeit durch verschiedene Datenarten belegt sein. Dann spricht man von einem Bus mit MultiplexVerfahren oder einem multiplexten Bus.
24
Warum diese unübersichtliche Doppelverwendung von Leitungen? Ein Grund besteht in der Ersparnis von Leitungen und Pins an den Chips. Diese Technik reduziert die Anzahl der Beinchen und ermöglicht so eine einfachere Produktion der Chips. Im nachfolgenden Blockschaltbild sehen Sie die verschiedenen Busse eines µ-Controllersystems. Es handelt sich dabei um die Euro_535-Karte. Diese Karte umfasst ein sehr flexibles Grundsystem auf Basis eines Controllers aus der 8051-Familie.
Port 0
Low-Byte-Adresse / Datum
AdressLatch
Low-Byte-Adresse
Eprom
ALE
80535
Port 2
J2 J3,8
High-Byte-Adresse
Microcontroller CE
OE
VAGND VAREF
Port 1
AN Port 6
PSEN
RAM Port 5
Port 4
Port 3
J1 WR / P3.6
WE
CS OE
A15 RD / P3.7
AdressLogik J4,5,6,7
RxD / P3.0
Steckerleiste
TxD / P3.1
V24Treiber
PC
V24Treiber
PC
P1.1 P1.3 P3.3 P1.2 P3.2 P3.4 R2OUT / P1.4 T1 T2 T3
L1 L2 L3
Tasten / Leuchten
T2IN / P4.7
Abb. 2.14 Blockschaltbild - Bussysteme für 80535-System
Der hier vorgestellte Baustein 80535 ist ein Derivat (= Erweiterung) eines 8051-Controllers. Auf den 80535-Controller wird in den nachfolgenden Ausführungen immer wieder verwiesen. Am µ-Controllerbaustein sind die verschiedenen Busse, bestehend aus Leitungen, angeschlossen. An den Ports 1,3,4,5 sind allgemeine I/O-Datenbusse angeschlossen. Es handelt sich um bidirektionale Ports. An Port 2 können die oberen 8 Bit des Adressbusses angeschlossen werden. Ist kein externer Speicher am µ-Controller angeschlossen, können diese Leitungen als allgemeine I/O-Ports verwendet werden.
2 Die Peripherie des µ-Controllers VG-Leiste Quarz
Prozessor
Latch
RAM
DIP-Switches
ROM
Taster
25
+5V Anschluß
RESET Serielle Schnittstelle
Abb. 2.15 Aufbau der EURO_535-Platine
Sie erkennen an Port 0 den gemultiplexten Adress-Datenbus. Dieser AdressDatenbus ist 8 Bit breit und führt zu den Einheiten: ‚ Speicher: EPROM (Erasable Programmable Read Only Memory) = Löschbarer Nur-Lese-Speicher. RAM (Random Access Memory) = Speicher mit wahlfreiem Zugriff, d.h. Lesen und Beschreiben des Speichers ist möglich. ‚ Steckerleiste ‚ Adresslatch Das Adresslatch hat die Adressen während der Zeit, in der Daten auf dem gemeinsamen Bus liegen, zwischenzuspeichern. Dieser Vorgang ist im nächsten Bild nochmals veranschaulicht. Zum Zeitpunkt t1 legt der Prozessor beispielsweise die Bitkombination 1010 0101 an Port 0 auf den Datenbus. Gleichzeitig erscheint an ALE ein HighPegel. Zum Zeitpunkt t2 nimmt ALE den Zustand Low an und speichert somit die Adresse im Latch. Anschließend legt der Prozessor zum Zeitpunkt t3 die Daten auf den Bus.
26
1010 0101 Adress-
t1
Port 0
1010 0101
1010 0101 1010 0101
ALE
1
latch
xxxx xxxx Adress-
t2
Port 0
xxxx xxxx
1010 0101 1010 0101
ALE
0
latch
1011 1101 Adress-
t3
Port 0
1011 1101
1010 0101 1010 0101
ALE
0
latch
Abb. 2.16 Ablauf der zeitgemultiplexten Adress-Daten-Zustände
Der Unterschied zwischen Multiplexen und zeitlichem Demultiplexen mit einem Latch wird deutlich, wenn man einen 2 x 4 Multiplexer mit 3-StateAusgang untersucht. Als Beispiel sei der Baustein 74HCT257 gewählt. Nibble A Nibble B
Select
A A A A 0 1 2 3
B B B B 0 1 2 3 74F257
OE
Y Y Y Y 0 1 2 3
Abb. 2.17 2x4 Multiplexer und Fotografie
Bei diesem Baustein können die Eingangsdaten gleichzeitig anliegen. Jeweils ein Nibble (1 Nibble = 4Bit = 1/2 Byte) wird auf den Ausgang durchgeschaltet. Ein in der Funktion des Multiplexers identischer Teil muss folglich im µ-Controller vorhanden sein.
2 Die Peripherie des µ-Controllers
27
Tabelle 2.11 Wahrheitstabelle Multiplexer Eingänge /OE H L L
Select X L H
Ausgänge Qn Z A0-A3 B0-B3
Im µ-Controller muss für das Umschalten zwischen Adressen und Daten ein 2x8 Multiplexer enthalten sein. Der Ausgang des Multiplexers wird an Port 0 anliegen. Bei der EURO_535-Karte ist ein Teil des Adressbusses auf eine besondere Adresslogik geführt. Diese Logik wird im Kapitel 3.7. "Timingberechnungen für 80535-Speicher" im Detail besprochen. 2.8
Schaltplan EURO_535 Karte
Falls Sie zum ersten Mal einen solchen Schaltplan sehen, mag dieser sehr unübersichtlich erscheinen. Sie erkennen aber sicherlich den Controller 80C535, den Latch 74573, das EPROM 27256, das RAM 56256, den Baustein für die seriellen Schnittstellen MAX232 und die drei Steckerleisten ST3A, ST3B, ST3C. Die kleineren Kästchen in der Bildmitte 7402, 7474, 7486 und 7402 gehören alle zur Adresslogik. Im zweiten Teil des Schaltplanes sind die Taster und die Leuchtdioden aufgeführt. Eine zweite serielle Schnittstelle kann mit den zwei Signalen R2OUT und T2IN, angeschlossen an Port 1.4 und Port 4.7, erzeugt werden. Alle Zusatzbeschaltungen der Ports auf der Platine können durch die DIPSwitches (Dual Inline Packages Switches) abgeschaltet werden. Hierdurch können auf der Steckerleiste alle Portanschlüsse für beliebige Schaltungen zugänglich gemacht werden. Beachten Sie deshalb beim Anschluss von Zusatzkarten an der Steckerleiste immer die Einstellungen der DIP-Switches. Die Schalter in einem Gehäuse werden lustiger weise auch oft "Mäuseklavier" genannt. Die Verwendung solcher Schalter sollte möglichst vermieden werden, um Fehlbedienungen zu vermeiden.
28
2 Die Peripherie des µ-Controllers
29
3 Aufbau von µ-Controllern der 8051-Familie
In den nachfolgenden Ausführungen tasten Sie sich von außen an die „Geheimnisse“ der Bausteine heran. Sie laufen gewissermaßen um den Baustein herum und studieren jeden Anschluss. Danach gehen Sie eine Schicht tiefer in den Baustein hinein und befassen sich mit der Funktionsweise des Anschlusses. Die nachfolgende Architekturbetrachtung ist sicherlich der interessanteste Teil. Hier werden wieder die einzelnen Teile von außen studiert, um danach wiederum eine Schicht tiefer vorzudringen. Diese Vorgehensweise lässt sich mit der Reise in eine Stadt vergleichen. Zuerst wählen Sie eine der verschiedenen Anreisemöglichkeiten wie Bahn, Bus, Auto, Schiff oder Flugzeug aus. In einem Übersichtsbild finden Sie die "Eingänge" und "Ausgänge" der Stadt . Reisen Sie mit dem Flugzeug an, müssen Sie sich zuerst im Flughafen zurechtfinden. Haben Sie dort Ihr Gepäck und den Ausgang gefunden, schauen Sie sich den Übersichtsplan an, um den groben Aufbau der Stadt genauer kennenzulernen. Das Blockbild entspricht also dem Übersichtsplan. V SS
V CC
XTAL1 XTAL2
RST/V
Port 0
Adress- und Datenbus
PD
/EA
8051 /PSEN
Port 1
ALE
RxD TxD /INT0 /INT1 T0 T1 /WR /RD
Port 3
Abb. 3.1 Logisches Symbol des 8051
Port 2
Adressbus
3 Aufbau von µ-Controllern der 8051-Familie
31
Für die Anschlüsse ist die Darstellung in Form des logischen Symbols vorteilhaft. Es gibt zwei Arten von Anschlussleitungen, erkennbar an der zweiten, aus Pfeilen bestehenden Reihe. An Port 0 sehen Sie zusätzlich einen Adress- und einen Datenbus. Diese Darstellung zeigt bereits die Flexibilität der Bausteine. Je nach Einsatzgebiet können diese Leitungen als einfache I/O-Leitungen oder als Adress- und Datenbus verwendet werden. Das "oder" ist als Exklusiv-Oder zu verstehen. Die Signalbeschreibung erfolgt nach dem logischen Symbol in Gruppen. Es wird eine allgemeine Beschreibung der Pin-Anschlüsse gegeben und in Form einer Tabelle dargestellt. Die genaue Bezeichnung und die Anschlussbelegung der DIL-Version sind ebenfalls in der Tabelle enthalten. 3.1
Pin-Definitionen und Funktionstabelle
Tabelle 3.1 Pin-Definitionen und Funktionen der 8051 DIL-Version Symbol Vss Vcc XTAL1
Pin In Out 20 40 19
XTAL2
18
RST/VPD 9
I
/EA
31
I
/PSEN
29
O
ALE
30
O
P0.0-P0.7 3932 P1.0-P1.7 1-8 P2.0-P2.7 2128 P3.0-P3.7 1017
I/O I/O I/O I/O
Funktionen - Beschreibung 0-Potential - Digitale Masse +5V Spannungsversorgung Eingang zum Oszillatorverstärker. Wird gebraucht, wenn ein Quarz benutzt wird. Wird mit Vss verbunden, wenn eine externe Quelle an XTAL2 benutzt wird. Ausgang vom Oszillatorverstärker. Eingang zum internen TimingTeil. Ein Quarz oder eine externe Quelle kann benutzt werden. Reset - Ein 1-Pegel setzt den Baustein zurück. Ein kleiner, interner Pull down-Widerstand erlaubt beim Einschalten ein Reset nur durch Zuschalten eines einfachen Kondensators. Weiterhin kann der VVPD zum Steuern von Stand-by-Power verwendet werden. Bei 0-Pegel holt der 8051 alle Instruktionen vom externen Programmspeicher. Bei 1-Pegel bis zu den Adressen 4096, d.h. die unteren 2KByte vom internen Speicher. Program Storage Enable. Ist ein zum Controlbus gehöriges Signal für den externen Programmspeicherzugriff. Es wird alle 6 Oszillatorperioden aktiviert. Es bleibt auf 1-Pegel, wenn interner Programmspeicherzugriff erfolgt. Dient zur Steuerung des externen Adresslatch für das zeitliche Demultiplexen der Daten und Adressen. Es wird alle 6 Oszillatorperioden bei externem Speicherzugriff aktiviert. Port 0 ist ein bidirektionaler open drain I/O Port. Wird auch für die Adressen und Daten verwendet bei der zweiten Betriebsart. Ist ein 8-Bit quasibidirektionaler Ein-, Ausgangsport. Ist ein 8-Bit quasibidirektionaler Ein-, Ausgangsport. In der zweiten Betriebsart stellt er die oberen acht Bit der Adressen zur Verfügung. Ist ein 8-Bit quasibidirektionaler Ein-, Ausgangsport. In der zweiten Betriebsart stellt er wichtige alternative Funktionen zur Verfügung.
32
3.2
Prinzipieller Aufbau eines 8051-Ports.
Gehen Sie vom Port-Pin eine Schicht tiefer in den Baustein hinein, erkennen Sie die Portstruktur. Port 0 wird nach den anderen Ports betrachtet. Der Grundaufbau der Ports 1 bis 3 ist im Bild dargestellt. Read Latch
gesperrt
interner Bus Write Latch
Q
D CLK
Port Latch
Port /Q
Read Pin freigegeben
Treiber
im Baustein
Port Pin
außerhalb
Abb. 3.2 Prinzipieller Aufbau eines 8051-Ports
Die Basis-Struktur des Anschlusses erfüllt folgende Aufgaben: ‚ Zustand des Pins lesen ‚ Pin beschreiben und Speichern des Zustandes ‚ Zustand des Port-Latches lesen Alle Aufgaben der Ports veranschaulichen die hervorgehobenen Datenpfade in den folgenden Bildern. Port lesen Wird der Read-Pin freigegeben, gelangt der Zustand des Port-Pins auf den internen Bus. Die graue Linie zeigt den Datenweg über das durchgeschaltete Tri-State-Gatter, angesteuert mit Hilfe des Read-Pin-Signals. Die gestrichelte Linie deutet die Bausteingrenzen an. Der Zustand des ReadLatches ist gesperrt, da sonst zwei Ausgänge gegeneinander geschaltet wären. Read Latch
gesperrt
interner Bus Write Latch
Read Pin
D Port CLK Latch
Q Port
/Q
freigegeben
Abb. 3.3 Datenweg: Zustand des Port-Pins lesen
Treiber
im Baustein
Port Pin
außerhalb
3 Aufbau von µ-Controllern der 8051-Familie
33
Port schreiben Wird der Port-Pin mit Daten vom internen Bus beschrieben, muss das Datum am D-Eingang des Port-Latches anliegen und gleichzeitig eine steigende Flanke am Signal Write-Latch erfolgen. In vielen Dokumentationen wird immer von einem Latch gesprochen, dann aber ein Clock eingezeichnet. Es geht aus keiner Dokumentation hervor, ob es sich um ein Latch oder ein D-Flip-Flop handelt. Read Latch
gesperrt
interner Bus
D Port CLK Latch
Write Latch
Read Pin
Q
Port /Q
gesperrt
Treiber
im Baustein
Port Pin
außerhalb
Abb. 3.4 Datenweg: Pin beschreiben mit Speichern
Port-Latch lesen Will man den Zustand des Port-Latches herausfinden, kann dieser durch Freigabe des Datenpfades vom Ausgang des Latches auf den internen Bus gelegt werden. Deshalb muss der Latch-Treiber durchgeschaltet werden. Infolge des allgemeinen Aufbaus der Ports mit einem D-Flip-Flop und den Tri-State-Gattern können alle Grundfunktionen realisiert werden. Dieser allgemeine Aufbau der Ports ergibt die große Anzahl von Nutzungsmöglichkeiten des µ-Controllers. Bei µ-Prozessoren gibt es keine solchen allgemein verwendbaren Ports. Für die Anbindung von Prozessoren an den Systembus müssen normalerweise zusätzliche Treiberbausteine mit entsprechend hohen Ausgangsströmen verwendet werden. Read Latch
freigegeben
interner Bus
D Port CLK Latch
Write Latch
Read Pin
gesperrt
Abb. 3.5 Zustand des Port-Latches lesen
Q Port /Q
Treiber
im Baustein
Port Pin
außerhalb
34
Port-Treiber Ports sind sowohl Eingänge als auch Ausgänge. Diese beiden Funktionen können hervorragend mit einem FET gelöst werden. Der Port-Pin liegt einerseits am FET und andererseits über einem Tri-State-Gatter - Read-Pin - am internen Bus. Die Steuerung des FET's erfolgt durch den /Q Ausgang des Port-Latches. Der eingezeichnete Widerstand von ca. 50kY ist als FET realisiert und variiert sehr stark. Je nach Zustand des Ports schwankt der Wert erheblich. Je nach verwendetem µ-Controller-Typ, beispielsweise NMOS oder C-MOS, unterscheiden sich die Werte ebenfalls. Ein exaktes Vorgehen setzt den Blick ins Datenblatt voraus. V CC
Read Latch
ca. 50kY interner Bus
Q
D Port
Write Latch
CLK
Latch
Port Pin
/Q
n
1
VDD Read Pin
außerhalb
im Baustein
Abb. 3.6 Aufbau des Treiberbausteins Port 1 bis 5
Die Funktion der FET's im Controller FET ist die Abkürzung für Feldeffekttransistor. Wie der Name sagt, wird dieser Transistor mit dem elektrischen Feld, d.h. leistungslos gesteuert. Das Gate (= Gatter) ist die Steuerelektrode. Mit ihm lässt sich der Widerstand zwischen Drain (= Senke) und Source (= Quelle) steuern (Fall A). Liegt am Gate ein HIGH=1 (Transistor leitend, Widerstand klein), so erhält der Ausgang ein LOW=0 (Fall B). Entsprechend umgekehrt im Fall C. +5V
0
Ausgang Eingang
D
G
S 0V
A
+5V
+5V
1 0
1 0V
0V
B
C
Abb. 3.7 Funktionsweise der FET's im Controller
3 Aufbau von µ-Controllern der 8051-Familie
3.2.1
35
Port 0
Fan-Out bedeutet, dass der Baustein bis zu 8 LS-Eingänge ansteuert. Port O ist ein bidirektionaler 8-Bit Open-Drain-Ein-, Ausgang. 1. Fall: Datum 0 am Adressenausgang MUX ist auf die Address-Data-Leitung geschaltet. Es liegt als AdressDatum ein 0 vor. Control liegt auf 1. Am Ausgang des Und-Gliedes liegt daher eine 0. Der obere FET sperrt und die 5V-Spannung wird nicht durchgeschaltet. Infolge der Verneinung vor dem MUX erscheint eine 1 am unteren FET. Dieser leitet und schaltet den 0-Pegel auf den Ausgang. Address Data
VCC
Control
0
Read Latch
1 0 sperrt
&
interner Bus Write Latch
Q
D
1
Port CLK
1
Latch /Q
P0.x Pin
0
leitend n 1
MUX
V DD
Read Pin
im Baustein
außerhalb
Abb. 3.8 Port 0 als Adressausgang mit 0-Pegel am Ausgang
2. Fall: Datum 1 am Adressenausgang MUX ist auf die Address-Data-Leitung geschaltet. Als Adress-Datum liegt eine 1 vor. Control liegt auf 1. Am Ausgang des Und-Gliedes liegt daher eine 1. Folglich leitet der obere FET und die 5V-Spannung wird durchgeschaltet. Infolge der Verneinung vor dem MUX erscheint eine 0 am unteren FET. Hierdurch wird dieser sperren. Der Pegel 1 erscheint am Ausgang. Das "x" bei P0.x Pin steht für die Zahlen 0 bis 7. VCC
Address Data Control
1
Read Latch
interner Bus Write Latch
1 &
Q
D
Port CLK
1 leitend
0
0 sperrt
Latch /Q MUX
P0.x Pin
1
n 1 V DD
Read Pin
im Baustein
Abb. 3.9 Port 0 als Adressausgang mit 1-Pegel am Ausgang
außerhalb
36
3. Fall: Datum 0 am Datenausgang MUX ist auf den Ausgang des Port- Latches geschaltet. Es liege auf dem internen Bus eine 0 vor. Control liegt auf 0. Am Ausgang des UndGliedes liegt daher eine 0. Somit sperrt der obere FET. Die 0 vom internen Bus gelangt über den /Q-Ausgang als 1 zum Gate des unteren FET's. Dieser wird leitend. Der 0-Pegel erscheint am Ausgang des P0.x Pins. Address Data
V CC
Control
X
Read Latch
interner Bus
0 &
0
0
Q
D
X
Port
Write Latch
CLK
0 sperrt
Latch
1
/Q
P0.x Pin
0
leitend n1
MUX
VDD
Read Pin
im Baustein
außerhalb
Abb. 3.10 Port 0 als Datenausgang mit 0-Pegel
4. Fall: Datum 1 am Datenausgang MUX ist auf den Ausgang des Port- Latches geschaltet. Es liegt auf dem internen Bus eine 1 vor. Control liegt auf 0. Am Ausgang des Und-Gliedes liegt daher eine 0. Folglich sperrt der obere FET. Die 1 vom internen Bus gelangt über den /Q-Ausgang des Port Latch als 0 zum Gate des unteren FET. Dieser sperrt ebenfalls. Hierdurch floatet das Ausgangssignal an Port 0. Also muss man zwei Betriebsarten unterscheiden. Wird der Port nicht als generelles I/O-Port verwendet, reicht infolge der internen Pull-upWiderstände das "Float“-Signal für den Anschluss von 8 LS TTLBausteinen aus. Für den Betrieb als allgemeiner I/O Ausgang müssen externe Pull-upWiderstände verwendet werden. VCC
Address Data Control
x
Read Latch
interner Bus Write Latch
0 &
1
1
D Port CLK Latch
0 sperrt
Q
x
0 sperrt
/Q MUX
P0.x Pin n1
1
float
V DD
Read Pin
im Baustein
Abb. 3.11 Port 0 als Datenausgang mit 1-Pegel am Ausgang
außerhalb
3 Aufbau von µ-Controllern der 8051-Familie
3.2.2 ‚
37
Port 1 Fan-Out 4 LS TTL
Port 1 ist ein bidirektionaler 8-Bit Ein-, Ausgangsport mit internem Pull-up-Widerstand. Dieser Port ist allgemein verwendbar zum Ansteuern oder Einlesen von Schaltern bzw. anderen Baugruppen. VCC
Read Latch
ca. 50 K Y interner Bus Write Latch
Q
D Port CLK
Latch
P1.x Pin
/Q
n
1
V DD Read Pin im Baustein
außerhalb
Abb. 3.12 Port 1 als bidirektionaler Port mit internem Pull-up Widerstand
3.2.3
Port 2
Fan-Out 4 LS TTL Port 2 ist ein bidirektionaler 8-Bit Ein-, Ausgangsport mit internem Pull-up-Widerstand. In der anderen Betriebsart werden die oberen 8-Bit für die Adressierung von externen Speicherbausteinen ausgegeben. VCC Address Data Control
Read Latch
MUX interner Bus Write Latch
Q
D
P2.x Pin
Port CLK
Latch /Q
n1 V DD
Read Pin
im Baustein
außerhalb
Abb. 3.13 Port 2 als bidirektionaler Port mit internem Pull-up-Widerstand
38
3.2.4 ‚
Port 3 Fan-Out 4 LS TTL Alternate Output Function
Read Latch
VCC Control
1
MUX
interner Bus Write Latch
D
Port CLK Latch
P3.x Pin
Q &
/Q VDD
Read Pin
im Baustein
Alternate Input Function
außerhalb
Abb. 3.14 Port 3 als bidirektionaler Port mit Alternate Functions
Port 3 ist ein bidirektionaler 8-Bit Ein-, Ausgangsport mit internem Pull-up Widerstand. In der zweiten Betriebsart können verschiedene spezielle Funktionen mit den Ausgängen realisiert werden. Diese werden auch als Alternate Functions bezeichnet. Hierzu können Sie nochmals Bild 3.1 ansehen. Dort erkennen Sie die zusätzlichen Funktionen. Diese werden in der Tabelle für alternative Funktionen an Port 3 aufgeführt. Tabelle 3.2 Alternative Funktionen an Port 3 Port Pin P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
Bezeichnung RxD TxD /INT0 /INT1 T0 T1 /WR /RD
Ein-, Ausgang Eingang Ausgang Eingang Eingang Eingang Eingang Ausgang Ausgang
Alternative Funktionen serieller Empfang serielles Senden Interrupt 0 Interrupt 1 Timer 0 Timer 1 externes Schreibsignal externes Lesesignal
Der interne Aufbau von Port 3 unterscheidet sich vom prinzipiellen Aufbau der anderen Ports durch seine zusätzlichen alternativen Funktionen. Um die alternative Funktion zu aktivieren, muss das Gate zwischen dem Latch und dem Treiberteil geöffnet sein. Dies bedeutet, dass das korrespondierende Bit im SFR Special Function Register eine 1 enthalten muss. Ist Alternate Function = 0, können auch die Daten vom Port-Latch nicht durchgeschaltet werden. Nach dem verfeinerten Blockschaltbild kommt das Signal über den Alternate Function-Anschluss.
3 Aufbau von µ-Controllern der 8051-Familie
3.3
39
Blockdiagramm 8051 - 8051A Counters
Frequency Reference
Oscillator & Timing
4096 Byte Program Memory 8051A only
128 Byte Data Memory
Two 16-Bit Timer/Event Counters
8051 CPU
64 KByte Bus Expander
Programmable I/O
Control
Programmable Serial port Full duplex UART Synchronous Shifter
Interrupts
Interrupts
Parallel Ports Adress Data Bus
Serial IN
Serial OUT
and I/O Pins
Abb. 3.15 Blockdiagramm des 8051 - 8051 A
Oscillator & Timing In diesem Teil wird der Grundtakt, von dem alle anderen Signale abgeleitet werden, erzeugt. Die interne Clock-Frequenz beträgt die Hälfte der Oszillatorfrequenz. Diese internen Signale definieren die Phasen, die internen Zustände und die Maschinenzyklen. 4096 Byte Program Memory 8051A only 4096 Byte Programmspeicher sind nur im 8051A enthalten. Die Programmierung dieser Speicher erfolgt beim Hersteller. 128 Byte Data Memory 128 Byte Datenspeicher sind im 8051 enthalten. Dieser Speicher wird durch den internen Datenbus angesprochen. Two 16-Bit Timer/Event Counters Zwei 16-Bit breite Zeitzähler oder Ereigniszähler sind in diesem Teil realisiert. Die beiden Zähler werden durch die Eingänge T0 und T1 angesteuert.
40
Programmable Serial Port Full Duplex UART Synchronous Shifter Dieser Teil ist ein programmierbarer, serieller Port mit vollduplex Universal Asynchronous Receiver Transmitter. Der universelle, vollduplex asynchron arbeitende Empfänger und Sender hat auch einen synchron arbeitenden Shifter. Programmable I/O - Parallel Ports - Adress Data Bus and I/O Pins Die programmierbaren, parallelen Ports stellen die bereits besprochenen Schnittstellen zur Umgebung des Bausteins dar. 64 KByte Bus Expander Control Dieser Teil erzeugt die für das Ansprechen von externem Speicher notwendigen Kontrollsignale. 8051 CPU Der wichtigste Teil des Controllers ist die CPU Central Processing Unit, die Zentraleinheit. Hier werden die Instruktionen ausgeführt. Die Interrupts (= Unterbrechungen) in der Programmabarbeitung können von internen Systemteilen oder von externer Peripherie erzeugt werden. Bestandteil der CPU ist in dieser Darstellung auch das Leitwerk, wie es im klassischen Digitalrechner bezeichnet wird. Das Leitwerk übernimmt die Schaltabfolge, wie sie im Blockbild für einfache Datenübergabe von System 1 zu System 2 in Kapitel 2 gezeigt wurde. Befehle werden im Befehlsdecoder interpretiert. Weitere wichtige Bestandteile der CPU sind der Akkumulator, die arithmetische logische Einheit, das Programm Statuswort und die zusätzlichen Hilfsregister. Das verfeinerte Blockschaltbild für den 8051-Kern zeigt Abbildung 3.16. Die im Bild verwendeten Abkürzungen finden Sie in der Tabelle 3.3. Drei zusätzliche periphere Einheiten - Unterbrechungs-Steuerung, Serielles Port, Zähler/Zeitgebersteuerung - sind im Kern des 8051-Controllers integriert. Die einzelnen Register dieser Einheiten sind jeweils 8 Bit breit. Bei einer Breite von 16 Bit in der Timer-Einheit werden jeweils zwei 8-BitRegister zusammengefasst. Hervorgehoben mit etwas dickeren Strichen ist rechts oben im verfeinerten Blockdiagramm des 8051 - 8051A der Adressbus. Die oberen 8 Bit des Adressbusses gehen zu Port 2 und die unteren 8 Bit zu Port 0. An beiden Ports ist gleichzeitig der Datenbus angeschlossen. Zwischen diesen beiden Bussen muss multiplext werden. Wie dies realisiert wird, ist bereits in Bild 3.11 und 3.13 gezeigt, wo der innere Teil der Ports untersucht wird.
3 Aufbau von µ-Controllern der 8051-Familie
41
4Kx8 RAM Adressen Dekodierer
Akkumulator
128x8
RAM-Adressen Dekodierer
ROM
RAM
Temporäres
Programm
Register
Statuswort
PCH
DPH
PCL
DPL
Befehlsdecoder
B-Register
Stack Pointer
Port 2
IE IP Unterbrechungs-
Port 0
Steuerung Arithmetisch SCON
logische
SBUF(Senden) Temporäres
Einheit
SBUF(Empfang)
Register
Serielles Port Port 1 Steuersignale TCON TMOD TL0 Steuerlogik
Oszillator
TH0 TL1 TH1
XTAL1
XTAL2
/EA
ALE
/PSEN
RST
Zähler/Zeitgeb.
VPD
Steuerung Statuswort
Port 3
Abb. 3.16 Verfeinertes Blockdiagramm des 8051 - 8051 A Tabelle 3.3 Verwendete Abkürzungen im verfeinerten Blockbild des 8051 Abkürzung Bedeutung engl. RAM Random Access Memory ROM Read Only Memory PCH Program Counter High Byte PCL Program Counter Low Byte DPH Data Pointer High Byte DPL
Data Pointer Low Byte
IE IP SCON
Interrupt Enable Interrupt Priority Serial Control
SBUF SBUF TCON TMOD TL0, TH0
Serial Buffer Serial Buffer Timer Control Timer Mode Timer 0 Low Byte, Timer 0 High Byte TL1, TH1 Timer 1 Low Byte, Timer 1 High Byte
Erklärung Schreib- und Lesespeicher Nur-Lesespeicher Programmzähler höherwertiges Byte Programmzähler niederwertiges Byte Adresszeiger auf externen Datenspeicher höherwertiges Byte Adresszeiger auf externen Datenspeicher niederwertiges Byte Register für Unterbrechungsfreigabe Register für Unterbrechungspriorität Register für Einstellungen des seriellen Interface Speicher für Senden Speicher für Empfangen Zeitgeber Kontrolle Register für Zeitgebereinstellungen Low Byte, High Byte von Zeitgeber 0 Low Byte, High Byte von Zeitgeber 1
42 Abkürzung Bedeutung engl. /EA External Address ALE
Address Latch Enable
/PSEN Program Storage Enable RST / VPD Reset / Stand By Power
Erklärung Bei Low-Pegel wird auf die externen Adressen zugegriffen Übernahme der zeitgemultiplexten Adressen Zugriff auf externen Programmspeicher Rücksetzen des Prozessors / Sparbetrieb
An Port 3 sind der interne Datenbus und 4 x 2 Leitungen der internen Zusatzeinheiten mit alternativen Funktionen angeschlossen. Es ist nicht ganz korrekt, bei dem internen Bus nur vom Datenbus zu sprechen, da in diesem Bus auch Kontrollsignale wie Schreiben und Lesen in die Ports vorhanden sind. Wir können daher auch vom Systembus sprechen. Zum Systembus gehören aber ebenso die Adressleitungen, die in diesem Blockbild extra gezeichnet sind. Am Port 3 befinden sich die Leitungen für die alternativen Funktionen. Jede Leitung stellt eigentlich zwei Leitungen dar. Die Tabelle der alternativen Anschlüsse an Port 3 sei nochmals aufgeführt. Von Port 3 führen zwei Leitungen RxD und TxD zum seriellen Port. Zwei Leitungen /INT0 und /INT1 führen zur Unterbrechungssteuerung. Zwei Leitungen T0 und T1 sind mit den beiden Zeitgebern verbunden, und die beiden Low-aktiven Lese- und Schreibsignale /RD, /WR sind mit der Steuerlogik verbunden. Tabelle 3.4 Port 3 Alternative Funktionen Pin RxD TxD /INT0 /INT1
Bedeutung serieller Empfang serielles Senden Interrupt 0 Interrupt 1
Pin T0 T1 /WR /RD
Bedeutung Timer 0 Timer 1 externes Schreibsignal externes Lesesignal
3.4
Aufbau des klassischen Digitalrechners
Ein Digitalrechner lässt sich in die folgenden Blöcke unterteilen: Speicher Für die Speicherung von Daten und Befehlen bzw. Befehlsfolgen. Leitwerk Die Steuerung des Datenverkehrs zwischen Registern und Speichern. Rechenwerk Für die Ausführung von logischen und arithmetischen Operationen. Eingabeeinheit Für die Eingabe von externen Daten und auch Befehlen. Ausgabeeinheit
3 Aufbau von µ-Controllern der 8051-Familie
Für die Ausgabe von Daten und Befehlen. Eingabeeinheit
-
-
-
-
-
-
43
-
Ausgabeeinheit
Rechenwerk
Leitwerk
Speicher
Abb. 3.17 Klassischer Aufbau eines Digitalrechners
4Kx8 RAM Adressen Dekodierer
Akkumulator
Temporäres Register
128x8 RAM
ROM
RAM-Adres. Dekodierer PCH DPH PCL DPL
Programm Statuswort
B-Register
Befehlsdecoder
Stack Pointer
Port 2
IE IP Unterbrech.Steuerung
Port 0
Arithmet. SCON
logische
SBUF(Senden)
Temporäres Register
Einheit
SBUF(Empfang)
Serielles Port
Port 1 Steuersignale TCON TMOD TL0 TH0
Steuerlogik
Oszillator
TL1 TH1 XTAL1
XTAL2
Leitwerk
/EA
ALE
/PSEN RST VPD
Eingabeeinheit /
Zähler/ Zeitgeber Statuswort
Port 3
Ausgabeeinheit
Rechenwerk Speicher
Peripherie
Abb. 3.18 Verfeinertes Blockdiagramm des 8051 mit Zuordnungen zu den Einheiten eines Digitalrechners
44
Die Ports sind als Eingabe- und Ausgabeeinheiten realisiert. Die Peripherieeinheiten sind bei µ-Prozessoren nicht Bestandteil des Chips. Genau hier liegt der Unterschied zwischen einem µ-Prozessor und einem µController. Bestimmte periphere Bausteine wie Interruptcontroller, serielle Schnittstelle und Zähler/Zeitgeber sind bereits im Chip des µ-Controllers integriert. Beim klassischen IBM-AT Rechner mit 80x86 µ-Prozessoren sind diese Bausteine jeweils als einzelner Chip aufgebaut. Diese Integration von Peripherie in einen Chip wird aber in Zukunft nicht nur bei µ-Controllern vorkommen, sondern ist in der gesamten Chipentwicklung zu beobachten. So gibt es bereits vollständige IBM-ATRechner auf einem Chip. Lediglich die Speichereinheiten sind noch als einzelne Chips realisiert. Mehrere Speicherbausteine werden auch auf einem SIMM-Modul (Single Inline Memory Modul) zusammengefasst. Das Modul besteht meistens aus acht oder neun Speicherbausteinen auf einer kleinen Platine. Diese Platine hat auf der einen Seite Anschlüsse, die bei der Montage in einem Schnappverschluss mit Stiften kontaktiert werden. Übliche Speichergrößen sind als sogenannte Streifen in den Größen 1,2,4,8,16 bis zu 8 GByte erhältlich. Einen weiteren Unterschied zwischen µ-Prozessor und µ-Controller bilden die Ports. Die flexible Struktur der Ports, nämlich die Nutzung sowohl als Ausgänge als auch als Eingänge, ist nur beim µ-Controller vorhanden. Beim Vergleich mit dem klassischen Aufbau eines Digitalrechners könnte man die Ports als Bestandteil des Chips ansehen und damit nicht zu den Eingabe- und Ausgabeeinheiten zählen. Diese Zuordnung ist abhängig davon, wo die Systemgrenzen definiert werden. Beim klassischen Digitalrechner waren die Eingabeeinheiten meist Lochkartenleser oder auch Lochstreifenleser. Die Ausgabeeinheit war ähnlich einer elektrischen Schreibmaschine oder wie ein Terminal aufgebaut. Die Zeit des klassischen Digitalrechners dauerte bis 1974. Zu dieser Zeit kamen die ersten µComputer auf den Markt. Die 8080 µ-Prozessoren wurden im Dezember 1973 erstmalig bemustert. Die ersten 8051 µ-Controller kamen als Nachfolger des 8048 (1976) 1980 auf den Markt. Dieser µ-Controller besteht also in seiner Grundstruktur vierzehn Jahre. Die weite Verbreitung und die in neuerer Zeit hinzugekommenen Anwendungen bieten somit die Sicherheit, durch Auswahl dieses Controllers eine solide Grundlagenausbildung zu gewährleisten. Die hierbei aufgezeigten Grundprinzipien werden bei allen zukünftigen µ-Computern ebenfalls zutreffen. Die Beschränkung auf einen 8-Bit-Controller gewährleistet eine bessere Übersicht und geringere Komplexität des Stoffes im Vergleich zu 16-Bit- oder 32-Bit-Prozessoren mit der entsprechenden Peripherie. Alle Grundprinzipien der µComputertechnik lassen sich ohne zu starke Vereinfachung anhand der µController studieren.
3 Aufbau von µ-Controllern der 8051-Familie
3.5
45
Blockdiagramm 80C515/C535
Der 80C515 enthält einen 8-KByte großen, programmierbaren ROMSpeicher. Die Version ohne internen ROM-Speicher wurde mit dem 80C535 µ-Controller realisiert. Der Kern der beiden Controller entspricht dem 8051 µ-Controller. Die wesentlichen Erweiterungen sind: Interrupt System
ROM RAM 80C51 Kern
Sieben Ports
Watchdog Timer
Timer 2 mit PWM A/D Wandler
Abb. 3.19 80C515 Erweiterungen
‚ ‚ ‚ ‚ ‚
8 KByte On-Chip ROM (nur 80C515) und 256 Byte On-Chip RAM 16-Bit Timer 2 mit PWM (Pulsweitenmodulation) 8-Bit A/D-Wandler 16-Bit Watchdog Timer Interrupts 7 externe / 5 interne mit 4 Prioritätsebenen Die Oszillatorfrequenz kann von 0,5 bis 16 MHz variieren. Alle Befehle des 8051- Kerns werden im 80515 µ-Controller ausgeführt. 64 von 111 Befehlen benötigen lediglich einen Zyklus. Ein auf dem Chip integrierter A/D-Wandler. Ein Multiplexer für 8 Kanäle und ein Sample & Hold (Abtast-, Halteglied) ermöglichen Abtastraten von 15 µs. Die unterschiedlichen Interruptebenen ermöglichen eine große Flexibilität.
Bild 3.20 80C515 / 80C535 Blockdiagramm (weis – 8051)
46
3.6
Adressbereiche 8051
Nachdem die wesentlichen Blöcke des 8051 und 80535 behandelt wurden, können Sie jetzt zu der Platine EURO_535 zurückkehren. Lassen Sie sich nicht verwirren, wenn ein Derivat des 8051 auf dieser Platine zum Einsatz kommt. Alle Bestandteile des 8051 sind in diesem Derivat enthalten. Bisher wurde der interne Adressbereich des 8051 studiert. Da Programm und Datenumfang von der Anwendung abhängig sind, kann der Speicherbedarf für µ-Controller sehr groß werden. Deshalb hat die Firma Intel einen externen Speicher vorgesehen. Der gesamte, einem 8051 Prozessor zur Verfügung stehende Adressbereich, kann in folgende Adressbereiche aufgeteilt werden: Adressbereiche
Datenspeicher
Programmspeicher
intern /EA=1 und Adresse tACC TLLIV > tCE TPLIV > tOE TPXIZ > tDF
Speicherzugriffszeit Chipauswahl Daten auf Datenbus Datenbus freigeben
Die erste Bedingung legt fest, dass die Speicherzugriffszeit tACC ( time access ) kleiner sein muss als die Zeit, die zwischen Adressausgabe vom Prozessor und Einlesen der Instruktion vom Prozessor TAVIV (Adress valid to instruction in) vergeht. Bei einem 16K-Eprom werden 14 Adressleitungen benötigt. Durch die gemultiplexten Adress- und Datenleitungen wird ein zusätzlicher Baustein für zeitliches Demultiplexen benötigt. Dieser geht dann in die Timingberechnung ein. Die Durchlaufzeit bei Baustein 74HCT573 muss also noch von der TAVIV-Zeit subtrahiert werden. Verwendet man den Motorola-Baustein 74HC573 beträgt die maximale Zeit bei 8000H
Am /PSEN-Signal wird durch den Prozessor ein 0-Pegel bei externem Programmspeicherzugriff erzeugt. Damit entsteht eine steigende Flanke am NOR-Glied. Da am Dateneingang des Flip-Flops eine "1" ansteht, wird Q auf "1" geschaltet. Der 1-Pegel erscheint somit auch am Eingang des NOR-Gatters und bewirkt am Ausgang einen 0-Pegel. Deshalb entsteht ein Impuls am Clock-Eingang des Flip-Flops und verriegelt damit das /PSENSignal am NOR-Eingang. Die Breite des Impulses errechnet sich aus den Durchlaufzeiten des Flip-Flops und des NOR-Gatters. Am /CE des EPROMs liegt wiederum ein 0-Pegel an. Dies ist eine sehr umständliche Beschreibungsform. Am Timing erkennen Sie den Vorgang besser. D=A15 /PSEN Q=NORE CLK=NORA /Q /CE ROM /CE RAM
Abb. 3.35 Funktionsweise - Timing für Adressumschaltung (nicht zeitgetreu)
Was ist das Ergebnis dieser Adress-Spiegelung? Beim Einschalten des Prozessorboards wird das EPROM im unteren Adressbereich 0h-7FFFh angesprochen. Nach dem Umschalten wird das EPROM im oberen Adressbereich 8000h-FFFFh angesprochen. Der RAM-
56
Speicher liegt danach von 0000H bis 7FFFH. Programme und Daten können in diesen Speicherbereich der EURO_535 vom PC geladen werden. Jetzt muss das Timing für den Fall der Adressumschaltung überprüft werden. Daraus ergeben sich die Werte für das EPROM. Die kritische Zeit ist sicherlich das /CE ( Chip enable ) für das EPROM. Das /PSEN-Signal gelangt durch das NOR-Gatter U5A, das Flip-Flop U4A und das ExklusivOder an den /CE-Eingang des EPROMs. Es gilt:
TPLIV / TNOR / TCLKQ / TEXCL @ TCE 150ns / 10ns / 10ns / 10ns @ 250ns
Bemerkung: Die Durchlaufzeiten durch die Gatter müssen unbedingt für den eingesetzten Baustein im Datenbuch überprüft werden. Ebenso müssen die Einsatzbedingungen, z.B. der Temperaturbereich, geklärt sein. Bei einem Prozessortakt von 12 MHz wird die Schaltung, mit einer Zugriffszeit von tACC=250ns auf das EPROM, nicht zuverlässig funktionieren. Im Datenbuch zum 80C535-Prozessor ist für TPLIV bei variablem Takt noch die Angabe TPLIV=3*tCLCL-100 ns gegeben. Hierbei beträgt der Prozessortakt 1/tCLCL. Sie können also den Takt bei der Schaltung entsprechend herabsetzen, um trotzdem das EPROM verwenden zu können. Es gilt die Gleichung:
TPLIV / TNOR / TCLKQ / TEXCL @ TCE
(3 * tCLCL / 100ns) / 10ns / 10ns / 10ns @ 250ns 3 * tCLCL @ 380ns 380ns tCLCL @ 3 7,8MHz @ Takt Dies ist ein sehr unbefriedigendes Ergebnis, das aber aus Kostengründen in Kauf genommen wird. Das /PSEN Signal wird bei der Schaltung auch auf den /OE-Eingang des EPROMs geführt. Damit gilt bei 12 MHz Takt und somit auch bei 7,8 MHz Takt:
TPLIV @ TOE
150ns @ 100ns Die letzte Bedingung lautet: Die Datenleitungen für die Instruktion müssen nach einer maximalen Zeitdauer in undefinierten Zustand DF (Data float) übergehen.
TPXIZ @ tDF 63ns @ 30ns
3 Aufbau von µ-Controllern der 8051-Familie
3.7.2
57
Timingberechnung 32K-RAM am 80C535 Port 0
74HCT573
Low-Byte-Adresse / Datum
ALE
AdressLatch
Low-Byte-Adresse
RAM
LE 50
11
Port 2 High-Byte-Adresse
62256A-10L 20
80535
27 22
Port 3 /WR /RD
/CS /WE /OE
27 28
Abb. 3.36 Blockbild für Timingberechnungen am RAM
Die Signalbezeichnung /WE (Write Enable) am RAM-Baustein ist gleichbedeutend mit R/W (Read/Write). Das Write-Signal spricht bei LowPegel an. Bei einem 32K-RAM werden 15 Adressleitungen benötigt. Durch die gemultiplexten Adress- und Datenleitungen wird ein zusätzlicher Baustein zum Demultiplexen gebraucht. Dieser geht dann in die Timingberechnung mit ein. t WHLH ALE
PSEN t t LLWL
LLDV t
RLRH
RD t RLDV t
AVLL
t RHDZ
t
LLAX2
t RHDX
t RLAZ Port 0
A0-A7 from Ri or DPL t
Data IN
A0-A7 from PCL
Instr. IN
AVWL AVDV
Port2
P2.0-P2.7 or A8-A15 from DPH
A8 - A15 from PCH
Abb. 3.37 Signal-Zeit Diagramm für Datenspeicher lesen am 80C535
Die wichtigsten Zeiten für den Controller hierbei sind in Tabelle 3.7.
58 Tabelle 3.7 Wichtigste Timing-Werte für Controller 80C535 externer Datenspeicher lesen (Datenbuch Siemens 80C535) Symbol
Parameter
TAVDV TLLDV TRLDV TRHDZ
Adress to valid data in ALE to valid data in /RD to valid data in DATA float after /RD
min 12MHz
max 12MHz 585 517 252 97
Einheit ns ns ns ns
Die wichtigsten Zeiten für den RAM-Speicher hierbei sind: Tabelle 3.8 Wichtigste Timing-Werte für den RAM-Speicher 55257 AFL-10 (Baugleich mit 62256A-10L) sind (Datenbuch Toshiba MOS Memory) Symbol
Parameter
(tACC) (tCE) (tOE) (tOD)
Access time RAM /CE to Output Valid /OE To Output Valid Output in High-Z
min
max 62256A 100 100 50 50
Einheit ns ns ns ns
TAVDV - TPROP > tACC Speicherzugriffszeit TLLDV > tCE >tOE Chipauswahl Daten auf Datenbus TRLDV > tCE >tOE Datenbus freigeben´ TRHDZ > tDF Die jeweils längste Zeit der beiden Signale zur Chipauswahl und Freigabe des Ausgangs vom Speicher muss in diesem Fall angesetzt werden: 585ns - 44ns > 100ns Speicherzugriffszeit 517ns > 100ns >50ns Chipauswahl Daten auf Datenbus 252ns > 100ns>50ns 97 > 50ns Datenbus freigeben Die verwendeten Speicherbausteine sind beim Lesevorgang völlig unkritisch im Timing. 3.7.3
RAM-Berechnung für die EURO_535-Karte
Bei den folgenden Berechnungen wird von einer bereits erfolgten Adress-Spiegelung ausgegangen, da nach dem Einschalten der Karte als erstes ein Sprung auf eine Adresse oberhalb von 8000H durchgeführt wird. Eine Von-Neumann-Architektur wird, wie bereits gezeigt, durch ein logisches Und der beiden Signale /PSEN und /RD erzeugt. Das logische Und lässt sich mit drei NOR-Gattern realisieren.
3 Aufbau von µ-Controllern der 8051-Familie
59
Vcc J4 PSEN
3 > =
2
1
1 > = RD
> =
1
OE RAM
1
Abb. 3.38 Schaltungsteil zur Erzeugung der Von-Neumann-Architektur
Die Schaltung arbeitet wie folgt: Der µ-Controller kann mit beiden Signalen auf das RAM zugreifen. Wenn das PSEN-Signal low wird, so werden gleichzeitig das RAM und das ROM angesprochen. Das höchste Bit A15 der Speicheradresse entscheidet, welcher Baustein angesprochen wird; es wird das Chip-SelectSignal verwendet. RD PSEN OE RAM Fall 1
Fall 2
Abb. 3.39 Zustand bei Zugriff auf Adresse > 8000h
Für die Timingberechnung müssen wir die Durchlaufzeiten für /OE des RAM-Speichers durch die beiden Oder-Bausteine des 74LS02 Chips beachten. Weiterhin muss für das /CS des RAM-Speichers die Durchlaufzeit für A15 durch das Exklusiv-Oder berücksichtigt werden.
Aufgabe Führen Sie die Timingberechnungen zum Lesen und Schreiben auf den RAM-Speicher der EURO_535 zur Übung durch. Das Timing für den Lesezugriff auf den Datenspeicher sieht folgendermaßen aus:
60 t WHLH ALE
PSEN t t LLWL
LLDV t
RLRH
RD t RLDV t
AVLL
t RHDZ
t
LLAX2
t RHDX
t RLAZ Port 0
A0-A7 from Ri or DPL t
A0-A7 from PCL
Data IN
Instr. IN
AVWL AVDV
Port2
A8 - A15 from PCH
P2.0-P2.7 or A8-A15 from DPH
Abb. 3.40 Signal-Zeit-Diagramm für Datenspeicher lesen am 80C535 Tabelle 3.9 Wichtigste Timing-Werte für Controller 80C535 externer Datenspeicher schreiben ( Datenbuch Siemens 80C535 ) Symbol
Parameter
TAVWL TLLWL TQVWH TWHQX
Adress valid to /WR ALE to /WR or /RD Data setup before /WR Data hold after /WR
min 12MHz 200 288 13
max 12MHz 203 300
Einheit ns ns
Die wichtigsten Zeiten für den RAM-Speicher bei dieser Schaltung sind: Tabelle 3.10 Wichtigste Timing-Werte für den RAM-Speicher 55257 AFL-10 schreiben (Baugleich mit 62256A-10L) sind (Datenbuch Toshiba MOS Memory): Symbol
Parameter
min
(Tbc) (tCW) (tDS) (tDH)
Write Cycle Time Chip Selection to End of Write Data Set up Time Data Hold Time
100 90 40 0
max
Einheit
0
ns ns ns ns
6 C für die 8051-Familie
Warum überhaupt C ? Gibt es nicht modernere Sprachen wie ADA oder C#? Sicherlich haben alle Kritiker der Sprache C gute Gründe für diese Aussagen. Ein Ingenieur oder ein Techniker kann aber nicht immer jede technisch neuere und bessere Sprache benutzen. Insbesondere dann nicht, wenn es nicht für jeden Prozessor den Compiler in der moderneren und besseren Sprache gibt. Deshalb hat sich C als allgemeine Sprache für Embedded Systems durchgesetzt. In C können Programme für jeden Prozessor geschrieben werden. Der Erfolg von C hängt angeblich vom Erfolg des Betriebssystems UNIX ab. Das ist nur teilweise richtig, da auf Signalprozessoren und Controllern UNIX nicht sinnvoll ist, sondern kleinere Betriebssysteme. Diese Bevorzugung von C lässt sich durch Aussagen der VDI/VDE 2422 "Entwicklungsmethodik für Geräte mit Steuerung durch Mikroelektronik" untermauern. Diese Richtlinie enthält auf Seite 22 folgende Tabelle: Tabelle 6.1 Hinweise zur Auswahl der Programmiersprache Verwendung für einfache SteueProgrammierspracherung ASSEMBLER x BASIC x FORTRAN x C x PL/M x PASCAL x
komplexe Steuerung
zeitkritische Teilfunktion x
x x x
x
Interessanterweise erfüllt nur C die Anforderungen für alle Gerätesysteme. Die Informationsmenge und deren Komplexität nimmt infolge der µ-Computertechnik immer mehr zu. Ich vermeide es deshalb, den Studierenden mehrere Assemblersprachen für allgemeine Prozessoren, RISCProzessoren, Signalprozessoren, Transputer, ALPHA-Prozessoren, PowerProzessoren und Grafikprozessoren beizubringen, sondern empfehle den Studierenden die Sprache C. Einen weit verbreiteten Compiler für die 8051-Familie entwickelte die Firma Keil. Diese stellt eine frei kopierbare "Evaluationsversion" zur
176
Verfügung. Mit Hilfe dieser Version sind Sie in der Lage, die nachfolgenden Programmbeispiele zu compilieren und zu testen. Kleinere Programmbeispiele können Sie ebenfalls bearbeiten. Bei größeren Programmen oder kommerziellem Einsatz müssen Sie die Vollversion kaufen. 6.1
Einführung in den C-Compiler
In den folgenden Abschnitten lernen Sie das Programm EIN_AUS in C zu erstellen und mit dem Simulator oder dem Remote-Debug-System auszutesten. Verschiedene Hinweise, wie beispielsweise, dass das Codesegment auf die Adresse 100H zu legen ist, vermeiden von vornherein Fehler in der Entwicklungsumgebung. Für eine vollständige Einführung in C empfehle ich das Original: The C Programming Language von Brian W. Kerninghan und Dennis M. Ritchie. Mit den vorliegenden Beispielen werden zunächst die Lösungen vorgestellt. Aus diesen Programmen können Sie, ähnlich wie bei einer Variantenkonstruktion, neue Programme entwickeln. 6.1.1
Das Programm EIN_AUS
Voraussetzung für das Erstellen des Programmes EIN_AUS in C ist die Installation der C51 Evaluations-Software von www.keil.com oder vom beiliegenden Datenträger. Beim beiliegenden Datenträger haben Sie die Gewissheit, dass kein Versionskonflikt mit den Erklärungen im Buch auftritt. Bei der Installation über www.keil.com haben Sie immer die aktuellste Version verfügbar. Bei Fragen zum Compiler C51 empfehle ich die Internetseite von Keil. Insbesondere die Suche funktioniert hervorragend. Beispielsweise möchten Sie wissen, was eine *.plg-Datei ist? Sie geben in das Suchfenster „*.plg“ ein und betätigen die Schaltfläche GO. Es erscheint: µVision® User's Guide: B. File Types
Hier sind alle Dateiendungen inkl. *.plg erklärt. Die Datei EIN_AUS.C ist das „Hello World“-Programm für Mikrocontroller. Die Funktionalität ist die gleiche wie beim Assembler-Programm EIN_AUS.A51. Ein Taster T1 schaltet eine LED ein. Ein Taster T2 schaltet die LED aus.
6 C für die 8051-Familie
177
/*********************************************************** ** ** ** Datei:EIN_AUS.C ** ** Das Programm bewirkt: ** ** Taster 1 schaltet Leuchte 1 ein ** ** Taster 2 schaltet Leuchte 1 aus ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rückgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: Prof. J. Walter ** ** Datum: 29.6.1994 WS 1993/94 ** ** ** **********************************************************************/ #pragma OBJECTEXTEND #pragma CODE DEBUG #pragma SYMBOLS #include <euro_535.h>
/* typengerechtes Programm Debug */ /* Symbolisches Debuggen */ /* Symbolliste wird erzeugt */ /* Definitionen fuer EURO_535-Karte */
/*********************************************************************/ void lichtein(void) { Leuchte_1 = 0; }
/* L1 leuchtet */
void lichtaus(void) { Leuchte_1 = 1; /* L1 aus */ } /*********************************************************************/ void main (void) { while (1) { if (!Taster_1) lichtein(); if (!Taster_2) lichtaus(); } }
/* Hauptfunktion
*/
/* Endlosschleife */ /* /* /* /*
Wenn Taster Leuchte ein Wenn Taster Leuchte aus
1 betätigt */ */ 1 betätigt */ */
Die Datei STARTUP.A51 ist eine von Keil zur Verfügung gestellte Datei, die nach dem Reset den Controller in einen definierten Zustand bringt. Im Einzelnen werden folgende Schritte durchgeführt: ‚ ‚ ‚ ‚ ‚
Löscht den internen Datenspeicher Löscht den externen Datenspeicher Löscht den erweiterten externen Datenspeicher Initialisiert den Stack und den Zeiger für small model Initialisiert den Stack und den Zeiger für large model
178
‚ Initialisiert den Stack und den Zeiger für compact model ‚ Initialisiert den 8051 Stackpointer - Hardware ‚ Setzt Steuerungszeichen in Programm um und initialisiert die globalen Variablen und die C Hauptfunktion – main, wenn es nicht bereits initialisierte Hauptvariablen gibt. Das Programm EIN_AUS.C und STARTUP.A51 kann nach dem Compilieren im Debugger ausgeführt werden. Die Dateien im Verzeichnis EIN_AUS nach dem Entwicklungsvorgang sind: EIN_AUS.C COMPILE.BAT LINK.BAT EURO_535.H EIN_AUS. EIN_AUS.M51 EIN_AUS.HTX EIN_AUS.SYM EIN_AUS.OBJ EIN_AUS.LST EIN_AUS.lnp EIN_AUS.Opt EIN_AUS.plg EIN_AUS.Uv2 EIN_AUS_Opt.Bak EIN_AUS_Uv2.Bak STARTUP.A51 STARTUP.LST STARTUP.OBJ
Editiertes C-Programm Compiler-Batch Link-Batch Register-Definitionen Durch Linker erzeugt Was der Linker machte Objekt-Datei für Debugger von Hitex Symbolinformationen Objektdatei für Linker List-Datei von Compiler Linker Input Datei generiert von Projekt-Optionen, Debugger-Einstellungen etc. Protokoll für den Build-Prozess uVision Projekt-Datei Sicherung Sicherung Assembler Datei von STARTUP Listing Datei von STARTUP Objektdatei von STARTUP für Linker
Einige der aufgeführten Dateien werden in der modernen Oberfläche von Keil µVision nicht mehr benötigt. Aufgrund der Kompatibilität sind diese jedoch nach wie vor in den Verzeichnissen enthalten. Auf diese Weise können solche Programme auch unter den Entwicklungs-Versionen ausgeführt werden, die in der ersten Auflage enthalten waren. Diese Forderung nach maximaler Kompatibilität bei Prozessoren hat die Firma Intel, wie bereits erwähnt, hervorragend umgesetzt. Diese Kompatibilität ist jedoch bei vielen weiteren technischen Entwicklungen ebenfalls gefordert. So müssen beispielsweise neue HDTV-Fernseher auch die alten Fernsehprogramme wiedergeben können. Insbesondere sollen auch der alte Bildaufbau 4:3 noch darstellbar sein. Und noch weitergehend: Die neuen Formate sollen auch auf alten TV-Modellen laufen. Eine ganz andere Auswirkung der Kompatibilität wird mit dem Aufbau dieses Buches deutlich. So wurden trotz neuer Entwicklungsumgebung die Seitenzahlen als solche beibehalten. Hierdurch können auch ältere Auflagen aus Bibliotheken in der Vorlesung verwendet werden. Ein Seitenverweis wird immer korrekt sein. Die prinzipiellen Abläufe beim Compilieren sind in der folgenden Abbildung dargestellt:
6 C für die 8051-Familie
*. Object File *.OBJ Objekt File *.C SOURCE C-Program File
L51
File
DateiKonverter *.M51 Listing File
Compiler
*.HTX
sp8051kl
Link & Locate
C-51
179
*.SYM Symbol Info
*.LST Listing File
Abb. 6.1 Compilieren des C-Programmes
Die Keil Entwicklungsumgebung erzeugt alle Dateien, die zur Ausführung des Programmes und zum Debuggen notwendig sind. Die Dateikonverter sind nur bei der älteren HITEX Entwicklungsumgebung notwendig. 6.1.2 Test von EIN_AUS.C mit dem Simulator Öffnen Sie die Datei: EIN_AUS.Uv2 im Verzeichnis Laufwerk: \8051\ENTW_C\EIN_AUS. Im Project Workspace – Projekt Arbeitsbereich erscheinen die Ordner: Target 1 und als Unterordner Source Group 1. Darin enthalten sind die Dateien STARTUP.A51 und EIN_AUS.C. Diese Dateien werden mit der Schaltfläche compiliert. Und es sollte folgende Meldung im „Output Window“ erscheinen: Build target 'Target 1' assembling STARTUP.A51... compiling EIN_AUS.C... linking... Program Size: data=9.0 xdata=0 code=35 "EIN_AUS" - 0 Error(s), 0 Warning(s).
Sollten jedoch Fehler vorhanden sein, erscheint bei einem Doppelklick auf die Fehlermeldung ein blauer Pfeil. Dieser Pfeil zeigt auf die wahrscheinlichste Fehlerursache für die Fehlermeldung. Auf diese Weise können Sie sehr komfortabel und schnell entwickeln. Vergewissern Sie sich auch nach dem Compilieren, ob im „Zauberstab" die richtigen Einstellungen durchgeführt sind. Insbesondere sollte im Register Debug der Simulator ausgewählt sein.
180
Abb. 6.2 Das Programm EIN_AUS.C und STARTUP.A51 in der Entwicklungsumgebung
In Abb. 6.3 sehen Sie im oberen Fenster den C-Code und im Fenster unterhalb den disassemblierten Code. Dieser Code ist Assembler! Führen Sie die Schritte mit F11 im Einzelschrittbetrieb aus. Öffnen Sie zusätzlich die beiden Fenster für Port 1 und Port 3. Mit Veränderungen im Port 1.1 und Einzelschrittausführung des Programmes können Sie die Veränderungen im Port 3.2 nachvollziehen. Mit RESET und F11 lässt sich das Programm STARTUP.A51 von Keil nachvollziehen. MOV R0,#7F CLR A @R0,A DJNZ R0,118
6 C für die 8051-Familie MOV LJMP
181
SP,#7 main
Dieser Code wird unmittelbar nach einem RESET ausgeführt. Er löscht den gesamten internen Datenspeicher von 00h bis 7Fh. Diese Erkenntnis hilft Ihnen beim Debuggen. Aber eben nur dann, wenn Sie auch Assembler verstehen.
Abb. 6.3 Das Programm EIN_AUS.C und STARTUP.A51 in der DebugUmgebung
182
6.1.3 Test des EIN_AUS.C in Hardware-Umgebung Voraussetzung bildet die Hardware EURO_535. Bevor das Programm gestartet wird, sollten Sie im „Zauberstift“ in der Registerkarte DEBUG das Feld: „Run to main()“ aktivieren. Jetzt kann das Programm EIN_AUS.C sehr komfortabel im Einzelschritt getestet werden. Mit F11 lösen Sie die einzelnen Schritte aus. Durch gleichzeitiges Betätigen der Taster T1 oder T2 auf der EURO_535-Karte und der Funktionstaste F11 können die einzelnen Programmteile ausgeführt werde. Sollten Sie keine Kommunikation zwischen EURO_535 und dem PC herstellen können, schauen Sie in der Gerätesteuerung nach, ob unter Hardware der richtige COM-Port auf PC-Seite gewählt wurde. Durch den Umgang mit dem Debugger, durch verschiedene Tests und Öffnen der Online-Hilfen erlernen Sie den Umgang mit einer solchen Testumgebung. Gleichzeitig erlernen Sie den Umgang mit einem Emulator, da die Umgebung bzw. Bedienoberfläche völlig gleichartig ist. 6.2 Die Eigenschaften des C-51-Compilers Außer den bereits genannten Vorteilen bei der Verwendung von C ergeben sich weitere Vorteile gegenüber der Assembler-Sprache. Sie müssen den Befehlssatz des Prozessors nicht vollständig beherrschen. Die Architektur des Controllers und dessen Umgebung müssen Sie jedoch genau kennen. Die Verwaltung der Register sowie der einzelnen Speicherbereiche übernimmt der Compiler. Die zweite „goldene Regel“ bei der Assemblerentwicklung (Kapitel 5: Projekte) muss also nicht mehr beachtet werden. Gleichzeitig erreichen Sie durch Verwendung von C eine bessere Programmstruktur. Dies erkennen Sie bereits im einfachen Beispiel EIN_AUS. Das vom Compiler erzeugte Programm EIN_AUS ist nicht länger als das in Assembler geschriebene. Der Aufbau mit Unterprogrammen ist aber programmiertechnisch eleganter. Ebenso ist die Lesbarkeit des C-Source-Codes besser als im Assembler. Für eine Projektübergabe oder bei der Wartung von Programmen ergeben sich daraus auch ökonomische Vorteile, da die Übergabe, Pflegbarkeit und Wiederverwendung der Programme in C wesentlich effektiver ist. Insbesondere bei Verwendung von mathematischen Routinen aus der mitgelieferten FloatingArithmetik ergibt sich eine erhebliche Verkürzung der Programmentwicklungszeit. Sehr schön können Sie dies am Programm "Effektivwert" erkennen. Das Programm in C ist ein Genuss gegenüber dem Programm in As-
6 C für die 8051-Familie
183
sembler. Sollten Sie gezwungen sein, den Controller zu wechseln um zur Bearbeitung von schnelleren Vorgängen einen Signalprozessor zu verwenden, so kann das Programm einfach portiert werden. Außer den Special Function Registern stimmen die verwendeten Datentypen überein. 6.2.1 Die Datentypen des C-51-Compilers Tabelle 6.2 Datentypen des C-51-Compilers Datentyp bit signed char unsigned char signed int unsigned int signed long unsigned long float pointer
Größe 1 Bit 1 Byte 1 Byte 2 Byte 2 Byte 4 Byte 4 Byte 4 Byte 1-3 Byte
Wertebereich 0 oder 1 -128 bis +127 0 bis 255 -32768 bis + 32767 0 bis 65535 -2147483648 bis +2147483647 0 bis 4294967295 ‒1,176E-38 bis ‒3,40E+38 Adresse einer Variablen
Datentyp Datentypen zum Zugriff auf SFR sbit sfr sfr 16
Größe
Wertebereich
1 Bit 1 Byte 2 Byte
0 oder 1 0 bis 255 0 bis 65535
Um beispielsweise den Port 0 anzusprechen, muss vorher die Variable P0 definiert werden. Dies geschieht mit der Anweisung sfr P0 = 0x80; oder durch Definition in der Datei *.h. In der Datei EURO_535.h, welche in das eigentliche Programm eingebunden wird, geschah dies für den Datentyp sbit mit den Anweisungen: /* sbit sbit sbit
Leuchtdioden */ Leuchte_3 = 0xB4; Leuchte_2 = 0xB3; Leuchte_1 = 0xB2;
/* sbit sbit sbit
Taster */ Taster_3 = 0x93; Taster_2 = 0x92; Taster_1 = 0x91;
Muss das Resultat in einen bestimmten Datentyp konvertiert werden, geschieht dies automatisch.
184
6.2.2 Speichertypen und Speichermodelle Der gesamte 8051-Speicher, bzw. der Speicher der Derivate, wird durch den C-51- Compiler genutzt. Durch die Unterscheidung zwischen internem und externem Speicherbereich können die Vorteile des jeweiligen Speichersegmentes genutzt werden. Schnelle Zugriffe, sowohl direkte als auch indirekte, können im internen Speicher des 8051-Controllers durchgeführt werden. Bei großen Datenmengen kommt der externe Speicherbereich zum Einsatz. Tabelle 6.3 Speichertypen bei C-51 (nach C-51-Bedienungsanleitung) Speichertyp Beschreibung data direkt adressierbarer interner Datenspeicher; ermöglicht schnellste Zugriffe auf Variablen (128 Byte) von 00h - 7Fh bdata bitadressierbarer, interner Datenspeicher, ermöglicht gemischten Bit und Byte-Zugriff von 20h - 2Fh. idata indirekt adressierbarer interner Datenspeicher; ermöglicht den Zugriff auf den vollen, internen Adressbereich bei beispielsweise 80535 von 00h - 0FFh. pdata ´paged´ (256 Byte) externer Datenspeicher, Zugriff mit dem Befehl movx @Ri. xdata externer Datenspeicher ( 64 KByte); Zugriff mit dem Befehl movx @dptr. code Programmspeicher (64Kbyte); Zugriff mit dem Befehl movc @A+DPTR.
Bei Variablen-Deklarationen ohne Angabe des Speichertyps werden in Abhängigkeit vom Speichermodell, SMALL, COMPACT, LARGE die voreingestellten Speichertypen verwendet. Beispiele für Variablen-Deklarationen: char data var1; char code text[]="PARAMETER EINGEBEN:"; unsigned long xdata array[100]; float idata x,y,z; unsigned int pdata dimension; unsigned char xdata vektor [10][4][4]; sfr P0 = 0x80; sbit RI = 0x98; char bdata flags; sbit flag0 = flags^0;
6 C für die 8051-Familie
185
Tabelle 6.4 Speichermodelle bei C-51 (nach C-51 Bedienungsanleitungen) Speichermodell Beschreibung SMALL Parameter und lokale Variablen werden im direkt adressierbaren, internen Datenspeicher platziert (max. 128 Byte; default Speichertyp: data) COMPACT Parameter und lokale Variablen werden im ´paged´ externen Datenspeicher plaziert (max. 256 Byte; default Speichertyp: pdata) LARGE Parameter und lokale Variablen werden im externen Datenspeicher platziert (max. 64 KByte; default Speichertyp: xdata)
Auch jetzt soll der Weg nicht verlassen werden, am Beispiel zu lernen und nur dann Wissen aufzunehmen, wenn es für die Lösung eines Problems gebraucht wird. Hervorragend geeignet für ein solches Vorgehen sind die bereits mit Assembler bearbeiteten Projekte. Die Architektur des Prozessors und die peripheren On-Chip-Einheiten verändern sich nicht. Der Controller kann bei Interrupt-Prozeduren oder bei Verwendung der Timer direkt in C programmiert werden.
Interrupt-Funktionen in C-51 Die Interrupt-Vektoren können mit Interrupt-Nummern von n= 0 bis n=31 erzeugt werden. Die Interrupt-Vektor-Adresse berechnet sich mit: Interrupt-Vektor-Adresse = 8*n + 3 Beispielsweise berechnet sich n für den Timer_2-Interrupt mit der Interrupt-Vektor-Adresse 2BH:
n?
TIMER2 / 3 ?5 8
Wobei TIMER2 = 2BH = 43 ist.
7
Projekte in C gelöst
Höhere Programmiersprachen bieten den Vorteil einer Entlastung bezüglich der Dokumentation im Sourcecode, denn sie sind leichter lesbar. Nach wie vor besteht aber die unbedingte Dokumentationspflicht bezüglich der Modularisierung und der Strukturierung. Ergänzt durch das Methodenwissen zur optimalen Implementierung sollte ein leicht lesbarer und wartbarer Programmcode entstehen. Es werden also zwei wesentliche Dinge vom Programmierer gefordert: Das Struktogramm und/oder ein leicht lesbarer und wartbarer Programmcode. Um Aufgaben zu lösen, sind jedoch weitere Aspekte zu berücksichtigen. Als wichtigste Forderung ist hierbei das Erstellen einer Anforderungsliste zu sehen. Diese Anforderungsliste wird bei den vorgestellten Projekten nicht ausgeführt, weil der Umfang dieser Aufgaben sehr klein ist. Sobald aber eine umfangreichere Aufgabe zu lösen ist, muss eine solche Anforderungsliste erstellt werden. Auch hier lassen sich wieder Grundregeln erstellen: Regel 1 Nur dokumentierte Hardware und Software ist existent. Regel 2 Funktionen werden im Zusammenhang dokumentiert. Nur in einzelnen Fällen erfolgt eine Dokumentation der Programmzeile. Regel 3 Beschränken Sie sich auf eine Anweisung pro Zeile. Regel 4 Verwenden Sie eine öffnende und eine schließende geschweifte Klammer jeweils in einer eigenen Zeile für jede einzelne Funktion. Regel 5 Rücken Sie die Anweisungen in einer Funktion bezüglich der geschweiften Klammern ein. Regel 6 Verwenden Sie keine Abkürzungen, sondern schreiben Sie die Bezeichnung aus.
7 Projekte in C gelöst
187
Diese Regeln können je nach Projektumfang sinnvoll ergänzt oder gekürzt werden. Die Programmierkonventionen sollten unbedingt vor jedem Projekt vereinbart und bekanntgegeben werden. Für Einsteiger in ein Projekt ist es vorteilhaft, wenn solche Konventionen innerhalb des Projektteams in einer dokumentierten Form vorliegen. 7.1 Standardkopf für Programme in C Der hier verwendete Standardkopf mit dem Dateinamen KOPF.C sieht folgendermaßen aus: /********************************************************************** ** ** ** Datei:?.C ** ** Das Programm bewirkt: ** ** ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rückgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: J. Walter ** ** Datum: 29.6.1994 SS 94 ** ** ** **********************************************************************/ /****************** Steueranweisungen für den Compiler ***************/ #pragma OBJECTEXTEND #pragma CODE DEBUG #pragma SYMBOLS
/* typengerechtes Programm Debug */ /* Symbolisches Debuggen ein */ /* alle Symbole werden aufgelistet */
/******************* Text im Quelltext einbinden *********************/ #include <euro_535.h>
/* Definitionen für EURO_535-Karte */
/*************************** Konstanten ******************************/ /*********************** globale Variablen ***************************/ /************************ Hauptprogramm ******************************/ void main(void) {
Falls keine Konstanten oder globalen Variablen verwendet werden, kann dieser Teil selbstverständlich gestrichen werden. Weitere ausführliche Beispiele finden Sie auf dem beiliegenden Datenträger.
188
7
Projekte in C gelöst
7.2 Blinklicht mit vorgegebener Blinkfrequenz Zur Vereinfachung werden sowohl die Aufgabe als auch das dazugehörige Struktogramm erneut aufgeführt. Aufgabe Ein einfaches Blinklicht mit vorgegebener Blinkfrequenz soll programmiert werden. Programmbeschreibung Initialisierung TIMER_0 Welche Taste wurde betätigt ? ja Taster 1 TR0 aus Port 3.2 löschen Licht ein
Taster 2 TR0 aus Port 3.2 setzen Licht aus
Zaehler = 0 ?
nein
Taster 3 Blinken TR0 an TIMER_0
P 3.2 Komplement
ret
Abb. 7.1 Struktogramm des Programmes BLIN_INT.C
Sie können die Aufgabe in C nur lösen, wenn Sie sowohl den Aufbau und die Funktionsweise der Timereinheit als auch der Interrupteinheit des 8051-Controllers verstanden haben. An diesem Punkt wird zudem die Einschränkungen der Portierbarkeit von C-Programmen deutlich. Selbst wenn die Sprache als optimal bezüglich der Portierbarkeit bezeichnet wird, ergeben sich oft Aufgaben, die die Peripherie eines µ-Computersystems betreffen. Es entsteht somit zusätzlicher Arbeitsaufwand. Je nach System beträgt dieser zusätzlicher Portierungsaufwand bis zu 10%. Zuerst möchte ich das Programm vorstellen und anschließend einige Erklärungen dazu geben. /********************************************************************** ** ** ** Datei:BLIN_INT.C ** ** Das Programm bewirkt: ** ** Taster 1: Licht einschalten ** ** Taster 2: Licht ausschalten ** ** Taster 3: Licht blinkt ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rueckgabewert: KEINER! (void) ** ** **
7 Projekte in C gelöst
189
*********************************************************************** ** ** ** ** ** Autor: W. Marx / J. Walter ** ** Datum: 29.6.1994 SS 1994 ** ** Aenderungen: ** ** ** ** ** **********************************************************************/
/***************** Steueranweisungen fuer den #pragma OBJECTEXTEND #pragma CODE DEBUG #pragma SYMBOLS
Compiler **************/
/* typengerechtes Programm Debug */ /* Symbolisches Debuggen */ /* Symbolliste wird erzeugt */
/****************** Text im Quelltext einbinden *********************/ #include <euro_535.h>
/* Definitionen fuer EURO_535-Karte */
/************************* Konstanten *******************************/ #define V_BLINK 10
/* Dauer des Blinkintervalls */
/*********************** Hauptprogramm ******************************/ void main(void); void Timer_0_ISR(void);
/* Funktions-Prototypen */
unsigned char zaehler = V_BLINK; void main(void) { Leuchte_1 = 1; IEN0 = 0x92;
/* main-Programm */ /* Lampe ausschalten */ /* generelle Interrupt */ /* Freigabe */ /* Modus 1, 16 bit Zaehler */
TMOD = 0x1; TCON = 0x0; while(1) {
/* Endlosschleife */ if(!Taster_1) { TR0 = 0; Leuchte_1 = 0; } if(!Taster_2) { TR0 = 0; Leuchte_1 = 1; } if(!Taster_3) { TL0 = 0; TH0 = 0; TR0 = 1; }
} return; }
/* Abfrage Schalter 1 ? */ /* Timer ausschalten */ /* Lampe an */ /* Abfrage Schalter 2 ? */ /* Timer ausschalten */ /* Lampe aus */ /* Abfrage Schalter 3 ? */ /* Zaehler auf 0 setzen */ /* Timer einschalten */
190
7
Projekte in C gelöst
void Timer_0_ISR(void) interrupt 1 /* { zaehler--; if (!zaehler) { Leuchte_1 = ~Leuchte_1; zaehler = V_BLINK; } return; }
ISR-Routine */ /* /* /* /*
bei jedem Einsprung */ wird Zaehler um 1 */ bis 0 gezaehlt */ Invertierung des Bit */
Der Programmkopf ähnelt dem bekannten EIN_AUS-Programm. Im Gegensatz zum EIN_AUS-Programm wurden keine Funktionen für das Ein- und Ausschalten der Leuchten verwendet. Die Anweisungen wurden stattdessen direkt an die Abfrage der Taster angehängt. Jetzt setzt der Compiler die Befehle anders um: Im Programm EIN_AUS entstanden aufgrund der Funktionsstruktur lcall-Befehle im Assembler. Im Programm BLIN_INT erzeugte der Compiler die bedingten Befehle jb (jump Bit). Bei der Initialisierung müssen für den Timer - wie im Assembler - das Modusregister TMOD und das Controlregister TCON, sowie für das Interruptsystem das Interruptregister IEN0 programmiert werden. Vorsichtshalber wurde die Leuchte 1 (L1) zuerst ausgeschaltet. In der anschließenden Endlosschleife fragt das Programm den Zustand von Taster_1 bis Taster_3 ab. Die Verwendung dieser Schreibweise mit Unter-strich wurde gewählt, um den unmittelbaren Zusammenhang zwischen Programm und Text zu veranschaulichen. Aufgrund des Anschlusses von Port und Taster über einen Widerstand, ergibt sich bei betätigtem Taster ein 0-Pegel am Eingang. Deshalb verwende ich die Verneinung mittels des Zeichens "!". Eine weiterer, schöner Operator, die ~ Tilde, wird bei der Invertierung der Leuchte_1 benutzt. Nach dem Editieren, der Kompilierung und dem Linken des Programmes kann dieses mit dem Simulator oder dem Remote-Debug-System getestet werden. In diesem Falle sei nur der erste Weg vorgestellt. Nach Aufruf des Simulators kompilieren Sie das Programm BLINT_INT.C und starten Sie den Debugger. Vergessen Sie jedoch nicht, im „Zauberstab“ unter der Registerkarte DEBUG den Kasten „Limit Speed to Real-Time“ zu aktivieren -der Grund: Bei den immer schneller werdenden Rechnern wird das 8051-Programm zu schnell simuliert. Sie können das Programm unmittelbar starten oder einen Breakpoint auf "main" setzen. Öffnen Sie sowohl Port 1 als auch Port 3 und testen Sie die Funktionen mit Taste1 und T2. Mit T3 können Sie den Blinkbetrieb starten. Sie müssen aber auf jeden Fall den Port P1.3 wieder auf „1“ setzen. Um das Ergebnis bei Port 3.2 zu sehen, muss im
7 Projekte in C gelöst
191
Abb. 7.2 Editier-Oberfläche beim Programm BLIN_INT.C
Fenster „VIEW“ der Punkt „Periodic Window Update“ aktiviert sein. Bei den vorliegenden Grundeinstellungen können Sie nunmehr sehr schnell den Parameter der Blinkfrequenz ändern. Gehen Sie hierzu wieder in den Editiermodus und ändern Sie die Blinkfrequenz beispielsweise auf 2. Kompilieren und starten Sie noch einmal den Debug-Mode. Jetzt sollten
192
7
Projekte in C gelöst
alle Fenster erneut erscheinen und Sie können das Programm sehr komfortabel testen. In der folgenden Abbildung sind Port 1 und Port 3 unterhalb des Disassembly-Fensters angeordnet. Port 3.2 ist auf „0“ gesetzt. Das Programm läuft und kann jederzeit angehalten werden. Am unteren Rand ist die abgelaufene Zeit t1 angezeigt.
Abb. 7.3 Debug-Oberfläche beim Programm BLIN_INT.C
7 Projekte in C gelöst
193
7.3 Projekt A/D-Wandlung Auch dieses Projekt setzt das entsprechende Wissen über den HardwareAufbau des Prozessors voraus. Die gleiche Aufgabe wurde bereits in Assembler gelöst. Das Struktogramm zeigt den prinzipiellen Aufbau des Programmes: Programmbeschreibung
Initialisierung A/D-Wandlung auslösen Wert CRCH = 0FCH und CRCL = 18H. Nach dem Reset beinhalten die Timer 2 Register TH2 und TL2 null. Timer 2 Control Register T2CON:
148
0C8H
T2PS 0
I3FR x
I2FR x
T2R1 1
T2R0 0
T2CM 0
T2I1 0
T2I0 1
T2CON
Nach einem Reset beinhaltet T2CON den Wert 00H. Es genügt folglich, Bit T2I0, T2R1 zu setzen. T2I0 wird zuletzt gesetzt, da dies den Zeitgeber startet. Für die Lösung der Aufgabe, 40 A/D-Werte mit einer Abtastfrequenz von 1kHz einzulesen, können Timer 2, A/D-Wandler und Interrupt verwendet werden. Der Interrupt für Timer 2 (ET2 im IEN0-Register) und derjenige für den A/D-Wandler (EADC in Register IEN1) müssen hierzu freigegeben werden. Die Software bestätigt das Auftreten eines Interrupts durch Rücksetzen des entsprechenden Kennungsbits / Flags. Beim A/DWandler ist dies das IADC-Bit, beim Timer 2 das TF2-Bit. Dieser Sachverhalt wird in der folgenden Tabelle dargestellt: Tabelle 5.20 Lösung der Aufgabe mit Interrupts Aktion Interruptfreigabe Timer 2 Interruptfreigabe A/D-Wandler Interruptbestätigung Timer 2 Interruptbestätigung A/D-Wandler
Bit ET2 EADC TF2 IADC
Bit Erklärung Interrupt Timer 2 Enable Interrupt A/D-Converter Timer Flag 2 Interrupt A/D-Converter
Assembler Anweisungen Programmbeschreibung Initialisierung Interrupt A/D Timer2 Interrupt-Unterprogramm Wert von ADDAT in ext. Speicher
Sind 40 Werte eingelesen ? Timer 2 sperren Leuchte 2 ausschalten
Abb. 5.23 Struktogramm für AD_40T2
Im Struktogramm für die A/D-Wandlung mit 1ms sind die wesentlichen Blöcke dargestellt. Das Interrupt-Unterprogramm ist hierbei sehr kurz aufgeführt. In einem verfeinerten Struktogramm wäre das Hochzählen des Datenpointers für die einzelnen Speicherzellen dargestellt. Die Detaillie-
5 Projekte mit Assembler gelöst
149
rung des Struktogrammes ist abhängig von der Programmiererfahrung. Sie sollten jedoch unbedingt immer die wesentliche Struktur des Programms darstellen. Das Programm AD_40T2.ASM im Sourcecode: $nomod51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(reg535.pdf) ;die 80535-spezifischen Daten $list ;es wird ein Listing erstellt $ title (AD_40T2) ;-----------------------------------------------------------------------;Programmbeschreibung ;-----------------------------------------------------------------------; ;Programm: Wandelt im A/D-Wandler 40 Werte mit Periodendauer von 1ms unter ;Verwendung von Timer 2 mit Interrupt unter Verwendung des Überlaufbits ;AD_40T2 AD_Wandler 40_ Werte T_imer2 ; ;T1=Wandlung starten L1=an L2=aus ;T3=Programm beenden L2=aus L1=aus ; ;Programmiert: J. Walter 11.12.93 ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 Zaehlvariable für Anzahl der A/D-Werte ; ;Kommentar: ; ;Aenderungen: ; ; ;-----------------------------------------------------------------------;Initialisierungsteil für allgemeine Konstanten ;-----------------------------------------------------------------------; MONITOR EQU 8000H ;Monitoreinsprung CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp ABFRAGE ;zur Abfrage springen ; ;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------Org 2BH ;Timer 2 Interrupt TIMER2_INT: mov DAPR,#0H ;Wandlung ausloesen, Bereich 0-5V clr TF2 ;Timer 2 Überlaufflag loeschen reti Org 43H ;A/D-Wandler Interrupt AD_INT: clr IADC ;Wandlungsbit löschen call AD_WERT_ISR reti
150 ;-----------------------------------------------------------------------;Initialisierungsteil für On-Chip Peripherie ;-----------------------------------------------------------------------ORG 100H ;Programmstart bei 100H INIT: ;Initialisierung für Abtastung setb P3.3 ;Wandlung läuft clr P3.2 ;L1 an setb EAL ;Allgemeine Interruptfreigabe setb EADC ;A/D-Wandler-Interrupt Freigabe setb ET2 ;Timer 2 Überlauf freigeben mov R2,#40 mov DPTR,#2000h
;40 Werte werden eingelesen ;Anfangsadresse für Daten
mov CRCH,#0FCh ;Timer 2 Hohes Byte laden mov CRCL,#18h ;Timer 2 Niederes Byte laden setb T2R1 ;Timer 2 Wiederladen bei Überlauf setb T2I0 ;Timer 2 Start mit Zeitgeberbetrieb ;-----------------------------------------------------------------------;Programmschleife ;-----------------------------------------------------------------------ABFRAGE: setb P3.2 ;L1 aus clr P3.3 ;L2 an Wandlung beendet jnb P1.1,INIT ;Start der Wandlung WANDLUNG_AN: jnb P1.3,ENDE ;Ende des Programms jmp ABFRAGE ;-----------------------------------------------------------------------;A/D-Wandler Interrupt Service Routine ;-----------------------------------------------------------------------AD_WERT_ISR: mov A,ADDAT ;der A/D-Kanal wird durch Reset init. movx @DPTR,A ;Wert in externen Speicher inc DPTR ;Adresse um eins erhoehen djnz R2, NICHT_FERTIG ; clr T2I0 ;nach 40 Werten Timerueberlauf sperren setb P3.2 ;L1 aus nach Wandlung NICHT_FERTIG: ret ENDE: setb P3.2 setb P3.3 ljmp MONITOR end
;L1 aus = Wandlung beendet ;L2 aus ;Sprung in Monitor
Das Abtasten von 40 Werten mit 1kHz Abtastfrequenz ist auch ohne Verwendung von Interrupts programmierbar. Der Timer 2 setzt bei einem Überlauf das TF2-Bit, welches durch die Software zurückgesetzt werden muss. Das TF2-Bit löst die Wandlung aus. Ist die Wandlung abgeschlossen, wird das BUSY-Bit zurückgesetzt.
5 Projekte mit Assembler gelöst
151
Assembler-Anweisungen Programmbeschreibung Timer 2 Initialisieren Warten auf TF2 Warten auf BSY Wert von ADDAT in ext. Speicher
Sind 40 Werte eingelesen ? Neue Wandlung / Ende ?
Abb. 5.24 Struktogramm für AD_40T2O A/D-Wandlung ohne Interrupts.
Das Programm AD_40T2O.ASM; A/D-Wandlung ohne Interrupts im Sourcecode: $nomod51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(reg535.pdf) ;die 80535-spezifischen Daten $list ;es wird ein Listing erstellt $ title (AD_40T2O) ;-----------------------------------------------------------------------;Programmbeschreibung ;-----------------------------------------------------------------------;Programm: Wandelt im A/D-Wandler 40 Werte mit Periodendauer: 1ms unter ;Verwendung von Timer 2 ohne Interrupt unter Verwendung des Überlaufbits ; ;AD_40T2O AD_Wandler 40_ Werte T_imer2_ O_hne Interrupt ; ;T1=Wandlung starten L1=an L2=aus ;T3=Programm beenden L2=aus L1=aus ;Programmiert: J. Walter 11.12.93 ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 Zaehlvariable für Anzahl der A/D-Werte ; ;Kommentar: ; ;Aenderungen: ; ;-----------------------------------------------------------------------;Initialisierungsteil für allgemeine Konstanten ;-----------------------------------------------------------------------;
152 MONITOR EQU 8000H ;Monitoreinsprung CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp ABFRAGE ;zur Abfrage springen ; ;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------;-----------------------------------------------------------------------;Initialisierungsteil für On-Chip Peripherie ;-----------------------------------------------------------------------ORG 100H ;Programmstart bei 100H INIT: ;Initialisierung für Abtastung setb P3.3 ;L2 aus Wandlung läuft clr P3.2 ;L1 an Wandlung läuft mov CRCH,#0FCh ;Timer 2 Hohes Byte laden mov CRCL,#18h ;Timer 2 Niederes Byte laden setb T2R1 ;Timer 2 Wiederladen bei Überlauf setb T2I0 ;Timer 2 Start mit Zeitgeberbetrieb mov R2,#40 mov DPTR,#2000h AD_40_WERTE: jnb TF2,AD_40_WERTE clr TF2 mov DAPR,#0H AD_WERT_DA: jb BSY,AD_WERT_DA mov A,ADDAT movx @DPTR,A inc DPTR djnz R2, AD_40_WERTE clr T2I0 setb P3.2
;40 Werte werden eingelesen ;Anfangsadresse für Daten ;warten bis Timer 2 Überlauf ;Timer 2 Überlaufbit löschen ;Wandlung auslösen ;Warten bis Wandlung fertig ;Wert in externen Speicher ;Adresse um eins erhoehen ; ;nach 40 Werten Timer stop ;L1 aus nach Wandlung
;-----------------------------------------------------------------------;Programmschleife ;-----------------------------------------------------------------------ABFRAGE: setb P3.2 clr P3.3 jnb P1.1,INIT jnb P1.3,ENDE jmp ABFRAGE
;L1 Wandlung läuft nicht ;L2 an Wandlung läuft nicht ;Start der Wandlung ;Ende des Programms
;-----------------------------------------------------------------------;Programmende ;-----------------------------------------------------------------------ENDE: setb P3.2 setb P3.3 ljmp MONITOR end
;L1 aus = Wandlung beendet ;L2 aus = Programm beendet ;Sprung in Monitor
5 Projekte mit Assembler gelöst
153
Subtraktion Offset; AD_40_OO.ASM Aufgrund der Eigenschaften des A/D-Wandlers im 80535 können nur positive Spannungswerte gewandelt werden. Deshalb muss der zu messenden Spannung ein Offset addiert werden. Dieses Offset muss für die Berechnung wieder eliminiert werden. Abgetasteter Sinus mit Offset
abgetasteter Sinus mit Offset Sinus - Offset
3
Sinus-Offset quadriert 2,5
Spannung u / [V]
2
1,5
1
0,5
0 0
0,005
0,01
0,015
0,02
0,025
0,03
0,035
0,04
-0,5
-1 Zeit T / [s]
Abb. 5.25 Abgetastete Sinus mit Offset
Wird der Offset subtrahiert, entstehen negative Zahlen. Dies ist für die Darstellung der Zahlen und deren Berechnung ungünstig, da im µController am einfachsten mit positiven Hexadezimalzahlen zu rechnen ist. Leiten Sie einfach sofort die Betragsbildung ein, noch bevor Sie die Quadrierung durchführen. Der prinzipielle Programmablauf ist damit: Struktur des Programms: Wert aus externem Speicher holen Offset subtrahieren Wenn negatives Ergebnis Betragsbildung mit Zweierkomplement Wert zurückschreiben Und das 40 mal
Das Programm AD_40_OO.ASM
154
$NOMOD51 $debug $INCLUDE(reg535.pdf) $title (AD_40_OO) ;40 Werte von A/D-Wandler ohne Offset ;Einfaches Programm zur Subtraktion des Offsets von 40 Zahlen ; ;Eingang: 40 A/D-Wandler Werte vom Speicher 2000H-2027H ;Ausgang: 40 Werte ohne Offset im Speicher 2000H-2027H ; ;Register: ;R7 Zählregister ;R6 Offset vom A/D-Wandler ; ;Initialisierungsteil AD_DAT_ANF EQU 2000H ;A/D-Daten Adressbeginn AD_DAT_END EQU 2027H ;A/D-Daten Adressende OFFSET EQU 66H ;DEZ. 102 entspricht 2 V ORG 0H jmp 100h ORG 100H ; ;Programmteil ; START: mov dptr,#AD_DAT_ANF mov R7,#28h mov R6,#OFFSET OFFSET_SCHLEIFE: movx a,@dptr clr C subb A,R6 jnc POS_ERG cpl A add A,#1 POS_ERG: movx @dptr,a inc dptr djnz R7,OFFSET_SCHLEIFE ljmp 8000H end
;Für Trace-Betrieb ;Programmanfang auf 100H ;Setzt Adresszähler auf 100H
;Adresse der A/D-Daten in DPTR ;Zählregister R7 mit 40 laden ;R6=Offsetregister ;n-ten A/D-Wert holen ;Carry löschen ;Akku - OFFSET ;falls Ergebnis positiv keine Betragsbildung ;Komplement von Akku ;Zweierkomplement ;Wert ohne Offset als Betrag zurück in ;externen Speicher ;DPTR Adresszähler + 1 ;Zählregister 0 ?, sonst Offset Schleife ;Monitoreinsprung
Die Betragsbildung wird durchgeführt, wenn ein Wert nach der Subtraktion negativ wird. ‚ Einer-Komplement ‚ Zweier-Komplement = Einer-Komplement+1 Was geschieht bei der Betragsbildung ? Angenommen im Speicher stehe der Wert 2H. Von diesem wird ein Offset von 4H abgezogen. 02H -04H -2H
5 Projekte mit Assembler gelöst
155
Wie sieht dies in binärer Darstellung aus?
Ergebnis SUBB wird gesetzt Komplement +1 Betrag:
10B -100B 1 1111 1110B
2 -4 -2
0000 0001B 0000 0001B 0000 0010B
Betrag ?
Carry-Bit
2
Zur Hilfe sei noch folgende Tabelle für Byte-Werte gegeben: Tabelle 5.21 Zahlendarstellung: Die vorderste "Eins" bedeutet "Negativ" Dezimal
Binär
0 1 2 3 4 .. .. .. 127 128 129 .. .. .. 254 255
0000 0000B 0000 0001B 0000 0010B 0000 0011B 0000 0100B .. .. .. 0111 1111B 1000 0000B 1000 0001B .. .. .. 1111 1110B 1111 1111B
Hexadezimal ohne Vorzeichen 00H 01H 02H 03H 04H .. .. .. 7FH 80H 81H .. .. .. FEH FFH
Dezimal mit Vorzeichen 0 1 2 3 4 .. .. .. 127 -128 -127 .. .. .. -2 -1
Subtrahiert wurde 102 =66H; dies entspricht einem Wert von ca. 2 V. Multiplizieren - Quadrieren; MUL_40.ASM Die Werte im Speicher müssen nunmehr quadriert werden. Dies hat zur Folge, dass aus 8-Bit-Werten 16-Bit-Werte entstehen. Die Werte legen wir wiederum im Speicher von 2028H bis 2077H, dies entspricht 80 Werten, ab.
156
Dieses Programm kopiert zuerst die Werte in den internen Speicherbereich ab 30H. Dadurch werden die Registerbänke und die einzeln adressierbaren Bits nicht überschrieben. Das Register R0 enthält die Adresse auf den Wert im internen Speicher. Nach der Multiplikation werden die 16-Bit-Werte wieder in den Speicher geschrieben. Sehr vorteilhaft wirkt sich hierbei der Befehl "mul ab" aus. Dieser führt eine Multiplikation in nur 4 µs bei 12 MHz Taktfrequenz durch. Das Programm MUL_40.ASM $NOMOD51 $debug $INCLUDE(reg535.pdf) $title (MUL_40) ;Einfaches Programm zur Multiplikation von 40 Zahlen ; ;Eingang: 40 A/D-Wandler Werte vom Speicher 2000H-2027H ;Ausgang: 80 Ergebnis-Werte vom Speicher 2028H-2077H ; ;Register ;R0 Adressierungsregister interner RAM ;R7 Zählregister Schleife ; ;Initialisierungsteil AD_DAT_ANF EQU 2000H ;A/D-Daten Adressbeginn AD_DAT_END EQU 2027H ;A/D-Daten Adressende ERGEB_DAT EQU 2028H ;Adresse für Ergebnisdaten ORG 0H ;Für Trace-Betrieb jmp 100h ;Programmanfang auf 100H ORG 100H ;Setzt Adresszähler auf 100H ; ;Programmteil ;A/D-Werte werden in internes RAM an Adresse 30H - 57H kopiert Start: mov dptr,#AD_DAT_ANF ;Adresse der A/D-Daten in DPTR mov R7,#28h ;Zählregister R7 mit 40 laden mov R0,#30h ;R0=Adressierungsregister: Register 0 ;enthält Adresse für internen RAM KOPIER_SCHLEIFE: movx a,@dptr ;n-ten A/D-Wert holen mov @R0,A ;Speichere Wert von Akku in Adresse die in ;R6 steht inc R0 ;Adresse+1 inc dptr ;DPTR+1 djnz R7,KOPIER_SCHLEIFE ;Zählregister 0 ?, sonst springen mov dptr,#ERGEB_DAT mov R7,#28h mov R0,#30h
;Vorbereitung für Multiplikation ;DPTR laden ;Zählregister R7 mit 40 laden ;R0 Adressregister
MUL_SCHLEIFE: mov a,@R0
;A/D-Wert holen
mov b,a mul ab movx @dptr,a
;Hilfsregister B mit Wert laden ;Multiplizieren LB Erg. A, HB in B ;Ergebnis LB in Adresse von DPTR
5 Projekte mit Assembler gelöst inc dptr mov a,b movx @dptr,a inc dptr inc R0 djnz R7,MUL_SCHLEIFE ljmp 8000H end
157
;dptr+1 ;HB in Akku ;Ergebnis HB in Adresse von DPTR ;dptr+1 ;interne Adresse +1 ;0 ?, sonst MUL_SCHLEIFE ;Monitoreinsprung
Addition der Werte; ADD_40.ASM Die Addition der Werte ergibt maximal eine 24-Bit-Zahl. Normalerweise befindet sich in Bibliotheken eine 32-Bit-Addition. Die aufgeführte 24Bit-Addition kann einfach auf 32 erweitert werden. Führen Sie dies einmal zur Übung durch. Die bisherigen Schritte waren zum größten Teil ein Hin- und Herschieben zwischen den Registern. Ein paar Rechenoperationen werden natürlich auch durchgeführt. Man erkennt aber, wie wichtig es ist, sich zunächst Gedanken über die Datenflüsse zu machen. Wie sahen die bisherigen Datenflüsse aus? Speicher 80535 Signalgenerator
2000H 2001H 2002H
1. Wert 2. Wert
2027H
40. Wert
A/D
Abb. 5.26 Speicherinhalt nach A/D-Wandlung von 40 Werten, AD_40
Nach der A/D-Wandlung wurden die Werte in den internen Speicherbereich des Prozessors kopiert und der Offset subtrahiert.
158 externer Speicher 80535 30H
2000H 2001H 2002H
1. Wert 2. Wert
2027H 2028H 2029H
40. Wert 1. Wert LB 1. Wert HB
2077H
40. Wert HB
interner Speicher 57H
CPU Quadrieren
Abb. 5.27 Speicherinhalt nach Quadrieren externer Speicher 80535
2000H 2001H 2002H
1. Wert 2. Wert
2027H 2028H 2029H
40. Wert 1. Wert LB 1. Wert HB
2077H 2078H 2079H 207AH 207BH
40. Wert HB 1. Wert Addition 2. Wert Addition 3. Wert Addition 4. Wert Addition
CPU Addition
LB+0 LB+1 LB+2 LB+3
Abb. 5.28 Speicherinhalt nach Addition
Sehr zu empfehlen ist eine Überprüfung der Programme auf ihre rechnerische Richtigkeit. Hierzu lässt sich folgendes, einfaches Verfahren anwenden: Eine Gleichspannung wird an den A/D-Wandler angelegt. Die eingelesenen Werte kann man im externen Speicher ansehen. Angenommen der Wert 3E stehe im Speicher. Dann würde sich das Ergebnis folgendermaßen berechnen lassen:
5 Projekte mit Assembler gelöst
externer Speicher
2077H 2078H 2079H 207AH 207BH
0F A0 58 02 bel.
LB+0 LB+1 LB+2 LB+3
Abb. 5.29 Speicherinhalt nach Addition
Additionsergebnis = 40 * 62 * 62 = 153760 In Hexadezimal ist dies 258A0H Der externe Speicher muss dann wie im Bild 5.29 aussehen: Das Programm ADD_40.ASM: $NOMOD51 $debug $INCLUDE(reg535.pdf) $title (ADD_40) ;Einfaches Programm zur 32 Bit-Addition von 40 16-Bit-Daten ; im externen Speicher ;Ergebnis der Addition im externen Speicher ab Adresse 2078 ;R3,R4,R5,R6 Additionsregister ;R7 Zählregister ;Initialisierungsteil MUL_DAT EQU 2028H ;Adressanfang ERG_ADD EQU 2078H ;Adresse Low-Byte 32-Additionsergebnis ORG 0H jmp 100h ORG 100H ; ;Programmteil ;MUL_Wert holen - addieren ;Register 0 setzen mov R3,#0 mov R4,#0 mov R5,#0 mov R6,#0 mov R7,#40 mov dptr,#MUL_DAT
;Für Trace-Betrieb ;Programmanfang auf 100H ;Setzt Adresszähler auf 100H
;Register null setzen ;Register null setzen ;Register null setzen ;Register null setzen ;Zählregister setzen ;Adresse der LB-MUL-Daten in DPTR
ADD_SCHLEIFE: CLR C movx a,@dptr addc a,R3 mov R3,a
;Carry null setzen ;Akku mit LB-MUL-Datum laden ;Addition von R3 und a ;Ergebnis in R3
159
160 inc dptr movx a,@dptr addc a,R4 mov R4,a mov a,#0 addc a,R5 mov R5,a inc dptr djnz R7,ADD_SCHLEIFE mov a,R3 mov dptr,#ERG_ADD movx @dptr,a inc dptr mov a,R4 movx @dptr,a inc dptr mov a,R5 movx @dptr,a ljmp 8000H end
;Datenpointer +1 ;Akku mit HB-MUL-Datum laden ;Addition von R4 und HB_MUL-Datum + carry ;Ergebnis 2.Byte in R4 ;kein 3. Byte vorhanden aber evtl. Carry ;Akku + R5 + Carry ;falls mehr als 256 Additionen muß ;Register 6 auch verwendet werden ;Datenpointer +1 ;Zählregister 0 ?, sonst springen ;LB in Akku ;Adresse LB-Ergebnis von Addition ;LB in externen Speicher ;Datenpointer + 1 ;LB+1 in Akku ;LB+1 in externen Speicher ;Datenpointer + 1 ;LB+2 in Akku ;LB+2 in externen Speicher ;u.s.w. falls 32 Bit Addition, LB+3 ;Monitoreinsprung
Division; DIV_40.ASM Für die Bildung des Effektivwertes muss noch durch die Abtastperiodendauer dividiert werden. Hierzu nochmals die Berechnung des Effektivwertes: n ? 39 1 T/ 2 2 Ueff ? Ð u ( t )dt für den µ-Controller Ueff ? 1* Ft un 2 T / T/ 2
T
 n?0
Mit den vorgegebenen Werten für die Abtastzeit = 40 ms und den Abtastintervallen von 1 ms ergibt sich: Ueff ?
1*1ms n ?39 2 Â un 40ms n ? 0
Es ist also die errechnete Summe durch 40 zu dividieren. Der maximale Wert für das Summenzeichen ist 24 Bit = 3 Byte groß. Der Wert 40 kann in einem Byte dargestellt werde. Deshalb ist eine 24/8-Bit-Division ausreichend. Diese Division wird auf eine Subtraktion zurückgeführt. Dividend ? Quotient Divisor
Wurzel_40 Die Ermittlung der Wurzel kann im µ-Controller erfolgen. Die Ermittlung der Wurzel kann aber auch auf der PC-Seite erfolgen. Dieser Weg ist der einfachere und wird daher bevorzugt.
5 Projekte mit Assembler gelöst
161
Übergabe über Serielle Schnittstelle SER_40 Das Ergebnis der Division ist eine maximal 3 Byte große Zahl. Aufgrund der üblichen Vorgehensweise wird eine 4-Byte-Zahl, dies entspricht einem Double Word (Doppelwort), an den PC übergeben. 5.6
Der Linker
Der Linker / Locater verfügt verschiedene Programmmodule zu einem einzigen, ausführbaren Programmzusammen. Im deutschsprachigen Raum werden auch die beiden Ausdrücke Binder / Lader verwendet. Der Linker kann absolute, adressierte Segmente nicht zusammenbinden, da dann beim Laden dieser Segmente in den Speicher Überlappungen entstehen würden. Es müssen also relative Segmente erzeugt werden. Die verschiedenen Namen in den einzelnen Modulen für die Variablen müssen auch den anderen Modulen bekannt gemacht werden. Dies geschieht mit dem Befehl PUBLIC. Dieser Befehl kann in der Evaluation-Version nicht verwendet werden. Als Beispiel, wie einzelne Module zu einem Gesamtprogramm mit dem Linker zusammengefügt werden können, dient das Effektivwertprogramm. Es sei jedoch gleich darauf verwiesen, dass sich dieses Programm sehr viel einfacher in C erstellen lässt. 5.7
Projekt Effektivwertmesser mit dem Linker erzeugt
HP_EW
Hauptprogramm für Effektivwert
$NOMOD51 $title(hp_ew) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Effektivwertberechnung ;Programmiert: B. Beck ; ;Eingang: Werte von A/D-Wandler ; ;Ausgang: Effektivwert über serielle Schnittstelle ; ;Verwendete Einspruenge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0)
162 ;Kommentar: ;Aenderungen: ;;Initialisierungsteil ; EXTRN code(ad_40,ad_40_oo,add_40,mul_40,div_40,dat_send,monitor) ; eff_wert_code SEGMENT CODE ; RSEG eff_wert_code ; hp_ew: ljmp start_ew ;Sprung auf Programmbeginn org 100H start_ew: jb P1.1, Start_ew lcall ad_40 ;Messwerte einlesen lcall ad_40_oo ;Offset subtrahieren lcall mul_40 ;Messwerte quadrieren lcall add_40 ;quadrierte Messwerte aufaddieren lcall div_40 ;Ergebnis durch 40 dividieren lcall dat_send ;Ergebnis seriell senden ljmp monitor end LINK.BAT c:\8051\rl51 &<eff_wert.lnk EFF_WERT.LNK hp_ew.obj,ad_40.obj,add_40.obj,ad_40_oo.obj,mul_40.obj,div_40.obj,eff_init. obj,dat_send.obj to eff_wert & code(eff_wert_code(0)) data(eff_wert_data(30H)) xdata(eff_wert_xdata(2000H))
Assemblierung erfolgt mit asm.bat in der Intel Entwicklungsumgebung. Bei Keil heißt der Linker BL51.EXE. Die entsprechenden Angaben führen Sie in der Keil Entwicklungsumgebung im „Zauberstift“ unter Options for Target in der Registerkarte BL51 Locate und BL51 Misc durch. Die einzelnen Module werden für den Linker vorbereitet: Modul AD_40.asm $NOMOD51 $title(AD_40.ASM) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Beispielprogramm zum A/D-Wandler des 80535 Version 1.0 ;Programmiert: B.Beck Dipl.Ing.(FH), Juli 1993 ; ;Eingang: 40 Werte von A/D-Wandler mit 1mS abgetastet ;Ausgang: 40 Werte im externen Speicher (ad_werte) ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ;
5 Projekte mit Assembler gelöst
163
;Verwendete Register und Variable: ;Registerbank(0) ;R2 Zaehlvariable fuer Anzahl der abgetasteten ;Werte ; ;Kommentar: ; ;Aenderungen: ; PUBLIC ad_40 EXTRN code(anzahl_ad_werte) EXTRN xdata(ad_werte) eff_wert_code SEGMENT CODE eff_wert_xdata SEGMENT XDATA ; ;Initialisierungsteil RSEG eff_wert_code ; ;Programmteil ; ad_40: ; call tim0init ;Timer 0 initialisieren ;ADCON ist durch RESET richtig eingestellt mov R2,#anzahl_ad_werte ;40 Werte werden eingelesen mov dptr,#ad_werte ;Adressen der Daten in Adresse ad_werte ; ; AD_Schleife: jnb TF0,$ ;warten bis Timerueberlauf (alle 1mS) clr TF0 ;Kennungbit loeschen clr TR0 ;Timer 0 stop mov TH0,#0fcH ;Wert fuer 1mS in Timer 0 laden mov TL0,#17H setb TR0 call AD_Wandlung ;neuen Wert einlesen djnz r2,AD_Schleife ;40 Werte ? ret ; ; AD_Wandlung: mov dapr,#0h ;A/D-Wandlung 8 Bit ausloesen jb bsy,$ mov a,addat movx @dptr,a inc dptr ret
;Warten bis Wandlung fertig ;Werte aus A/D-Wandlerregister in Akku ;Werte in externen Speicher ; ;
tim0init: mov A,TMOD anl A,#11110000B orl A,#00000001B
;die Initialisierung des Timer0 bleibt ;unveraendert ;16-bit Zaehler mit internem Takt
164 mov TMOD,A mov TH0,#0fcH mov TL0,#17H setb TR0 ret ; ; end
;Wert fuer 1mS in Timer 0 laden ;Timer 0 start
Modul ADD_40.asm $NOMOD51 $title(ADD_40) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Programm zur 32 Bit-Addition von 16-Bit-Daten ;Speicher ;Programmiert: B.Beck Dipl.Ing. (FH) ; ;Eingang: 40 16-Bit Werte Adresse (ergeb_dat) ;Ausgang: 40 Werte im externen Speicher Adresse (ERG_ADD) ;Verwendete Einspr³nge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R3,R4,R5,R6 Additionsregister ;R7 Zaehlregister ; ;Kommentar: ; ;Aenderungen: ; ;Initialisierungsteil ; eff_wert_code SEGMENT CODE ; PUBLIC add_40 ; EXTRN xdata(ergeb_dat,erg_add) EXTRN code(anzahl_ad_werte) ; RSEG eff_wert_code ; ;Programmteil ; ;MUL_Wert holen - addieren ;Register 0 setzen add_40: mov R3,#0 mov R4,#0 mov R5,#0 mov R6,#0
;register ;register ;register ;register
null null null null
setzen setzen setzen setzen
im
externen
5 Projekte mit Assembler gelöst mov dptr,#ERGEB_DAT mov R7,#anzahl_ad_werte ADD_SCHLEIFE: CLR C movx a,@dptr addc a,R3 mov R3,a inc dptr movx a,@dptr addc a,R4 mov R4,a mov a,#0 addc a,R5 mov R5,a mov a,#0 addc a,R6 mov R6,a inc dptr djnz R7,ADD_SCHLEIFE mov a,R3 mov dptr,#ERG_ADD movx @dptr,a inc dptr mov a,R4 movx @dptr,a inc dptr mov a,R5 movx @dptr,a inc dptr mov a,R6 movx @dptr,a ret
;Adresse der LB-MUL-Daten in DPTR ;Zaehlregister laden ;Carry null setzen ;Akku mit LB-MUL-Datum laden ;Addition von R3 und a ;Ergebnis in R3 ;Datenpointer +1 ;Akku mit HB-MUL-Datum laden ;Addition von R4 und HB_MUL-Datum + carry ;Ergebnis 2.Byte in R4 ;kein 3. Byte vorhanden aber evtl. Carry ;Akku + R5 + Carry ;Akku + R6 + Carry ;Datenpointer +1 ;Zaehlregister 0 ?, sonst springen ;LB in Akku ;Adresse LB-Ergebnis von Addition ;LB in externen Speicher ;Datenpointer + 1 ;LB+1 in Akku ;LB+1 in externen Speicher ;Datenpointer + 1 ;LB+2 in Akku ;LB+2 in externen Speicher ;Datenpointer +1 ;LB+3 in Akku ;32 Bit Addition, LB+3
end
Modul AD_40_OO.asm $NOMOD51 $title(Programm zum A/D Wandler des 80535) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Beispielprogramm um Gleichanteil der A/D-Wandlung des 80535 ;zu subtrahieren Version 1.0 ;Programmiert: B.Beck Dipl.Ing. (FH) ; ;Eingang: 40 Werte externer Speicher (ad_werte) ;Ausgang: 40 Werte für externen Speicher (ad_werte)ohne Offset ;Verwendete Einsprünge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R7 Zaehlregister
165
166 ;R6 Offset vom A/D-Wandler ; ;Kommentar: ; ;Aenderungen: PUBLIC ad_40_oo EXTRN XDATA(ad_werte) EXTRN CODE(anzahl_ad_werte,offset) eff_wert_code SEGMENT CODE ; ;Initialisierungsteil ;Vereinbarungen RSEG eff_wert_code ; ;Programmteil ; ad_40_oo: mov dptr,#AD_WERTE mov R7,#ANZAHL_ad_werte mov R6,#OFFSET OFFSET_SCHLEIFE: movx a,@dptr clr C subb A,R6 jnc POS_ERG cpl A add A,#1 POS_ERG: movx @dptr,a inc dptr djnz R7,OFFSET_SCHLEIFE
;Adresse der A/D-Daten in DPTR ;Zählregister R7 mit Anzahl der ;gewandelten Werte laden ;R6=Offsetregister ;n-ten A/D-Wert holen ;Carry loeschen ;Akku - OFFSET ;falls Ergebnis positiv keine Betragsbildung ;Komplement von Akku ;Zweierkomplement ;Wert ohne Offset als Betrag zurück in ;externen Speicher ;DPTR Adresszähler + 1 ;Zaehlregister 0 ?, sonst Offset Schleife
ret end
Modul MUL_40.asm $NOMOD51 $title(MUL_40) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Multiplikation von 40 Zahlen ;Programmiert: B. Beck, J. Walter ; ;Eingang: A/D-Wandler Werte (anzahl_ad_werte) ;
5 Projekte mit Assembler gelöst
167
;Ausgang: Ergebnis-Werte im Xdata-Speicher ergeb_dat ; ;Verwendete Einsprünge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ;R0 Adressierungsregister interner RAM ;R7 Zählregister Schleife; ;Kommentar: ; ;Aenderungen: ;Initialisierungsteil eff_wert_code SEGMENT CODE ; PUBLIC mul_40 ; EXTRN CODE(anzahl_ad_werte) EXTRN XDATA(ad_werte,ergeb_dat) EXTRN DATA(temp_intern) ; RSEG eff_wert_code ; ;Programmteil ;A/D-Werte werden in internes RAM an Adresse temp_intern kopiert ; mul_40: mov dptr,#ad_werte mov R7,#anzahl_ad_werte mov R0,#temp_intern
KOPIER_SCHLEIFE: movx a,@dptr mov @R0,A inc R0 inc dptr djnz R7,KOPIER_SCHLEIFE
;Adresse der A/D-Daten in DPTR ;Zählregister R7 mit Anzahl der gewandelten ;Werte laden ;R0=Adressierungsregister: Register 0 ;enthaelt ;Adresse für internen RAM
;n-ten A/D-Wert holen ;Speichere Wert von Akku in Adresse die in ;R0 steht ;Adresse+1 ;DPTR+1 ;Zaehlregister 0 ?, sonst springen
;Vorbereitung für Multiplikation mov dptr,#ERGEB_DAT mov R7,#anzahl_ad_werte mov R0,#temp_intern
;DPTR laden ;Register R7 mit anzahl laden ;R0 Adressregister
MUL_SCHLEIFE: mov a,@R0 mov b,a mul ab movx @dptr,a inc dptr mov a,b movx @dptr,a inc dptr inc R0 djnz R7,MUL_SCHLEIFE
;A/D-Wert holen ;Hilfsregister B mit Wert laden ;Multiplizieren LB Erg. A, HB in B ;Ergebnis LB in Adresse von DPTR ;dptr+1 ;HB in Akku ;Ergebnis HB in Adresse von DPTR ;dptr+1 ;interne Adresse +1 ;0 ?, sonst MUL_SCHLEIFE
168 ret end
Modul DIV_40.asm $NOMOD51 $title(DIV_40) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Division von zwei 32-bit Zahlen ;Programmiert: B. Beck, J. Walter ; ;Eingang: erg_add ; ;Ausgang: erg_div ; ;Verwendete Einsprünge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ;R0,R1 Divisor ;R5,R6,R7 ; ;Kommentar: ; ;Aenderungen: ; ; eff_wert_code SEGMENT CODE eff_wert_data SEGMENT DATA ; ; RSEG eff_wert_data ; ;Initialisierungsteil ; PUBLIC div_40 ; EXTRN code(anzahl_ad_werte) EXTRN XDATA(erg_div,erg_add) EXTRN DATA (TMP_0,TMP_1,TMP_2,TMP_3,OP_0,OP_1,OP_2,OP_3) ; ; RSEG eff_wert_code ; ;Programmteil ;This divides the 32 bit OP register ;by the value supplied div_40: mov R7,#0 mov R6,#0 mov TMP_0,#0 mov TMP_1,#0 mov TMP_2,#0
;zero out partial remainder
5 Projekte mit Assembler gelöst mov TMP_3,#0 mov R1,#0 mov R0,#anzahl_ad_werte mov dptr,#erg_add movx a,@dptr mov OP_0,a inc dptr movx a,@dptr mov OP_1,a inc dptr movx a,@dptr mov OP_2,a inc dptr movx a,@dptr mov OP_3,a mov R5,#32
169
;load divisor (high-Byte) ;load divisor (low Byte) ;load dividend
;loop count ;This begins the loop
Div_loop: call shift_d mov A,R6 rlc A mov R6,A mov A,R7 rlc A mov R7,A jc can_sub clr C mov A,R7 subb A,R1 jc cant_sub jnz can_sub clr C mov A,R6 subb A,R0 jc cant_sub
;shift the dividend and return MSB in C ;shift carry into LSB of partial remainder
;now test to see if R7/R6 >= R1/R0 ;Carry out of R7 shift means R7/R6 > R1/R0 ;subtract R1 from R7 to see if R1 < R7 ;A = R7-R1, carry set if R7 < R1 ;at this point R7>R1 or R7=R1 ;jump if R7>R1 ;if R7=R1, test for R6>=R0 ;A = R6-R0, carry set if R6 < R0
can_sub: ;subtract the divisor from the partial ;remainder clr C mov A,R6 subb A,R0 mov R6,A mov A,R7 subb A,R1 mov R7,A setb C ljmp quot cant_sub:
;A = R6-R0 ;A = R7-R1-Borrow ;shift a 1 into the quotient ;shift a 0 into the quotient
clr C quot: ;shift the Carry-bit into the quotient lcall shift_q ;Test for competion
170 djnz R5,div_loop ;Now we are all done, mov the TMP values ;back into OP mov mov mov mov ;
OP_0,TMP_0 OP_1,TMP_1 OP_2,TMP_2 OP_3,TMP_3 ;Ergebnis nach ERG_DIV speichern
mov DPTR,#ERG_DIV ; mov A,OP_0 movx @DPTR,A inc DPTR mov A,OP_1 movx @DPTR,A inc DPTR mov A,OP_2 movx @DPTR,A inc DPTR mov A,OP_3 movx @DPTR,A inc DPTR ; ret ; shift_d: ;shift the dividend one bit to the ;left and return the MSB in C clr C mov A,OP_0 rlc A mov OP_0,A mov A,OP_1 rlc A mov OP_1,A mov A,OP_2 rlc A mov OP_2,A mov A,OP_3 rlc A mov OP_3,A ret ; shift_q: ;shift the quotient one bit to the left ;and return the MSB in C mov rlc mov mov rlc mov mov rlc mov mov rlc mov ret
A,TMP_0 A TMP_0,A A,TMP_1 A TMP_1,A A,TMP_2 A TMP_2,A A,TMP_3 A TMP_3,A
5 Projekte mit Assembler gelöst
171
; end
Modul EFF_INIT.asm $NOMOD51 $title(EFF_INIT) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Initialisierungsdateien fuer Effektivwertprogramm ;Programmiert: B. Beck, Juli 1993 ; ;Eingang: ; ;Ausgang:Typvereinbarungen ; ;Verwendete Einspruenge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ; ;Kommentar: ; ;Aenderungen: ; ; eff_wert_code SEGMENT CODE eff_wert_xdata SEGMENT XDATA eff_wert_data SEGMENT DATA RSEG eff_wert_code ANZAHL_ad_werte EQU 40 OFFSET EQU 66H monitor EQU 8000H RSEG
;Anzahl der gewandelten Werte ;DEZ. 102 entspricht 2 V ;Einsprungadresse Monitior
eff_wert_xdata
ad_werte: ds anzahl_ad_werte
;Speicherplatz fuer die gewandelten Werte
ERGEB_DAT: ds 2*anzahl_ad_werte
ERG_ADD: ds 4 ERG_DIV: ds 4
;Adressanfang der Werte nach der ;Multiplikation ;Adresse Low-Byte 32-Additionsergebnis ;Adresse fuer die Ergebnisdatender Division
RSEG eff_wert_data TMP_0: TMP_1: TMP_2: TMP_3: OP_0: OP_1:
ds ds ds ds ds ds
1 1 1 1 1 1
;temporaerer Speicher fuer die Division ; " ; " ; " ;low Byte des Dividend bzw. des Ergebnisses ;
172 OP_2: OP_3:
ds 1 ds 1
; ;high
"
temp_intern:ds anzahl_ad_werte ;temporaerer Speicher im internen RAM PUBLIC TMP_0,TMP_1,TMP_2,TMP_3,OP_0,OP_1,OP_2,OP_3,temp_intern PUBLIC ANZAHL_AD_WERTE,OFFSET,MONITOR PUBLIC AD_WERTE,ERGEB_DAT,ERG_ADD,ERG_DIV end
Modul DAT_SEND.asm $NOMOD51 $title(Programm zum A/D Wandler des 80535) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Serielle Uebertragung der Ergebnisses ;Programmiert: B. Beck ; ;Eingang: Ergebnis der Division im externen Speicher ; ;Ausgang: Serielle Daten ; ;Verwendete Einsprnnge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ;R0, R1,R5,R6 ;Kommentar: ; ;Aenderungen: ; eff_wert_code SEGMENT CODE eff_wert_xdata SEGMENT XDATA ; ;Initialisierungsteil ; PUBLIC dat_send ; EXTRN XDATA(erg_div) ; RSEG eff_wert_code ; dat_send: clr ES mov PCON,#80H mov SCON,#50H setb BD mov DPTR,#erg_div movx A,@DPTR mov R6,A inc DPTR
;seriellen Interrupt sperren ;Baudrate 9600 ;8 Bit, serieller Empfang ;interner Baudratengenerator ;Adresse des Ergebnisses (low-Byte)im DPTR ;Ergebnis im Akku ;Wert zwischenspeichern ;Adresse des Ergebnisses (high-Byte) im DPTR
5 Projekte mit Assembler gelöst movx A,@DPTR mov R5,A mov A,R5 lcall bytesend mov A,R6 lcall bytesend ; ret
;Ergebnis im Akku ;high-Byte in Accu ;Ergebnis als ASCII seriell senden ;low-Byte in Accu ;Ergebnis als Ascii seriell senden
; ; Tabelle zur HEX -> ASCII-Wandlung ; h_a_tab: db '0123456789ABCDEF' ; ; Tabelle zur ASCII -> HEX-Wandlung ; a_h_tab: db 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh ; ;UP bytesend: wandelt das Zeichen aus ;dem ACCU in ASCII und sendet es ;ueber die serielle Schnittstelle ; bytesend: mov DPTR,#h_a_tab mov R0,A ; anl A,#0f0h swap A movc A,@A+DPTR lcall SERSEND
;high-nibble nach ASCII ;adresse der Tabelle in DPTR ;ACCU zwischenspeichern ;Offset berechnen ;Zeichen senden ;low-nibble nach ASCII
mov A,R0 anl A,#0fH movc A,@A+DPTR lcall SERSEND ret ;UP ASCII ->HEX: Adresse ASCII-Wert in R0 ;Adresse hex-Wert in R1 asc_hex: mov @R1,#0 mov DPTR,#a_h_tab mov A,@R0 jnb ACC.6,asc_hex1 add A,#9 asc_hex1: anl A,#0fH movc A,@A+DPTR swap A orl A,@R1 mov @R1,A inc R0 mov A,@R0 jnb ACC.6,asc_hex2 add A,#9 asc_hex2:
;Hex-Wert loeschen ;Adresse der Umwandlungstabelle ;ascii -> hex im DPTR ;ascii-wert im Accu ;springe wenn kein Buchstabe ;9 addieren (wegen Tabelle a_h_tab)
;high-nibble hex-Wert speichern ;naechster ascii-Wert ;ascii-wert im Accu ;springe wenn kein Buchstabe ;9 addieren (wegen Tabelle a_h_tab)
173
174 anl A,#0fH movc A,@A+DPTR orl A,@R1 mov @R1,A ret
;low-nibble hex_wert speichern ; UP sersend: sendet ein Zeichen aus dem ACCU
SERSEND: mov SBUF,A jnb TI,$ clr TI ret end
;Zeichen senden ;warten bis serielle Daten gesendet ;Ende-Kennung der Uebertragung loeschen
Sie erkennen sicherlich die großen Anstrengungen, die bei einem derartigen solchen Lösungsweg auf Sie zukommen. Es gibt zum Glück auch einen einfacheren Weg, zum Ziel zu kommen, nämlich über die Verwendung von Hochsprachen. Selbstverständlich können kleine Assemblerprogramme mit dem Linker / Locator in die Hochsprache eingebunden werden. Die Eleganz und Schnelligkeit, mit der Sie Programme in Hochsprache entwickeln können, zeigt das nächste Kapitel auf. Die Notwendigkeit, Assembler zu lernen, erscheint bei der Verwendung Hochsprache auf den ersten Blick überflüssig. Spätestens beim Debuggen, und Austesten von Hardware müssen Sie Assembler jedoch verstehen. Der Compiler macht nämlich nichts anderes, als die Befehle in Assembler umzusetzen. Die Firmen Silicon Laboratories und Infineon stellen weitere Hilfsmittel zur schnellen Programmierung in Assembler zu Verfügung. Hierdurch können Assembler-Programme und die Einstellungen der Hardware sehr komfortabel durchgeführt werden. Aber sobald ein Fehler im Zusammenspiel zwischen Hardware und Software auftritt, müssen Sie verstehen, wie das Programm entstanden ist und der Assembler arbeitet.
4
Assembler für die 8051-Controller-Familie
Für die Ausführung eines Programms auf einem µ-Controller der 8051Familie muss das Programm in einer für den Prozessor ausführbaren Form vorliegen. Diese Form besteht aus einer Kombination von "1" und "0", welche mit dem Zustand "EIN" und "AUS" oder "HIGH" und "LOW" gleichgesetzt werden kann. Als gut handhabbar hat sich die Darstellung in Bytes gleichbedeutend mit 8 Bit herausgestellt. Diese 8 Bit lassen sich als Hexadezimalzahl mit je zwei Nibble darstellen.
Abb. 4.1 Zahlendarstellung Der Mensch denkt aber selten in Hexadezimalzahlen. Hier prallen also zwei Sprachen aufeinander. Eine Ausdrucksweise wie "Lade das Register mit dem Namen Akkumulator mit der Zahl 89" fördert das Verständnis für die Aktionen, die im µ-Controller durchgeführt werden. Würde man eine solche Ausdrucksweise wählen, ergäben sich sehr umfangreiche und damit unübersichtliche Programme. Deshalb haben die Ingenieure bei Intel einen leicht zu merkenden mnemotechnischen Code entwickelt. "Lade das Register mit dem Namen Akkumulator mit der Zahl 89" heißt verkürzt: mov A,#89
Abb. 4.2 Befehl für 8051
62
Mit ein bisschen Übung und der nebenstehenden Erklärung im Bild lässt sich dieser Befehl einfach anwenden und schnell schreiben. Der Prozessor im µ-Controller kann diesen Befehl jedoch noch nicht bearbeiten, da dieser nur eine 1-0-Kombination als Befehl ausführen kann. Folglich muss der erwähnte Befehl in eine 1-0-Kombination übersetzt werden. Bei der 8051Familie stehen hierfür die beiden Bitkombinationen in der Tabelle: Tabelle 4.1 Übersetzung des Codes in eine Hexadezimal
Bitkombination 0111 0100B 0101 1001B
Als Hexadezimalzahl 74H 59H
Mnemotechnischer Code mov A, #89
Die erste Bitkombination übersetzt den Befehl mov A. Die zweite Bitkombination - dezimal geschrieben "89" - ergibt in hexadezimaler Darstellung 59H. Genau diese Übersetzungsarbeit - vom mnemotechnischen Code in die hexadezimale Darstellungsart - leistet der Assembler. Andererseits bezeichnet man die einfach zu merkende Kurzschreibweise ebenfalls als Assembler. "To assemble" heißt übersetzt "zusammenfügen". Sie fügen ein Programm in Kurzschreibweise zusammen und übersetzen diese Kurzschreibweise mit Hilfe eines Programms in 1-0-Kombinationen. Sowohl die Kurzschreibweise der Befehle als auch das Programm zum Übersetzen bezeichnet man als Assembler. Für das Übersetzen können Sie den beiliegenden Intel Evaluation Assembler verwenden. Für die Erstellung von 8051-Software verwenden Sie am besten einen PC mit dem Betriebssystem MS-DOS 5.0 oder höher. Die beiliegende Software HISIM51 erlaubt das Austesten der Programme mit dem Simulator. Falls Sie die Hardware in Form der EURO_535 V2.0 erstanden haben, empfiehlt sich die Ausführung der Programme direkt auf der Hardware. Die nachfolgenden Ausführungen beziehen sich auf den 8051Prozessor. Wie bereits erwähnt, gibt es von diesem Prozessor bereits mehr als tausend Derivate. Werden Besonderheiten dieser Derivate programmiert, so wird dies ausdrücklich erwähnt. Aufgabe Eine Leuchtdiode soll mit einem Taster eingeschaltet und mit einem anderen Taster ausgeschaltet werden.
4 Assembler für die 8051-Controller-Familie 63
Lösung Für das erste, einfache Programm sind die Portausgänge P1.1, P1.2, P1.3, P3.2, P3.3 und P3.4 der EURO_535 V2.0 wie folgt beschaltet. Sind die DIP-Schalter, aufgrund ihrer Größe auch "Mäuseklavier" genannt, S2.1-S2.6 auf ON geschaltet, werden die Leuchtdioden und Taster mit den entsprechenden Ports verbunden. An Port 1.1, 1.2, 1.3 liegen die Taster 1 bis 3. An Port 3.2, 3.3, 3.4 sind Leuchtdioden angeschlossen. Alle Ports sind zusätzlich auf die VG-Leiste - eine 96-polige Anschlussleiste - geführt.
+5V 1,8k Y
1,8k Y
1,8k Y
L1
L2
L3
VGC19
S2.1
VGA19
P3.2 P1.1 VGC13
S2.2
P3.3
VGC18
S2.3
P3.4
Prozessoranschlüsse P1.2 P1.3
S2.4 VGA14
S2.5
T1
T2
VGC14
S2.6
T3
Abb. 4.3 Beschaltung der Ports
Die gesamte Beschaltung der Ports mit Leuchtdioden und Schalter kann auf der Karte durch die DIP-Switches S2.1 - S2.6 abgeschaltet werden. Hierdurch stehen für Ihre eigenen Entwicklungen alle Ports zur Verfügung. Der Unterschied zur üblichen Softwareerstellung wird hier sehr deutlich. Eine Softwareerstellung für µ-Controller setzt ein intensives Studium der entsprechenden Hardware voraus. Andererseits ist von der Hardware eine entsprechende Dokumentation zu liefern.
64 Tabelle 4. 2 Dokumentation der Beschaltung
Port
Anschluss
Bemerkung
P1.1 P1.2
T1 T2
Taster 1 Taster 2
P1.3
T3
Taster 3
P3.2
L1
Leuchtdiode 1
P3.3
L2
Leuchtdiode 2
P3.4
L3
Leuchtdiode 3
Wenn Sie selbst Hardware und Software für eine Aufgabenstellung entwickeln, sollten Sie eine künstliche Schnittstelle zwischen Hardware und Software mit Hilfe der Dokumentation erzeugen. Sie arbeiten also in einem Fall für die Hardwareabteilung und im anderen Fall für die Softwareabteilung. Die Beschaltung kann für die Softwareabteilung beispielsweise von der Hardwareabteilung in Form einer Tabelle dokumentiert sein. Das Struktogramm, auch Ablaufdiagramm genannt, ist zu erstellen. Hiermit setzen Sie die formulierte Aufgabenstellung in eine für die Software geeignete Beschreibungsform um. Dieser Schritt ist besonders wichtig. Er entspricht beim Klavier spielen dem Eintrag des Fingersatzes in das Notensystem. Einfache Stücke können Sie ohne Fingersatzeintrag spielen, aber spätestens beim „Hummelflug“ von Rimski Korssakow haben Sie Knoten in den Fingern. Bitte nehmen Sie diesen Tipp sehr ernst. Insbesondere wenn Sie größere Softwareprojekte bearbeiten müssen, sollten Sie die Dokumentation der wesentlichen Programmteile und damit die Struktur für andere Nutzer verständlich machen. Das bedeutet in der Konsequenz, dass Sie für die Dokumentation eine allgemein anerkannte Form wählen. Diese Form kann beispielsweise das Struktogramm nach DIN 66261 sein. Für objektorientierte Programmkonzepte sind Struktogramme dagegen ungeeignet. Eine Form der Programm-Entwicklung und Programm-Dokumentation ist die PDL – Program Design Language. In Worten beschreiben Sie zunächst: „WAS wird gemacht“. Dies entspricht praktisch den Kommentaren in den nachfolgenden Assembler-Programmen. Darauf folgt die Umsetzung in einer beliebigen Sprache. So können Sie beispielsweise als Ziel-
4 Assembler für die 8051-Controller-Familie 65
sprache Assembler oder auch C verwenden. Für ein erstes Programm wählen wir zur Veranschaulichung das Struktogramm. Falls Sie die Symbole für Programmablaufpläne nicht parat haben, finden Sie diese auf der nächsten Seite.
Abb. 4.4 Struktogramm für das erste, einfache Programm EIN_AUS.ASM
Nachfolgend sehen Sie das Programm. Es ist ausführlich dokumentiert. Die Wichtigkeit der Kommentare erkennen Sie leider erst, wenn Sie ein von Ihnen selbst geschriebenes Programm nach einem Jahr hervorholen und Änderungen durchführen sollen. Ersparen Sie sich diese Bloßstellung vor sich selbst! $ title (EIN_AUS) $debug ;Einfaches Programm zum Ein- Ausschalten einer Leuchte ;Taster 1 Einschalten, Taster 2 Ausschalten ;Taster 3 Programm beenden CSEG AT 0H ljmp ANFANG ORG 100H
;Legt absolute Codesegmentadresse auf 0h ;Sprung auf Programmanfang ;Programmstart bei 100H
ANFANG: jnb P1.1,LICHT_EIN jnb P1.2,LICHT_AUS jnb P1.3,PROGRAMM_ENDE ajmp ANFANG
;Schalter 1 betaetigt ? ;Schalter 2 betaetigt ? ;Programmende ;Springe zur Adresse Anfang
LICHT_EIN: clr P3.2 ajmp Anfang
;Licht einschalten ;Springe zur Adresse Anfang
LICHT_AUS: setb P3.2 ajmp ANFANG
;Licht ausschalten ;Springe zur Adresse Anfang
PROGRAMM_ENDE: ljmp 8000H end
;Monitoreinsprung
66
Symbole für Programm-Ablaufpläne Strukturelement
Klassische Darstellung
Struktogramme
Anfang
<Eingangsgröße>
Ende
Schnittstelle
Sequenz
ja
?
nein
?
ja
nein
Verzweigung b1
?
? b2
bn
für ?
ja
?
nein
Schleife für
Wiederholung
ja
?
nein
ja
?
Abb. 4.5 Symbole für Programm-Ablaufpläne
Schleife
nein
Sprung aus Schleife
4 Assembler für die 8051-Controller-Familie 67
4.1
Erstellen eines einfachen Assemblerprogramms
Die Entwicklung des Programmes Ein_aus.asm wird in den nachfolgenden Schritten beschrieben. 1. Installieren Sie die Keil Entwicklungsumgebung durch Starten der beiliegenden CD. Wählen Sie die Evaluationssoftware „Install Evaluation Software“ und anschließend im Inhaltverzeichnis den Punkt „ C51 Compiler“ (Eval Tools). Folgen Sie den Anweisungen der CD. 2. Rufen Sie den Dateimanager auf. 3. Kopieren Sie von der 8051-CD das Verzeichnis 8051 auf Ihre Festplatte. Bei einer neueren Umgebung spielt es keine Rolle, welchen Laufwerksbuchstaben Sie wählen. 4. Entfernen Sie den Schreibschutz für alle Dateien im 8051Verzeichnis. Rufen Sie den Dateimanager auf und suchen Sie in Verzeichnis 8051 nach allen Dateien mit *.*. Danach klicken Sie mit der rechten Maustaste auf die markierten Dateien. Im erscheinenden Fenster können Sie den Schreibschutz für alle aktivierten Dateien entfernen. 5. Das Programm „µVision“ rufen Sie unter Start\Programme\µVision auf. 6. Unter dem Menüpunkt: Project -> New Project legen Sie ein neues Projekt an. Bemerkung: Nach Abschluss vieler Projekte in den unterschiedlichsten Medien ziehe ich es inzwischen vor, für jedes Projekt einen separaten Ordner anzulegen und alle für das Projekt benötigten Dateien in diesem Ordner oder dessen Unterordner abzulegen. Das führt oft zu mehrfachem Ablegen derselben Dateien. Wird aber ein Projekt verschoben oder an einen anderen Mitarbeiter weitergegeben, so ist dadurch gewährleistet, dass alle notwendigen Dateien im Projektordner vorhanden sind. Besonders hilfreich ist dabei, eine Versionsnummer zusätzlich zur Projektnummer zu vergeben. Eine Sicherung des Projektstandes inklusive der Versionsnummer erweist sich ebenfalls als sehr vorteilhaft.
68
Abb. 4.6 Erstellen eines neuen Projektes
Damit Sie alle bisherigen Beispielprogramme für die 8051-Familie von den älteren Auflagen verwenden können, müssen Sie ein neues Projekt im Ordner: 8051\entw_asm\Ein_aus anlegen.
Abb. 4.7 Speichern der Projektdatei: Ein_aus.uv2
Legen Sie einen Ordner EIN_AUS und darin das Projekt Ein_aus.Uv3 an.Danach erscheint ein neues Fenster mit der Überschrift: Select Device for Target 'Target 1'. Hier wählen Sie das Zielsystem, also den Mikrocontroller aus.
4 Assembler für die 8051-Controller-Familie 69
Abb. 4.8 Auswahl des Controllers
Im vorliegenden Beispiel befindet sich der 80C535-Chip im Verzeichnis von Infineon unter der Bezeichnung SAB80C535. Dieser Controller wird inzwischen nicht mehr gefertigt. Stattdessen können Sie den 80C515 einsetzen, dessen zusätzlicher ROM durch die Hardware ausgeblendet wird.
Abb. 4.9 Auswahl des Derivates SAB 80C535 für die EURO-535-Karte
Die Zielumgebung ist die EURO_535-Karte. Die wesentlichen Eckdaten dieser Umgebung müssen zuerst dem Assembler und Linker unter dem Menüpunkt: Project/Options for Target 'Target1' bekannt gegeben wer-
70
den. Legen Sie den Takt auf 12.0 MHz fest und tragen Sie die Startadresse: 0x0000 und die Größe: 0x8000 für das EPROM und den RAM ein. Bedenken Sie, dass das Remote-Debugsystem der EURO_535 nur in einer von-Neumann-Architektur funktionsfähig ist. Verwenden Sie eine andere Hardware können völlig andere Techniken zum Einsatz kommen.
Abb. 4.10 Einstellungen für die gewählte Hardwareumgebung
Zur Konfiguration der Entwicklungsumgebung müssen die Programme für das Zielsystem bekannt gemacht werden. Im linken Fenster befindet sich unter dem Ordner: Target ein weiterer Ordner mit dem Namen: Source Group 1. Klicken Sie auf diesen Ordner mit der rechten Maustaste und es öffnet sich der folgende Dialog:
Abb. 4.11 Hinzufügen der Datei
Klicken Sie auf: Add Files to Group 'Source Group1' und es öffnet sich ein Datei-Dialog. Damit Sie das Programm nicht neu editieren müssen, öffnen Sie das Verzeichnis: 8051\entw_asm\Ein_aus\Ein_aus.asm. Der
4 Assembler für die 8051-Controller-Familie 71
Datei-Suffix ist normalerweise auf *.C eingestellt und sollte auf *.asm umgestellt werden.
Abb. 4.12 Das editierte Programm EIN_AUS.asm
Das hier vorgestellte Programm Ein_aus.asm wurde auf die wesentlichen Teile begrenzt. Insbesondere wurden alle üblichen Informationen zugunsten der Übersichtlichkeit weggelassen. Die Anweisungen von der bisher verwendeten Umgebung -Intel Assembler- wurden für den Assembler beibehalten. 4.2
Debuggen – Test und Fehlerbeseitigung
Mit Hilfe von Software wird der Controller auf dem PC simuliert. Die Leistungsfähigkeit eines PCs liegt oftmals weit über der Leistungsfähigkeit eines Controllers. Deshalb kann die Simulation schneller ablaufen als auf dem Zielsystem. Eine weitere sehr gute Testmöglichkeit ist der Test auf der Zielhardware. Hierfür muss die Zielhardware bestimmte Voraussetzungen erfüllen.
72
4.3
Test des EIN_AUS-Programms mit dem Simulator
Unter µVision2 können Sie auf zwei Arten das Programm testen. Als reine Simulation per Software oder in der realen Hardwareumgebung mit Hilfe des frei verfügbaren Monitorprogramms MON51 für die EURO_535-Karte.Durch einen Klick auf das "Lupensymbol mit rotem d" lösen Sie den Debug-Vorgang aus.
Abb. 4.13 Das editierte Programm Ein_aus.asm mit Start/Stop Debug Session
Ein neues Fenster mit den einzelnen Registern des 8051-Controllers erscheint. Mit dem Button Disassembly Window können Sie zwischen den verschiedenen Darstellungsarten umschalten. Im Menüpunkt Debug sind sämtliche Möglichkeiten für den Test des Programms aufgeführt. Durchlaufen Sie einmal das Programm in Einzelschritten mit dem Befehl Step oder mit der Funktionstaste F11.
4 Assembler für die 8051-Controller-Familie 73
Abb. 4.14 Das editierte Programm Ein_aus.asm im Debug-Modus
Unter dem Menüpunkt Peripherals können Sie die einzelnen Bits des Port 1 setzen und zurücksetzen. Somit lassen sich die Taster auf der EURO_535 per Software simulieren. Beachten Sie, dass Sie, um im Einzelschritt fortzufahren, das Fenster mit dem Sourcecode wieder aktivieren müssen.
74
Abb. 4.15 Das editierte Programm Ein_aus.asm mit abgearbeiteten Befehlen
4.4
Test des EIN_AUS-Programms mit EURO_535
Mit Remote-Debug testen Sie Ihre Software in der Hardwareumgebung. Durch die reale Umgebung sind die Testbedingungen besser als bei SoftDebug. Die Voraussetzungen für einen solchen Test gestalten sich jedoch umfangreicher: Euro-535 Hardware mit MON51 Eprom Verbindung der beiden Systeme über V24-Schnittstelle (RS232) Einstellungen in µVision2 In der integrierten Entwicklungsumgebung µVision2 rufen Sie im Menüpunkt Project/Options for 'Target1' die Registerkarte Debug auf. Wählen Sie die Check Box Use: Keil Monitor-51 Driver und Load Application at Startup. Dies bewirkt, dass beim Start des Debuggers die Datei Ein_aus sofort in die EURO-535-Karte geladen wird.
4 Assembler für die 8051-Controller-Familie 75
Abb. 4.16 Einstellungen in der Registerkarte Debug
Sehr vorteilhaft ist es, sämtliche Check-Boxen im Feld „Restore Debug Session Settings“ zu aktivieren. Hierdurch werden alle geöffneten Fenster im Debugbetrieb wieder aktiviert. Im Schalter „Settings“ können Sie die Einstellungen der Kommunikationsschnittstellen überprüfen. Falsche Einstellungen sind sehr häufig die Ursache für eine Fehlermeldung bei der Kommunikation zwischen EURO_535 und dem PC. Achten Sie bitte darauf, dass auch in der Registerkarte Target die Einstellungen korrekt sind. Bestätigen Sie die Eingaben mit OK. Bei neueren Notebooks muss ein USB-Seriell Umsetzer eingesetzt werden. Dazu muss unter Windows die richtige COM-Schnittstelle im Gerätemanager eingestellt werden. Wählen Sie COM1 oder COM2. Das Fenster „Project Workspace“ können Sie schließen und erhalten dann das folgende Fenster mit dem gesamten Programm. Sollte die Verbindungsaufnahme zwischen den beiden Systemen nicht funktionieren, können Sie unter Settings die verwendete COMSchnittstelle Ihres PCs auswählen.
76
Abb. 4.17 Das editierte Programm Ein_aus.asm nach Auslösen des Ladevorganges zur EURO_535
Die Registerinhalte des Controllers können Sie über den Button ein- und ausschalten. Der Programmcounter steht nach dem Start auf 0000H. Sie erkennen dies auch am gelben Pfeil am rechten Rand. Betätigen Sie den Button wird ein Einzelschritt ausgeführt und der Programmcounter springt auf 0100H. Wählen Sie unter dem Menüpunkt Debug den Punkt Breakpoints aus, so erscheint das folgende Fenster:
4 Assembler für die 8051-Controller-Familie 77
Abb. 4.18 Debug-Fenster nach Verbindungsaufnahme mit der EURO_535-Karte mit MON51 und das Setzen von Breakpoints
Im Feld Expression werden die gewünschten Breakpoints editiert und durch Define in die Breakpointliste eingetragen. Sinnvollerweise verwendet man hierzu die symbolischen Namen der Labels - Sprungmarken.. In diesem Fall wurde beispielsweise 'LICHT_EIN' gewählt. Sobald Sie Close
78
anklicken, erscheint eine rote Markierung an den gewählten Labels im Source Code. Sie können einen Breakpoint auch mit einem Doppelklick an der gewünschten Stelle auslösen. Im Programm EIN_AUS können die einfachen Techniken zum Austesten eines Programmes im Zusammenspiel mit der Hardware sehr gut geübt werden. Dies ist das einfachste Beispiel für EVA. E steht für Eingabe, V für Verarbeitung, A für Ausgabe. Die Eingabe erfolgt mit einem Taster, die Verarbeitung mit dem Controller und die Ausgabe mit einer LED. Das EVA-Prinzip ist das Grundschema für die elektronische Datenverarbeitung. Es gilt für Software und Hardware.
Abb. 4.19 Breakpoint LICHT_AUS
Mit dem Button lassen Sie das Programm ablaufen. Sobald der Taster T1 am Port 1.1 betätigt wird, hält das Programm am Breakpoint LICHT_EIN: an. Beobachten Sie beim Einzelschrittbetrieb mit der Taste „F11“ den Program Counter. Durchlaufen Sie die Warteschleife zu Beginn mehrmals und beobachten Sie die Befehlsausführungszeit für die Warteschleife. Bei 12 MHz-Betrieb können Sie die Warteschleife 125 000 Mal pro Sekunde durchlaufen.
4 Assembler für die 8051-Controller-Familie 79
4.5
Entwicklungsprozess für ein µ-Controller-Programm
An unserem einfachen Beispiel EIN_AUS lernen wir die typischen Schritte zur Lösung einer Aufgabe mit dem µ-Controller kennen. Diese Schritte sind im nachfolgenden Schaubild nochmals dargestellt. Produktvorstellung und Produktspezifikation sind durch die Aufgabenstellung von EIN_AUS vorgegeben. Aufgrund der simplen Anforderungen fällt dieser Teil hier sehr einfach aus. Normalerweise muss eine Anforderungsliste für das Produkt erstellt werden. Diese Anforderungsliste muss vom Vertrieb, der Geschäftsleitung, der Hardware- als auch der Softwareabteilung gegengezeichnet werden. Ich kann dieses "muss" nur jedem Entwickler empfehlen, selbst wenn einer der Beteiligten sich herausredet; bestehen Sie darauf! Die weitere Entwicklung verläuft meist parallel, da eine lineare Entwicklung zu viel Zeit beansprucht. Vorteilhaft erweist sich zu diesem Zeitpunkt der Einsatz eines Simulators zur Entwicklung der Software. Die Festlegung der Portbenutzung bzw. der Adressen und Speicherbelegung muss in Absprache zwischen Hardware und Software erfolgen. Diese Festlegung setzt einige Erfahrung voraus. Behalten Sie sich deshalb immer eine Reserve für spätere Aufgabenerweiterungen vor. Eine kontinuierliche Überprüfung ihrer Arbeit erreichen Sie durch wöchentliche Absprachen zwischen Hardware und Software. Die Wichtigkeit der ersten Schritte, insbesondere der Produktspezifikation, sei nochmals betont. Auch hier gilt, dass sich ein Fehler beim nächsten Entwicklungsschritt mit dem Kostenfaktor 10 auswirkt. Sind die Phasen Design, Konstruktion und Endtest abgeschlossen und der Endtest nicht erfolgreich, so müssen diese drei Phasen erneut durchlaufen werden. Insbesondere bei Embedded Systems bedingt die Systemintegration häufig einen weiteren Durchlauf von Design, Konstruktion und Endtest. Die Produktion beginnt meist mit einer kleinen Vorserie. Diese Vorserie muss ebenfalls ausgiebig getestet werden, damit keine Rücklaufaktionen notwendig werden. Wechseln Sie unter keinen Umständen ausgetestete Bauteile zugunsten billigerer Angebote aus. Bei der Entwicklung der EURO_535 wurde der Treiber für die serielle Schnittstelle im Prototyp getestet. Die Serie wurde mit einem angeblich kompatiblen Baustein gefertigt. Dennoch gab es zahlreiche Rückläufer wegen der mangelhaften Schnittstelle. Aus dem Gewinn wurde schlagartig ein Verlust!
80
Produkt Vorstellung
Produkt Spezifikation
Prototyp Hardware Design
Prototyp Hardware Konstruktion Prototyp Hardware Endtest
Ü B E R P R Ü F U N G
System Integration
Beginn der Produktion
Abb. 4.20 Entwicklungsablauf
Prototyp Software Design Prototyp Software Codierung Prototyp Software Endtest
4 Assembler für die 8051-Controller-Familie 81
4.6
Prototyp Software Design Start
Turbo-Pascal 6.0 Editor Word in TXT-Format
ASCII-Editor
BSP_2.ASM
BSP_1.ASM
BSP_4.C
BSP_3.ASM
Assembler
C-51 Compiler PL/M-51
ASM51
verschiebbarer Objektcode
Anwender Bibliothek Library Manager
C-Libraries
L51 Linker/Locator BL51 Banking Linker
Absolute Programme CSEG, ORG
BSP_GES.
Symbolpräprozessor SP8051KE
Symbolpräprozessor SP8051KE
Symbolpräprozessor SP8051KE
OH Objekt-HexCode-Wandler
PC
PC
PC
80535 EPROM
HITOP Simulator
Simulator
80535 Monitor EPROM
Remote Debug
Abb. 4.21 Ablauf Programmentwicklung
Hardware ohne µ-Controller
Emulator
Emulator
EPROM
82
Der Ablauf einer Programmentwicklung für µ-Controller beginnt im vorherigen Bild mit „Start“. Das Ende der Programmentwicklung wird meist in Form eines lauffähigen Programms im EPROM vorliegen. Die Testumgebung kann ein Simulator, ein Remote-Debug-System oder ein Emulator sein. Der "Start" im Bild beinhaltet bereits Modularisierung und Erstellung von Struktogrammen. Diese Aufgaben sind aufgrund der Vereinfachung nicht im Bild gezeigt. Sie können mit einem ASCII-Editor sowohl Assembler-Programme als auch C Programme editieren. Je nach Art der Programme wird ein Compiler oder Assembler zum Übersetzen der Programme verwendet. Durch Verwenden des Linkers können Sie verschiedene Module, die bereits auch in Form einer Bibliothek vorliegen, zusammenbinden. Je nach Zielumgebung, d.h. auf welcher Hardware die Software abläuft, erzeugen Sie aus der Linker-Datei entsprechende Dateien. Im Falle des vorgestellten Systems können *.HTX-Dateien sowohl vom Simulator, Remote-Debug-System als auch vom Emulator bearbeitet werden. Der Simulator zeigt sehr schön die Vorgänge im Prozessor auf. Die Umgebung kann in einer Vollversion des Simulators ebenfalls simuliert werden. Das einzige Werkzeug zur Programmentwicklung ist ein PC. Das Remote-Debug-System bietet alle Möglichkeiten, die Programme in Echtzeit auf der Zielhardware ablaufen zu lassen. Diese kann zum Beispiel die EURO_535 sein. Von Nachteil ist die Nicht-Echtzeitfähigkeit beim Austesten des Programms. Ein weiterer Nachteil besteht im erhöhten Speicherbedarf für das Monitorprogramm. Bei Echtzeitaufgaben und großen Entwicklungen empfiehlt sich dringend der Einsatz eines Emulators. Auch beim Test der HardwareUmgebung des Controllers ist dessen Einsatz sinnvoll. 4.7
Die Speicherbereiche des 8051 / 80535
Über den Assembler lässt sich steuern, welche Speicherbereiche des 8051 / 80535 angesprochen werden. Dafür werden zum Quellcode sogenannte Pseudobefehle wie z.B. CSEG -hier beginnt das Codesegement- als Anweisung für den Assembler vorgegeben. Der Unterschied zwischen einem 8051- und einem 80535-Controller liegt in der Erweiterung des internen RAM-Speicherbereiches. Weitere 128 Byte stehen beim 80535 durch indirekte Adressierung zur Verfügung. Vorteilhaft wirkt sich dies insbesondere durch den jetzt genügend großen Speicherplatz für den Stack aus.
4 Assembler für die 8051-Controller-Familie 83
Abb. 4.22 Speicherbereiche 8051 / 80535
4.8
ASM 51 Macro Assembler
Für Assembler-Anweisungen wie Speicherinitialisierung und Reservierung gilt nachfolgende Liste: Tabelle 4.3 und Tabelle 4.4 Assembler Anweisungen Symboli- Anwei- Operant Funktion sche Ad- sung resse Speicher Initialisierung und Reservierung [:]
DB
[:]
DW
<expression> <string> <list> <expression> <string> <list>
Funktionsbeschreibung
Define byte in prog- Definiere Byte (8 Bit) im Programmspeiram memory cher Define word in prog- Definiere Wort (16 Bit) im Programmspeiram memory cher
84 Symboli- Anweis- Operant sche Ad- ung resse [:]
DBIT
Funktion
Funktionsbeschreibung
<expression> Advance bit location Reserviere <expression> Byte im bitadrescounter sierbaren Bereich
Symbol Definitionen
EQU
<expression> Create new symbol
SET
<expression>
USING
CODE
<expression> - 0,1,2,3 <expression>
DATA
<expression>
IDATA
<expression>
XDATA <expression>
BIT
<expression>
Definition eines neuen Symbols (nicht redefinierbar) Set symbol value Definition eines neuen Symbols temporarily (redefinierbar) Select register bank Wahl der aktuellen Registerbank mit R0, R1, R2, R3, R4, R5, R6, R7 Define code address Definition eines Symbols im Programmsymbol speicher Define data adress Definition eines neuen Symbols im symbol internen Datenspeicher Define indirect data Definition eines neuen Symbols im indirekt adress symbol adressierbaren internen Datenspeicher Define an off chip da-Definition eines neuen Symbols im ta adress symbol externen Datenspeicher Define a bit adress Definition eines Symbols im symbol bitadressierbaren Bereich
Relative Segmente <segmentname>
SEGMEN {CODE|XDATA Declare relocatable |DATA|IDATA| segment. T BIT} [Assign attributes]
Definition eines Segmentnamens mit einer Typangabe sowie ggf. Speichergrenzen
RSEG
Aktivieren des vorher definierten relativen Segments <segment-name>
[ _{PAGE|INPAG E|INBLOCK| BITADRESSAB LE|UNIT}]
<segmentname>
Select relocatable segment
Absolute Segmente CSEG
[AT]
select code segment
DSEG
[AT]
select internal data segment
ISEG
[AT]
XSEG
[AT]
Select indirect internal segment select external data segment
BSEG
[AT]
select bit adress segment
Die folgenden Befehle und Definitionen werden auf absolute Adressen im CODE-Segment bezogen Die folgenden Definitionen werden auf absolute Adressen im internen Datenspeicher-Segment bezogen Die folgenden Definitionen werden auf absolute Adressen im indirekt adressierbaren Datenspeicher-Segment bezogen Die folgenden Definitionen werden auf absolute Adressen im externen Datenspeicher-Segment bezogen Die folgenden Definitionen werden auf absolute Adressen im bitadressierbaren Segment bezogen
Assembler Kontrolle für Zustände ORG END
<expression>
Set location Setzt den Adresszähler auf <expression> counter value End of program Ende des Programms
4 Assembler für die 8051-Controller-Familie 85
4.9 4.9.1
Die Assembler-Anweisungen im Detail Vereinbarungen für Symbole und Syntax
Symboldefinitionen - Symbol Definitions Ein Symbol repräsentiert Segmente, Register, Adressen und Zahlen. Syntax von Symbolnamen ‚ Beginn mit Buchstaben oder Sonderzeichen (z.B. ? oder _) ‚ erste 31 signifikante Zeichen; Länge max. 255 Zeichen ‚ Keine Unterscheidung zwischen Groß- und Kleinbuchstaben, aber möglich Beispiel: Programm_ENDE Syntax von Zahlenwerten ‚ erstes Zeichen muss Ziffer sein. Nicht FFH - sondern 0FFH Marken - Labels ‚ Symbolnamen mit Doppelpunkt [:] am Schluss ‚ Zuordnung von Befehlsadressen zu Symbolen Es kann Speicher als WORD (16Bit), BYTE (8 Bit) und BIT reserviert werden. 4.9.2
Speicherbereich Initialisierung und Reservierung
DB Das Format einer DB Anweisung ist: [label:] DB expression list Diese Anweisung initialisiert Programmspeicher mit Byte-Werten. Deshalb muss ein CODE-Typ-Segment aktiv sein. PRIMZAHLEN: DB 1,2,3,5,7,11,13 halt 1
; Das Label "Primzahlen" hat den In-
DW Das Format einer DW-Anweisung ist: [label:]DW expression list Diese Anweisung reserviert und initialisiert Worte innerhalb des Programmspeichers.
86 Sprung_Verteiler: DW GO_PROC,BREAK_PROC,DISPLAY_PROC ; eine Sprungverteiler Tabelle wird erstellt ; durch Aufzählung der Adressen für die ; Prozeduren.
DS Das Format ist: [label:]DS expression Diese Anweisung reserviert Speicher in Byte-Schritten. Es dürfen weder Vorwärtsreferenzen noch verschiebbare oder externe Bezüge vorhanden sein. DBIT Das Format ist: [label:]DBIT expression Die Anweisung reserviert Speicher in BIT Einheiten. Die Basiseinheit ist damit Bit und nicht Byte. EQU <symbol>EQU weist <symbol> den Wert zu. Nicht redefinierbar innerhalb Modul Bsp.: TRUE EQU OFFH
SET <symbol>SET weist <symbol> den Wert zu. Zeitliche Zuweisung - Redefinierbar innerhalb Modul Bsp.: TRUE SET OFFH 4.9.3
Die Registerbänke 0 bis 3
Die Registerbänke befinden sich im internen RAM; Adresse 00H - 1FH Sie können durch Verwenden des Befehls "USING" ausgewählt werden. USING USING 0 ausdruck 3 Ausdruck wählt die aktive Registerbank aus. Bsp.: Using 1
; Registerbank 1 wird ausgewählt
4 Assembler für die 8051-Controller-Familie 87
Nach dem Einschalten wird automatisch die Registerbank 0 gewählt. Symbol R0 bis R7 werden der jeweilig aktiven Registerbank zugewiesen. Es kann jeweils nur eine Registerbank aktiv sein. 1FH
Registerbank 3
18H 17H
Registerbank 2 10H 0FH
Registerbank 1 08H 07H
Registerbank 0 00H
R7 R6 R5 R4 R3 R2 R1 R0
@R1 @R0
kann Adresse von Speicher enthalten
Abb. 4.23 Registerbänke
4.9.4
Der Programmspeicherbereich
CODE <symbol> CODE Definition eines Symbols für ein Byte im Programmspeicherbereich CODE weist <symbol> den Wert zu. Nicht redefinierbar innerhalb Modul Bsp.: INT_VEKT_0 CODE 03H ; Interruptvektor 0 für externe Interrupts ; hat Adresse 03 Der Programmspeicher umfasst 64 KByte. Hiervon können 4 KByte im Prozessor sein. Je nach /EA-Signal wird dann interner oder externer Programmspeicher angesprochen. Welche Adresse des Programmspeichers angesprochen wird, steht im PC (Program Counter). Weiterhin liegen in diesem Adressbereich die Interrupt Vector Adresses (InterruptvektorAdressen). Beim 8051-Controller sind dies: Tabelle 4.5 Interrupt Vektoren im Programmspeicherbereich des 8051 PC 0000H 0003H 000BH 0013H 001BH 0023H
Interrupt Name RESET EXTIO TIMER 0 EXTI1 TIMER1 SINT
Erklärung Start Address after Reset External Interrupt 0 Timer 0 Overflow Interrupt External Interrupt 1 Timer 1 Overflow Interrupt Serial Channel 0 Interrupt
88
FFFFH
Für ErweiterungenSoftware-Portierbarkeit freihalten
0FFH
OFF-CHIP ROM
0FFFH 0000H
4 K IN-Chip ROM /EA=1
23H
SINT
1BH
TIMER 1 Timer 1 Überlauf Interrupt
13H
EXTI1
0BH
TIMER 0 Timer 0 Überlauf Interrupt
03H
EXTI0
externer Interrupt 0
00H
RESET
Startadresse nach Reset
Interrupt serielle Schnittstelle
externer Interrupt 1
Abb. 4.24 Programmspeicher
4.9.5
Der interne Datenspeicher
Der interne Datenspeicher ermöglicht eine sehr schnelle Programmbearbeitung. Die Adressierung des internen Datenspeichers kann direkt oder indirekt erfolgen. Für die Effizienz eines Programms ist die richtige Verwendung des internen Speichers wichtig. Der nachfolgende Befehl reserviert internen Speicher. DATA <symbol> DATA Definition eines Symbols für ein Byte im internen RAM oder SFR DATA weist <symbol> den Wert zu. Nicht redefinierbar innerhalb Modul Bsp.: TABELLE
DATA 70H
; Tabelle erhält die Adresse 70H
IDATA <symbol> IDATA Definition eines Symbols für ein Byte im indirekt adressierbaren internen RAM (00H-7FH). IDATA weist <symbol> den Wert zu. Nicht redefinierbar innerhalb Modul Bsp.: BUFFER
IDATA 60H
4 Assembler für die 8051-Controller-Familie 89 FFH
21 SFR Special Function
nur direkt adressierbar
Registers 80H 7FH
RAM 2FH
indirekt @Ri i=0,1
RAM BIT ADRESS RAUM
1FH 00H
direkt adressierbar
Registerbänke
Abb. 4.25 Interner Datenspeicher
4.9.6
Der externe Datenspeicher
Der externe Datenspeicher ist nur über indirekte Adressierung ansprechbar. Die Adresse steht entweder in den Registerbänken oder im Datenpointerregister. XDATA <symbol> XDATA Definition eines Symbols für ein Byte im externen RAM XDATA weist <symbol> den Wert zu. Nicht redefinierbar innerhalb Modul Bsp.: WERT1 XDATA 3890H
; WERT1 erhält die Adresse 3890H
FFFFH
nur indirekt adressierbar RAM über
@DPTR - @Ri
0000H
Abb. 4.26 Externer Datenspeicher
90
4.9.7
Die Bit-Adressen
Im internen direkt und indirekt adressierbaren RAM-Bereich gibt es 16 bitadressierbare Register. Jedes einzelne Bit in diesem Bereich kann direkt adressiert werden. BIT <symbol>BIT Bit weist <symbol> den Wert zu. (20H-2FH / 32-47) Nicht redefinierbar innerhalb Programm. Bsp.: ALARM BIT P1.3 ; Alarm-Taste an Pin Port 1.3 angeschlossen OPEN_DOOR BIT ALARM+1; entspricht P1.4 FFH
Special Function 80H 7FH
RAM 2FH 20H 1FH 00H
RAM BIT ADRESS RAUM Registerbänke
2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 27H 26H 25H 24H 23H 22H 21H 20H
7F
09 08 02 01 00 20H.0
Abb. 4.27 Bitadressierbarer Bereich
Die Zuweisungen in Form von werden in den Register-Deklarationsdateien durchgeführt. 4.10 Segmente Segmente sind Speicherbereiche. Da es beim 8051-Prozessor fünf verschiedene Speicherbereiche gibt, sind auch fünf Segmente verfügbar. Innerhalb der einzelnen Segmente muss ein Adresszähler vorhanden sein. Dieser "Location Counter" ist der Adresszähler des jeweils aktiven Segments. Aktiviert man ein Segment, so wird der „Location Counter“ auf die Basisadresse 0 gesetzt. Ist eine andere Basisadresse angegeben, wird diese verwendet.
4 Assembler für die 8051-Controller-Familie 91
interner / externer Programmspeicher
FFFFH
externer Daten speicher
interner Daten speicher
FFFFH FFH
nur direkt
CSEG
XSEG
adressierbar
80H 7FH
DSEG RAM
ISEG 2FH
0000H
0000H
1FH 00H
BSEG Registerbänke
indirekt
@Ri i=0,1
direkt
adressierbar
Abb. 4.28 Speicherbereiche - Segmente
CSEG XSEG DSEG ISEG BSEG
Externer oder interner Programmspeicher Externer Datenspeicher Interner direkt adressierbarer Datenspeicher Interner indirekt adressierbarer Datenspeicher Interner bitadressierbarer Datenspeicher
4.10.1 Relative Segmente Relative Segmente definieren einen verschiebbaren Speicherbereich für den Assembler. Zum Beispiel mit der Anweisung: <segment-name> SEGMENT DATA Erzeugung eines verschiebbaren Datensegments Der Location Counter wird innerhalb des internen Datenspeicherbereiches auf 0 gesetzt und ein entsprechendes Segment definiert. Entsprechend sieht die Anweisung für die anderen Speicherbereiche aus. Die weiteren Angaben sind: PAGE Gibt die Seite in einem Vielfachen von 256 für Programmspeicher oder externes Datenspeichersegment an. Gültig ist die Anweisung für Programmspeicher und externen Datenspeicher.
92
INPAGE Das Segment liegt innerhalb eines 256 Byte großen Blocks. Gültig für Programmspeicher und externen Datenspeicher. INBLOCK Das Segment liegt innerhalb eines 2048 Byte großen Blocks. Gültig nur für Programmspeicher. RSEG <segment-name> Diese Anweisung aktiviert das vorher definierte relative Segment. 4.10.2 Absolute Segmente Die Anweisung muss ohne Label erfolgen. Die Anweisung wird durch Angabe der entsprechenden Adresse für den „Location Counter“ gegeben. Default ist 0. Wird innerhalb eines Programms das Segment gewechselt, wird dieses Segment mit der Adresse des vorher verlassenen Segmentes fortgesetzt. 4.10.3 Assembler-Anweisungen ORG - END ORG Durch die ORG Anweisung kann der Programmierer die Programme und Daten in bestimmte Speicherbereiche legen. Auf diese Weise kann der Programmierer gewissermaßen einen Linker simulieren. Vorteilhaft wird diese Anweisung, wenn bestimmte Adressen beschrieben werden sollen, beispielsweise Interruptadressen. Diese können aber auch durch EQUAnweisung und den symbolischen Namen beschrieben werden. END Diese Anweisung muss die letzte Programmzeile sein. 4.10.4 Quellcode-Anweisungen für den Linker Falls mehrere Module durch einen Linker zusammengebunden werden, müssen besondere Anweisungen zur Verfügung stehen. PUBLIC Durch diese Anweisung an den Assembler werden die nachfolgenden Namen für andere Module verfügbar. Die Namen sind normalerweise nur in einem Modul lokal bekannt. Durch diese Anweisung wird der Name global bekannt. (Nicht anwendbar bei Evaluation Assembler von Intel)
4 Assembler für die 8051-Controller-Familie 93
EXTERN Durch diese Anweisung an den Assembler werden dem Linker externe, d.h. außerhalb des Moduls stehende Symbole, bekannt gemacht. Diese Symbole können somit als Ansprungadressen von jump- oder callBefehlen für externe Codesymbole dienen. NAME Die Anweisung legt den Namen eines Moduls für den Linker fest. Voreinstellung ist der Dateiname. Es gelten folgende Bedingungen: ‚ Keine Ziffer am Anfang ‚ Muss am Anfang eines Moduls stehen ‚ Kein Label Beispiel: NAME MATH_32_MODUL
4.11
Assembler-Steueranweisungen (Assembler Controls )
[] {} | [,.... ]
eckige Klammern bedeuten optionale Argumente Es darf nur eins der geklammerten Argumente gewählt werden. Einfache Trennung Die vorhergehende Bezeichnung kann wiederholt werden; muss jedoch durch Kommata getrennt werden.
Tabelle 4.6 Assembler Controls. Control
Default
[ { _ MOD51 } ] * MOD51 [ { _ NOMOD51 } ] *
Abkür- Funktion zung -
[ { _ DATE () } DATE () DA ]* [ { _ DEBUG } ] * NODEBU DB / [ { _ NODEBUG } ] * G NODB [ { _ EJECT } ] [ { _ GEN } ]
no EJECT EJ GE
[ { _ GENONLY } ]
GENONL GO Y
[ { _ NOGEN } ]
NOGE
Mit MOD51 benutzt der Assembler die SFRund Bitsymbole des SAB8051. NOMOD51 unterdrückt die Standardsymbole des 8051. Text aus max. 9 Zeichen wird im Seitenkopf als Überschrift ausgegeben Aufnahme bzw. Unterdrückung der Symboltabelle in die Objektcodedatei für das symbolische Testen mit dem ETA Papiervorschub auf Formularanfang Generieren der Makro-Definition, der Makroaufrufe und der Makroexpansionen in der ListDatei Generieren von ausschließlich Makroexpansionen in der List-Datei, als ob die Expansion Teil des Quellenprogramms wäre. Generieren der Makro-Definitionen, der Makroaufrufe.
94 Control
Default
Abkür- Funktion zung
[ { _ LIST } ] LIST LI / [ { _ NOLIST } ] NOLI [ { _ MACRO MACRO MR / [ (<memory percent>) (50) NOMR }]* [ { _ NOMACRO } ] * [ { _ OBJECT () OBJECT OJ / }]* (<source fi-NOOJ [ { _ NOOBJECT } ] * le.OBJ>) [ { _ PAGELENGTH PAGELEN PL () } ] * GTH (60) [ { _ PAGEWIDTH PAGEWID PW () } ] * TH (120) PAGING PI / [ { _ PAGING } ] * NOPI [ { _ NOPAGING } ] * [ { _ PRINT () } PRINT PR / ]* (<source fi-NOPR [ { _ NOPRINT } ] * le.LST>) [{_ REGISTE RB / REGISTERBANK RBANK NORB ( [...]) } ] * (0) [{_ NOREGISTERBANK }]* [ { _ RESTORE } ] no RS RESTORE [ { _ SAVE } ] no SAVE SA [ { _ SYMBOLS } ] * SYMBOLSSB / [ { _ NOSYMBOLS } NOSB ]* no TITLE TT [ { _ TITLE ('<string>') } ] [ { _ WORKFILES (ddd[, ddd]) } ] * [ { _ XREF } ] * [ { _ NOXREF } ] *
same drive WF as source file NOXREF XR / NOXR
Erstellen bzw. Unterdrücken einer Übersetzungsliste Auswerten und Expandieren von MakroAufrufen (bzw. keine Auswertung und Expansion bei NOMACRO). Prozentuale Zuweisung des verfügbaren Speichers Erstellung bzw. Unterdrückung einer Objektcodedatei Einstellung der Anzahl der Zeilen pro Seite (minimal 10, maximal 65535) Einstellung der Anzahl der Zeichen pro Zeile (72 8000H 55 Funktionsweise - Timing für Adressumschaltung (nicht zeitgetreu) 55 Blockbild für Timingberechnungen am RAM 57 Signal-Zeit Diagramm für Datenspeicher lesen am 80C535 57 Schaltungsteil zur Erzeugung der Von-Neumann-Architektur 59 Zustand bei Zugriff auf Adresse > 8000h 59 Signal-Zeit-Diagramm für Datenspeicher schreiben am 80C535 59 Zahlendarstellung 61 Befehl für 8051 61 Beschaltung der Ports 63 Struktogramm für das erste, einfache Programm EIN_AUS.ASM 65 Symbole für Programm-Ablaufpläne 66 Erstellen eines neuen Projektes 68 Speichern der Projektdatei: Ein_aus.uv2 68 Auswahl des Controllers 69 Auswahl des Derivates SAB 80C535 für die EURO-535-Karte 69 Einstellungen für die gewählte Hardwareumgebung 70 Hinzufügen der Datei 70 Das editierte Programm EIN_AUS.asm 71 Das editierte Programm EIN_AUS.asm mit Start/Stop Debug Session 72 Das editierte Programm EIN_AUS.asm im Debug-Modus 73 Das editierte Programm EIN_AUS.asm mit abgearbeiteten Befehlen 74 Einstellungen in der Registerkarte Debug 75 Das editierte Programm nach Auslösen des Ladevorganges zur EURO_535 76 Debug-Fenster nach Verbindungsaufnahme mit der EURO_535-Karte 77 Brechpoint LICHT_AUS 78 Entwicklungsablauf 80 Ablauf Programmentwicklung 81 Speicherbereiche 8051 / 80535 83 Registerbänke 87 Programmspeicher 88 Interner Datenspeicher 89 Externer Datenspeicher 89 Bitadressierbarer Bereich 90 Speicherbereiche Segmente 91 Blockbild von Timer 0 und 1 im 16-Bit Modus 112 Mode 2, Zähler / Zeitgeber 0 und 1 mit automatischem ...... 113 Mode 3, Timer 1 Interrupt wird von Timer 0 mitbenutzt 113
11 Bildverzeichnis Abb. 5.4 Abb. 5.5 Abb. 5.6 Abb. 5.7 Abb. 5.8 Abb. 5.9 Abb. 5.10 Abb. 5.11 Abb. 5.12 Abb. 5.13 Abb. 5.14 Abb. 5.15 Abb. 5.16 Abb. 5.17 Abb. 5.18 Abb. 5.19 Abb. 5.20 Abb. 5.21 Abb. 5.22 Abb. 5.23 Abb. 5.24 Abb. 5.25 Abb. 5.26 Abb. 5.27 Abb. 5.28 Abb. 5.29 Abb. 6.1 Abb. 6.2 Abb. 6.3 Abb. 7.1 Abb. 7.2 Abb. 7.3 Abb. 7.4 Abb. 7.5 Abb. 8.1 Abb. 8.2 Abb. 8.3 Abb. 8.4 Abb. 8.5 Abb. 8.6 Abb. 8.7 Abb. 9.1 Abb. 9.2 Abb. 9.3 Abb. 9.4 Abb. 10.1 Abb. 10.2 Abb. 10.3 Abb. 10.4
Erzeugen von Interrupts Zu viele Interrupts Prioritäten / Anforderungen von Interrupts Struktogramm für Blink-Programm Debug-Programm Zeitgeber-Anzeige Debug-Programm Zeitgeber-Anzeige Debug-Programm: Interrupt Blockbild A/D-Wandler Anschluss eines Potentiometers an EURO_535 Schaltbild ADDA535-Karte Anzeige des ADDAT-Inhalts im Debug-Programm Umsetzung von parallel in seriell Einstellungen der seriellen Schnittstelle Einstellungen im Terminalprogramm Wechselspiel zwischen PC und Controller Erzeugen der Baudrate Blockschaltbild für Effektivwertmesser Abgetasteter Sinus Blockschaltbild Zeitgeber 2 Struktogramm für AD_40T2 Struktogramm für AD_40T2O A/D-Wandlung ohne Interrupts. Abgetasteter Sinus mit Offset Speicherinhalt nach A/D-Wandlung von 40 Werten, AD_40 Speicherinhalt nach Quadrieren Speicherinhalt nach Addition Speicherinhalt nach Addition Compilieren eines C-Programmes Simulator mit geladener EIN_AUS-Datei EIN_AUS in symbolischer Debug-Umgebung Struktogramm des Programmes BLIN_INT.C Debug-Oberfläche beim Programm BLIN_INT.C Verändern des Zählregisters Struktogramm AN0_COD.C Ausschnitt einer Debug-Sitzung von AN0_COD.C Anzeige des Hauptspeichers im Programm DEBUG.EXE Blockbild des Signalprozessors 218x Analog Devices ADSP-2106x Blockbild Einheiten des C515C-Controllers Blockbildschaltbild FullCAN Controller Blockschaltbild C8051F340 Prototyp mit C8051F340 auf der EURO_535 Einfache Aufgabendarstellung für CPU - Datenflussabschätzung Blockschaltbild als Unterlage für die Dokumentation Schaltplan für Dokumentationsunterlagen Layout - Bestückungsplan Schaltung zwischen Prozessor und EPROM Zeitdiagramm beim Umschaltvorgang (nicht zeitgetreu) Anschluss des RAM - Speichers Eprom über Decoder an 80535
307 116 118 119 121 124 125 125 127 127 128 132 133 134 135 135 139 143 143 146 148 151 153 157 158 158 159 179 180 181 188 191 192 193 195 205 208 211 213 213 215 216 221 224 225 230 249 249 261 273
Tabellenverzeichnis Tabelle 1.1 Tabelle 2.1 Tabelle 2.2 Tabelle 2.3 Tabelle 2.4 Tabelle 2.5 Tabelle 2.6 Tabelle 2.7 Tabelle 2.8 Tabelle 2.9 Tabelle 2.10 Tabelle 2.11 Tabelle 3.1 Tabelle 3.2 Tabelle 3.3 Tabelle 3.4 Tabelle 3.5 Tabelle 3.6 Tabelle 3.7 Tabelle 3.8 Tabelle 3.9 Tabelle 3.10 Tabelle 4.1 Tabelle 4.2 Tabelle 4.3 Tabelle 4.4 Tabelle 4.5 Tabelle 4.6 Tabelle 4.7 Tabelle 4.8 Tabelle 4.9 Tabelle 4.10 Tabelle 4.11 Tabelle 4.12 Tabelle 4.13 Tabelle 5.1 Tabelle 5.2 Tabelle 5.3 Tabelle 5.4 Tabelle 5.5 Tabelle 5.6 Tabelle 5.7 Tabelle 5.8 Tabelle 5.9 Tabelle 5.10
Die Ebenen in vereinfachter Darstellung Wahrheitstabelle D-Flip-Flop Erklärung der Abkürzungen für Timing D-Flip-Flop FACT Logikbausteine ( aus Datenbuch für FACT-Bausteine ) Wahrheitstabelle für 3-State-Register 74125 Wahrheitstabelle für 3-State-Register 74126 Wahrheitstafel für Register Wahrheitstafel Latch Datenübergabe Pin Namen Wahrheitstabelle für einen Adressdecoder(Baustein 74LS139) Wahrheitstabelle Multiplexer Pin-Definitionen und Funktionen der 8051 DIL-Version Alternative Funktionen an Port 3 Verwendete Abkürzungen im verfeinerten Blockbild des 8051 Port 3 Alternative Funktionen /PSEN und /RD verknüpft Timing-Werte für Controller 80C535 und EPROM Wichtigste Timing-Werte für Controller 80C535 … Wichtigste Timing-Werte für den RAM-Speicher 55257 AFL-10... Wichtigste Timing-Werte für Controller 80C535 … Wichtigste Timing-Werte für den RAM-Speicher … Übersetzung des Codes in eine Hexadezimal Dokumentation der Beschaltung Endungen der verwendeten Dateien Werkzeuge für die µ-Controller-Programmentwicklung Interrupt Vectoren im Programmspeicherbereich des 8051 Assembler Controls Program Status Word - Programm-Status-Wort Special Function Register nach funktionellen Gruppen Wichtige Schreibweisen und Bedeutungen für die Befehle Registerinhalte nach RESET mit Übersetzung PCON BITS Power Control Bits IEN0 Interrupt 0 Control Bits IEN1 Interrupt 0 Control Bits Die verwendeten Einheiten in den Projekten Vorschlag für Registerverwendung TMOD BYTE TCON BITS Timer 0 - Timer 1 Control Bits Interrupt-Vektor-Adressen IEN0 Interrupt 0 Control Bits Interrupt Control Bits TCON Interrupt Control Bits IP0 Interrupt Priority Bits IP0 Interrupt Priority Bits
2 12 14 15 16 16 18 19 20 22 22 27 31 38 41 42 47 52 58 58 60 60 62 64 83 83 87 93 96 97 99 105 106 107 107 108 109 112 114 115 117 117 118 120 120
309 Tabelle 5.11 Tabelle 5.12 Tabelle 5.13 Tabelle 5.14 Tabelle 5.15 Tabelle 5.16 Tabelle 5.17 Tabelle 5.18 Tabelle 5.19 Tabelle 5.20 Tabelle 5.21 Tabelle 6.1 Tabelle 6.2 Tabelle 6.3 Tabelle 6.4 Tabelle 8.1 Tabelle 8.2 Tabelle 8.3 Tabelle 9.1 Tabelle 9.2 Tabelle 9.3 Tabelle 9.4 Tabelle 9.5 Tabelle 9.6 Tabelle 9.7 Tabelle 9.8 Tabelle 9.9 Tabelle 9.10 Tabelle 10.1 Tabelle 10.2 Tabelle 11.1 Tabelle 11.2
Codierung Wert - Spannung ADCON REGISTER Erhöhung der Auflösung durch Einschränkung des Messbereiches SCON Bits ADCON REGISTER Allgemein verwendete Baudraten Verwendetet Abkürzungen Timer 2 Control-Bits Lösung der Aufgabe mit Interrupts Zahlendarstellung: Die vorderste "Eins" bedeutet "Negativ" Beispiele für Programmiersprachen und Hinweise ... Datentypen des C-51-Compilers Speichertypen bei C-51 ( nach C-51-Bedienungsanleitung ) Speichermodelle bei C-51 ( nach C-51 Bedienungsanleitung ) Entwicklung einer Prozessorfamilie Prozessoren - Namen und Aufgabengebiet Unterscheidungskriterien für Prozessoren Anforderungsliste für EURO_535 Karte Leitlinien zum Aufstellen einer Anforderungsliste Verschiedene Prozessoren - CPU's Stückliste für EURO_535 Kabelbelegung EURO_535 - PC Steckerbelegung VG-Leiste EURO_535 Pinbelegung des VG-Steckers mit Funktionsbeschreibung Fertigungsunterlagen Ausschnitt aus CD: Technical Product Information for .... Beispiel für kontinuierliche Verbesserung durch Anforderungslisten Codierung mit Leuchten Wahrheitstabelle 74LS138 TMOD BYTE TCON BITS Timer 0 - Timer 1 Control Bits
126 128 129 130 138 140 140 146 147 148 155 175 183 184 185 200 202 203 218 220 224 226 227 228 229 231 233 234 259 273 293 294
Stichwortverzeichnis µ-Computer 5 µ-Controller 30 16K-EPROM 50 32K-RAM 57 74F374 17 8051 30 8051 Befehle 99 A/D-Wandler 127; 129; 138; 140 ACC 105 ADCON 129; 138; 140 ADDA535-Karte 128 ADDAT-Register 129 ADD Files 70 Adressbus 23 ALE-Signal 49 AN0_COD.ASM 126 AN0_COD.C 193 Anforderungsliste 218 ASM 51 83 AT-Bus 23 Ausgabeeinheit 42 Auslösen des Ladevorganges 76 B 105 Baudrate 139 Befehle 99 Bit 10 Bit-Adressen 90 Bitadressierbar 90 BLIN_INT.ASM 111; 122 BLIN_INT.C 188 Blinklicht 111 BSEG 91 BUS 23 Controlbus 23 Counter 111 CPU 40 CSEG 91
Data Memory 39 Datenbus 23 Datenspeicher lesen 50; 57 Datenspeicher schreiben 50 DB 85 DBIT 86 D-Flip-Flop 11; 12 Digitalrechners 42 DPTR 105 DS 86 DSEG 91 DW 85 Ebenen-Problem 3 EFF_WERT.C 198 Effektivwert 141 Effektivwertmesser 141; 143 EIN_AUS.ASM 65 EIN_AUS-Programm 71 Eingabeeinheit 42 Emulator 81 END 92 Event Counters 39 Externer Datenspeicher 89 EXTRN 93 Feldeffekttransistor 34 FET 34 Funktionstabelle 11 GAL 22 I/O-Bereich 23 I/O-Bus 23 IEN0 105; 107; 117 IEN1 105; 107; 117 Impulsdiagramm 12 Interrupt 125 Interrupt 0 enable bits 292 Interrupt 1 enable bits 292 Interrupt Control Bits 293 Interrupt Priorität 120 Interrupt System 114 Interrupt Vector Adressen 115 Interruptcontroller 44
11 Stichwortverzeichnis Interrupt-Prioritäten 119 Interrupts 119 IP0 105; 120 IP1 105; 106; 115; 116; ISEG 91 Jumper 230 Latch 18 Leitwerk 42 Leuchte_x 183 Lichtgeschwindigkeit 13 Macro Assembler 84 NAME 93 ORG 92 Oscillator 39 PAL 22 PCON 106; 139 Pegel 9 Pin-Definitionen 31 Port 0 35 Program Memory 39 Program Status WORD 96 Programm Status Wort 292 Programmspeicher lesen 49; 50 Programmspeicher Lesezugriff 51 Projekte 108 PROM 22 PSW 96 PUBLIC 92 Rechenwerk 42 Recovery Time 13 Regel 1 109 Regel 2 109 Regel 3 109 Register 17 Remote Debug System 74 Remote-Debug 76 RESET 105 SBUF 139
Schaltnetz 8 Schaltwerk 7 SCON 138 Segmente 90; 91; 92 Serial port 40 SERIEL_1.ASM 133 SERIEL_1.C 196 Ser. Schnittst. 44; 134; 138; 139 Serielles Kabel 227 Simulator 72 SMx 295 Special Function Register 96 Speicher 42 Stack 96 Steuerbus 23 Steuerlogik 42 Synchrone Übertragung 138 T2CON 147; 296 Taster_x 183 TCON 106; 114; 118; 120; 294 Theorie des µ-Controller Chips 9 Theorie des Klavierspiels 4 Three-State-Ausgang 16 Timer 111 Timer 2 146 TMOD 112; 293 Truth Table 11 TTL Pegel 10 Turingmaschine 6 UART 40 verfeinertes Impulsdiagramm 13 VG-Leiste 228 Vollduplex-Betrieb 138 Wahrheitstabelle 11 Watchdog 107 Watch-Point 132 XSEG 91 Zähler 111 Zeitdiagramm 12
311
8
Prozessorarchitekturen im Überblick
8.1
Grundstrukturen und Einteilung von µ-Prozessoren
In diesem Kapitel wird anstatt von µ-Controllern hauptsächlich von µ-Prozessoren gesprochen. Da alle µ-Prozessoren inzwischen auf einem Chip aufgebaut werden, kann der µ-Prozessor mit dem Prozessor gleichwertig verwendet werden. Jeder Controller beinhaltet einen µ-Prozessor. Deshalb ist die Suche nach dem geeigneten Prozessor unmittelbar mit der Frage nach der Controller-Familie verknüpft. Die Entwicklung der µ-Prozessoren möchte ich am Beispiel der Firma Intel erläutern, da diese den ersten einsatzfähigen Mikroprozessor entwickelte. Tabelle 8.1 Entwicklung einer Prozessorfamilie Jahr 1969/70 1971 1973 1978 1981 1982 1982 1985 1988 1989 1990 1991 1991 1993 1994 1997 1998 1998 1999 2000 2001
Prozessor 8008 8008 8080 8086 8088 80186 80286 80386 80386SX 80486 80386 SL 80486SX 80486 50MHz Pentium Pentium Pro Pentium MMX Celeron Pentium II Xeon Pentium III / Xeon Pentium 4 Xeon
Bemerkungen Siemens Second Source = 8086 mit 8-Bit externem Datenbus IBM-PC
= 80386 mit 16-Bit externem Datenbus 1,2 Millionen Transistoren ! Stromsparende Version 80386 = 80486 mit 16-Bit externem Datenbus Auf 32-Bit getrimmt Grafik-, Video-, Audio-Verarbeitung Privat-Anwender Server, Workstations Desktop / Server Neue Architektur, Front Side Bus, Befehlssatz Dualprozessor
8 Prozessorarchitekturen im Überblick 2001 2002 2002 2004 2005 2005 2006
Itanium Pentium 4 –M Itanium 2 Celeron M Pentium Extreme Celeron D Core 2 Duo
201
Server 64-Bit Notebookprozessor Server 64-Bit Mobile Plattform für Privatanwender Erste Dualcore Prozessor 64-Bit für günstige PCs PC und Notebook Prozessor
Die einfachste technische Einteilung der Prozessoren kann mit Hilfe ihrer Bezeichnung vorgenommen werden. Diese Verbindung zwischen dem Namen und dem Aufgabengebiet, das sich vorteilhaft mit diesen Prozessoren lösen lässt, wird in Tabelle 8.2. hergestellt. Das bekannteste Einsatzgebiet von Prozessoren ist der PC. Die Veränderungen, die dieser Computer bewirken wird, werden nicht fassbare Ausmaße annehmen. Die Entwicklung und Verbreitung dieser erst ca. 40 Jahre alten Technik verursachte den Übergang vom Energiezeitalter zum Informationszeitalter. Man kann daher von einer neuen Kulturtechnik sprechen. Die ethischen Gesichtspunkte dieser Schlüsseltechnologie sind leider nicht Gegenstand dieses Buches, aber ich möchte jeden Entwickler und Techniker ermuntern, sich auch mit den Folgen dieser Technik für den Menschen auseinanderzusetzen. Eine weitere Unterscheidung zwischen den Prozessoren besteht in der Bit-Breite des Datenbusses. Die allgemeinen 8-Bit-Prozessoren sind zwar vereinzelt noch im Einsatz, sollten aber bei Neuentwicklungen nicht mehr verwendet werden. Im Gegensatz dazu sind 8-Bit-Controller bei Neuentwicklungen sehr wohl zu berücksichtigen. Das breite Einsatzgebiet von 8-Bit-Prozessoren unterstreicht diese Aussage, da mit ihnen bereits alle wesentlichen Entwicklungen für Computer durchgeführt werden. Die wesentlichen Architekturen der Peripherie kristallisierten sich im Laufe dieser Entwicklungen heraus und wurden in den Chip integriert. Infolge der geringeren Kosten und der Miniaturisierung der Bausteine kann die so entstandene Architektur für neue Aufgaben, ausgehend von einem Kern, erweitert werden. Neueste Einsatzmöglichkeiten und damit Entwicklungen entstehen beispielsweise auf dem Gebiet der Chipkarten. Kartentelefone, Abrechnungen für Verkehrssysteme, Einsatz im Bankwesen als elektronisches Geld, Zugangskontrollen oder der elektronische Krankenschein basieren auf der Architektur von 8-BitControllern. Allgemeine 16-Bit-Prozessoren sind im Bereich der PCs ebenfalls bereits "Geschichte". Im Bereich der 16-Bit-Controller ergeben sich dagegen neue Einsatzfelder in Rahmen industrieller Anwendungen. Prozess-
202
steuerungen und Prozessregelungen stellen immer höhere Geschwindigkeitsanforderungen. Interessanterweise entstand im Bereich der 16-BitProzessoren eine weitere Architektur in Form der Signalprozessoren. Alle Befehle dieser Prozessoren werden innerhalb eines Zyklus ausgeführt. Außerdem können durch die Verwendung von mehreren Einheiten wie Multiplizier-Einheit, arithmetisch-logische Einheit und Shift-Einheit drei Befehle gleichzeitig ausgeführt werden. Sie sollten deshalb insbesondere bei Einsatz von 16-Bit-Prozessoren einen Vergleich zwischen Signalprozessor und Controller anstellen. Bei 32-Bit-Prozessoren ergeben sich die Einsatzfelder: PC, Workstation, Embedded Control Supercomputing und Multimedia. Das Aufgabengebiet von Intel-Prozessoren ist auch in der vorherigen Tabelle enthalten. Tabelle 8.2 Prozessoren: Namen und Aufgabengebiet Prozessor Beispiel µ-Prozessor 6502, 6809 8080, 8085 Z-80 68000 68020 80x86 Pentium i960 i860 MPC604 Arithmetik- 8087 prozessor 80287 80387 SignalADSP 2100 prozessor TMS 320 DSP 56001 ADSP 21020 DSP 96000 TMS 32040 GrafikET4000 prozessor P9100 Vision864 Controller 8051 8096 80166
Bitbreite 8-Bit 8-Bit 8-Bit 16-Bit 32-Bit 16-Bit 32-Bit 32-Bit 64-Bit 64-Bit 8-Bit 16-Bit 32-Bit 16-Bit 16-Bit 24-Bit 32-Bit 32-Bit 32-Bit 24-Bit 64-Bit 8-Bit 16-Bit 16-Bit
Art CISC CISC CISC CISC CISC CISC RISC C/RISC RISC RISC
RISC RISC RISC RISC RISC
CISC CISC CISC
Einsatzgebiet allgemein , Home-Computer, PC allgemein , PC, Industrie allgemein, PC, Industrie allgemein , Macintosh, allgemein, Macintosh allgemein, PC allgemein, PC allgemein, Hybrid allgemein / Workstation allgemein, Server, Workstation arithmetische Operationen arithmetische Operationen arithmetische Operationen Digitale Signalverarbeitung Digitale Signalverarbeitung Digitale Signalverarbeitung Digitale Signalverarbeitung Digitale Signalverarbeitung Digitale Signalverarbeitung Grafik Grafik Grafik Für spezielle Aufgaben Für spezielle Aufgaben
Die wesentlichen Eigenschaften und Unterschiede der Prozessoren lassen sich anhand eines Vertreters aus jeder Familie kurz beschreiben. Die
8 Prozessorarchitekturen im Überblick
203
Unterschiede in der Architektur liegen vor allem in der Anzahl der Register und deren Verwendungsmöglichkeit sowie in den Arten der Adressierung. Weitere Unterscheidungsmerkmale sind: Tabelle 8.3 Unterscheidungskriterien für Prozessoren Kriterium Allgemeine Register Arithmetische Register Index-Register Segment-Register Busbreite Adressbus nach außen Busbreite Adressbus intern Busbreite Datenbus nach außen Busbreite Datenbus intern Taktfrequenz Datenfluss Adressierbarer Speicherbereich Memory Management auf dem Chip I/O Adressierbarkeit Adressierarten Interface für Arithmetikprozessor Cache Pin-Anzahl Stromversorgung
Bemerkungen / typische Werte 4,8 8 4,8 4,8 4,8,16,24,32,64 Bit 4,8,16,24,32,64 Bit 4,8,16,24,32,64 Bit 4,8,16,24,32,64 Bit 5,8,10,16,20,25,33,50,66,100,150 MHz 2,5,16,50,80,132,160 MByte/s 64, 512 KByte; 1,16,32 MByte; 4 GByte 64 KByte 8,1,24 1st Level, 2nd Level 40, 68, 100, 132, 228 3,3V, 5V
Wie wichtig die Art und Weise der Adressierung ist, verdeutlicht sich anhand der Segmentregister. Sind diese Register nicht vorhanden, ergibt sich eine linearen Adressierung. Der Adressbereich unterteilt sich nicht in einzelne Segmente. Welche Auswirkungen die Segmentierung hatte, verdeutlichen alte Betriebssysteme wie MS-DOS. Es gab durchweg Speicherplatzprobleme aufgrund der Segmentgröße von 64 KByte. Hier greift die Hardware-Architektur zu stark in die Software-Architektur ein. Der Software-Entwickler muss die Freiheit haben, seine Segmentierung bzw. Modularisierung selbst durchzuführen. Aber auch bei Dateisystemen für die Festplatte spielt die Adressierung eine wesentliche Rolle. Sobald Sie mit FAT32 arbeiten, haben Sie bei einer Videodatei mit 25MBit/s ab einer Dauer von 10 Minuten „Schwierigkeiten“ (Speicherplatzprobleme). 8.1.1 80x86-Prozessoren Stellvertretend für die erste und zweite Generation von Prozessoren führe ich das Registermodell des 8086 auf, das aus dem 8080-Prozessor hervorging. Der 8088-Prozessor entspricht im Grundaufbau dem 8086-
204
Prozessor. Im Unterschied zu diesem hat er jedoch einen acht Bit breiten Datenbus zur Peripherie. Der erste IBM-PC beinhaltete genau diesen Prozessor. Register von 8086 und 8088-Prozessor grau hinterlegt 8080-Prozessor Arbeitsregister 16 Bit breit AH BH CH DH
AX BX CX DX
8080 A HL BC DE
AL BL CL DL
Akkumulator Basis Counter / Zähler Datenregister
Pointer- und Indexregister 8080 SP BP SI DI
SP
Stapelzeiger Basiszeiger Source - Quellindex Destinat. -Zielindex
Programmzustand IP FLAG HIGH
8080 PC FLAG LOW
Befehlszeiger Kennzeichenregister
Segmentregister CS DS SS ES
Codesegment Datensegment Stapelsegment Extrasegment
Diese Darstellung der Register veranschaulicht die Entwicklungsphilosophie der Firma Intel. Neue Prozessoren wurden immer unter dem Aspekt der Kompatibilität entwickelt. Dies hatte zur Folge, dass zuvor entwickelte Software sofort auf einem neu entwickelten Prozessor ablauffähig war. Abwärtskompatibilität ist der Hauptgrund für den Erfolg dieser Prozessorgeneration. In der Konsequenz ergaben sich aber auch Nachteile in der Adressierbarkeit. Die physikalische Adresse von 1 MByte ergibt sich aus einer SegmentAdresse und einer Offset-Adresse. Soll beispielsweise die physikalische Adresse 20020H angesprochen werden, so erhalten Sie in einem DebugProgramm wie DEBUG (liegt jedem DOS-System und auch Windows XP bei und kann durch Eingabe von "DEBUG" in der CMD-Box aufgerufen werden) nach Eingabe von d2000:0020 folgende Bildschirmanzeige:
8 Prozessorarchitekturen im Überblick C:\>debug -d2000:0020 2000:0020 E9 DF 2000:0030 E3 8B 2000:0040 4C 89 2000:0050 B8 00 2000:0060 D1 D8 2000:0070 10 73 2000:0080 87 2E 2000:0090 5A 58 -r AX=0000 BX=0000 DS=24EE ES=24EE 24EE:0100 FE3C -
00 1E 16 42 B1 95 3B 8B
50 18 C2 33 03 B9 06 DA
52 59 4C D2 B1 10 02 83
80 B8 A3 8B 04 00 00 E2
3E 02 C6 CA D3 F7 77 0F
CA-4C 42-33 4C-89 CD-21 E8-03 F1-0B 80-89 B1-04
40 D2 16 58 D8 D2 3E D3
74 8B C4 5B 8B 74 A7 EB
CX=0000 DX=0000 SP=FFEE SS=24EE CS=24EE IP=0100 ??? [SI]
E5 CA 4C 53 D6 01 4C 03
E8 CD 8B 50 8B 40 89 C3
B9 21 F2 05 C7 03 36 50
FD A3 8B 0F 83 C3 A5 52
72 C0 F8 00 FA 72 4C 89
205
...PR.>
[email protected] ....Y..B3....!.. L...L..L...L.... ..B3....!X[SP... ................
[email protected] ..;...w..>.L.6.L ZX...........PR.
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0000=CD
Abb. 8.1 Anzeige des Hauptspeichers im Programm DEBUG.EXE
Die 20-Bit-Adresse entsteht durch Multiplikation der vor dem Doppelpunkt stehenden Zahl und anschließender Addition der nach dem Doppelpunkt stehenden Zahl. 2000:0020 2000H*16=2000H * 10H 20000+20= absolute physikalische Adresse 20020H Sie könne das Programm DEBUG und die Befehle auf ihrem PC testen. Es funktioniert auch unter Windows XP. Diese komplizierte Adressbildung hat den Vorteil, dass 64 KByte große Programme an beliebiger Stelle im Hauptspeicher ausgeführt werden können. Es muss lediglich eine entsprechende Offsetadresse eingestellt werden. „Spötter“ behaupten übrigens, dass auf diese Weise die modulare Programmierung entwickelt wurde Stellvertretend für 32-Bit-Prozesssoren sei das Registermodell der Prozessoren 80386 / 80486 vorgestellt. Auch hier wurden die bisherigen Register der Vorgänger in den neuen Prozessor integriert. Eine wesentliche Erweiterung dieser Prozessoren besteht in der MMU Memory Management Unit - Speicherverwaltungseinheit. Mit Hilfe dieser Einheit wird ein Speicherbereich verwaltet, dessen Adresse größer als der Umfang des Hauptspeichers sein kann. Es wird also virtueller Speicher hinzugenommen. Mit Virtuell bezeichnet man hier die Vortäuschung von Hauptspeicher durch Hinzufügen von physikalischem Festplattenspeicher. Die Zugriffszeiten auf solche Speicher sind zwar einerseits größer als bei echtem Hauptspeicher, andererseits kann man nun mit einem logischen Adressbereich arbeiteten , der wesentlich größer als der physikalische Hauptspeicher ist.
206
Register von 80386 und 80486-Prozessor Arbeitsregister 32 Bit breit EAX EBX ECX EDX
AH BH CH DH
AL BL CL DL
Pointer- und Indexregister 32 Bit ESP SP EBP BP ESI SI EDI DI Programmzustand 32 Bit EIP EFLAGS
IP FLAG LOW
Erweiterter Akkumulator Erweiterte Basis Erweiterter Counter / Zähler Erweitertes Datenregister
Stapelzeiger Basiszeiger Source - Quellindex Destinat. -Zielindex
HIGH-
Befehlszeiger Kennzeichenregister
Segmentregister 16 Bit CS ES SS DS FS GS
Codesegment Extrasegment Stapelsegment Datensegment (1) Datensegment (2) Datensegment (3)
Maschinensteuerregister 32 Bit CR0 CR1 Reserviert CR2 CR3 GDT 48 Bit IDT 48 Bit
Seitenfehler lineare Adresse Seiteninhaltsverz. Basisadr. Globale Deskriptortabelle Interruptdeskriptor-Tabelle
LDT LSS
Lokale Deskriptortabelle Prozessstatussegment
DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 TR6 TR7
Reserviert
Maschinensteuerregister
Debugreg. 0 (lin.Brkpdr. Debugreg. 0 (lin.Brkpdr. Debugreg. 0 (lin.Brkpdr. Debugreg. 0 (lin.Brkpsr. Für Intel reserviert Für Intel reserviert Breakpoint-Status Breakpoint-Steuerung Test-Steuerung Test-Status
0) 0) 0) 0)
8 Prozessorarchitekturen im Überblick
8.1.2
207
Signalprozessoren
Signalprozessoren erlangen aufgrund ihrer angepassten, hohen Rechenleistung bei der Signalverarbeitung eine immer größere Bedeutung. Sowohl im Kommunikationsbereich als auch in der schnellen Prozessverarbeitung bei Echtzeitanwendungen kommen diese Prozessoren zum Einsatz. Als konkretes Beispiel soll hier die Sprachverarbeitung dienen: Mit Hilfe von Signalprozessoren entstehen u.a. komplexe Systeme für TelefonBanking und automatische Auskunftssysteme. Entscheidende Architekturmerkmale des Signalprozessors sind: RISC-Prozessor
Alle Befehle werden innerhalb eines Zyklus ausgeführt Harvard-Architektur Zwei getrennte Speicher für Programme und Daten Mindestens drei parallel arbeitende Recheneinheiten mit: ALU Arithmetisch-logische-Einheit MAC Multiplizier-Akkumulier-Einheit Barrel-Shifter Shift-Einheit Zwei Adressgeneratoren Um Signalprozessoren zu programmieren, müssen Sie nicht unbedingt den entsprechenden Assembler erlernen. Es gibt bereits mehrere CCompiler, die die Architektur des Prozessors nutzen und den Code entsprechend optimieren, wie z.B. ein frei erhältlicher GNU-C-Compiler. Stellvertretend für Signalprozessoren stelle ich hier zwei Architekturen vor: Aus dem Bereich der 16-Bit Fixed-Point Prozessoren innerhalb der 2100-Familie den ADSP-21msp51 Signalprozessor- er ist durch seine vielfältig integrierte Peripherie in der Funktionalität einem Controller sehr ähnlich. Sowie aus dem Bereich der 32-Bit Floating-Point Prozessoren einen sehr aktuellen, leistungsfähigen. Signalprozessor ADSP 218x Im folgenden Blockschaltbild erkennen Siedie für einen Signalprozessor typischen Einheiten. Die ADSP-2100 Basis-Architektur ist mit einer durchgehenden Linie umrandet. Die zu den externen Speichern führenden Anschlüsse werden im Multiplex-Verfahren betrieben. Intern stehen vier getrennte Busse zur Verfü-
208
gung. Zwei Adressbusse mit jeweils 14 Bit Breite und zwei Datenbusse mit 16 und 24 Bit Breite. Der 24 Bit breite Datenbus ist ein Programmspeicher-Datenbus und kann sowohl Programme als auch Daten befördern.
Abb. 8.2 Blockbild des Signalprozessors 218x Analog Devices
Data Adress Generator (Adresserzeugung) Für viele Algorithmen der digitalen Signalverarbeitung müssen komplexe Manipulationen der Daten durchgeführt werden. Dafür eignen sich Umlaufpuffer (circular buffers). Mit Hilfe der beiden Adressgeneratoren können gleichzeitig acht Umlaufpuffer automatisch verwaltet werden. Jeder Adressgenerator verfügt also über 4 Zeiger (Pointer). DAG #1 greift nur auf den Datenspeicher Adressbus zu. DAG #2 kann auf den Datenspeicher Adressbus und auf den Programmspeicher Adressbus zugreifen. Es kann also gleichzeitig auf Daten aus dem Programmspeicherbereich und auf Daten aus dem Datenspeicherbereich zugegriffen werden. Program Sequenzer ( Steuerung der Programmabfolge ) Der Program Sequenzer versorgt den Programmspeicher mit den Instruktionsadressen. Der Sequenzer selbst wird vom Instruktionsregister gesteuert, welches die momentane Instruktion beinhaltet. Instruktionen werden innerhalb eines Zyklus geholt und in das Instruktionsregister geladen. Im nächsten Zyklus wird dieser Befehl dann ausgeführt. Um keinen Zyklus zu verlieren, realisiert der Prozessor ein single level pipelining (Zwischenspeicherung mit der Tiefe eins). Schleifen werden ohne Zusatzzyklen ausgeführt.
8 Prozessorarchitekturen im Überblick
209
Memory ( Speicher ) Der Programmspeicher umfasst bis 48Kx24Bit und ist als SRAM (Statischer RAM) realisiert. Der Datenspeicher, ebenfalls als SRAM realisiert, umfasst bis zu 56Kx16 Bit. Ein Boot-Adressgenerator erzeugt die Adressen, damit beim Hochfahren des Prozessors Daten aus einem BootEPROM in den Programmspeicher geladen werden können. Anschließend wird auf dieses Programm zugegriffen. Hierdurch vereinfacht sich die Boot-Routine erheblich. Bei der EURO_80535-Karte war dagegen eine komplizierte Adressumschaltung notwendig, um den Bootvorgang zu realisieren. Zusätzlich können über die beiden Busse ein externer Programmspeicher und ein Datenspeicher angeschlossen werden. Arithmetic Units ( Arithmetische Einheiten ) Drei unabhängig rechnende Einheiten können gleichzeitig Rechenoperationen ausführen. Die Multiplizier- und Akkumuliereinheit führt die beiden Operationen Multiplizieren und Addieren innerhalb eines Zyklus aus. Gleichzeitig können in der arithmetisch-logischen Einheit und im Barrel Shifter andere Operationen ausgeführt werden. Diese drei Einheiten zusammen führen zu einer derartig hohen Rechenleistung. Die nun folgenden Einheiten sind nicht notwendig Bestandteile eine jeden Signalprozessors. Doch ähnlich wie bei den Controllern integrierte man die im Laufe der Entwicklung oft benötigte Peripherie in den eigentlichen Signalprozessor- Chip. Serial Ports ( Serielle Schnittstellen ) Die beiden seriellen Schnittstellen arbeiten bidirektional. Zusätzlich sind noch Komprimierungseinheiten und automatische Datenpufferung innerhalb der seriellen Schnittstellen integriert. Timer ( Zeitgeber ) Der 16-Bit-Zeitgeber enthält zwei zusätzliche Register, das Zählregister und das Periodenregister. Zusätzlich kann die Zählfrequenz mit Hilfe eines 8-Bit-Registers variiert werden. Der Zeitgeber funktioniert als Abwärtszähler. Bei jedem Erreichen des Nullzustandes wird ein Interrupt ausgelöst. Die zeitliche Auflösung liegt bei der Zykluszeit des Prozessors ( bis 60 ns ). Die gesamte On-Chip-Peripherie erinnert sehr stark an einen 80535Controller. Die Rechenleistungen liegen jedoch wesentlich höher. Dieser Signalprozessor eignet sich hervorragend für die Sprachverarbeitung bis
210
3,4 KHz. Der Controller kann für Signale bis 100 Hz eingesetzt werden. Bei noch höheren Frequenzen, wie sie beispielsweise in der Audiotechnik vorkommen, setzt man am vorteilhaftesten Floating-Point-Signalprozessoren wie ADSP-21060, TigerSHARC oder TMS320C6x ein. Als Beispiel für einen leistungsfähigen Floating-Point Signalprozessor kann der ADSP 2106x SHARC (Super Harvard Architecture Computer) dienen. Dieser erweitert die Architektur des 218x in erheblichem Maße mit mehreren wichtigen Einheiten. Für den Test und die Emulation wurde ein JTAG Standard Test Access Port nach IEEE Standard 1149.1 in den Prozessor integriert. Über diesen Port können alle Register ausgelesen und der Prozessor gebootet werden. Ein 4 MBit-Speicher als dual-ported SRAM (statischer RAM mit zweiseitigen Zugriffsmöglichkeiten) ist auf dem Chip integriert. Der I/OProzessor beinhaltet die wesentlichen Schnittstellen wie DMA-Controller Direct Memory Access Controller (Direkter Speicherzugriff - der Controller generiert die Adressen und nicht der Prozessor) und serielle Schnittstellen (40 MBit/s). Aus der Transputer-Welt wurden die Link Ports (Verbindungsports) übernommen. Diese Verbindungen eignen sich hervorragend für Punkt-zu-Punkt-Verbindungen zwischen Prozessoren. Die sechs LinkPorts können unabhängig und gleichzeitig zum Prozessorkern arbeiten. Die maximale Datenübertragungsrate beträgt 280 MByte/s. Zwei rechnende Einheiten mit jeweils ALU, Barrel Shifter und Multiplier sind in der TigerSHARC Architektur enthalten. 6Mbit on-chip SRAM und 4 Link Ports mit 1 GByte/s sind integriert. Die Verbindung zwischen mehreren TigerSHARC-Prozessoren kann durch spezielle DMA-Kanäle erfolgen. Hiervon bietet der Prozessor 14 Kanäle an. Die Mehrfachprozessorarchitektur „lässt grüßen“. Eine FFT Fast Fourier Transformation mit 32-Bit Breite für 1024 Abtastwerte benötigt nur 32µs. Das ist eine typische Operation für die Erzeugung von Kompressionsalgorithmen in der Audio- und Videotechnik. Die Multiprozessorfähigkeit in Verbindung mit der enormen Rechenleistung erlauben in Zukunft, Systeme mit bisher unerreichten Rechenleistungen aufzubauen. Mit solchen Prozessoren können die Leistungsanforderungen, die Multimedia-Systeme stellen, sehr gut befriedigt werden. LiveÜbertragungen in HDTV und 5.1 können mit solchen Prozessoren realisiert werden. Kleinere DSPs werden zahlreich in MP3 Aufnahmegeräten und Playern eingesetzt. Aber auch in Kameras aller Art sind Signalprozessoren zu finden. Ein weiteres breites Einsatzgebiet ist die Musik: Filter wie z.B. Hall oder Verzerrungen werden inzwischen digital erzeugt. In Prüf-
8 Prozessorarchitekturen im Überblick
211
ständen zur Analyse von Klopfgeräuschen oder zur Klapperdiagnose finden sich die verschiedensten digitalen Signalprozessoren. 4 MBIT SRAM
Core Processor Cache 32x48
Timer
JTAG 2 unabhängige 2MBIT Bänke Test &
7
Zweiseitiger Zugriff Emulation DAG 1
DAG 2
Program
Processor Port
8x4x32
8x4x24
Sequenzer
I/O Port
DATA DATA ADDR ADDR ADDR DATA DATA ADDR
PM Address Bus 24
IOD
IOA
48
17
EXTERNAL PORT 32 Address Bus Mux
DM Address Bus 32
Host Port & Multiprocessor Interface
PM Data Bus 48
48 Data Bus Mux
Bus
DM Data Bus 40
Control
4 Register
IOP Registers
File
DMA Controller
16x40 Multiplier
Barrel Shifter
Serial Ports 0,1
ALU
36
Memory Mapped
6 6
Link Ports 0,1,2,3,4,5 I/O PROCESSOR
Abb. 8.3 ADSP-2106x Blockbild
Für eine Diskussion der anderen Prozessoren sei auf die entsprechende Firmenliteratur verwiesen, weil die Halbwertzeit von Spezialprozessoren wie etwa Grafikprozessoren nur bei ca. 1,5 bis 2 Jahren liegt. Dies bedeutet, dass die Information, die ich Ihnen auf diesem Gebiet vermittle, in 18 Monaten nur noch zur Hälfte nutzbar wäre. Dies kann nicht das Anliegen einer langfristigen Ausbildung im Bereich der µ-Computertechnik sein. Ich befasse mich deshalb wieder gerne mit der nicht so spektakulären, aber seit langem bestehenden Familie der 8051Controller. Insbesondere auch deshalb, weil deren Vielfalt einen großen Anwendungsbereich abdeckt. Die Vielfalt der neuen Entwicklungen von beispielsweise Silicon Laboratories können Sie auf www.keil.com studieren. Im Menüpunkt „Supported Mikrocontrollers“ können Sie die Controller auswählen.
212
8.2
Derivate der 8051-Controller-Familie
Die Vielzahl der Einsatzfelder von µ-Controllern der 8051-Familie brachte ein breites Produktspektrum hervor. Insbesondere die neuen Chipkarten mit einem 8051-Controller erweitern, wie bereits erwähnt, die Einsatzfelder der µ-Controller. Die Automobilindustrie erkannte ebenfalls die weitreichenden Einsatzfelder der Controller und baut diese Felder kontinuierlichaus. Der Einsatz in der Consumer-Elektronik für die braune und weiße Ware hat sich bereits mehrere Jahre bewährt und wird weiter vorangetrieben. Selbstverständlich beinhaltet nahezu jede PC-Tastatur ein 8051Derivat. Diese große Vielzahl erlaubt es Ihnen, für beinahe jede Anforderung, den geeigneten Prozessor auf Basis des 8051-Controllers zu finden. Die Architektur des 8051-Kerns kann je nach Aufgabenstellung erweitert werden. Die weiteren Blockschaltbilder wurden, ausgehend von diesem Ursprung, so ergänzt, dass daraus die neuen Derivate hervorgehen konnten.. Die zwei wesentlichen Vertreter der 8051 und der 80515 / 80535 wurden bereits vorgestellt. Der 80535 wird inzwischen nicht mehr hergestellt und kann durch den C515C-Controller ersetzt werden. Der Programmspeicher auf dem Chip kann per Hardware deaktiviert werden. Das erste Bild zeigt in starker Vereinfachung die wesentlichen Einheiten dieses Controllers auf. Der wesentliche Unterschied zum bereits vorgestellten 80C515 besteht in der Einheit „FullCAN Controller“. Das verfeinerte Blockschaltbild ist in Abb. 8.5 dargestellt. Der CAN Controller Area Network nach Spezifikation 2.0B, entwickelt von Bosch, wird vorwiegend in der Automobilindustrie eingesetzt. Es gibt aber inzwischen auch einige Anwendungen in der Prozessautomatisierung. Die anschließende Tabelle zeigt nur einen Bruchteil der bestehenden Derivate auf. Sie erkennen dort aber bereits die Vielfalt der möglichen Derivate. Firmen wie AMD, Philips, Atmel, Infineon oder Silicon Laboratories bieten jeweils eine breite Palette dieser Bausteine an. Bei der Auswahl des Prozessors sollten Sie immer zuerst Ihre Aufgabe genau analysieren und dann den entsprechenden Controller auswählen. Gehen Sie einfach davon aus, dass Ihr Wunschcontroller bereits existiert. Die umgekehrte Vorgehensweise, also zuerst einen Controller auszuwählen und dann die Peripherie dieses Controllers entsprechend der Aufgabenstellung zu entwickeln, bedeutet immer einen hohen Entwicklungsaufwand für die Peripherie. Die meisten Anforderungen können durch eine geschickte Wahl des Controllers erfüllt werden.
8 Prozessorarchitekturen im Überblick
8.2.1 C515C-Controller
Abb. 8.4 Einheiten des C515C-Controllers TXDC
RXDC
BTL-Configuration
CRC Gen/Check
Bit Timing Logic
Bit
Timing Generator
TX/RX Shift Register
Messages Handlers
Intelligent Memory
Clocks (to all) Control
Interrupt Register
Status + Control
Bit Stream Processor Status Register
Error Management Logic
Abb. 8.5 Blockschaltbild FullCAN Controller (Users Manual Infineon)
213
214
8.2.2
8051-Derivat C8051F340
Diese Weiterentwicklung von Silicon Laboratories enthält zahlreiche sinnvolle Erweiterungen zum 8051-Controller. Herausragend für den Einsatz im Prototypenbau sind die Einheiten: ‚ 8051 Kern High-Speed Controller Core. - On-chip debug circuitry facilitates full speed, non-intrusive in-system debug (No emulator required) – ein im Prozessor integriertes Entwanzungssystem mit Unterbrechungspunkten, Einzelschrittbearbeitung, Beobachtung und Änderung der Register und des Speichers. - Pipelined Instructions architecture - 70% der Befehle mit 1 oder 2 Systemtakten - 48 MIPS - Erweiterter Interrupt Verwaltung - Watchdog Timer ‚ Speicher - 4352 Bytes RAM - 64kB In-system programmable Flash - im Chip programmierbarer Speicher ‚ Digitale Eingänge und Ausgänge - 40 Ports - 5 V tolerant - Hoher Strom - SMBus – I2C - SPI-BUS - 2 UARTS - 4 16-Bit Zähler / Zeitgeber - 16-Bit Zähler-Array - Ext. Speicherschnittstelle ‚ Analoge Einheit - Multiplexer AMUX - Differentieller oder auf Masse bezogener Eingang - 10-Bit A/D-Wandler Abtastfrequenz 200kHz - Temperatursensor - Vergleichsspannung extern oder intern - Option externer Wandlungsstart ‚ Oszillator - 0,25% Genauigkeit - Taktrückgewinnung - Unterstützung USB und UART - Externer Oszillator - 80 kHz Interner Oszillator
8 Prozessorarchitekturen im Überblick
215
- Kann zwischen Taktquellen im Betrieb umschalten ‚ USB Controller - USB Spezifikation 2.0 - Full speed 12 Mbps - Low speed 1,5 Mbps - Integrierter Takt - Unterstützt 8 Endpunkte - 1 kB USB Buffer Speicher - Integrierter Sender - Keine externen Bauteile ‚ Crossbar - Die Crossbar ordnet die internen digitalen und analogen Funktionen den externen Port-Pins zu. Zur Vereinfachung der Programmierung gibt es einen Configuration Wizard.
Abb. 8.6 Blockschaltbild C8051F340
216
Dieser Controller kann an alle Aufgaben und bisherigen Projekte mit der EURO_535-Karte angepasst werden. Er dient als Ausgangsbasis für weitere Projekte. Alle Funktionen der bisherigen EURO_535-Karte sind hier in einem Chip enthalten. Damit ist die neue Karte 10-mal kleiner aber dafür 10-mal schneller. Einen Prototyp der neuen Karte sehen Sie im folgenden Bild, auf der EURO_535 Karte liegend. Auf dem weißen Keramikträger ist der Controller erkennbar.
Abb. 8.6 Prototyp mit C8051F340 auf der EURO_535
11
Anhang
11.1
Zusammenstellung der Register von 8051/80535
Nachfolgend finden Sie die Registerdeklarationsdateien, die beim Assemblieren für den jeweiligen Prozessortyp in den Source-Code eingebunden werden. 11.1.1 REG8051.PDF ; Copyright 1979,1983,1986 Intel Corporation ; REGISTER DECLARATIONS FOR 8051 ;******** BYTE REGISTERS ******* P0 DATA 80H P1 DATA 90H P2 DATA 0A0H P3 DATA 0B0H PSW DATA 0D0H ACC DATA 0E0H B DATA 0F0H SP DATA 81H DPL DATA 82H DPH DATA 83H PCON DATA 87H TCON DATA 88H TMOD DATA 89H TL0 DATA 8AH TL1 DATA 8BH TH0 DATA 8CH TH1 DATA 8DH IE DATA 0A8H IP DATA 0B8H SCON DATA 98H SBUF DATA 99H
11 Anhang
;******** BIT REGISTERS ******* ;******** CY BIT AC BIT F0 BIT RS1 BIT RS0 BIT OV BIT P BIT
PSW BITS ******* 0D7H 0D6H 0D5H 0D4H 0D3H 0D2H 0D0H
;******** TF1 BIT TR1 BIT TF0 BIT TR0 BIT IE1 BIT IT1 BIT IE0 BIT IT0 BIT
TCON BITS ******* 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
;******** EA BIT ES BIT ET1 BIT EX1 BIT ET0 BIT EX0 BIT
IE BITS ******* 0AFH 0ACH 0ABH 0AAH 0A9H 0A8H
;******** PS BIT PT1 BIT PX1 BIT PT0 BIT PX0 BIT
IP BITS ******* 0BCH 0BBH 0BAH 0B9H 0B8H
285
286
;******** RD BIT WR BIT T1 BIT T0 BIT INT1 BIT INT0 BIT TXD BIT RXD BIT
P3 BITS ******* 0B7H 0B6H 0B5H 0B4H 0B3H 0B2H 0B1H 0B0H
;******** SM0 BIT SM1 BIT SM2 BIT REN BIT TB8 BIT RB8 BIT TI BIT RI BIT
SCON BITS ******* 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
11 Anhang
11.1.2 REG535.PDF Datei ;******** BYTE REGISTERS ******* P0 DATA 080H P1 DATA 090H P2 DATA 0A0H P3 DATA 0B0H PSW DATA 0D0H ACC DATA 0E0H B DATA 0F0H SP DATA 081H DPL DATA 082H DPH DATA 083H PCON DATA 087H TCON DATA 088H TMOD DATA 089H TL0 DATA 08AH TL1 DATA 08BH TH0 DATA 08CH TH1 DATA 08DH IEN0 DATA 0A8H IP0 DATA 0A9H IEN1 DATA 0B8H IP1 DATA 0B9H SCON DATA 098H SBUF DATA 099H IRCON DATA 0C0H CCEN DATA 0C1H CCL1 DATA 0C2H CCH1 DATA 0C3H CCL2 DATA 0C4H CCH2 DATA 0C5H CCL3 DATA 0C6H CCH3 DATA 0C7H T2CON DATA 0C8H CRCL DATA 0CAH CRCH DATA 0CBH TL2 DATA 0CCH TH2 DATA 0CDH ADCON DATA 0D8H ……………………..
287
288
ADDAT DAPR P4 P5
DATA DATA DATA DATA
0D9H 0DAH 0E8H 0F8H
;******** BIT REGISTERS ******* ;******** PSW CY AC F0 RS1 RS0 OV F1 P
BIT BIT BIT BIT BIT BIT BIT BIT
BITS *******
0D7H 0D6H 0D5H 0D4H 0D3H 0D2H 0D1H 0D0H
;******** IEN0 BITS ******* EAL WDT ET2 ES ET1 EX1 ET0 EX0
BIT BIT BIT BIT BIT BIT BIT BIT
0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H
;******** IEN1 BITS ******** EXEN2 SWDT EX6 EX5 EX4 EX3 EX2 EADC
BIT BIT BIT BIT BIT BIT BIT BIT
0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H
11 Anhang
;******** IRCON BITS ******** EXF2 BIT 0C7H TF2 BIT 0C6H IEX6 BIT 0C5H IEX5 BIT 0C4H IEX4 BIT 0C3H IEX3 BIT 0C2H IEX2 BIT 0C1H IADC BIT 0C0H ;******** TCON BITS ******* TF1 BIT 08FH TR1 BIT 08EH TF0 BIT 08DH TR0 BIT 08CH IE1 BIT 08BH IT1 BIT 08AH IE0 BIT 089H IT0 BIT 088H ;******** P3 RD BIT WR BIT T1 BIT T0 BIT INT1 BIT INT0 BIT TXD BIT RXD BIT
BITS ******* 0B7H 0B6H 0B5H 0B4H 0B3H 0B2H 0B1H 0B0H
;******** SCON BITS ******* SM0 BIT 09FH SM1 BIT 09EH SM2 BIT 09DH REN BIT 09CH TB8 BIT 09BH RB8 BIT 09AH TI BIT 099H RI BIT 098H
289
290
;******** T2CON BITS ******** T2PS I3FR I2FR T2R1 T2R0 T2CM T2I1 T2I0
BIT BIT BIT BIT BIT BIT BIT BIT
0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8H
;******** P1 BITS ******** T2 BIT CLKOUT T2EX INT2 INT6 INT5 INT4 INT3
097H BIT BIT BIT BIT BIT BIT BIT
096H 095H 094H 093H 092H 091H 090H
;******** ADCON BITS ******** BD CLK BSY ADM MX2 MX1 MX0
BIT BIT BIT BIT BIT BIT BIT
0DFH 0DEH 0DCH 0DBH 0DAH 0D9H 0D8H
;******** INTERRUPT VECTOR ADRESSES ******** TIMER2 ADCI EXTI2 EXTI3 EXTI4 EXTI5 EXTI6
EQU EQU EQU EQU EQU EQU EQU
02BH 043H 04BH 053H 05BH 063H 06BH
11 Anhang
291
11.1.3 REGISTER DECLARATIONS FOR 80535 mit Erklärungen ;******** BYTE REGISTERS ******* P0 DATA P1 DATA P2 DATA P3 DATA PSW DATA ACC DATA B DATA SP DATA DPL DATA DPH DATA PCON DATA TCON DATA TMOD DATA TL0 DATA TL1 DATA TH0 DATA TH1 DATA IEN0 DATA IP0 DATA IEN1 DATA IP1 DATA SCON DATA SBUF IRCON CCL1 DATA CCH1 DATA CCL2 DATA CCH2 DATA CCL3 DATA CCH3 DATA T2CON CRCL DATA CRCH DATA TL2 DATA TH2 DATA ADCON ADDAT DAPR DATA P4 P5
080H 090H 0A0H 0B0H 0D0H 0E0H 0F0H 081H 082H 083H 087H 088H 089H 08AH 08BH 08CH 08DH 0A8H 0A9H 0B8H 0B9H 098H DATA DATA 0C2H 0C3H 0C4H 0C5H 0C6H 0C7H DATA 0CAH 0CBH 0CCH 0CDH DATA DATA 0DAH DATA DATA
Port 0 Port 1 Port 2 Port 3 Programm-Status-Wort Akkumulator Hilfsregister- Multiplikationsregister Stackpointer - Kellerzeiger Datenzeiger Low-Byte Datenzeiger High-Byte Power-control-register Timer control-register Timer mode register Timer 0, low byte Timer 1, low byte Timer 0, high byte Timer 1, high byte Interrupt enable Interrupt priority regist. 0 Interrupt 1 enable Interrupt priority register 1 Serial channel control register 099H Serial channel buffer register 0C1H Interrupt control register Compare capture register 1, low byte Compare capture register 1, high byte Compare capture register 2, low byte Compare capture register 2, high byte Compare capture register 3, low byte Compare capture register 3, high byte 0C8H Timer 2 Control register Compare reload capture register , low byte Compare reload capture register , high byte Timer 2, low byte Timer 2, high byte 0D8H A/D converter control register 0D9H A/D converter data register D/A converter program register 0E8H Port 4 0F8H Port 5
292 ;******** BIT REGISTERS ******* ;******** PSW
BITS *******
CY AC F0 RS1
BIT BIT BIT BIT
0D7H 0D6H 0D5H 0D4H
RS0
BIT
0D3H
BIT BIT BIT
0D2H 0D1H 0D0H
OV F1 P
Carry flag Auxiliary carry flag for BCD operations General purpose user flag register bank select bits (00 - Bank 0; 01 Bank 1) register bank select bits (10 - Bank 2; 11 Bank 3) Overflow flag General purpose user flag Parity flag, wird bei jeder Instruktion ge setzt, zurückgesetzt, ODD-EVEN von Akkumulator
;******** IEN0 BITS ******* EAL BIT 0AFH WDT BIT 0AEH ET2 BIT ES ET1 EX1 ET0 EX0
BIT BIT BIT BIT BIT
Programm Status Wort
Interrupt 0 enable bits
Enables=1 or disables=0 external interrupts Watchdog timer refresh flag, wird unmittelbar vor SWDT gesetzt, um unbeabsichtigten Refresh zu verhindern Enables=1 or disables=0 timer 2 overflow, ext. reload Enables=1 or disables serial channel interrupt Enables=1 or disables=0 timer 1 interrupt Enables=1 or disables=0 external interrupt 1 Enables=1 or disables=0 timer 0 interrupt Enables=1 or disables=0 external interrupts
0ADH 0ACH 0ABH 0AAH 0A9H 0A8H
;******** IEN1 BITS ******** EXEN2
BIT
0BFH
SWDT
BIT
0BEH
EX6
BIT
0BDH
EX5
BIT
0BCH
EX4
BIT
0BBH
EX3
BIT
0BAH
EX2
BIT
0B9H
EADC
BIT
0B8H
Interrupt 1 enable bits
Enables=1 or disables= 0 timer 2 reload interrupt, external interrupt is not affected Watchdog timer status flag. Wird durch Hardware gesetzt falls Watchdog timer gestartet wird. Enables=1 or disables=0 external interrupt 6 capture / compare Enables=1 or disables=0 external interrupt 5 capture / compare Enables=1 or disables=0 external interrupt 4 capture / compare Enables=1 or disables=0 external interrupt 3 capture / compare Enables=1 or disables=0 external interrupt 2 capture / compare Enables=1 or disables=0 A/D converter interrupt
;******** IRCON BITS ********Interrupt Control Bits EXF2
BIT
0C7H
Enables=1 or disables=0 external reload flag,
11 Anhang
TF2
BIT
0C6H
IEX6
BIT
0C5H
IEX5
BIT
0C4H
IEX4
BIT
0C3H
IEX3
BIT
0C2H
IEX2
BIT
0C1H
IADC
BIT
0C0H
293
neg. transition on pin T2EX Timer 2 overflow flag, TF2=1 cause an interrupt if timer 2 interrupt is enabled. Must be cleared by SW external interrupt 6 edge flag, cleared when interrupt processed external interrupt 5 edge flag, cleared when interrupt processed external interrupt 4 edge flag, cleared when interrupt processed external interrupt 3 edge flag, cleared when interrupt processed external interrupt 2 edge flag, cleared when interrupt processed A/D converter interrupt request flag. Set by hardware at the end of a conversion. Must be cleared by software
TMOD BYTE - Timer 0 - Timer 1 - Modus Control Register (nicht bitadressierbar) 89H
GATE
C/T# M1 Timer 1
M0
GATE
C/T# M1 Timer 0
M0
TMOD
Tabelle 11.1 TMOD BYTE Bit Gate C/T#
Funktion Gating control "1" schaltet, wenn INTx#-Pin auf "1" und TRx Kontrollbit gesetzt. "0" => Timer x zählt, wenn TRx Kontrollbit gesetzt ist Counter or timer select bit. Zähler oder Zeitgeber Auswahlbit "1" Zähler-Funktion ( Eingang am Tx Eingangspin vom Prozessor ) "0" Zeitgeber-Funktion ( Eingang vom internen System Clock )
M1/M0 0 0 8-bit timer / counter THx ist ein 8-bit-Zähler / Zeitgeber TLx dient als 5-bit-Vorteiler 0 1 16-bit timer/counter "THx" und TLx" ergeben zusammen einen 16-bit Zähler / Zeitgeber. 1 0 8-bit auto-reload timer / counter 8-bit automatisch ladender Zähler / Zeitgeber. THx enthält den Wert der in TLx bei jedem Überlauf geladen wird. 1 1 Timer 0: TL0 ist ein 8-bit -Zähler / Zeitgeber der von den Kontrollbits von Timer 0 kontrolliert wird. TH00 ist ein 8-Bit-Zeitgeber der nur von den Zeitgeber 1 Kontrollbits kontrolliert wird. 1 1 Timer 1. Zähler / Zeitgeber hält
294
;******** TCON BITS ******** TCON BITS - Timer 0 / 1 Control Bits Bitadressierbar
88H
8FH
8EH
8DH
8CH
8B
8AH
89H
88H
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Diese Bits werden nicht zur Kontrolle des Zeitgebers verwendet
Tabelle 11.2 TCON BITS Timer 0 - Timer 1 Control Bits Bit TR0 TF0 TR1 TF1
Funktion Timer 0 run control bit Bit zum Starten und Stoppen des Zeitgebers 0 Timer 0 overflow flag Wird hardwaremäßig beim Zeitgeber / Zählerüberlauf gesetzt Wird bei Aufruf des entsprechenden Interrupts zurückgesetzt Timer 1 run control bit Bit zum Starten und Stoppen des Zeitgebers 1 Timer 1 overflow flag Wird hardwaremäßig beim Zeitgeber / Zählerüberlauf gesetzt Wird bei Aufruf des entsprechenden Interrupts zurückgesetzt
;******** P3 BITS ******* Port 3 bits, alternate functions RD WR T1 T0 INT1 INT0 TXD
BIT BIT BIT BIT BIT BIT BIT
0B7H 0B6H 0B5H 0B4H 0B3H 0B2H 0B1H
RXD
BIT
0B0H
External data memory read strobe External data memory write strobe Timer 1 external counter input Timer 0 external counter input External interrupt 1 input, timer 1 gate control External interrupt 0 input, timer 0 gate control Serial port's transmitter data outputs (asynchron) synchron clock output Serial port's receiver data input (asynchron) synchron data input/output
TCON
11 Anhang
295
;******** SCON BITS ******* Serial control bits SM0 BIT 09FH Mode für Serielle Schnittstelle SM1 BIT 09EH SM0 SM1 Mode Beschreibung 0 0 0 Shift register, sync. 0 1 1 8-Bit UART 1 0 2 9-Bit UART 1
1
3
9-Bit UART
Baudrate f0SC/12 Variabel f0SC/64 f0SC/32 Variabel
SM2 BIT 09DH "1" Ermöglicht Multiprozessor-Kommunikation in Mode 2 und 3. Empfänger-Interrupt wird nicht ausgelöst, falls das neunte Datenbit "0" ist. In Mode 1 und SM2="1" wird der Interrupt ebenfalls nicht aktiviert, falls kein gültiges Stoppbit empfangen wird. In Mode 0 muss SM2="0" sein. REN BIT 09CH Receiver enable. "1" Gibt den seriellen Empfang durch Software frei. "0" sperrt den Empfang. TB8 BIT 09BH Übertragungsbit 8. Ist neuntes Bit für Mode 2 und 3. Wird durch Software gesetzt und rückgesetzt. RB8 BIT 09AH Empfangsbit 8. Neuntes Bit für Empfang in Mode 2 und 3 TI
BIT 099H Übertragungsinterrupt. Wird durch die Hardware am Ende des achten Bits in Mode 0 gesetzt, oder am Beginn des StopBits in den anderen Moden. Muss durch Software zurückgesetzt werden.
RI
BIT 098H Empfängerinterrupt. Ist das empfangene Interrupt-Flag. Wird am Ende des achten Bits in Mode 0 gesetzt, oder am Beginn des Stop-Bits in den anderen Moden. Muss durch Software zurückgesetzt werden.
296
T2CON Bits - Timer 2 Control Bits I2FR
I3FR
T2PS
T2PS
BIT 0CFH Vorteiler Auswahl-Bit. "1" Timer 2 Stand wird in den Timer oder die GatterTimer-Funktion mit 1/24 der Oszillator-Frequenz geschrieben. "0" Gatter mit fOSC für Timer 2. Muss "0" sein für die Zählerfunktion von Timer 2
I3FR
BIT 0CEH Externer Interrupt 3 fallende / steigende Flanke. Ebenso für Übernahme-Funktion in Kombination mit dem CRCRegister benutzt. "1" Übernahme für CRC-Register bei positivem Übergang am Pin P1.0. "0" Übernahme für CRC-Register bei negativem Übergang am Pin P1.0.
I2FR
BIT
T2R1
BIT 0CCH T2R1 T2R0 Timer 2 reload mode selection
T2R0
BIT 0CBH 0 1
x 0
1
1
0CDH
T2R1
T2R0
T2CM
T2I1
T2I0
T2CON
0C8H
wird nicht für Timer 2 benutzt
Reload nicht möglich Mode 0: Automatisches Laden bei Timer 2 Überlauf Mode 1: Laden bei fallender Flanke an Pin P1.5
T2CM BIT 0CAH Timer 2 Compare Mode. "1" Vergleichsmodus 1 aktiv "0" Vergleichsmodus 0 aktiv T2I1
BIT 0C9H Timer 2 Input Auswahl
T2I0
BIT 0C8H T2I1 T2I0 0 0 Kein Eingang ausgewählt 0 1 Timer-Funktion, Eingangsfrequenz von T2PS abhängig 1 0 Zähler-Funktion für externes Signal an Pin 1.7 1 1 Torzeit-Funktion durch P1.7 Eingang
;******** P1 BITS ******** Port 1 Alternative Funktionen T2 CLKOUT T2EX INT2 INT6
IN / OUT OUT
097H 096H
Externes Zählen oder Gatter für Timer 2 Takt-Ausgang ( Zykluszeit )
IN / OUT IN / OUT IN / OUT
095H 094H 093H
Externer Trigger für Laden der Zähler Externer Interrupt 2 Eingang Vergleich-Ausgang/ Übernahme-Eingang für CCRegister 3
11 Anhang INT5
IN / OUT
092H
INT4
IN / OUT
091H
INT3
IN / OUT
090H
297
Vergleich-Ausgang/ Übernahme-Eingang für CCRegister 2 Vergleich-Ausgang/ Übernahme-Eingang für CCRegister 1 Vergleich-Ausgang/ Übernahme-Eingang für CRCRegister
;******** ADCON BITS ******** A/D-Wandler Kontroll-Bits BD
Bit
0DFH
Baud rate enable "1" Baudrate von Mode 1 und 3 wird von einem speziellen Vorteiler erzeugt. Hierdurch werden die StandardBaudraten von 4800 und 9600 Baud bei 12 MHz Oszillatorfrequenz erzeugt. CLK Bit 0DEH Takt-Ausgang ( Zykluszeit ) OUT "1" Takt erscheint am Port 1.6; erscheint nicht in pdf-Datei BSY Bit 0DCH Busy Flag "1" A/D-Wandlung findet statt "0" wird durch Hardware gesetzt falls keine A/D-Wandlung ADM Bit 0DBH A/D Wandlungs-Mode "1" kontinuierliche Wandlung "0" Nur eine Wandlung MX2 BIT 0DAH Multiplexer-Auswahlbit 2 MX1 BIT 0D9H Multiplexer-Auswahlbit 1 MX0 BIT 0D8H Multiplexer-Auswahlbit 0 MX2 MX1 MX0 Kanal 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
Analog Eingang 0 Analog Eingang 1 Analog Eingang 2 Analog Eingang 3 Analog Eingang 4 Analog Eingang 5 Analog Eingang 6 Analog Eingang 7
Pin MYMOS AN0 AN1 AN2 AN3 AN4 AN5 AN6 AN7
PIN ACMOS P6.0 P6.1 P6.2 P6.3 P6.4 P6.5 P6.6 P6.7
;******** INTERRUPT VECTOR ADRESSES ******** TIMER2 EQU 02BH ADCI EQU 043H EXTI2 EQU 04BH EXTI3 EQU 053H EXTI4 EQU 05BH EXTI5 EQU 063H EXTI6 EQU 06BH
298
11.1.4 EURO_535.h Diese Datei wird bei Entwicklungen in der Programmiersprache C für die EURO_535-Karte verwendet. /* (c) Copyright KEIL ELEKTRONIK GmbH. 1990, All rights reserved. */ /* Register Declarations for the 80515 Processor */ /* Erweiterungen fnr die EURO_535 Karte in Standardkonfiguration*/ /* sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr
BYTE Register */ P0 = 0x80; P1 = 0x90; P2 = 0xA0; P3 = 0xB0; P4 = 0xE8; P5 = 0xF8; PSW = 0xD0; ACC = 0xE0; B = 0xF0; SP = 0x81; DPL = 0x82; DPH = 0x83; PCON = 0x87; TCON = 0x88; TMOD = 0x89; TL0 = 0x8A; TL1 = 0x8B; TH0 = 0x8C; TH1 = 0x8D; SCON = 0x98; SBUF = 0x99;
sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr sfr
IEN0 IEN1 IP0 IP1 IRCON CCEN CCL1 CCH1 CCL2 CCH2 CCL3 CCH3 T2CON CRCL CRCH TL2
= = = = = = = = = = = = = = = =
0xA8; 0xB8; 0xA9; 0xB9; 0xC0; 0xC1; 0xC2; 0xC3; 0xC4; 0xC5; 0xC6; 0xC7; 0xC8; 0xCA; 0xCB; 0xCC;
11 Anhang sfr sfr sfr sfr
TH2 ADCON ADDAT DAPR
= = = =
0xCD; 0xD8; 0xD9; 0xDA;
/* BIT Register */ /* PSW */ sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit F1 = 0xD1; sbit P = 0xD0; /* TCON sbit TF1 sbit TR1 sbit TF0 sbit TR0 sbit IE1 sbit IT1 sbit IE0 sbit IT0
*/ = = = = = = = =
0x8F; 0x8E; 0x8D; 0x8C; 0x8B; 0x8A; 0x89; 0x88;
/* IEN0 sbit EAL sbit WDT sbit ET2 sbit ES sbit ET1 sbit EX1 sbit ET0 sbit EX0
*/ = = = = = = = =
0xAF; 0xAE; 0xAD; 0xAC; 0xAB; 0xAA; 0xA9; 0xA8;
/* IEN1 */ sbit EXEN2 = sbit SWDT = sbit EX6 = sbit EX5 = sbit EX4 = sbit EX3 = sbit EX2 = sbit EADC =
0xBF; 0xBE; 0xBD; 0xBC; 0xBB; 0xBA; 0xB9; 0xB8;
/* P3 */ sbit RD sbit WR sbit T1 sbit T0 sbit INT1
0xB7; 0xB6; 0xB5; 0xB4; 0xB3;
= = = = =
299
300 sbit INT0 sbit TXD sbit RXD
= 0xB2; = 0xB1; = 0xB0;
/* SCON sbit SM0 sbit SM1 sbit SM2 sbit REN sbit TB8 sbit RB8 sbit TI sbit RI
*/ = = = = = = = =
0x9F; 0x9E; 0x9D; 0x9C; 0x9B; 0x9A; 0x99; 0x98;
/* T2CON sbit T2PS sbit I3FR sbit I2FR sbit T2R1 sbit T2R0 sbit T2CM sbit T2I1 sbit T2I0
*/ = = = = = = = =
0xCF; 0xCE; 0xCD; 0xCC; 0xCB; 0xCA; 0xC9; 0xC8;
/* ADCON sbit BD sbit CLK sbit BSY sbit ADM sbit MX2 sbit MX1 sbit MX0
*/ = = = = = = =
0xDF; 0xDE; 0xDC; 0xDB; 0xDA; 0xD9; 0xD8;
/* IRCON sbit EXF2 sbit TF2 sbit IEX6 sbit IEX5 sbit IEX4 sbit IEX3 sbit IEX2 sbit IADC
*/ = = = = = = = =
0xC7; 0xC6; 0xC5; 0xC4; 0xC3; 0xC2; 0xC1; 0xC0;
11 Anhang /* sbit sbit sbit
Leuchtdioden */ Leuchte_3 = 0xB4; Leuchte_2 = 0xB3; Leuchte_1 = 0xB2;
/* sbit sbit sbit
Taster */ Taster_3 = 0x93; Taster_2 = 0x92; Taster_1 = 0x91;
11.2
301
Installation der Software
Die Entwicklungsumgebung der 8051 Keil-Software als Evaluationsversion lässt sich bei vielen Systemen ohne Anleitung direkt von der CD installieren. Bei Fragen finden Sie eine beispielhafte Anleitung zur Installation unter http://www.hit-karlsruhe.de/8051/. Für die Installation der 8051-Umgebung wählen Sie: ‚ Install Evaluation Software. Im neu erscheinenden Fenster wählen Sie: ‚ C51 V X.xx(Eval Tools) aus. Folgen Sie den Anweisungen der Installation. Die vollständige Entwicklungsumgebung sollte sich danach im Ordner: Keil befinden. Das Programm legt automatisch ein Icon unter: Start/Programme mit dem Namen: KeilµVision an. Für eine Programmentwicklung wird in den neueren Programmumgebungen meist ein Projektordner und eine Projektdatei angelegt. In der Datei und dem dazugehörigen Ordner sind alle notwendigen Dateien für die Entwicklungsumgebung gespeichert. Sie erleichtern sich die Arbeit, wenn Sie diese Struktur übernehmen und wie nachfolgend beschrieben verfahren. ‚ Anlegen eines neuen Projektes ‚ Auswahl des Controllers ‚ Editieren des Programms ‚ Assemblieren und Linken des Programms ‚ Testen des Programms Unter dem Menüpunkt: Project legen Sie ein neues Projekt an. Damit Sie alle bisherigen Beispielprogramme für die 8051-Familie von den älteren Auflagen verwenden können, ist es sinnvoll einen neuen Ordner: entw_asm im Verzeichnis Keil anzulegen.
302
In diesem Ordner können die neuen Projekte angelegt werden. Legen Sie das Projekt EIN_AUS.Uv2 an. Danach erscheint ein neues Fenster mit der Überschrift: Select Device for Target 'Target 1'. Hier wählen Sie das Zielsystem, also den Mikrocontroller aus. Im vorliegenden Beispiel befindet sich der 80C535-Chip im Verzeichnis von Infineon unter der Bezeichnung SAB80C535. Im linken Fenster befindet sich unter dem Ordner: Target ein weiterer Ordner mit dem Namen: Source Group 1. Klicken Sie auf diesen Ordner mit der rechten Maustaste und erscheinen die zum Projekt gehörigen Assembler-Dateien. Sehr einfach wird die Entwicklung eines neuen Programmes mit einem kleinen Zusatzprogramm zur Entwicklung von neuen 8051-Programmen. Sie finden dieses unter: http://193.196.117.22/EURO_535_ASM/publish.htm Hier wird ein Projektordner auf dem Laufwerk D: erzeugt und die Entwicklungsumgebung von Keil aufgerufen. Die Datei-Vorlagen können einfach an ihre Vorgaben angepasst werden. Die andauernden Änderungen und die vielen unterschiedlichen Computersysteme machen eine gute Beschreibung zur Installation von Software in einem Buch sehr schwierig. Hierfür ist das Internet sehr gut geeignet.
11 Anhang
11.3
303
Hilfreiche Bücher zum Aufarbeiten der Grundlagen
Die nachfolgende Literatur ist mit entsprechenden Bemerkungen in Klammern versehen. In diesen Büchern finden Sie wichtige Voraussetzungen und Ergänzungen zum Verständnis des behandelten Stoffes. Kammerer, Josef ( Einfache klare Erklärungen ) 3. Grundschaltungen/Leiter des Arbeitskreises III Wolfgang Oberthür. (HPI-Fachbuchreihe Elektronik) München: Pflaum 1980 Tietze, U. , Schenk, Ch. ( Umfassendes Grundlagenwerk ) Halbleiterschaltungstechnik Berlin, Heidelberg, New York: Springer-Verlag 1989 Osborne, Adam ( Allgemeine Einführung ) Einführung in die Mikrocomputertechnik te-wi Verlag GmbH München 1978 Einführung in die Mikroprozessortechnik Grundlagen / Entwurfsprinzipien / Anwendungen TI Learning Center ( Allgemeine Einführung ) Siemens ( Wichtiges Datenbuch ) SAB 80515 / SAB 80C515 8-Bit Single-Chip Microcontroller Family User´s Manual 1990 Siemens (Wichtigstes Hilfsmittel) Pocket Guide 11.4
Vortragsfolien
Die Vortragsfolien sind auf der CD verfügbar. Mit Hilfe des Programms Powerpoint können diese Folien an Ihre Bedürfnisse angepasst werden. Sie können die Folien an ihre Bedürfnisse anpassen.
10
Übungsaufgaben
Mit Hilfe der Übungsaufgaben können Sie Ihren Kenntnisstand kontrollieren. Eine thematische Gliederung der Aufgaben wurde nicht durchgeführt. Vielmehr wurden jeweils Übungsklausuren über das gesamte Fachgebiet erstellt. Für die Einordnung der Schwierigkeit dient die Punktezahl. Die maximal erreichbare Punktezahl pro Übungsklausur beträgt 50. Bei der Lösung der Aufgaben können Sie alle Hilfsmittel verwenden. Hilfreich kann ein persönlicher "Spickzettel" sein, mit dessen Hilfe Sie die Zeitdauer, in der Sie die Aufgaben lösen, reduzieren können. Das Detailwissen in der µ-Controllertechnik hat aufgrund der Variation der bestehenden Controller einen sehr großen Umfang. Die Fülle der Detailinformationen wird Sie gewissermaßen "erschlagen". Falls Sie sich bisher ein Stoffgebiet durch Auswendiglernen eingepaukt haben, müssen Sie sich jetzt umstellen. Die Aufgabe muss zuerst jeweils in die entsprechende Ebene / Kapitel eingeordnet werden. Danach empfiehlt es sich, durch methodisches Vorgehen, beispielsweise durch Entwickeln eines Struktogrammes bei der Programmentwicklung, die Aufgabe zu lösen. Bei vielen Aufgaben hilft auch ein gezieltes Nachschlagen in Ihren Unterlagen, nachdem Sie die Einordnung der Aufgabe in das entsprechende Umfeld vollzogen haben. Die Aufgaben zum 8086-Assembler können nur mit Zusatzliteratur gelöst werden. 10.1
Übungsklausur 1
1. 8051-Assembler (12 Punkte) Schreiben Sie ein 8051-Programm zur Addition von zwei 8-Bit-Zahlen mit Übertrag. Die beiden Zahlen 0FFH und 20H werden zuerst in den externen Speicher an die Adresse 7000H und 7001H geschrieben. Nach Ausführung des Programmes steht das Ergebnis in 7002H (LSB) und 7003H (Übertrag). a. Skizzieren Sie den Ablauf / Struktogramm b. Schreiben Sie das Programm (mit Rücksprung in Monitor) c. Schreiben Sie die Anweisung zum Assemblieren mit ASM51 d. Das Programm wird auf dem 80535-Board ausgeführt. Beschreiben Sie stichwortartig die Vorgehensweise beim Testen.
10 Übungsaufgaben
237
2. 8086-Assembler (10 Punkte) Schreiben Sie ein 8086-Programm zur Multiplikation von zwei Zahlen (Dez.). Der Bediener des Programmes wird jeweils durch eine Aufforderung am Bildschirm veranlasst, die beiden Zahlen einzugeben ("ohne Überprüfung auf Zahl"). Das Ergebnis wird am Bildschirm wie folgt ausgegeben:
Bitte geben Sie eine erste einstellige Zahl ein: 9 Bitte geben Sie eine zweite einstellige Zahl ein: 9 Das Ergebnis der Multiplikation beider Zahlen ist: 81
Hilfe: ASCII-Zeichen 30H-39H
Zahl 0-9
Funktion 01h: Liest ein Zeichen ein und gibt dies am Bildschirm aus Variablen: AL eingegebenes Zeichen Unveränderte Register: AH,BX,CX,DX,SI,DI,BP,CS,DS,SS,ES,FLAG Funktion 02h: Gibt ein Zeichen am Bildschirm aus Variablen: DL auszugebendes Zeichen Unveränderte Register: AX,BX,CX,DX,SI,DI,BP,CS,DS,SS,ES,FLAG Befehle 8088/8086: push reg16 pop reg16 aam Konvertiert eine Zahl kleiner 100 in zwei BCDZahlen. Die niederwertige steht im AL-Register, die höherwertige im AH-Register and al,00001111b verundet Inhalt im AL-Register (für ASCII-HexWandlung) ähnlich ist Hex-ASCII-Wandlung Grober Ablauf: ‚ Text1 ausgeben ‚ Zahl1 einlesen ‚ ASCII-HEX-Wandlung ‚ Text2 ausgeben ‚ Zahl2 einlesen ‚ ASCII-HEX-Wandlung ‚ Multiplikation durchführen ‚ aam Adjust after Multiply ‚ Ergebnis in ASCII ausgeben
238
3. Signalprozessor Assembler (4 Punkte)
a. b. c. d.
Nachfolgend sehen Sie ein Programm für einen ADSPSignalprozessor. Welche mathematische Operation führt dieses Programm durch? Welche Bit-Breite wird verarbeitet? Wie viele Zyklen braucht dieses Programm? Wie lange benötigt dann ein 12,5 MHz Prozessor? .Module DPA; { Was wird hier gemacht? Aufrufende Parameter AX0=LSW von X AX1=MSW von X AY0=LSW von Y AY1=LSW von Y zurückgegebene Werte SR0=LSW von Z SR1=MSW von Z veränderte Register AR,SR Berechnungszyklen ? Zyklen } .ENTRY dpa; dpa: AR=AX0+AY0; SR0=AR, AR=AX1+AY1+C; SR1=AR; RTS; .ENDMOD;
4. Timing Berechnung (8 Punkte) Sie verwenden einen 8051A mit 16 MHz und haben ein EPROM mit einer Zugriffszeit von 250 ns verfügbar. a. b. c.
Berechnen Sie, ob es möglich ist, das EPROM zu verwenden. Bei welcher Taktfrequenz des Prozessors könnten Sie das EPROM verwenden? Bei Programmausführung beträgt die Prozessorauslastung 40%. Welchen Typ von Prozessor setzen Sie dann ein?
10 Übungsaufgaben
239
5. Prozessoren im Vergleich (6 Punkte) 1. Bei Prozessoren gibt es zwei unterschiedliche Arten von Adressierung, die lineare und die segmentierte Adressierung. Welche Aussage ist richtig? a b c d
68000- und 8088-Prozessoren haben linearen Adressraum 68000-Prozessoren haben einen segmentierten Adressraum 8051 und 21xx-Prozessoren haben einen segmentierten Adressraum 8086-Prozessoren haben segmentierte, 68000 lineare Adressraum
2. Welche Aussage ist richtig? a b c d
80xxx-Prozessoren sind Hardware-kompatibel 80xxx-Prozessoren sind Software-kompatibel 21xx und 8051 sind Software-kompatibel 80535 und 8051 sind Pin-kompatibel
3. Die Architektur von Prozessoren hat entscheidenden Einfluss auf die Leistung. Welcher Prozessor verwendet zwei parallel arbeitende Einheiten zur Leistungssteigerung? a b c d
80535 8048 8086 2111
4. Bei Multiprozessorsystemen verwendet man Coprozessoren mit BusInterface-Einheit. Welcher Prozessor hat eine solche Einheit? a b c d
80535 8048 80286 und 8051 2111
240
5.
Welche Hochsprache kann bei verschiedenen Prozessoren (Signalprozessor, µ-Controller, CISC-Prozessor eingesetzt werden? a b c d
Pascal Assembler Cobol C
6. Man unterscheidet zwischen CISC (Complex Instruction Set Computer) und RISC (Reduced Instruction Set Computer). Welcher Prozessor gehört zur RISC-Familie? a b c d
8087-Arithmetikprozessor 80517 2101 68000
6. Allgemeine Fragen zur µ-Computertechnik (10 Punkte) 1. Auf einem Speicher ist die Angabe 62256 zu lesen. Wie viel Speicher ist auf diesem Baustein verfügbar? a b c d
62 256 Bit 256 KByte 32 KByte 256 Nibbles
2. Welche beiden Signale müssen für eine Von-Neumann-Architektur beim 8051 miteinander mit logisch UND verknüpft werden? a b c d
/PSEN und /RD PSEN und ALE PSEN und RD RD und ALE
10 Übungsaufgaben
241
3. Welches Statusbit können Sie im Programmstatuswort frei verwenden? a b c d
PSW.0 Freibit STATFREI F0
4. Welche Besonderheit ist beim 8051 beim Anschluss des Port0 gegenüber den restlichen Ports zu beachten? a b c d
Der Ausgang ist rücklesbar Der FAN-Out ist > 2 LSTTL Es gibt keinen Zugriff auf den internen Bus Kein interner Pull-Up Widerstand vorhanden
5. Welche Aussage ist für 8051-Derivate falsch? a b c d
80515 hat 256 Byte interner RAM Bestimmte 8051-Derivate haben keinen USART 80515 hat bereits PWM Jedes 8051-Derivat hat 5 Interruptvektoren
6. Welches Signal bei 8051-Prozessoren ist für das Multiplexen zwischen Daten und Adressen zuständig? a b c d
/RD RD /ALE ALE
7. Welche Flags werden beim ADD A,Rr - Befehl beeinflusst? a b c d
CY,AC,OV CY,AC AC,CY,P,OV keines
242
8. Die Interrupt-Vektor-Adresse von 80515 für das externe Compare/Capture2- Ereignis ist? a b c d
9BH FFH 00H 63H
9. Beim Übergang auf 80515-Prozessoren wird eine Symboltabelle .pdf verwendet. Welche(r) Assembler-Befehl(e) sind zur Einbindung der Symboltabelle notwendig? a b c d
NOMOD51 NOMOD51 und INCLUDE SYMBOLS NOMOD und INCLUDE
10. Um 4 verschiedene Prozessorprogramme quasiparallel abzuarbeiten, verwendet man vorteilhaft folgende Einheiten im 8051 für die Speicherung der Register. a b c d
externen EPROM Cache den internen RAM von 0H-1EH Auxiliary Carry-Bytes
10 Übungsaufgaben
243
Lösungen Übungsklausur 1 Lösung Aufgabe 1 a. Grober Ablauf / Struktogramm Initialisierung ‚ Assembler Anweisungen ‚ Variablen ‚ CSEG, ORG Speicher vorbereiten ‚ Zahlen in externe Speicherzellen schreiben Addition ‚ Zahlen einlesen ‚ Addition durchführen ‚ L-Byte in Speicher ‚ Übertrag in externen Speicher Monitor 80535 ‚ Rücksprung in Monitorprogramm b.
Programm
$ title (ADDIT_SP) $ NOMOD51 ;8051 $ INCLUDE (reg535.pdf) ;80535
;Austragen der symbolischen Adressen von ;Einbinden der symbolischen Adressen von
;Einfaches Programm zur Addition von zwei 8 Bit Zahlen mit Übertrag Z1 EQU 0FFH ;Wert Zahl 2 Z2 EQU 20H ;Wert Zahl 1 ADRZ1 EQU 7000H ;Adresse von 1. Zahl CSEG AT 0H ORG 0H jmp Anfang ORG 100H Anfang: mov DPTR,#ADRZ1 mov A,#Z1 movx @DPTR,A inc DPTR mov A,#Z2 movx @DPTR,A mov R0,#0
mov DPTR,#ADRZ1
;Legt absolute Codesegmentadresse auf 0h ;Programmzähler auf 0 ;Auf Startadresse springen, da Monitor auf ;PC=0 eingestellt ;Setzt Adresszähler auf 100H Programmteil
;Adresse in Datenpointer ;Akku mit Z1 beschreiben ;Z1 in externen Speicher ;DPTR+1 ;Akku mit Z2 beschreiben ;Z1 in externen Speicher ;Register 0 mit 0 beschreiben für addc A,R0;Befehl ;eigentliche Addition beginnt ;
244 movx A,@DPTR ;Akku mit Z1 laden mov R1,A ;Z1 in Register 1 laden inc DPTR ;Inhalt des Datenpointers inkrementieren movx A,@DPTR ;Z2 in Akku add A,R1 ;Addition von Z1 und Z2 inc DPTR ;Inhalt des Datenpointers inkrementieren movx @DPTR,A ;Ergebnis speichern mov A,#0 ;0 in Akku schreiben, damit ADDC ausgeführt kann addc A,R0 ;Carry in Akku inc DPTR ;externe Speicheradresse für Übertrag movx @DPTR,A ;Übertrag speichern Programm_ENDE: ljmp 8000H ;Monitoreinsprung
;werden
end
c. asm51 Addit_SP.asm d. ‚ ‚ ‚ ‚ ‚
MS51 laden PC-Programm für PC-80535 Kommunikation ADDIT_SP.OBJ Download des Programmes auf 80535-Board G0 Start des Programmes Anschauen des Speicherinhaltes Bei Fehler Programm im Einzelschrittbetrieb abarbeiten.
Lösung Aufgabe 2 title mult_8B DOSSEG .MODEL small .STACK 100h ; .DATA Text1 DB DB Text2 DB DB Text3 DB DB
;Multiplikation mit 8-Bit Ergebnis ;Mit .MODEL, DOSSEG ;Definiert die Segmentierungsfolge nach DOS ;Speichermodell: alles in einem Segment ;Reservierung von 256 Bytes ;Hier beginnt der Datenbereich 13,10,'Bitte geben Sie' ' eine erste einstellige Zahl ein: $' 13,10,'Bitte geben Sie' ' eine zweite einstellige Zahl ein: $' 13,10,'Das Ergebnis der' ' Multiplikation beider Zahlen ist: $'
; .CODE START: mov ax,@data mov ds,ax mov dx,offset Text1 mov ah,09h int 21h mov ah,01
;Hier beginnt der Programmteil ;DS zeigt auf Datensegment ;Adresse von Text1 in DX-Register ;Funktion - Zeichenausgabe ;Zahl1 in ASCII einlesen
10 Übungsaufgaben int 21h and al,00001111b push ax mov dx,offset Text2 mov ah,09h int 21h mov ah,01 int 21h and al,00001111b pop dx mul dl push ax mov dx,offset Text3 mov ah,09h int 21h pop ax aam or al,00110000b mov bl,al or ah,00110000b mov dl,ah mov ah,02h int 21h mov dl,bl mov ah,02h int 21h mov ah,4ch int 21h END START
245
;jetzt steht dies in AL ;umwandeln in Zahl1 ;in Stack retten ;Adresse von Text2 in DX-Register ;Funktion - Zeichenausgabe ;Zahl2 in ASCII einlesen ;jetzt steht dies in AL ;umwandeln in Zahl ;Zahl 1 von Stack holen ;Multiplikation durchführen ;retten von Ergebnis ;Adresse von Text3 in DX-Register ;Funktion - Zeichenausgabe ;Ergebnis holen ;8-Bit Zahl kleiner 100 wird in BCD ;gewandelt ;30h dazu für ASCII ;niedere Stelle retten ;30h dazu für ASCII ;höchste Stelle ausgeben ;Funktion Zeichenausgabe aufrufen ;niedere Stelle ausgeben ;Funktion Zeichenausgabe aufrufen ;Programmende
Lösung Aufgabe 3 a. b. c. d.
Eine Addition 32 Bit + Carry? 4 Zyklen 12,5 MHz -> 80ns / Zyklus *4= 320 ns
Lösung Aufgabe 4 a. Aus Programmspeicher-Lese-Zugriff: "Timing" 16/12MHz tAVIV =223 ns < 250 ns Das EPROM kann bei der Taktrate 16 MHz nicht verwendet werden.
246
b.
1 / 90 ns xMHz 1 - 90 ns ? 5 * xMHz 1 xMHz ? 5 * tAVIV - 90 ns 1 ? 5* 250 ns - 90 ns 5 ? ? 14, 7 MHz 340 ns tAVIV ? 5 *
tAVIV
c. Verwendeter Prozessor 8051A; Taktfrequenz 12 MHz. Kostengünstigerer Prozessor und genügend Prozessor-Reserve.
Lösung Aufgabe 5 1d; 2b; 3c; 4d; 5d; 6c;
Lösung Aufgabe 6 1c; 2a; 3d; 4d; 5b; 6d; 7c; 8d; 9b; 10c;
10 Übungsaufgaben
10.2
247
Übungsklausur 2
1. 8051-Assembler (10 Punkte) Schreiben Sie ein 8051-Programm (mit allgemeinem Kopf zum symbolischen Debuggen und List-file, ablauffähig auf 80535-Prozessor) zur Division einer 8-Bit-Zahl durch 2. Die 8-Bit-Zahl steht im externen Speicher an Adresse: Zahl_zur_Division. Der externe Speicher ist ab 2000H frei. Das Ergebnis wird in den externen Speicher an Adresse: Erg_der_Division geschrieben. a. Skizzieren Sie den groben Ablauf / Struktogramm b. Schreiben Sie das Programm (mit Rücksprung in Monitor) mit EQUAnweisung für die symbolischen Adressen. c. Schreiben Sie die Anweisung zum Assemblieren mit ASM51 d. Das Programm wird auf dem 80535-Board ausgeführt. Beschreiben Sie stichwortartig die Vorgehensweise beim Testen. e. Ist das Programm auf jedem 8051-Derivat ausführbar? 2. 8051-Assembler (12 Punkte) Im internen Speicher stehen 10-Byte-Zahlen (0-255) ab der Adresse: Adr_10_Zahlen. Diese sollen zum PC als ASCII-Zahlen übertragen werden. Es werden serielle Schnittstellen ( Initialisieren ist nicht notwendig ) verwendet. a. Entwerfen Sie den Programmablaufplan oder ein Struktogramm b. Schreiben Sie ein ablauffähiges 8051-Programm (Mit Standard-Kopf) c. Welche Art von Programm können Sie auf der PC-Seite verwenden? Hilfe: ZEICHEN
HEX
0 30
1 31
2 32
3 33
4 34
5 35
6 36
7 37
8 38
9 39
A 41
B 42
C 43
D 44
E 45
F 46
3. Prozessorwahl ( 8 Punkte ) Wählen Sie für die nachfolgenden Aufgaben den optimalen Prozessor aus (bzgl. Kosten / Programmieraufwand bei 1000 Stück ) . a. Randbedingungen: ‚ 8 KB Programmumfang ‚ Es werden Kopierroutinen unter Verwendung von 2 Adresszeiger durchgeführt (nicht zeitkritisch) ‚ A/D-Wandlung 8 Bit ‚ 156-Byte-Speicher für Parameter
248
Bitte genaue Bezeichnung des Prozessors Prozessor:_____________________________
b. Aufgabe: Aufzugsteuerung für Personenbeförderung mit Selbstbedienung ‚ sehr schneller Aufzug ‚ 16 Stockwerke ‚ Vorrangschaltung ‚ kurze Reaktionszeit Prozessor:__________________________________ c. Wählen Sie für die Spracheingabe an einem PC den geeigneten Prozessor für die Einsteckkarte für einen AT-Bus aus. Prozessor:__________________________________
d. Für die Tastatur an einem PC mit serieller Datenübertragung zum PC wird ein Prozessor benötigt. Welchen Prozessor verwenden Sie? Prozessor:__________________________________
4. Timing-Berechnung (12 Punkte) Sie verwenden einen 80535 mit 12 MHz und haben ein EPROM mit einer Zugriffszeit von 120 ns. Das /PSEN-Signal, vom Prozessor erzeugt, wird über ein NOR-Gatter, ein D-Flip-Flop und einem Exklusiv-Oder, dem EPROM am CE/-Eingang zugeführt. Das Flip-Flop ist für die Adressumschaltung notwendig. Die maximale Zeitdauer TPLIV, von bis zur ist für den Prozessor: (3*tclcl-100ns). tclcl ist die Periodendauer des Prozessortakts.
10 Übungsaufgaben
A15 1
1
JP6
CE Rom
1
0 › 1
1
NORE
249
0
1
NORA
PSEN
0 1
JP5
CE Ram
1
JP7
7486
Abb. 10.1 Schaltung zwischen Prozessor und EPROM
D=A15 /PSEN Q=NORE CLK=NORA /Q /CE ROM /CE RAM
Abb. 10.2 Zeitdiagramm beim Umschaltvorgang (nicht zeitgetreu)
a. b.
Berechnen Sie für das /CE-Signal des EPROMs, welche Bausteinfamilie (74 AC, und / oder 74ACT jeweils bei TA= -40° bis 85°) verwendet werden kann. Bis zu welcher Frequenz des Prozessors können beide Bausteinfamilien verwendet werden?
Angaben zum EPROM: Symbol Parameter /CE to output valid tCE
min
max 120
Einheit ns
Angaben zu den Bausteinen der Schaltung zwischen Prozessor und EPROM in den beiliegenden Kopien.
250
µ-Controller (3 Punkte, jeweils nur eine Lösung)
5.
1. Bei 8051-Prozessoren gibt es unterschiedliche Arten von Adressierung. Die direkte und indirekte Adressierung. Welche Aussage ist richtig? a b c
d
Die externen Speicherbereiche sind nur direkt zu adressieren Der interne Speicher ist nur direkt adressierbar Es gibt sowohl direkt als auch indirekt adressierbaren, internen Speicher Die Speicher sind alle Bit-adressierbar
2. Ein Echtzeitbetriebssystem mit Antwortzeiten von 100 ms zum Einsatz in einer Fabrik kann für folgende Aufgaben eingesetzt werden: a
b c d
Regelung mit Drehgebern direkt am Prozessor bei 1200 U/min und 128 Strichen Bei Befehlseingabe durch Sprache Sortieren von Schrauben bei 800 Schrauben / min Temperaturregelung mit 3 Sensoren 1 Messung / 5 Sek.
3. Die Architektur von Prozessoren hat entscheidenden Einfluss auf die Leistung. Das Verwenden von mehreren Datenpointern ist bei folgenden Aufgaben sinnvoll: a b c d
Bei Bitmanipulationen Bei Verwendung der serieller Schnittstelle Beim Kopieren von Speicherbereichen Bei Watchdog-Routinen
4. Ein Signalprozessor hat folgende Eigenschaften: a b c d
Befehlszykluszeit < 500 ns Er rechnet analog und ist deshalb sehr schnell Im Signalprozessor sind keine Register vorhanden Externer Speicher kann nicht verwendet werden
10 Übungsaufgaben
251
5. Welche Hochsprache kann bei 8051-Derivaten eingesetzt werden? a b c d
C++ Basic Cobol C
6. Man unterscheidet zwischen CISC (Complex Instruction Set Computer) und RISC (Reduced Instruction Set Computer). Welcher Prozessor gehört zur RISC-Familie? a b c d
µ-Controller 80535 Arithmetikprozessor 80387 µ-Prozessor 8086 DSP-Prozessor 2100
6. Allgemeine Fragen (5 Punkte, jeweils nur eine Lösung) 11. Auf einem Speicher ist die Angabe 27C64-200 zu lesen. Wieviel Speicher ist bei diesem Baustein verfügbar? a b c d
640 KBit 64 KByte 200 KByte 8 KByte
12. Welche beiden Signale müssen für eine Harvard-Architektur beim 8051 miteinander mit logisch UND verknüpft werden? a b c d
/PSEN und /RD PSEN und ALE PSEN und RD keine
252
13. Der µ-Controller 80535 verfügt über mehrere Register. Welche Aufgabe hat der Akkumulator? a b c d
Er puffert die Betriebsspannung des µ-Controllers Er speichert die Flag-Bits Er nimmt das Ergebnis von Verknüpfungsoperationen auf Er speichert den Inhalt des Stackpointers bei Ausfall der Betriebsspannung
14. Was wird unter dem Begriff >>ALUCarry ZAHL: jnc BUCHSTABE ;Wenn Carry nicht gesetzt ->Buchstabe add a,#30H ;+ 30H dann ASCII ret BUCHSTABE: add a,#37H ;+ 37H dann ASCII ret SER_BYTE: setb TI ;nur für Test mit Simulator setzen ! jnb TI,SER_BYTE ;warten bis sendefähig mov SBUF,A ;Zeichen in SBUF BYTE_WEG: jnb TI,BYTE_WEG ;Warten bis Byte gesendet ist clr TI ;TI löschen ret end
Lösung 2c
257
Ein einfaches Terminalprogramm
ein-
258
Lösung Aufgabe 3 a. 80535 b. 8051 c. Signalprozessor d. 8051 Lösung Aufgabe 4 Es gilt:
T PLIV ? 3 *1 / 12 Mhz / 100ns ? 150ns T PLIV / T NORHL / T CLKQLH / T EXCLLH @ T CE Verwendung von AC-Bausteinen:
150 ns / 7, 0 ns / 10, 5ns / 9, 5ns @ ?120 ns 123ns @ 120 ns Verwendung von ACT-Bausteinen
150 ns / 10 ns / 13ns / 12 ns @ ?120 ns 115ns @ ?120 ns Gleichung nicht erfüllt, ACT-Bausteine können nicht verwendet werden. b.
T PLIV ? 3 *1 / xMhz / 100 ns ? 155ns 3 ? 11, 7 MHz (155 - 100)ns Beide Familien können bei einer Taktfrequenz von 11,7 MHz verwendet werden. Lösung Aufgabe 5 1c; 2d; 3c; 4a; 5d; 6d; Lösung Aufgabe 6 1d; 2d; 3c; 4d; 5a; 6c; 7c; 8b; 9b; 10c;
10 Übungsaufgaben
10.3
259
Übungsklausur 3
1. 8051-Assembler A/D-Wandlung mit Anzeige (10 Punkte) Schreiben Sie ein 8051-Programm (mit allgemeinem Kopf zum symbolischen Debuggen und List-file, ablauffähig auf 80535-Prozessor), das A/D-Werte an Kanal 0 wandelt. Es liegt eine Spannung zwischen 0V und 5V am Eingang des A/D-Wandlers und soll folgendermaßen angezeigt werden: Tabelle 10.1 Codierung mit Leuchten Spannung 0CACHE=(2*lang_blink)) { Leuchte_1=~Leuchte_1; Leuchte_2=~Leuchte_2; zaehler=0; } return; }
279
280
Lösung 1c compile ABW_BLI mit folgendem Batch: COMPILE.BAT copy %1.c c:\8051\c51p\c51 cd c:\8051\c51p\c51 c51.exe %1.c copy %1.* c:\8051\entw_c\%1 del %1.* cd c:\8051\entw_c\%1
Lösung 1d link ABW_BLI mit folgendem Batch: LINK.BAT copy C:\8051\ENTW_C\%1\%1.OBJ C:\8051\c51p\c51 cd c:\8051\c51p\c51 l51 %1.OBJ CODE(0100H) copy %1. c:\8051\entw_c\%1\%1. copy %1.m51 c:\8051\entw_c\%1\%1.m51 del %1.* cd c:\8051\entw_c\%1 c:\8051\sp8051kl C:\8051\ENTW_C\%1\%1.
Aufruf des Debug-Programmes HITOP.EXE Download von ABW_BLI.HTX Laden von ABW_BLI.SYM Öffnen der Fenster: Register, List, Instruction Run Lösung 1e Nein, dieses Programm ist nicht auf jedem Derivat lauffähig, da Timer 2 verwendet wird. Lösung 2a Es genügt in diesem Fall das obere Byte DPH abzufragen. Der Datenpointer kann mit dem Befehl inc DPTR hochgezählt werden. Das Programm muss unterhalb 0100H gelegt werden, da es sich sonst selbst löscht. Als Adresse für den Programmstart kann z.B. 0A0H gewählt werden.
10 Übungsaufgaben
281
Programmkopf Assembleranweisungen Laden der Konstanten, Variablen R2=DPH+1; DPTR=0100H R2>=DPH
DPTR+1 Speicher = 0 evtl. Bestätigung
Lösung 2b $nomod51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(reg535.pdf) ;die 80535-spezifischen Daten $list ;es wird ein Listing erstellt $ title (ext_sp_0) ;-----------------------------------------------------------------------;Programmbeschreibung ;-----------------------------------------------------------------------;Programm: ;Externer Speicher wird ab 0100H bis 6FFFH zu "0" gesetzt ; ;Datum: ;Programmiert: J. Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 DPH Datenpointer High Byte ;R1 Inhalt ;Kommentar: ; ;Aenderungen: ;Datum: 29.6.94 ; ; ;-----------------------------------------------------------------------;Initialisierungsteil fuer allgemeine Konstanten ;-----------------------------------------------------------------------X_SP_U EQU 0100H ;untere Speichergrenze X_SP_O EQU 6FFFH ;obere Speichergrenze INHALT EQU 000H ;Inhalt der Speicherzelle
282 MONITOR EQU 8000H
;Sprung in Monitor
CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp START ; ;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------;-----------------------------------------------------------------------;Programmschleife ;-----------------------------------------------------------------------ORG 00A0H START: mov DPTR,#X_SP_O mov A,DPH add A,#1 mov R2,A mov DPTR,#X_SP_U mov R1,#INHALT
;Programmstart bei A0H sonst loescht sich ;Programm selbst ;Datenpointer mit oberer Grenze laden ;Oberes Byte von Grenze oben in Akku ;+1 =70H ;Datenpointer mit unterer Grenze laden ;Datum laden
;alle Speicherzellen mit Adressen kleiner High Byte Obere Grenze ;werden beschrieben SCHLEIFE_1: mov A,R1 movx @DPTR,A inc DPTR mov A,DPH cjne A,02H,SCHLEIFE_1 clr P3.2 WARTEN: jb P1.1,WARTEN setb P3.2 ljmp MONITOR end
Lösung Aufgabe 3 a. 8051 b. 8051 c. 80535 d. 8051
;Datenpointer +1 ;High-Byte in Akku ;Schon oberes Byte obere Grenze erreicht ? ;02H entspricht R2 ;Arbeit getan ;Hilfe fuer Debug ;bestaetigen ;Monitor erhaelt Kontrolle
10 Übungsaufgaben
Lösung Aufgabe 4 Boolesche Gleichung
/ CE _ EP2 ? / A0 ® A1 ® / A2 ® / CS 2 ? / P2.4 ® P2.5 ® / P2.6 ® / P2.7 Zeitberechnung:
TLLIV / tPHL @ tCE 233ns / 44ns ? 189ns @ tCE Bei der Speicherauswahl muss tCE kleiner als 189ns sein
Lösung Aufgabe 5 1d; 2c; 3c; 4b; 5d; 6c;
Lösung Aufgabe 6 1b; 2c; 3c; 4b; 5b; 6a; 7d; 8b; 9c; 10c;
283