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, 1kΩ, 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
Platine
µ-Computer
Chip µ-Prozessor
c:> Chips
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
5
CMOS 4,5V
4
H
CMOS
H
H
H 3,5 V
3 2,4V 2
2,0 V 1,5 V
1
0,4V
0,8 V 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
6
Q
Kenn-
74F74
zeichnung
1
/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
TLH
t
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
Clock
PHL
PLH
t
rec 50%
V 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
Clock
t su
h V CC
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. D2
D1
D0
D6
D5
D4
D3
D7
CP
CP
D
CP
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
/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
Schreibe1
1010 0101
/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 CP_S2
Register
Vcc
Lese2 Schreibe2
/RD /WR
0011 1100
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 VAGND VAREF AN Port 6
CE
OE
Port 1 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
P1.1 P1.3 P3.3 P1.2 P3.2 P3.4 T1 T2 T3
R2OUT / P1.4
L1 L2 L3
Tasten / Leuchten
T2IN / P4.7
V24Treiber
PC
V24Treiber
PC
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
RxD TxD /INT0 /INT1 T0 T1 /WR /RD
→ ← → → → → ← ←
PD
→
/EA
→
/PSEN
←
ALE
←
Port 3
8051
↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔
Abb. 3.1 Logisches Symbol des 8051
↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔
Port 0
↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔
Port 1
↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔
Port 2
↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔
→ → → → → → → →
Adress- und Datenbus
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
/Q
Read Pin freigegeben
Port 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 /Q
freigegeben
Abb. 3.3 Datenweg: Zustand des Port-Pins lesen
Port 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 Write Latch
Read Pin
Q
D CLK
Port Latch
/Q
gesperrt
Port 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 Write Latch
Read Pin
D Port CLK Latch
gesperrt
Abb. 3.5 Zustand des Port-Latches lesen
Q /Q
Port 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. 50kΩ 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. Read Latch
V CC ca. 50kΩ
interner Bus Write Latch
Q
D
CLK
Port Latch
Port Pin
/Q
n1 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
0
Read Latch
VCC
Control
1 0 sperrt
&
interner Bus Write Latch
D CLK
Q Port Latch /Q
1
1
P0.x Pin
leitend
0
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 CLK
1 leitend
Port Latch /Q
0
0 sperrt 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
X
Read Latch
interner Bus
V CC
Control
0 &
0
0
Write Latch
Q
D CLK
0 sperrt
X
Port Latch
/Q
1
P0.x Pin
leitend
0
n 1
MUX
V DD 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. Address Data
x
Read Latch
interner Bus Write Latch
VCC
Control
0 &
1
1
D Port CLK Latch
0 sperrt
Q
x /Q
0 sperrt MUX
P0.x Pin n1
1
float
VDD
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. V CC
Read Latch
ca. 50 K Ω
interner Bus
Q
D
Write Latch
CLK
Port 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. V CC
Address Data Read Latch
Control
MUX interner Bus Write Latch
Q
D CLK
P2.x Pin
Port Latch /Q
n 1 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 1
Read Latch
VCC
Control
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
4096 Byte
128 Byte
& Timing
Program Memory 8051A only
Data Memory
64 KByte Bus Expander
Programmable
Two 16-Bit Timer/Event Counters
8051 CPU
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
PCH
RAM
PCL
Temporäres
Programm
Register
Statuswort
DPH DPL
Befehlsdecoder
B-Register
Stack Pointer
Port 2
IE IP Unterbrechungs-
Port 0
Steuerung Arithmetisch SCON
logische
SBUF(Senden) Temporäres Register
Einheit
SBUF(Empfang) Serielles Port Port 1 Steuersignale TCON TMOD TL0 Steuerlogik
Oszillator
TH0 TL1 TH1
XTAL1
XTAL2
/EA
ALE
/PSEN
RST
Zähler/Zeitgeb.
VPD
Statuswort Steuerung
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
RAM-Adres. Dekodierer PCH DPH PCL DPL
128x8 RAM
ROM
Programm Statuswort
B-Register
Stack Pointer
Befehlsdecoder
Port 2
IE IP Unterbrech.Steuerung
Port 0
Arithmet. SCON
logische
Temporäres Register
SBUF(Senden)
Einheit
SBUF(Empfang)
Serielles Port
Port 1 Steuersignale
Steuerlogik
Oszillator
XTAL1
XTAL2
Leitwerk
TCON TMOD TL0 TH0 TL1 TH1
/EA
ALE
/PSEN RST VPD
Eingabeeinheit /
Zähler/ Statuswort Zeitgeber
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 Sieben Ports
ROM RAM 80C51 Kern 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
Programmspeicher intern /EA=1 und Adresse <1000H
extern
Datenspeicher intern
obere 128 Bytes MOV A,@RO
extern /RD-/WR-Signal aktiv MOVX A,@DPTR
/PSEN aktiv
untere 128 Bytes MOV A,@RO MOV A,RO
SFR MOV A,PSW
Abb. 3.21 Adressbereiche 8051 mit den Befehlen zum Ansprechen
Die beiden wesentlichen Speicherarten sind: Datenspeicher und Programmspeicher. Diese Unterscheidung wurde beim Grundaufbau der ersten Generation von Digitalrechnern nicht gemacht. Man sprach einfach vom Speicher. Dies führte zu einer Vermischung von Daten und Programmen. Bei einem solchen Rechner spricht man von einer Von-NeumannArchitektur. Leistungsfähigere Systeme verwenden eine HarvardArchitektur. Hier wird bezüglich der Hardware zwischen Programm und Datenspeicher unterschieden. Selbstverständlich kann diese Unterscheidung auch durch die Software erfolgen. Bei Prozessoren mit linearem Adressraum, wie beispielsweise dem Motorola 68000, wurde diese Unterscheidung innerhalb des Macintosh Betriebssystems von Apple softwaremäßig durchgeführt.
3 Aufbau von µ-Controllern der 8051-Familie
47
Speicher Adressen Daten Programm Programm Daten Programm Daten Programm Adressen
Adressen Datenspeicher Daten
Daten
CPU
Adressen Programm speicher Daten
Daten
Adressen Peripherie
Adressen
CPU
Daten
Adressen Peripherie Daten
Daten
Abb. 3.22 Von-Neumann-Architektur Abb. 3.23 Harvard-Architektur
Mit dem 8051-Controller lassen sich beide Architekturen realisieren. Die Architektur mit im Speicher gemischten Daten und Programmen wird die Von-Neumann-Architektur genannt. Die Architektur mit getrennten Datenspeicher und Programmspeicher heißt Harvard-Architektur.. Meist werden jedoch keine 64 KByte Programmspeicher und 64 KByte Datenspeicher benötigt, sondern man kommt mit einem 64 KByte großen Datenund Programmspeicher aus. Deshalb trifft man die Von-NeumannArchitektur sehr oft an. Auch bei dem 80535-Board ist diese Architektur realisiert. Softwaremäßig kann man nach wie vor Datenbereich und Programmbereich trennen. Verknüpft man die beiden Prozessorsignale /PSEN und /RD über ein Und-Gatter, wird sowohl beim Zugriff auf den Programmspeicher als auch beim Zugriff auf den Datenspeicher vom Prozessor ein /OE-Signal für den Speicher erzeugt.
vom Prozessor
RAM
/PSEN /RD
&
/OE
Tabelle 3.5 /PSEN und /RD verknüpft /PSEN /RD 0 0 1 1 0 1 1
/OE 0 0 0 1
Abb. 3.24 Erzeugen der VonNeumann-Architektur
Im Blockschaltbild EURO_535 ist dieser Schaltungsteil Bestandteil der Adress-Logik. Beim Erzeugen einer solchen Architektur ist unbedingt das Timing zu berücksichtigen. Die Zugriffszeiten des /PSEN-Signals sind kürzer als die Zugriffszeiten des /RD-Signals.
48
3.7
Timingberechnungen für 80535-Speicher
Im ersten Kapitel wurde die Wichtigkeit der Timingberechnung hervorgehoben. Exemplarisch werden verschiedene Timingberechnungen durchgeführt. Die verwendeten Signalformen (Switching Waveforms) sind abhängig davon, ob es sich um Eingänge oder Ausgänge handelt. Signalform
Eingang
Ausgang
Muß stabil sein
Muß stabil sein
Kann von "1" nach "0"wechseln
Kann von "1" nach "0"wechseln
Kann von "0" nach "1"wechseln
Kann von "0" nach "1"wechseln
nicht beachten Jeder Wechsel erlaubt
Wechselt Zustand nicht bekannt
macht keinen Sinn
Mittellinie bedeutet "kein hochohmiger Zustand"
Abb. 3.25 Bedeutung der Signalformen
Das gesamte Timing hängt vom Takt des Quarzoszillators ab. Die Zeitangaben beruhen auf der Taktfrequenz. Im Falle des 8051 und des 80C535 beträgt die Taktfrequenz 12 MHz oder auch 16 MHz. Sie erinnern sich an den Einschreibvorgang eines Bits in das D-FlipFlop? Hierzu musste am D-Eingang eine "1" oder "0" anliegen und am Clock-Eingang eine steigende Flanke vorhanden sein. Wird aus dem DFlip-Flop gelesen, muss das entsprechende D-Flip-Flop zuerst ausgewählt und danach das anstehende Datum eingelesen werden. Selbstverständlich muss auch beim Lese-Vorgang die Information rechtzeitig anliegen und mit einer steigenden Flanke übernommen werden. Das Prinzip vom D-Flip-Flop lässt sich auf den Lesevorgang des Programmspeichers übertragen. Der µ-Controller muss zuerst die Speicherzelle auswählen, die er lesen soll. Dies geschieht durch Anlegen der Adresse. Nachdem die Speicherzelle im EPROM durch die Adresse - vom µController erzeugt - ausgewählt wurde, vergeht Zeit, bis der Speicherbaustein den Inhalt dieser Speicherzelle zu Verfügung stellen kann. Der Prozessor wartet auf die gültige Instruktion. Diese Zeit wird TAVIV (Adress to Valid Instruction in) genannt. Die vom Speicher ausgegebene Bitkombination liest der Prozessor ein. Die steigende Flanke des /PSEN-Signals entspricht hierbei dem Clock beim D-Flip-Flop. Entscheidend für das kor-
3 Aufbau von µ-Controllern der 8051-Familie
49
rekte Einlesen des Signals ist der durch den dicken Strich angedeutete Zustand der einzelnen Leitungen. Bei allgemeinen Prozessoren - wie 80286, 68000 - ist der Ablauf beim Lesen von Speichern völlig gleichartig. Da aber nicht zwischen HarvardArchitektur und Von-Neumann-Architektur unterschieden wird, ist bei diesen Prozessoren das /PSEN-Signal durch das /RD-Signal zu ersetzen.
Abb. 3.26 Prinzip für Lesen des Programmspeichers
Nach der Zeit TPLIV (/PSEN to valid instruction in) schaltet der Ausgang des Speicherbausteins vom hochohmigen in den niederohmigen Zustand. Für weitere Aktionen auf dem Datenbus muss der Datenbus wieder vom Ausgang des Programmspeichers getrennt werden. Die Zeit TPXIZ (Input instruction float after /PSEN) gibt der µ-Controller vor.
Abb. 3.27 Prinzip für Lesen des Programmspeichers
Leider sind die Verhältnisse im realen System noch etwas komplizierter, da meist mehrere Speicherbausteine in einem µ-Controllersystem enthalten sind. Außerdem liegt die Adresse bei den Intel-Prozessoren durch das Multiplex-Verfahren nicht immer vollständig an. An Port 0 liegen zuerst die Adresse und dann das Datum an. Kapitel 2 verdeutlicht diesen Sachverhalt im Bild S. 26 "Ablauf der multiplexten Adress-Daten-Zustände". Durch dieses Verfahren spielt das ALE-Signal (Adress Latch enable) eine zentrale Rolle beim Timing der 8051-Familie. Alle Zeiten hängen vom ALE Signal ab. ALE selbst wird wiederum vom Oszillator-Takt abgeleitet. Durch die fallende Flanke des ALE-Signals speichert das externe Latch die
50
Adressen A0-A7. Die Zeit, nachdem das ALE-Signal auf 0-Pegel ging, bis der µ-Controller die Instruktion einliest, wird TLLIV (ALE to valid instruction in) genannt. Die Zeitvorgaben sind damit durch den Prozessor festgelegt. Die entsprechenden Speicherbausteine werden durch diese Vorgaben ausgewählt. Der Anschluss der Speicherbausteine kann nun wiederum auf verschiedene Arten erfolgen. Zudem müssen drei verschiedene Speicherzugriffsarten betrachtet werden: 1. Programmspeicher lesen Program Memory Read Cycle 2. Datenspeicher lesenData Memory Read Cycle 3. Datenspeicher schreiben Data Memory Write Cycle ALE
t LLIV t PLIV PSEN t A0-A7
Port 0
PXIZ
Instr. N
A0-A7
t AVIV Port 2
A8-A15
Abb. 3.28 Programmspeicher lesen vereinfacht
Die jeweiligen Zeitangaben sind dem Datenblatt des gewählten Controllers zu entnehmen. Für die verschiedenen Anschlussmöglichkeiten und verschiedenen Speicherzugriffsarten werden die Zeitbedingungen nachfolgend durchgerechnet. 3.7.1 16K-EPROM an 80535 Port 0
74HC573
Low-Byte-Adresse / Datum
ALE
50
AdressLatch
Low-Byte-Adresse
Eprom
LE 11
Port 2
TMS 27128JL-25
High-Byte-Adresse 20
80535 /PSEN
49
Port 3
Abb. 3.29 Blockbild für einfache Timingberechnungen
22
/CE
/OE
3 Aufbau von µ-Controllern der 8051-Familie
51
Alle Bezeichnungen für das Timing werden prinzipiell aus der Sicht des Prozessors getroffen. Der Speicher wird an den Prozessor angepasst. t LHLL ALE
t AVLL
t PLPH t LLPL t LLIV t PLIV
PSEN t t
t AZPL t LLAX Port 0
A0-A7
t
PXAV PXIZ
PXIX
Instr. N
A0-A7
t AVIV Port 2
A8-A15
Abb. 3.30 Programmspeicher Lesezugriff vollständig
Die Bedingungen der zeitlichen Anforderungen bei Lesezugriff auf den Programmspeicher sind durch das Timing des µ-Controllers vorgegeben. Das Signal-Zeit-Diagramm für diese Anordnung - nämlich µ-Controller und EPROM - ist im nachfolgenden Bild zu sehen. Die Zeitangaben für das EPROM sind in Klammern gesetzt. Tprop (tACC)
ADDR:
TAVIV
P0:
INSTR.
PCL TLLIV
ALE:
(tCE) TPLIV
/PSEN
(tOE)
PCL tDF
TPXIZ tDF
Abb. 3.31 Zeitbedingungen für EPROM und 80C535 in einem Signal-ZeitDiagramm
52 Tabelle 3.6 Timing-Werte für Controller 80C535 und EPROM Symbol
Parameter
min 12MHz
(tACC) TAVIV (tCE) TLLIV (tOE) TPLIV (tDF) TPXIZ
Access time Eprom Adress to valid instruction in /CE to Output Valid ALE to valid instruction in /OE To Output Valid /PSEN to valid instruction in Output in High-Z Input instruction float after /PSEN
max 12MHz 250 302 250 233 70 150 60 63
Einheit ns ns ns ns ns ns ns ns
Die Bedingungen für diese Konfiguration mit dem Speicherbaustein EPROM 27128 -25 - die Zeitwerte für diesen Baustein sind eingeklammert - lauten: TAVIV - TPROP > 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 <85°C Tprop=44ns. Für die Zeit TAVIV gelten bei einem 12-MHzTakt maximal 302ns. Die Zugriffszeit tACC können wir direkt am EPROM lesen. Die Aufschrift AM27C256-25 bedeutet folgendes: • AM steht für die Herstellerfirma (AMD) • 27 steht für EPROM, • C steht für CMOS • 256 steht für 256 kBit = 32 KByte • -25 steht für die Zugriffszeit tACC=250 ns
TAVIV − Tprop > tACC 302ns − 44ns > 250ns
3 Aufbau von µ-Controllern der 8051-Familie
53
Es besteht also eine Reserve von 8 ns bei der Karte für diese Bedingung. Die zweite Bedingung für die Zeit tCE legt fest: Die Daten müssen nach der Zeit TLLIV auf dem Datenbus gültig sein. Das EPROM muss nach dieser Zeit die Daten auf den Bus gelegt haben.
TLLIV > tCE 233ns > 250ns Hier erkennen Sie, dass diese Zeit bei der obigen Schaltung nicht eingehalten wird! Trotzdem funktioniert ein Board mit solchen Bausteinen oft zuverlässig in normaler Umgebungstemperatur bzw. bei einem Los bestimmter Chips. Bei entsprechenden Umgebungsbedingungen ist aber dieses Board nicht zuverlässig. Ist ein solcher Fehler bei einer Produkthaftungsfrage nachweisbar, kann dies empfindliche Folgen nach sich ziehen. Bitte führen Sie immer Timingberechnungen durch! Spezifizieren Sie die Einsatz-Temperatur! Spezifizieren Sie den Prozessor-Takt! Die nächste Bedingung ist: Maximale Zeitdauer von der /PSEN-Ausgabe bis zur gültigen Instruktion auf dem Bus.
TPLIV > TOE
150ns > 100ns Die letzte Bedingung lautet: Die Instruktion aus dem EPROM muss nach einer maximalen Zeitdauer vom Bus genommen werden und in einen undefinierten Zustand DF (Data float) übergehen.
TPXIZ > tDF
63ns > 30ns Jetzt werden die Zeiten der EURO_535-Karte beim Zugriff auf das EPROM untersucht. Hierzu muss der Pfad beziehungsweise die Zeitbedingungen für das tCE-Signal des EPROMs genauer studiert werden. Zuvor sei jedoch eine Besonderheit der EURO_535-Karte erklärt. Infolge dieses Schaltungsteils kann diese Karte sehr universell eingesetzt werden. Durch Vertauschen der beiden Speicherbausteine EPROM und RAM können beliebige Programme auf die Karte heruntergeladen werden.
54 Vor Adreßspiegelung
Nach Adreßspiegelung
0000H
0000H RAM
ROM bzw. EPROM 7FFFH 8000H
7FFFH 8000H ROM bzw.
RAM
EPROM FFFFH
FFFFH
Abb. 3.32 Vor und nach der Adressspiegelung
Wenn Sie einen µ-Controller einschalten, beginnt der Programmzähler immer bei 0. Hier muss also der erste auszuführende Befehl stehen. Bei der EURO_ 80535-Karte steht im EPROM als erste Anweisung ein Befehl, der auf die Adresse 8000h zugreift. Hierdurch wird eine besondere Adressumschaltung ausgelöst. Nach dem Einschalten oder nach einem Reset ist folgender schaltungstechnischer Zustand auf der Karte gegeben:
Abb. 3.33 Zustand nach dem Einschalten oder Reset
Nach einem Reset wird das Flip-Flop am Q-Ausgang eine "0" zeigen. Die Adressleitung A15 besitzt ebenfalls einen Low-Pegel. Damit liegt an /CE des EPROMs eine "0". Wird das EPROM auch mit einem 0-Pegel an /OE beschaltet, werden Daten auf den Datenbus gelegt. Auf der Speicherstelle 0 wird der erste Befehl vom Prozessor gelesen. Bei unserem EPROM steht dort ein Sprung nach Speicherstelle 8000h. Damit wird A15 auf High-Pegel gesetzt. Es gilt das nächste Bild.
3 Aufbau von µ-Controllern der 8051-Familie
55
Abb. 3.34 Zustand bei Zugriff auf Adresse > 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
50
AdressLatch 11
Low-Byte-Adresse
RAM
LE
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
Port 0
t RHDZ
LLAX2
A0-A7 from Ri or DPL t
t RHDX
t RLAZ 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 TRLDV > tCE >tOE Daten auf Datenbus TRHDZ > tDF Datenbus freigeben´ 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 252ns > 100ns>50ns Daten auf Datenbus 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
Port 0
t RHDZ
LLAX2
A0-A7 from Ri or DPL t
t RHDX
t RLAZ
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
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 Ω
1,8k Ω
1,8k Ω
L1
L2
L3
VGC19
S2.1
VGA19
P3.3
P3.2 P1.1 VGC13
S2.2
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
⇔
Prototyp Software Design
⇔
Prototyp Software Codierung
⇔
Prototyp Software Endtest
System Integration
Beginn der Produktion
Abb. 4.20 Entwicklungsablauf
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_3.ASM
BSP_2.ASM
BSP_1.ASM
BSP_4.C
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
Die Assembler-Anweisungen im Detail
4.9.1 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 18H 17H 10H 0FH 08H 07H
Registerbank 3 Registerbank 2 Registerbank 1 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
RAM
nur indirekt adressierbar
ü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 RAM BIT ADRESS RAUM 1FH Registerbänke 00H
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
2FH
0000H
0000H
1FH 00H
BSEG Registerbänke
ISEG 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 } ] * PAGING PI / [ { _ NOPAGING } ] * NOPI [ { _ 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 ]* [ { _ TITLE no TITLE TT ('<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 <= n <= 132) Aufteilung bzw. Nichtaufteilung der Übersetzungsliste in Seiten mit Überschrift Erstellung bzw. Unterdrückung einer Übersetzungs-Listendatei Reservierung der benutzten Registerbänke im Programm Modul. Mit NORB wird keine Registerbank reserviert
Wiederaktivierung der zuletzt sichergestellten Steuerparameter LIST, GEN Sicherstellen der augenblicklichen Zustände der Steuerparameter LIST, GEN Aufnahme bzw. Unterdrückung der Symboltabelle in die Übersetzungsdatei Ausgabe der Zeichenfolge <string> in der Übersetzungszeile (max. 60 Zeichen) einer jeden Seite der List-Datei Zuweisung Laufwerke für temporäre Arbeitsdateien des Assemblers Aufnahme bzw. Unterdrückung der SymbolQuerverweisliste in die Übersetzungsdatei
Die mit einem Stern markierten Anweisungen - "Primary controls" - an den Assembler müssen zu Beginn eines Programmes stehen. Die anderen Anweisungen – „General controls“ - können an jeder Stelle des Programmes auftauchen. Die in diesem Buch am häufigsten benutzten Anweisungen für den Assembler sind nachfolgend aufgeführt:
4 Assembler für die 8051-Controller-Familie 95 §nomod51 §debug $nolist $include(reg535.pdf) $list §title ()
Um dem Assembler die zusätzlichen Register namentlich bekannt zu machen, muss eine neue *.pdf-Datei eingebunden werden. Zuvor muss die voreingestellte 8051.pdf-Datei ungültig gemacht werden. Bevor die neue *.pdf-Datei eingebunden wird, sollten zuerst die beiden Befehle "debug" und "nolist" ausgeführt werden. Die neue *.pdf-Datei muss noch im richtigen Verzeichnis stehen. Sicherheitshalber kopieren Sie diese Datei bei einem neuen Projekt in das Projektverzeichnis. Um zu debuggen, müssen Sie die Symboltabelle in die Objektcodedatei einbinden. Diese Prozedur ist sowohl beim Arbeiten mit einem RemoteDebug-System, als auch beim Arbeiten mit einem Emulator notwendig. Die Anweisung "nolist" verhindert das Ausdrucken der vollständigen Registerliste bei jedem Listing. Der Befehl "title()" erstellt auf jeder Seite des Listings eine Überschrift. 4.12
Stack
Der Stack ist im internen RAM des 8051-Prozessors angelegt. Die Adresse wird vom Stack-Pointer erzeugt und verwaltet. Dieser zeigt immer auf die oberste Adresse im Stack. Der Stack ist als LIFO (Last-In-First-Out) organisiert und dient in erster Linie dazu, den Inhalt des Programmzählers bei Unterprogrammaufrufen und Interrupts zwischenzuspeichern. Er ist sowohl zur Speicherung von Daten als auch zur Speicherung des Programmstatuswortes PSW mit Hilfe der Befehle POP und PUSH zu benutzen. Der Stack-Pointer ist ein 8 Bit breites Register, das eine beliebige Adresse des internen RAM-Speichers enthält. Die Adresse darf beim 8051Controller nicht größer als 127 sein. Bei Derivaten des 80535 können alle 256 Byte adressiert werden. Der Stack-Pointer enthält immer die Adresse des letzten, auf den Stack gelegten Bytes. Beim Einschalten des Prozessors wird der Stack-Pointer auf 07H gesetzt, so dass das erste nach dem Einschalten durch PUSH gespeicherte Byte die Adresse 08H hat. Dies geschieht aus Kompatibilitätsgründen zum 8048-Controller.Da die Adresse 08H jedoch im Bereich der Registerbänke von 00H-1FH befindet, wird normalerweise der Stack-Pointer mit dem Befehl MOVE SP,#99 auf die Adresse 99 gestellt.
96
Stack: die wichtigsten Fakten • • • • • • • • • •
LIFO -Organisation Last In First Out PUSH dadr: Inhalt von dadr (direct adress) wird auf Stack gelegt. SP=SP+1 POP dadr: Inhalt von Stack wird auf dadr (direct adress) gelegt. SP=SP-1 LCALL, ACALL, CALL, RET, RETI Nutzung für Datenspeicherung, PSW STACK-POINTER 8 Bit - Adresse für internen RAM 8051 Adresse darf 127 nicht überschreiten. Nach RESET SP=07H - aufgrund Kompatibilität zum 8048 MOV SP,#2Fh Initialisiert Stack, um auf Adresse 30h = 48d Daten abzulegen. HW inkrementiert Stack vor PUSH STACK: DS 10H Reserviert 10 Byte für Stack (gering)
4.13
Special Function Register
Special Function Register sind 1 Byte breite Register, die im internen Datenspeicher von 80H-FFH liegen können. Ein Special Function Register ist beispielsweise das PSW - Program Status WORD. Die Adressierung erfolgt direkt. 4.14
Program Status Word
Die Bedeutung der einzelnen Bits geht aus der jeweiligen Beschreibung hervor. Tabelle 4.7 Program Status Word - Programm-Status-Wort Abkürzung CY AC F0 RS1 RS0 OV F1 P
BIT BIT BIT BIT BIT BIT BIT BIT
Adresse 0D7H 0D6H 0D5H 0D4H 0D3H 0D2H 0D1H 0D0H
Bedeutung 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 gesetzt, rückgesetzt, ODD-EVEN von Akkumulator
4 Assembler für die 8051-Controller-Familie 97
Die Multitasking-Fähigkeit des 8051 resultiert aus den vier verschiedenen Registerbänken des 8051. Durch die Bits: RS1, RS0 im ProgrammStatus-Wort wird die Registerbank festgelegt. Die ersten 32 Adressen im internen RAM sind unterteilt in vier Registerbänke. Warum ist diese Unterteilung sinnvoll? Infolge einer solchen Unterteilung kann man verschiedene Aufgaben quasi gleichzeitig durchführen und jeder Aufgabe eine Registerbank zuweisen. Durch diese Aufteilung ergibt sich zwangsläufig eine klare Trennung zwischen den einzelnen Aufgaben und deren zugehörigen Registerbänken. Eine Zusammenstellung der Special Function Register für den 8051und 80C535- Controller finden Sie in der folgenden Tabelle. Tabelle 4.8 Special Function Register nach funktionellen Gruppen Block
Symbol
Register
Adresse
CPU
ACC B DPTR
Akkumulator Hilfsregister B Datenzeiger, High Byte Low Byte Programm-Status-Wort Stapel-Zeiger Programm-Zähler Interrupt-Freigabe Interrupt-Priorität Port 0 Port 1 Port 2 Port 3 Serielle Port Kontrolle Serielle Ein-/ Ausgangspuffer Zeitgeberkontrolle Zeitgebermodus Zählerinhalt Zeitgeber 0
0E0H1) 0F0H1) 83H 82H 0D0H1) 81H
Interrupt System Ports
Serielle Schnittstelle Timer 0/ Timer 1
Interrupt System
PSW SP PC IE IP P0 P1 P2 P3 SCON SBUF TCON TMOD TH0, TL0 TH1, TL1 IEN0 IEN1
Zählerinhalt Zeitgeber 1
0A8H1) 0B8H1) 80H1) 90H1) 0A0H1) 0B0H1) 098H1) 99H 88H1) 89H 8CH 8AH 8DH 8BH
80535-Erweiterung Interrupt-Freigabe-Register 0 0A8H1) Interrupt-Freigabe-Register 1 0B8H1)
Wert nach Reset 00H 00H 0000H 00H 07H 0000H 00H 00H 0FFH 0FFH 0FFH 0FFH 00H undefined 00H 00H 0000H 0000H
00H 00H
98 Block
Symbol
Register
Adresse Wert nach Reset
IP0 IP1
Interrupt Priorität Register 0 Interrupt Priorität Register 1
0A9H 0B9H
Interrupt Anforderung Kontrolle Zeitgeber 1 Kontrolle Zeitgeber 2 Kontrolle Port 4 Port 5 Port 6, Analog/Digital Input Energiespar-Modus Power Control Register A/D Wandlung, aber hier 7. Bit BD Baudrate 4800/9600 Power Control, aber hier 7. Bit SMOD Baudrate verdoppelt Vergleich Übernahme Freigabe Vergleich Übernahme Register 1
0C0H1) 88H1) 0C8H1) 0E8H1) 0F8H1) 0DBH 87H 00H
IRCON TCON2) T2CON2) Ports P4 P5 P6 Power Saving PCON Mode Serielle ADCON Schnittstelle PCON2) Compare/ Capture -Unit (CCU)
A/D Wandler
CCEN CCH1 CCL1 CCH2 CCL2 CCH3 CCL3 CCH4 CCL4 CRCH CRCL TH2 TL2 T2CON ADCON ADDAT DAPR
00H XX00 0000B3) 00H 00H 00H 0FFH 0FFH
0D8H1) 00H 87H
0C1H 0C3H 0C2H Vergleich Übernahme Register 2 0C5H 0C4H Vergleich Übernahme Register 3 0C7H 0C6H Vergleich Übernahme Register 4 0CFH 0CEH Vergleich /Lade/Übernahme 0CBH Register 0CAH Zählerinhalt Zeitgeber 2 0CDH 0CCH Zeitgeberkontrolle 2 0C8H1) A/D-Wandler Kontrolle 0D8H1) A/D-Wandler Datenregister 0D9H D/A-Wandler Kontrolle 0DAH
undefined 00H 00H 00H 00H 00H 00H 0000H 00H 00H 00H 00H
1) Bitadressierbares Spezial Register 2) Wurde doppelt aufgeführt, da einige Bits auch zu anderen Funktionen gehören 3) X= Der Wert ist unbestimmt und reserviert
4 Assembler für die 8051-Controller-Familie 99
4.15
Die Befehle für die 8051 µ-Controller-Familie
Selbstverständlich könnten wir nunmehr alle Register und die dazugehörigen Befehle einzeln analysieren. Der Erfolg einer solchen Analyse ist jedoch sehr zweifelhaft. Deshalb werden nach einer Einführung in den Befehlssatz einfache Projekte realisiert, um die einzelnen Befehle praktisch anwenden zu können. Anschließend wird ein größeres Projekt "Effektivwertmessung" angegangen und modular programmiert. • • • • • •
Die Befehle können in folgende Hauptgruppen eingeteilt werden: Transfer Befehle Transport von Speicherinhalten Boolean Instructions Logisches Verknüpfen von Daten Instructions for Bit Manipulation Bearbeiten der einzelnen Bits Arithmetic Instructions Ausführung von arithmetischen Operationen Shift Instructions Verschieben von Daten innerhalb eines Registers Branch Instructions Verzweigen des Programmflusses
Alle 8051 Befehle sind ab Seite 100 aufgeführt. Tabelle 4.9 Wichtige Schreibweisen und Bedeutungen für die Befehle Abkürzung #data data addr Rr @Rr code addr
A C bit addr / bit addr DPTR PC AB
Bedeutung Daten sind in der Instruktion codiert - # = Zahl Speicheradresse innerhalb des Chips 0 ≤ r ≤ 7 Allgemein verwendbares Register der Registerbänke 0 ≤ r ≤ 1 indirekt adressierbares Register der Registerbänke 16-Bit-Adresse decodiert als: volle 16-Bit-Adresse 11-Bit-Seitenadresse 8-Bit relativer Offset Akkumulator Carry Flag Bit-Adresse auf dem Chip Komplementierter Inhalt der Bit-Adresse Datenzeiger ( Data Pointer ) Programmzähler ( Program Counter ) Register Paar
100 Mnemonic
Register
Incoding Binary
Inc. HEX
Affec ted Flags
Bytes CyclesFunction
Funktionsbeschreibung
Transfer Instructions Internal RAM mov A,Rr
r=0-7
11101rrr
E8+r
P
1
1
mov Rr,A
r=0-7
11111rrr
F8+r
-
1
1
mov A,@Ri
i=0-1
1110011i E6+i
P
1
1
mov @Ri,A
i=0-1
1111011i F6+i
-
1
1
mov A,dadr*
-
11100101 E5
P
2
1
mov dadr,A
-
11110101 F5
-
2
1
mov A,#const8
-
01110100 74
P
2
1
mov Rr,#const8 r=0-7
01111rrr
78+r
-
2
1
mov @Ri,#const8
i=0-1
0111011i 76+i
-
2
1
mov dadr,#const8 mov Rr,dadr
-
01110101 75
-
3
2
r=0-7
10101rrr
A8+r
-
2
2
mov dadr,Rr
r=0-7
10001rrr
88+r
-
2
2
mov dadr,@Ri
i=1-0
1000011i 86+i
-
2
2
mov @Ri,dadr
i=0-1
1010011i A6+i
-
2
2
mov dadr1,dadr2 -
10000101 85
-
3
2
mov DPTR,#const16
-
10010000 90
-
3
2
movx A,@Ri
i=0-1
1110001i E2+r
P
1
2
movx @Ri,A
i=0-1
1111001i F2+i
-
1
2
movx A,@DPTR
-
11100000 E0
P
1
2
movx @DPTR,A
-
11110000 F0
-
1
2
xch A,Rr
r=0-7
11001rrr
P
1
1
xch A,dadr
-
11000101 C5
P
2
1
xch A,@Ri
i=0-1
1100011i C6+i
P
1
1
xchd A,@Ri
i=0-1
1101011i D6+i
P
1
1
swap A
-
11000100 C4
-
1
1
push dadr
-
11000000 C0
-
2
2
pop dadr
-
11010000 D0
-
2
2
Move register Rr contents to Lade Akkumulator mit Inhalt von Reaccumulator gister Rr Move accumulator contents to Lade Register Rr mit Inhalt des Akregister Rr kumulators Move contents of data memory Lade Akkumulator mit dem Inhalt der addressed by Ri to accumula- internen Datenspeicherzelle, die durch tor den Inhalt von Ri adressiert ist Move accumulator to data Lade interne Datenspeicherzelle, die memory addressed by Ri durch den Inhalt von Ri adressiert ist, mit dem Inhalt des Akkumulators Move contents of direct add- Lade Akkumulator mit Inhalt von dadr ress to accumulator (mov (mov A,ACC ist kein gültiger Befehl) A,ACC is not a valid instruction) Move accumulator contents to Lade dadr mit Inhalt des Akkumuladirect address tors Move immediate data to acLade Akkumulator mit 8 Bit Konstante cumulator Move immediate data to regis- Lade Register Rr mit 8 Bit Konstante ter Move immediate data to data Lade interne Datenspeicherzelle, die memory addressed by Ri durch den Inhalt von Ri adressiert ist, mit 8 Bit Konstante Move immediate data to data Lade dadr mit 8 Bit Konstante memory Load register Rr with contents Lade Register Rr mit Inhalt von dadr of direct address Load direct address with con- Lade dadr mit Inhalt von Register Rr tents of register Move contents of data memory Lade dadr mit Inhalt der Datenspeiaddressed by Ri to direct add- cherzelle, die durch Ri adressiert ist ress Move data memory to contents Lade interne Datenspeicherzelle, die of data memory addressed by durch Ri adressiert ist, mit Inhalt von Ri dadr Move data memory to data Lade dadr1 mit Inhalt von dadr2 memory Move immediate data to data Lade Daten-Pointer DPTR mit 16 Bit pointer Konstante Transfer Instructions External RAM Move contents of external data Lade Akkumulator mit dem Inhalt der memory addressed by Ri to ac- externen Datenspeicherzelle, die durch cumulator Ri adressiert ist Move accumulator contents to Lade externe Datenspeicherzelle, die external data memory, addres- durch den Inhalt von Ri adressiert ist, sed by Ri mit dem Inhalt des Akkumulators Move contents of external data Lade Akkumulator mit dem Inhalt der memory addressed by DPTR to externen Datenspeicherzelle, die durch accumulator DPTR adressiert ist Move accumulator contents to Lade externe Datenspeicherzelle, die external data memory, addres- durch den Inhalt von DPTR adressiert sed by DPTR ist, mit dem Inhalt des Akkumulators Transfer Instructions Internal RAM
C8+r
Exchange accumulator and register contents Exchange accumulator and data memory contents Exchange accumulator and data memory addressed by Ri
Vertausche die Inhalte von Akkumulator und Register Rr Vertausche die Inhalte von Akkumulator und dadr Vertausche die Inhalte von Akkumulator und der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist Exchange low order nibble of Vertausche die Inhalte der niederweraccumulator and data memory tigen Halbbytes von Akkumulator und der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist Exchange nibbles of accumula- Vertausche die Bytehälften des Akkutors mulators Increment stack pointer. Der Stack-Pointer wird um 1 erhöht Push data memory onto stack Der Inhalt von dadr wird im Stack abgelegt Pop data memory form stack Übertrage den Inhalt der durch den Decrement stack pointer Stack-Pointer adressierten Datenspeicherzelle nach dadr; der StackPointer wird um 1 erniedrigt
4 Assembler für die 8051-Controller-Familie 101 Mnemonic
Register
Incoding Binary
Inc. HEX
Affec ted Flags
Bytes CyclesFunction
Funktionsbeschreibung
movc A,@A+DPTR
-
10010011 93
P
1
2
movc A,@A+PC
-
10000011 83
P
1
2
Mnemonic
Register
Incoding Binary
Bytes Cycl es
Function
anl A,Rr
r=0-7
01011rrr 58+r
Affec ted Flags P
1
1
anl A,@Ri
i=0-1
0101011i 56+1
P
1
1
anl A,dadr
-
01010101 55
P
2
1
anl A,#const8
-
01010100 54
P
2
1
anl dadr,A
-
01010010 52
-
2
1
anl dadr,#const8 -
01010011 53
-
3
2
Logical AND accumulator with Der Akkumulator wird überschrieben register contents to accumula- durch das Ergebnis der UNDtor Verknüpfung von Akkumulator und dem Inhalt von Register Rr Logical AND accumulator with Der Akkumulator wird überschrieben data memory contents addres- durch das Ergebnis der UNDsed by Ri to accumulator Verknüpfung von Akkumulator und dem Inhalt der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist Logical AND accumulator with Der Akkumulator wird überschrieben contents of direct adress to durch das Ergebnis der UNDaccumulator Verknüpfung von Akkumulator und dem Inhalt von dadr Logical AND accumulator with Der Akkumulator wird überschrieben immediate data to accumula- durch das Ergebnis der UNDtor Verknüpfung von Akkumulator und der 8 Bit Konstanten Logical AND accumulator with Der Inhalt von dadr wird überschriecontents of direct adress to di- ben durch das Ergebnis der UNDrect adress Verknüpfung von Akkumulator und dem Inhalt von dadr Logical AND contents of direct Der Inhalt von dadr wird überschrieaddress and immediate data toben durch das Ergebnis der UNDdirect address Verknüpfung der 8 Bit Konstanten mit dem Inhalt von dadr
orl A,Rr
r=0-7
01001rrr
48+r
P
1
1
orl A,@Ri
i=0-1
0100011i 46+1
P
1
1
orl A,dadr
-
01000101 45
P
2
1
orl A,#const8
-
01000100 44
P
2
1
orl dadr,A
-
01000010 42
-
2
1
orl dadr,#const8 -
01000011 43
-
3
2
xrl A,Rr
r=0-7
01101rrr
68+r
P
1
1
xrl A,@Ri
i=0-1
0110011i 66+1
P
1
1
Transfer Instructions ROM Move program memory addres- Lade Akkumulator mit dem Inhalt der sed by accumulator plus DPTR Programmspeicherzelle, die durch die to accumulator Summe von DPTR und Akkumulator adressiert ist Move program memory addres- Lade Akkumulator mit dem Inhalt der sed by accumulator plus prog- Programmspeicherzelle, die durch die ram counter to accumulator Summe von Programmzähler und Akkumulator adressiert ist Boolean Instructions AND Inc. HEX
Funktionsbeschreibung
Boolean Instructions OR Logical OR accumulator with Der Akkumulator wird überschrieben register contents to accumula- durch das Ergebnis der ODERtor Verknüpfung von Akkumulator und dem Inhalt von Register Rr Logical OR accumulator with Der Akkumulator wird überschrieben data memory contents addres- durch das Ergebnis der ODERsed by Ri to accumulator Verknüpfung von Akkumulator und dem Inhalt der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist Logical OR accumulator with Der Akkumulator wird überschrieben contents of direct adress to ac- durch das Ergebnis der ODERcumulator Verknüpfung von Akkumulator und dem Inhalt von dadr Logical OR accumulator with Der Akkumulator wird überschrieben immediate data to accumulator durch das Ergebnis der ODERVerknüpfung von Akkumulator und der 8 Bit Konstanten Logical OR accumulator with Der Inhalt von dadr wird überschriecontents of direct adress to di- ben durch das Ergebnis der ODERrect adress Verknüpfung von Akkumulator und dem Inhalt von dadr Logical OR contents of direct Der Inhalt von dadr wird überschrieaddress and immediate data to ben durch das Ergebnis der ODERdirect address Verknüpfung der 8 Bit Konstanten und dem Inhalt von dadr Boolean Instructions EXCLUSIVE OR Logical XOR accumulator with Der Akkumulator wird überschrieben register contents to accumula- durch das Ergebnis der EXODERtor Verknüpfung von Akkumulator und dem Inhalt von Register Rr Logical XOR accumulator with Der Akkumulator wird überschrieben data memory contents addres- durch das Ergebnis der EXODERsed by Ri to accumulator Verknüpfung von Akkumulator und dem Inhalt der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist
102 Mnemonic
Register
Incoding Binary
Inc. HEX
xrl A,#const8
-
01100100 64
xrl dadr,A
-
01100010 62
xrl dadr,#const8 -
01100011 63
Affec Bytes CyclesFunction Funktionsbeschreibung ted Flags P 2 1 Logical XOR accumulator with Der Akkumulator wird überschrieben immediate data to accumulator durch das Ergebnis der EXODERVerknüpfung von Akkumulator und der 8 Bit Konstanten 2 1 Logical XOR accumulator with Der Inhalt von dadr wird überschriecontents of direct adress to di- ben durch das Ergebnis der EXODERrect adress Verknüpfung von Akkumulator und dem Inhalt von dadr 3 2 Logical XOR contents of direct Der Inhalt von dadr wird überschrieaddress and immediate data to ben durch das Ergebnis der EXODERdirect address Verknüpfung der 8 Bit Konstanten und dem Inhalt von dadr Boolean Instructions COMPLEMENT / CLEAR ACC.
cpl A
-
11110100 F4
P
1
1
Complement accumulator
clr A
-
11100100 E4
P
1
1
Clear accumulator
Komplementiere Akkumulator (Einer Komplement) Lösche den Akkumulator
Instructions for Bit Manipulation TRANSFER / AND / OR / CLEAR / COMPLEMENT / SET Mnemonic
Register
Incoding Binary
mov C,badr
-
mov badr,C
-
anl C,badr
Inc. HEX
Byt- Cyc es les
Function
Funktionsbeschreibung
10100010 A2
Affec ted Flags CY
2
1
-
2
2
-
10000010 82
CY
2
2
Move contents of bit adress to carry Move contents of carry to bit adress Logical AND carry with contents of bit adress
Lade Carry mit Inhalt von badr
10010010 92
anl C,/badr
-
10110000 B0
CY
2
2
orl C,badr
-
01110010 72
CY
2
2
orl c,/badr
-
10100000 A0
CY
2
2
clr C clr badr cpl C cpl badr
-
11000011 11000010 10110011 10110010
C3 C2 B3 B2
CY CY -
1 2 1 2
1 1 1 1
setb C setb badr
-
11010011 D3 11010010 D2
CY -
1 2
1 1
Lade badr mit Inhalt des Carry
Das Carry wird überschrieben durch das Ergebnis der UND-Verknüpfung von Carry und Inhalt von badr Logical AND carry with comp- Das Carry wird überschrieben durch lement of contents of bit addas Ergebnis der UND-Verknüpfung ress von Carry und dem invertierten Inhalt von badr Logical OR carry with contents Das Carry wird überschrieben durch of bit adress das Ergebnis der ODER-Verknüpfung von Carry und Inhalt von badr Logical OR carry with comple- Das Carry wird überschrieben durch ment of contents of bit address das Ergebnis der ODER-Verknüpfung von Carry und dem invertierten Inhalt von badr Clear carry Carry löschen Clear contents of bit adress Lösche Inhalt von badr Complement carry Carry invertieren Complement contents of bit Invertiere Inhalt von badr address Set carry Carry setzen Set contents of bit address Setze Inhalt von badr Arithmetic Instructions ADD
add A,Rr
r=0-7
00101rrr
28+r
CY,AC, 1 OV,P
1
add A,@Ri
i=0-1
0010011i 26+1
CY,AC, 1 OV,P
1
add A,dadr
-
00100101 25
CY,AC, 2 OV,P
1
add A,#const8
-
00100100 24
CY,AC, 2 OV,P
1
addc A,Rr
r=0-7
00111rrr
38+r
CY,AC, 1 OV,P
1
addc A,@Ri
i=0-1
0011011i 36+1
CY,AC, 1 OV,P
1
addc A,dadr
-
00110101 35
CY,AC, 2 OV,P
1
Add register contents to accumulator
Der Akkumulator wird überschrieben durch das Ergebnis der Addition von Akkumulator und dem Inhalt von Register Rr Add contents of data memory Der Akkumulator wird überschrieben addressed by Ri to accumula- durch das Ergebnis der Addition von tor Akkumulator und dem Inhalt der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist Add contents of direct adress Der Akkumulator wird überschrieben to accumulator durch das Ergebnis der Addition von Akkumulator und dem Inhalt von dadr Add immediate data to accu- Der Akkumulator wird überschrieben mulator durch das Ergebnis der Addition von Akkumulator und der 8 Bit Konstanten Add carry and register conDer Akkumulator wird überschrieben tents to accumulator durch das Ergebnis der Addition von Akkumulator und dem Inhalt von Register Rr und dem Inhalt des CarryFlags Add carry and contents of data Der Akkumulator wird überschrieben memory addressed by Ri to durch das Ergebnis der Addition von accumulator Akkumulator, dem Inhalt der internen Datenspeicherzelle, die durch den Inhalt von Ri adressiert ist, und dem Inhalt des Carry-Flags Add carry and contents of di- Der Akkumulator wird überschrieben rect adress to accumulator durch das Ergebnis der Addition von Akkumulator dem Inhalt von dadr und dem Inhalt des Carry-Flags
4 Assembler für die 8051-Controller-Familie 103 Mnemonic
Register
Incoding Binary
inc A
-
inc Rr
r=0-7
inc @Ri
Inc. HEX
Bytes CyclesFunction
Funktionsbeschreibung
00000100 04
Affec ted Flags P
1
1
Increment accumulator
00001rrr
08+r
-
1
1
Increment register
i=0-1
0000011i 06+1
-
1
1
Increment data memory contents addressed by Ri
inc dadr
-
00000101 05
-
2
1
inc DPTR
-
10100011 A3
-
1
2
Increment contents of direct address Increment data pointer
Zum Inhalt des Akkumulators wird 1 addiert Zum Inhalt des Registers Rr wird 1 addiert Zum Inhalt der internen Datenspeicherzelle, die durch Ri adressiert ist, wird 1 addiert Zum Inhalt von dadr wird 1 addiert
da A
-
11010100 D4
CY,P
1
1
Decimal adjust accumula- Das Ergebnis einer vorangegangenen Adtor for addition dition zweier BCD-Zahlen wird unter Berücksichtigung von Carry und Hilfscarry wieder zu 2 BCD-Ziffern korrigiert
subb A,Rr
r=0-7
10011rrr
98+r
CY,AC, 1 OV,P
1
subb A,@Ri
i=0-1
1001011i 96+i
CY,AC, 1 OV,P
1
subb A,dadr
-
10010101 95
CY,AC, 2 OV,P
1
subb A,#const8 -
10010100 94
CY,AC, 2 OV,P
1
dec A
-
00010100 14
P
1
1
dec Rr
r=0-7
00011rrr
18+r
-
1
1
dec @Ri
i=0-1
0001011i 16+1
-
1
1
dec dadr
-
00010101 15
-
2
1
Subtract sum of register Die Summe der Inhalte von Carry und and carry from accumulator Register Rr wird vom Akkumulator subtrahiert. Das Ergebnis überschreibt den Akkumulator Subtract sum of contents of Die Summe der Inhalte von Carry und data memory addressed by der internen Datenspeicherzelle, die Ri to accumulator durch Ri adressiert ist, wird vom Akkumulator subtrahiert. Das Ergebnis überschreibt den Akkumulator Subtract sum of contents of Die Summe der Inhalte von Carry und direct adress and carry from der Adresse dadr wird vom Akkumulator accumulator subtrahiert. Das Ergebnis überschreibt den Akkumulator Subtract sum of immediate Die Summe der Inhalte von Carry und data der 8 BitKonstanten wird vom Akkumulaand carry form accumulator tor subtrahiert. Das Ergebnis überschreibt den Akkumulator Decrement accumulator Vom Inhalt des Akkumulators wird 1 subtrahiert Decrement register Vom Inhalt des Registers Rr wird 1 subtrahiert Decrement data memory Vom Inhalt der internen Datenspeichercontents zelle, die durch Ri adressiert ist, wird 1 addressed by Ri subtrahiert Decrement contents of di- Vom Inhalt von dadr wird 1 subtrahiert rect address
mul AB
-
10100100 A4
CY,OV, 1 P
4
Multiply accumulator with B-register
div AB
-
100100100A4
CY,OV, 1 P
4
Divide accumulator by Bregister
rl A
-
00100011 23
-
1
1
Rotate left without carry
rlc A
-
00110011 33
CY,P
1
1
Rotate left through carry
rr A
-
00000011 03
-
1
1
Rotate right without carry
rrc A
-
00010011 13
CY,P
1
1
Rotate left through carry
Zum Inhalt des Registers DPTR wird 1 addiert
Arithmetic Instructions DECIMAL ADJUSTING
Arithmetic Instructions SUBTRACT
Arithmetic Instructions MULTIPLY / DIVIDE Die Inhalte von Akkumulator und BRegister werden multipliziert. Das niederwertige Byte des Produktes überschreibt den Akkumulator, das höherwertige Byte das B-Register. Das Carry wird gelöscht, das OV-Bit wird gesetzt, wenn das Ergebnis im B-Register ≠ 0 ist Der Inhalt des Akkumulators wird durch den Inhalt des B-Registers dividiert. Der Quotient überschreibt den Akkumulator, der Rest das B-Register. Das Carry wird gelöscht. Bei Division durch 0 wird das OV-Bit gesetzt Shift Instructions Verschiebe den Inhalt des Akkumulators um 1 Stelle nach links. Die Stelle 27 wird zur Stelle 20 verschoben Verschiebe den Inhalt des Akkumulators um 1 Stelle nach links über das Carry. Das Carry wird an die Stelle 20 verschoben Verschiebe den Inhalt des Akkumulators um 1 Stelle nach rechts. Die Stelle 20
wird zur Stelle 27 verschoben Verschiebe den Inhalt des Akkumulators um 1 Stelle nach rechts. Das Carry wird an die Stelle 27 verschoben
104 Branch Instructions Unconditional Jumps Mnemonic
Register
Incoding Binary
ljmp adr16
-
Inc. Affec By Cyc Function HEX ted tesles Flags 00000010 02 3 2 Jump to absolute address
sjmp rel
-
10000010 80
-
2 2
ajmp adr11
-
See Table Branch ins
-
2 2
jmp adr
-
-
-
-
jmp @A+DPTR
-
01110011 73
-
1 2
jc rel
-
01000000 40
-
2 2 Jump if carry is set
jnc rel
-
01010000 50
-
2 2
jb badr,rel
-
00100000 20
-
3 2
jnb badr,rel
-
00110000 30
-
3 2
jnb rel
-
01010000 50
-
3 2
jbc badr,rel
-
00010000 10
-
3 2
jz rel
-
01100000 60
-
2 2
jnz rel
-
01110000 70
-
2 2
cjne A,dadr,rel
-
10110101 B5
CY 3 2
cjne A,#const8,rel
-
10110100 B4
CY 3 2
cjne Rr,#const8,rel
0-7
10111rrr
B8+r
CY 3 2
cjne i=0-1 @Ri,#const8,rel
1011011i B6+i
CY 3 2
djnz Rr,rel
r=0-7
11011rrr
-
2 2
djnz dadr,rel
-
11011101 D5
-
3 2
-
-
Funktionsbeschreibung
Setze das Programm bei der 16 Bit Adresse adr 16 fort Setze das Programm relativ zum Programmzähler fort Jump to absolute address Setze das Programm bei der 11 Bit Adresse adr 11 innerhalb der 2K, auf die der Programmzähler zeigt, fort Generic Jump ASM 51 generiert einen sjmp, ajmp, ljmp Befehl in Abhängigkeit der Entfernung des Sprungzieles. (Bei Vorwärts-Referenz wird grundsätzlich LJMP eingesetzt). Jump to sum of accumulator Setze das Programm an der Adresse fort, die and data sich aus der Summe von Akkumulator und DPTR pointer ergibt Jump to relative address
Branch Instructions Conditional Jumps
D8+r
Springe relativ zum Programmzähler, wenn Carry = 1 ist Jump if carry is not set Springe relativ zum Programmzähler, wenn Carry = 0 ist Jump if bit is set Springe relativ zum Programmzähler, wenn der Inhalt von badr = 1 ist Jump if bit is not set Springe relativ zum Programmzähler, wenn der Inhalt von badr = 0 ist Jump if bit is not set Springe relativ zum Programmzähler, wenn der Inhalt von badr = 0 ist Jump and clear if bit is set Springe relativ zum Programmzähler, wenn der Inhalt von badr = 1 ist und lösche den Inhalt von badr Jump relative if accumulator Springe relativ zum Programmzähler, wenn der is set Akkumulator =0 ist Jump relative if accumulator Springe relativ zum Programmzähler, wenn der is not zero Akkumulator ≠0 ist Compare memory to accumu- Springe relativ zum Programmzähler, wenn die lator. Jump Inhalte von Akkumulator und dadr ungleich sind. if not equal Das Carry wird gesetzt, wenn dadr größer ist, sonst wird es rückgesetzt Compare immediate data to Springe relativ zum Programmzähler, wenn der accumuInhalte des Akkumulators ungleich konst8 ist. lator. Jump if not equal Das Carry wird gesetzt, wenn konst8 größer ist, sonst wird es rückgesetzt Compare immediate data to Springe relativ zum Programmzähler, wenn der register. Jump Inhalte von Rr ungleich konst8 ist. Das Carry if not equal wird gesetzt, wenn konst8 größer ist, sonst wird es rückgesetzt Compare constants of indirect Springe relativ zum Programmzähler, wenn der address to Inhalte der Datenspeicherzelle die durch Ri adimmediate data, Jump if not ressiert ist, ungleich konst8 ist. Das Carry wird equal gesetzt, wenn konst8 größer ist, sonst wird es rückgesetzt Decrement register and jump Der Inhalt von Register Rr wird um 1 erniedrigt. if not zero Ist dann der Inhalt ≠ 0, springe relativ zum Programmzähler Decrement memory and jump Der Inhalt von dadr wird um 1 erniedrigt. Ist if not zero dann der Inhalt ≠ 0, springe relativ zum Programmzähler Subroutine Instructions
lcall adr16
-
00010010 12
-
3 2 Long call to adr 16
acall adr11
-
See Table Branch instruction
-
2 2 Absolute call within current 2K
call adr11
-
-
-
2 2 Generic Call
ret
-
00101101 22
-
1 2 Return from subroutine
reti
-
00110010 32
-
1 2 Return from interrupt subroutine
nop
-
00000000 00
-
1 1 No operation
-
Der Stack-Pointer wird erhöht. Der Inhalt des Programmzählers wird im Stack abgelegt. Das Programm wird bei der Adresse adr 16 fortgesetzt Der Stack-Pointer wird erhöht. Der Inhalt des Programmzählers wird im Stack abgelegt. Das Programm wird bei der Adresse adr 11 innerhalb der 2K fortgesetzt, auf die der Programmzähler zeigt ASM51 generiert einen acall, lcall Befehl in Abhängigkeit der Entfernung des Sprungziels. (Bei Vorwärtsreferenz wird grundsätzlich lcall eingesetzt. Die oberen zwei Byte des Stack werden in den Programmzähler geladen. Der Stack-Pointer wird dabei erniedrigt Die oberen zwei Byte des Stack werden in den Programmzähler geladen. Der Stack-Pointer wird dabei erniedrigt. Die aktuelle Interrupt-Ebene wird freigegeben Leerbefehl
4 Assembler für die 8051-Controller-Familie 105
4.16
Der System Reset
Der System-Reset ermöglicht, den Prozessor 8051 in einen definierten Anfangszustand zu bringen. Bei Derivaten, wie beispielsweise dem 80535, kann die HardwareReset-Funktion auch im Normalbetrieb benutzt werden, um den Power down mode (Energiespar-Modus) zu beenden. Für den externen RESET muss ein LOW-Aktives Signal für die Dauer von 24 Oszillator-Perioden anliegen. • • • • • •
12 Oszillator-Perioden= 1Maschinenzyklus=1µs bei 12MHz-Prozessor 8051 - definierter Anfangszustand 80535 - Power down mode beenden 80535 - Interner Hardware-Reset - Durch Watchdog ALE, PSEN sind während RESET Eingänge - Testfunktionen für Prozessor möglich Programmstart bei #0000H
Tabelle 4.10 Registerinhalte nach RESET mit Übersetzung Register Accumulator Multiplicationsregister Data Pointer Interrupt Enable Interrupt Priority Port 0 Port 1 Port 2 Port 3 Program Counter Program Status Word Serial Port Control Serial I/O-Buffer Stack Pointer Timer Control Timer Mode Timer 0 Counter Timer 1 Counter
Register Symbol Akkumulator ACC Hilfsregister B B Datenzeiger DPTR Interrupt Freigabe IEN0,IEN1 Interrupt Priorität IP0, IP1 Port 0 P0 Port 1 P1 Port 2 P2 Port 3 P3 Programm Zähler PC Programm Status Wort PSW Serielle Port Kontrolle SCON Serielle Ein-/ Ausgangspuffer SBUF Stapel-Zeiger SP Zeitgeberkontrolle TCON Zeitgebermodus TMOD Zählerinhalt Zeitgeber 0 TH0,TL0 Zählerinhalt Zeitgeber 1 TH1,TL1
80535-Erweiterung
80535-Erweiterung
Timer 2 Control Register
Zeitgeber 2 Kontrolle Register
T2CON Symbol
Wert 00H 00H 0000H 00H 00H 0FFH 0FFH 0FFH 0FFH 0000H 00H 00H Undef. 07H 00H 00H 0000H 0000H
00H Wert
106 Timer 2 Counter Interr. Request Reg. Interrupt Control Reg. Comp. Capture Reg. 1 Comp. Capture Reg. 2 Comp. Capture Reg. 3 Comp./Rel./Capture Timer 2 Control Reg. A/D Conv. Contr. Reg. D/A Conv. Progr. Reg. Power Control Reg. Comp./capture enable A/D Conv. data Register
Zählerinhalt Zeitgeber 0 Interrupt Anforderung Interrupt Kontrollregister Vergl. Übern. Reg. 1 Vergl. Übern. Reg. 2 Vergl. Übern. Reg. 3 Vergl. /Lade/Übern. Reg. Zeitgeberkontrolle 2 A/D-Wandler Kontrolle D/A-Wandler Kontrolle Versorgungs-Kontrolle Vergl.-Übern. Freigabe A/D-Wandler Datenreg. 8
TH2,TL2 IRCON IRCON CCH1,CCL1 CCH2,CCL2 CCH3.CCL3 CRCH,CRCL T2CON ADCON DAPR PCON CCEN ADDAT
0000H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H
4.17 Der Stromsparmodus In diesen Betriebsarten reduziert sich der Energieverbrauch (Power Saving Modes). Vorgesehen wurden zwei Möglichkeiten: Power Down Mode: Der Oszillator wird ausgeschaltet und der interne RAM wird mit einem sehr geringen Strom versorgt (Standby current). Idle Mode: Die CPU wird vom Oszillator getrennt, aber alle anderen peripheren Einheiten können aktiv sein. Bei Verwendung des Stromsparmodus ergeben sich Unterschiede zwischen dem 80515 und dem 80C515. PCON BITS - Power Control Bits 87H
SMOD
PDS
IDLS
-
GF1
GF0
PDE
IDLE
PCON
Diese Bits werden nicht für den Stromsparmodus verwendet Tabelle 4.11 PCON BITS Power Control Bits Bit PDS
Funktion Power Down Start Bit. Wird dieses Bit gesetzt, ist dies der letzte Befehl, bevor in den Stromsparmodus umgeschaltet wird. IDLS IDLS Start Bit Wird dieses Bit gesetzt, ist dies der letzte Befehl, bevor in den IDLEMode (nur CPU ohne Takt) umgeschaltet wird. GF1 Bit zur allgemeinen Verwendung GF0 Bit zur allgemeinen Verwendung PDE Power Down Enable. Ermöglicht bei "1" den Stromsparmodus IDLE Idle mode Enable bit. Ermöglicht bei "1" den IDLE-Mode
4 Assembler für die 8051-Controller-Familie 107
4.18 Watchdog Timer Der „Wachhund-Zeitgeber“ ermöglicht, ein geordnetes Wiederanlaufen nach einem Software- oder Hardwarefehler. In den ICE-Zügen der Bundesbahn betätigt der Zugführer innerhalb vorgegebener Zeitintervallen beispielsweise alle 2 Minuten - einen Schalter. Eine Automatik überwacht diesen Vorgang. Löst der Zugführer diesen Vorgang nicht aus, so wird der Zug gestoppt. Eine sehr gute Vorsichtsmaßnahme, da der Zugführer einen Herzinfarkt bekommen könnte und der ICE mit Tempo 250 km/h in einen Sackbahnhof einfahren würde. Genau dieser Schaltvorgang muss innerhalb von 65532 µs für den Überwachungsschalter von der Software durchgeführt werden, oder es wird ein RESET ausgelöst. IEN0 Interrupt Enable 0 / Interrupt 0 Freigabe-Register bitadressierbar A8H
EAL
WDT
ET2
ES
ET1
EX1
ET0
EX0
IEN0
Wird nicht für Watchdog verwendet Tabelle 4.12 IEN0 Interrupt 0 Control Bits Bit Funktion WDT "0" Externer Interrupt 0 gesperrt "1" Erzeugt ein Zurücksetzen des Watchdog Timers. Muss unmittelbar vor SWDT gesetzt werden, um ein unbeabsichtigtes Rücksetzten zu vermeiden. SWDT Watchdog Timer start/refresh flag ist in IEN1 (0B8H)
IP0 Interrupt Prioritätsregister bitadressierbar 0A9H
-
WDTS IP0.5
IP0.4
IP0.3
IP0.2
IP0.1
IP0.0
Wird nicht für Watchdog verwendet Tabelle 4.13 Interrupt Prioritätsregister 0 Control Bits Bit Funktion WDTS Watchdog timer status flag "1" wird durch Hardware bei Start des Watchdog Timers erzeugt. Kann durch Software ausgelesen werden.
IP0
5 Projekte mit Assembler gelöst
Anhand von konkreten Aufgabenstellungen werden die einzelnen Einheiten des µ-Controllers erklärt und darauf aufbauend auch programmiert. Damit erreichen Sie zwei Ziele: Sie lernen die Befehle des 8051/80535Controllers und die Verwendung der auf dem Chip integrierten Einheiten kennen. Die Aufgaben und die verwendeten Einheiten sind in nachfolgender Tabelle aufgeführt: Tabelle 5.1 Die verwendeten Einheiten in den Projekten Projekt 1. Blinklicht mit Blinkfrequenz 2. A/D-Wandlung 3. Serielle Schnittstelle 4. Effektivwertmessung
verwendete Einheiten Timer 0,1 Interrupt A/D-Wandler Serielle Schnittstelle Timer, A/D-Wandler, Serielle Schnittst.
Alle Projekte können mit der EURO_80535-Karte realisiert werden. Für die A/D-Wandlung bietet sich eine einfache Schnittstellenkarte an. Für die Projektarbeit möchte ich Ihnen noch ein paar Tipps mitgeben. Diese resultieren einerseits aus meiner langjährigen Tätigkeit für die Industrietätigkeit und andererseits aus nahezu 50 gemeinsam mit Studierenden durchgeführten Projekten. Der wichtigste Hinweis bezieht sich auf die zeitliche Projektplanung. Bei Ihren persönlichen, zeitlichen Abschätzungen werden Sie einen Faktor ermitteln, mit dem Sie Ihre Zeitabschätzung multiplizieren, um die Zeit realistisch bestimmen zu können. Sehr hilfreich bei der Planung von Projekten hat sich Microsoft Projekt erwiesen. Nicht der schöne Ausdruck oder die nette Form erweist sich als vorteilhaft. Dagegen muss sich der Benutzer infolge der Programmstruktur über konkrete Inhalte Gedanken machen. Das Programm bietet also lediglich eine Hilfestellung zum methodischen Vorgehen. Als sehr wichtig erweist sich in diesem Zusammenhang die Anforderungsliste. Ohne die Anforderungsliste, in der minimale und maximale physikalische Größen definiert wurden, sollten Sie kein Projekt beginnen. Sehr gut bewährt hat sich das Vorgehen nach den VDI-Richtlinien 2222 und 2422. Die folgenden „Goldenen Regeln“ sollten Sie einhalten. Im
5 Projekte mit Assembler gelöst
109
Laufe meiner industriellen Laufbahn habe ich oft erlebt, dass Software über hunderte von Mannjahren neu entwickelt wurde, aber anschließend nicht wartbar bzw. wiederverwertbar war. Dies ist eine zentrale Problematik heutiger und zukünftiger Softwareentwicklung. Software muss für weitere Projekte wiederverwendbar und wartbar sein. Dieser Idealzustand ist Gegenstand umfangreicher Arbeiten und Studien der gesamten Softwareindustrie. Regel 1 Nur dokumentierte Hardware und Software ist existent. Erläuterung: Für jede Aufgabenstellung müssen folgende Unterlagen erstellt sein: • Aufgabenstellung in schriftlicher Form • Struktogramm oder Ablaufdiagramm • Gut dokumentierter Quellcode - Standardkopf verwenden Regel 2 Durchgängige Verwendung von Registern mit Herstellung des Ausgangszustands. Zuordnung von Tasks (Aufgaben - Prozesse) zu Registerbänken. Erläuterung: Ein Vorschlag für die Registerverwendung befindet sich in der folgenden Tabelle. Aufgrund der Verfügbarkeit von 4 Registerbänken kann der Ausgangszustand oft durch Umschalten der Registerbänke und durch Speicherung von Akkumulator und Hilfsregister B erreicht werden. Tabelle 5.2 Vorschlag für Registerverwendung Register von 8051 A, B R0, R1 R2, R3 R4, R5 R6, R7 A
Verwendung Rückgabe von Bytes und Wörtern Rückgabe von Doppelwörtern Zählervariablen Übergabe und Rückgabe von Adressen Übergabe von Bytes und Wörtern falls Fehler; Fehlercode in Register B übergeben
Regel 3 Bei umfangreicher Software unbedingt Hochsprache C / C++ verwenden.
110
5.1
Standardkopf für Assemblerprogramme
Für die gemeinsame Programmerstellung innerhalb eines Teams oder Unternehmens spielt der Grundaufbau der Programme eine entscheidende Rolle. Der Aufbau und die Darstellung des Aufbaus entscheiden über die Wartbarkeit und Wiederverwendbarkeit der Programme. Falls Sie sich durch Ihren Programmierstil unersetzbar machen wollen, können Sie dies durchaus erreichen. Ein für Sie großer Nachteil entsteht jedoch dadurch, dass man Sie jetzt auch nicht mehr befördern oder für andere interessante Aufgaben einsetzen kann. Sprechen Sie deshalb bei Teamarbeiten die Vorgaben gründlich ab. Als Vorschlag für Programme in 8051-Assembler dient folgender Programmkopf: $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 () ;bitte ausfüllen ;--------------------------------------------------------------------;Programmbeschreibung ;--------------------------------------------------------------------;Programm: ;Datum: ;Programmiert: Teamarbeiter 1 ; ;Verwendete Einspruenge: keine ;Verwendete Unterprogramme: keine ; ;Verwendete Register und Variable: ;Registerbank(0) ; ;Kommentar: ;Aenderungen: ;Datum: ;-----------------------------------------------------------------------;Initialisierungsteil fuer allgemeine Konstanten ;-----------------------------------------------------------------------CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ;Sprung auf Initialisierungsroutine ;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;Initialisierungsteil fuer On-Chip Peripherie ;-----------------------------------------------------------------------ORG 100H ;Programmstart bei 100H INIT: ;-----------------------------------------------------------------------;Programmbeginn ;-----------------------------------------------------------------------ABFRAGE:
5 Projekte mit Assembler gelöst
5.2
111
Blinklicht mit vorgegebener Blinkfrequenz
Aufgabe: Programmieren Sie ein einfaches Blinklicht mit vorgegebener Blinkfrequenz.. Auf den ersten Blick erscheint die Aufgabe sehr einfach. Es gibt auf dem µ-Controller zwei Zeitgebereinheiten: Timer 0 und Timer 1 Lösung: Mit Hilfe eines Zeitgebers kann eine LED, die an einem Port angeschlossen ist, ein- und ausgeschaltet werden. Die Betriebsarten des Zeitgebers / Zählers innerhalb des 8051 / 80535Chips sind nachfolgend aufgeführt: 5.2.1
Timer / Counter - Zeitgeber / Zähler des 8051
Bei der Bezeichnungsweise dieser Einheit schleicht sich oft die kurze und unpräzise Bezeichnungsweise "Timer" ein. Die Funktionsweise der Timereinheit ist jedoch wesentlich differenzierter. Zum einen kann diese Einheit als Zeitgeber programmiert werden und zum anderen als Zähler. Bei jeder Betriebsart wird ein Zählerbaustein angesteuert. Bei der Funktion als Zeitgeber verbindet man den Zähleingang mit einem konstanten Taktsignal / Oszillator. Bei der Funktion als Zähler verbindet man den Zähleingang mit einem Ereignis-Signal, dessen Flankenanzahl gezählt wird. Die grundsätzlichen Möglichkeiten der zwei 16-Bit-Timereinheiten des 8051Kerns sind: zwei Zeitgeber - jeweils interner Takt / Ereignis-Zähler - externer Takt Mode 0: Mode 1: Mode 2: Mode 3:
13-Bit Counter Pulsweitenmessung mit Gate 16-Bit Counter Pulsweitenmessung mit Gate Autoreload / THx wird automatisch bei Überlauf in TLx geladen; x=0,1 Zähler 0 zwei 8-Bit-Zähler / Zeitgeber Zähler 1 stoppt Zähler 1
Die Betriebsart wird über die Programmierung des TMOD / Timer Modusregister eingestellt. Die Bedeutung der einzelnen Bits ist in der nachfolgenden Tabelle erkennbar. Hierbei führt jedes einzelne Bit des Registers einen symbolischen Namen. Rechts erscheint der symbolische Name des Registers und links die absolute Adresse des Registers.
112
TMOD BYTE - Timer 0 - Timer 1 - Modus Control Register 89H
GATE
C/T# M1 Timer 1
M0
GATE
C/T# M1 Timer 0
M0
TMOD
Tabelle 5.3 TMOD BYTE Bit Gate
C/T#
Funktion Gating control "1" durchgeschaltet, 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 TxD 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
Im Blockbild sind die zu programmierenden Bits sehr gut erkennbar. OSC
Interrupt TF0
÷ 12 C/T#=0
Takt
Timer overflow flag
TH0
TL0
C/T#=1
T0 / P 3.4
interner Bus
TR0 Timer run control bit
Gate
&
>1
INT0#
Abb. 5.1 Blockbild von Timer 0 und 1 im 16-Bit Modus
5 Projekte mit Assembler gelöst
113
Durch das TF0 Timer 0 overflow flag wird beim Übergang des Zählers von 65535 auf 0 ein Überlauf-Bit gesetzt. Dieses Überlauf-Bit ist im Register TCON Timer Control Register zu finden. Mode 2 veranschaulicht das nachfolgende Bild: OSC
im Chip
Interrupt
C/T#=0
Takt
TL0
TH0
C/T#=1
T0 /
Timer overflow flag
TF0
÷ 12
P 3.4
TR0 Timer run control bit
Gate
Reload
&
>1
INT0#
Abb. 5.2 Mode 2, Zähler / Zeitgeber 0,1 mit Wiederladen des TL0 Registers
Das höherwertige Byte des 16-Bit-Zählers THO überschreibt bei Auslösung des Interrupts durch Überlauf des niederwertigen Bytes den Inhalt des niederwertigen Bytes. Hierdurch kann eine Periodendauer von 2µs bis 256 µs sehr einfach durch Einschreiben des Wertes 256 minus gewünschter Periodendauer erzeugt werden. Mode 3 wirkt sich bei Timereinheit 0 und 1 verschieden aus. Timer 0 wird in zwei 8-Bit-Zähler aufgeteilt und übernimmt die Kontrolle der beiden Timer 1 Bits TR1 und TF1. Der Timer 1 kann für alle Aufgaben benutzt werden, die kein Interrupt benötigen. OSC
Interrupt TF0
÷ 12 C/T#=0
Takt
C/T#=1
T0 /
Interrupt
Timer 0 overflow flag
TL0 Timer 1 overflow flag
P 3.4
TF1 interner Bus
TR0 Timer run control bit
Gate INT0#
>1
&
f
osc
/12
Takt
TH0
Control TR1
Abb. 5.3 Mode 3, Timer 1 Interrupt wird von Timer 0 mitbenutzt
114
TCON BITS - Timer 0 - Timer 1 - Control Bits Bitadressierbar 88H
8FH
8EH
8DH
8CH
8B
8AH
89H
88H
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TCON
Diese Bits werden nicht zur Kontrolle des Zeitgebers verwendet Tabelle 5.4 TCON BITS Timer 0 - Timer 1 Control Bits Bit
Funktion
TR0
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.
TF0 TR1 TF1
Durch das TF0-Bit wird ein Interrupt ausgelöst. Der Interrupt kann jedoch nur ausgelöst werden, wenn die Interrupteinheit entsprechend eingestellt wurde. Nachfolgende Tabelle zeigt einen Überblick über die Interrupteinheit des 8051 / 80535: 5.2.2
Interrupt-System des 8051 / 80535
Ein freigegebener und ausgelöster Interrupt (Unterbrechung) stellt den 16-Bit PC Program Counter (Programmzähler) auf eine fest vorgegebene Adresse im Programmspeicherbereich. Die beiden 8-Bit Register des Programmzählers werden durch die Interrupt-Vektor-Adresse überschrieben. Als nächster Befehl kommt der in der Interrupt-Vektor-Adresse stehende Befehl zur Ausführung. Das Interrupt System im Überblick: 6 / 12 Interrupt-Quellen 3 / 5 interne Interrupt-Quellen ( Zähler / Zeitgeber 0,1,2, serielle Schnittstelle, A/D-Wandler ) 2 / 4 Prioritätsebenen 2 / 7 extern triggerbare Interrupts allgemeine Interruptfreigabe - individuelle Interruptfreigabe. (Alle fett kursiv gedruckten Angaben beziehen sich auf den 80535-Controller.)
5 Projekte mit Assembler gelöst
115
Tabelle 5.5 Interrupt-Vektor-Adressen PC Adresse 0000H 0003H 000BH 0013H 001BH 0023H 002BH
Interrupt-Name RESET EXTIO TIMER 0 EXTI1 TIMER1 SINT SINT04)6) TIMER2
0043H 004BH
ADCI EXTI2
0053H
EXTI3
005BH
EXTI4
0063H
EXTI5
006BH
EXTI6
0083H 0093H
SINT1 CMINT
009BH 00A3H
COMPTIMER SETINT
00ABH
CLRINT
1) 8051 4) 80C517
Erklärung Start Address after Reset1) External Interrupt 01) Timer 0 Overflow Interrupt1) External Interrupt 11) Timer 1 Overflow Interrupt1) Serial Channel 0 Interrupt1) Timer 2 Overflow/ External Reload Interrupt2)-6) A/D-Converter Interrupt3).....6) External Interrupt 2/ Compare Event with CC43).....6) Bei 80C515 External Interrupt only External Interrupt 3 / Compare Event with CRC3).....6) External Interrupt 4 / Compare Event with CC13).....6) External Interrupt 5 / Compare Event with CC23).....6) External Interrupt 6 / Compare Event with CC33).....6) Serial Channel 1 Interrupt4)6) CMx Compare Register Interrupt6) Compare Timer Overflow4)6) Compare Set Interrupt6) Compare Clear Interrupt6) 2) 80(C)52 3) 80(C)515 5) 80C515A 6) 80C517A
Da alle Einheiten des 8051 auch im 80535 enthalten sind, kann man von einer echten Erweiterung des Interrupt-Systems sprechen. Beim Assemblieren ist jedoch die Einbindung der entsprechenden *.PDF Datei notwendig. Für die nachfolgenden Programmbeispiele wird immer die 80535.PDF Datei eingebunden. Dadurch ändern sich die symbolischen Namen der Register. IE Interrupt Enable / Interrupt Freigabe beim 8051-Prozessor wird zu IEN0 Interrupt Enable, da ein zweites Interrupt Enable Register IEN1 im 80535 enthalten ist. Einen guten Überblick für die Interrupterzeugung
116
und die Interruptpriorität erhält man durch die beiden folgenden Abbildungen und die dazugehörigen Tabellen.
P3.2/INT0
IE0
TCON.0
TF0
TIMER 0 Overflow
IE1
P3.3/INT1
TCON.2
TIMER 1 Overflow
TF1
I
RI
Receiver
>1 SERIAL PORT Transmitter
TI
TIMER 2 Overflow
TF2
N T E R R
>1
P1.5/T2EX
EF2 EXEN2
A/D-Converter
P1.4/INT2
U P T
IADC
IEX2
TCON.5
C O N T R O
Compare 0
L
P1.0/INT3/CC0
IEX3
TCON.6 Compare 1 IEX4
P1.1/INT4/CC1 Compare 1
P1.2/INT5/CC2
IEX5
Compare 1
P1.3/INT6/CC3
Abb. 5.4 Erzeugen von Interrupts
IEX6
5 Projekte mit Assembler gelöst
117
IEN0 Interrupt Enable 0 / Interrupt 0 Freigabe-Register Bitadressierbar 0A8H WDT
EAL
WDT
ET2
ES
ET1
EX1
ET0
EX0
IEN0
Wird nicht für Interrupt-Kontrolle genutzt
Tabelle 5.6 IEN0 Interrupt 0 Control Bits Bit
Funktion
EX0
"0" Externer Interrupt 0 gesperrt "1" Externer Interrupt 0 freigegeben "0" Überlauf Timer 0 gesperrt "1" Überlauf Timer 0 freigegeben "0" Externer Interrupt 1 gesperrt "1" Externer Interrupt 1 freigegeben "0" Überlauf Timer 1 gesperrt "1" Überlauf Timer 1 freigegeben "0" Serieller Schnittstellen Interrupt gesperrt "1" Serieller Schnittstellen Interrupt freigegeben "0" Überlauf Timer 2 gesperrt "1" Überlauf Timer 2 freigegeben Wird nicht für Interrupt Kontrolle genutzt "0" Kein Interrupt wird erkannt "1" Jeder Interrupt wird entsprechend seiner Einstellung erkannt
ET0 EX1 ET1 ES ET2 WDT EAL
IEN1 Interrupt Enable 1 / Interrupt 1 Freigabe-Register bitadressierbar 0A8H
0BFH 0BEH 0BDH EXEN2 SWDT EX6
0BCH EX5
0BBH EX4
0BAH EX3
0B9H EX2
0B8H EADC
IEN1
Tabelle 5.7 Interrupt Control Bits Bit
Funktion
EADC
"0" A/D-Wandler Interrupt gesperrt. "1" A/D-Wandler freigegeben. "0" externer Interrupt 2 gesperrt. "1" externer Interrupt 2 / Übernahme- / Vergleichs-Interrupt 4 freigegeben. "0" externer Interrupt 3 gesperrt. "1" externer Interrupt 3 / Übernahme- / Vergleichs-Interrupt 4 freigegeben. "0" externer Interrupt 4 gesperrt. "1" externer Interrupt 4 / Übernahme- / Vergleichs-Interrupt 4 freigegeben. "0" externer Interrupt 5 gesperrt. "1" externer Interrupt 5 / Übernahme- / Vergleichs-Interrupt 4 freigegeben. "0" externer Interrupt 6 gesperrt. "1" externer Interrupt 6 / Übernahme- / Vergleichs-Interrupt 4 freigegeben. Wird nicht für Interrupt Kontrolle genutzt "0" Externer Reload Interrupt Timer 2 wird gesperrt. "1" Externer Reload Interrupt Timer 2 wird erkannt.
EX2 EX3 EX4 EX5 EX6 SWDT EXEN2
118
TCON BITS - Interrupt Control Bits Bitadressierbar 88H
8FH TF1
8EH TR1
8DH TF0
8CH TR0
8B IE1
8AH IT1
89H IE0
88H IT0
TCON
Tabelle 5.8 TCON Interrupt Control Bits Bit IT0 IE0 IT1 IE1 TR0 TF0 TR1 TF1
Funktion Interrupt 0 type control bit. Auswahlbit für Arbeitsweise "1" Fallende Flanke löst externen Interrupt aus "0" 0-Pegel löst externen Interrupt aus "1" Falls externer Interrupt durch Hardware erkannt wird. "0" automatisch durch Interruptausführung Interrupt 1 type control bit. Auswahlbit für Arbeitsweise "1" Fallende Flanke löst externen Interrupt aus "0" 0-Pegel löst externen Interrupt aus "1" Falls externer Interrupt durch Hardware erkannt wird. "0" automatisch durch Interruptausführung Timer 0 Run Control - Wird nicht für Interrupt Kontrolle genutzt. Timer 0 overflow flag. "1" durch Hardware, wenn Zähler / Zeitgeber Überlauf. "0" automatisch durch Interruptausführung Timer 1 Run Control - Wird nicht für Interrupt Kontrolle genutzt Timer 1 overflow flag. "1" durch Hardware, wenn Zähler / Zeitgeber Überlauf. "0" automatisch durch Interruptausführung
Die Verwendung von Interruptstrukturen ist sehr beliebt. Mittlerweile beruhen ganze Betriebssysteme darauf. In der Prozessautomatisierung müssen Sie jedoch im Normalbetrieb keine Interrupts verwenden. Was in der Zentraleinheit passiert, wenn zu viele Interrupts gleichzeitig auftreten, veranschaulicht das nachfolgende Bild:
Abb. 5.5 Zu viele Interrupts
5 Projekte mit Assembler gelöst
IP1.0
IP0.0
IEN 0.7IEN 0.0
I
Level 3
N
Level 2
T
Level 1
E R
IE0
119
Level 0
R U P T
IEN 1.0
R E
IADC
Q U E S T
IEN 0.1 TF0
IEN 1.1
IP 1.1
IP 0.1
IEX2
P
IEN 0.2 IE1
IEN 1.2
IP 1.2
IP 0.2
O
IEX3
R
IEN 0.3 TF1
IEN 1.3
I
IP 1.3
IP 03
>1
TI
C
IEN 0.4 IEN 1.4
IP 1.4
IP 0.4
IEX5 TF2 EXF2
>1
O N T R
IEN 0.5 IEN 1.5
T Y
IEX4 RI
R I
IP 1.5
IP 0.5
IEX6
Abb. 5.6 Prioritäten / Anforderungen von Interrupts
O L
Vector Locations
120
IP0 BITS - Interrupt-Priorität-Bits Alle Interruptquellen wurden wie im vorherigen Bild übersichtlich paarweise kombiniert. Die Priorität ergibt sich aus der jeweiligen Bitkombination der beiden paarweise kombinierten Bits, z.B. IP0.0 und IP1.0 0A9H
-
WDTS IP0.5
IP0.4
IP0.3
IP0.2
IP0.1
IP0.0
IP0
0B9H
-
-
IP1.4
IP1.3
IP1.2
IP1.1
IP1.0
IP1
IP1.5
Tabelle 5.9 IP0 Interrupt Priority Bits IP1.x 0 0 1 1
IP0.x 0 1 0 1
Funktion Priorität 0 (kleinste) Priorität 1 Priorität 2 Priorität 3
Tabelle 5.10 IP0 Interrupt Priority Bits Bit IP1.0 / IP0.0 IP1.1 / IP0.1 IP1.2 / IP0.2 IP1.3 / IP0.3 IP1.4 / IP0.4 IP1.5 / IP0.5
Funktion IE0 / IADC TF0 / IEX2 IE1 / IEX3 TF1 / IEX4 RI + TI / IEX5 TF2 + EXF2 / IEX6
Für die Lösung der Blink-Aufgabe muss keine Priorität der Interrupts vergeben werden. Erst ab mehreren Aufgaben (Tasks) spielt es eine Rolle, welche Aufgabe die höchste Priorität hat. Deshalb müssen nur folgende Register programmiert werden: IENO TMOD TCON
Interrupt Enable / Interrupt-Freigabe Timer Mode / Zeitgeber-Betriebsart Timer Control / Zeitgeber-Kontrolle
Hierzu werden diese Register nochmals aufgeführt und in der zweiten Zeile die entsprechenden Bits eingetragen. Selbstverständlich können die bitadressierbaren Register auch einzeln programmiert werden (setb EAL). Davon werden die anderen Einstellungen des aktuellen Programms nicht tangiert. Bei unserem Remote-DebugSystem darf beispielsweise der Interrupt für die serielle Schnittstelle nicht
5 Projekte mit Assembler gelöst
121
gesperrt werden, da sonst die Kommunikation zwischen PC und der EURO_80535-Karte nicht mehr möglich ist. 0A8H 0A8H
EAL 1
WDT 0
ET2 0
ES 1
ET1 0
EX1 0
ET0 1
EX0 0
IEN0 IEN0
89H 89H
GATE 0
C/T# 0
M1 0
M0 0
GATE 0
C/T# 0
M1 0
M0 1
TMOD TMOD
88H 88H
TF1 0
TR1 0
TF0 1
TR0 0
IE1 0
IT1 0
IE0 0
IT0 0
TCON TCON
Nach diesen Vorüberlegungen sehen Sie im nächsten Bild die einzelnen Programmteile in strukturierter Darstellung: Assembler Anweisungen Programmbeschreibung Initialisierung
TIMER_0
Welche Taste wurde betätigt ? Taster 1 TR0 aus Port 3.2 löschen Licht ein
Taster 2 TR0 aus Port 3.2 setzen Licht aus
ja
Register 2 = 0 ?
nein
Taster 3 Blinken TR0 an TIMER_0
P 3.2 Komplement
ret
Abb. 5.7 Struktogramm für Blink-Programm
Die Assembler-Anweisungen ermöglichen eine komfortable Testumgebung. Weiterhin kann mit den Anweisungen vermieden werden, dass umfangreiche Listen erstellt werden. Der Block „Programmbeschreibung“ sollte, wie bereits erwähnt, eine festgelegte Form beinhalten. Der Initialisierungsteil für allgemeine Konstanten enthält EQU (Equateanweisungen) zur Generierung neuer Symbole. Der Initialisierungsteil für die On-ChipPeripherie enthält die Einstellungen der auf dem Chip integrierten Peripherieteile. Das Blinkprogramm im Quellcode:
122 $NOMOD51 $title(BLIN_INT.ASM) $xref $debug $nolist $include(REG535.PDF) $list ; ;-----------------------------------------------------------------------;Programmbeschreibung ;-----------------------------------------------------------------------; ;Programm: Beispiel fuer Blinkprogramm ; ;Betaetigung Taster 1: Licht einschalten ;Betaetigung Taster 2: Licht ausschalten ;Betaetigung Taster 3: Licht blinkt ;Programmiert: J. Walter 11.12.93 ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ; ;Registerbank(0) ;R2 Zaehlvariable n*65,536mys ; ; ;Kommentar: ; ;Aenderungen: ; ;-----------------------------------------------------------------------;Initialisierungsteil für allgemeine Konstanten ;-----------------------------------------------------------------------; V_BLINK EQU 10 ;Blinkfrequenz 10 Dezimal ; cseg at 0h ;Codesegmentadresse 0h jmp INIT ;springe zum Initialisierungs;Unterprog. fuer Timer0 ; ;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------; org 0Bh
;Sprungmarke zur ISR fuer Timer0
TIME_INT0: ;ISR fuer Timer0 (Adresse 0Bh) call TIMER_0 ;Aufruf: UP Schleife reti ; ;-----------------------------------------------------------------------;Initialisierungsteil für On-Chip Peripherie ;-----------------------------------------------------------------------; org 100h INIT : setb P3.2 mov R2,#V_BLINK mov IEN0,#10010010b mov TMOD,#00000001b mov TCON,#00100000b
;UP zum Initialisieren von Timer 0 ;Lampe ausschalten ;R2 Ist Zaehlvariable ;Generelle Interrupt ;Freigabe,Freigabe Timer0 Interrupt ;Modus1: 16 BitZaehler/Zeitgeber ;Request-Flag fuer Timer0
5 Projekte mit Assembler gelöst
123
;Ueberlauf setzen ;Timer0 vorerst noch ausschalten ; ;-----------------------------------------------------------------------;eigentliche Programmschleife ;-----------------------------------------------------------------------; ABFRAGE: jnb P1.1,LAMPE_AN jnb P1.2,LAMPE_AUS jnb P1.3,LAMPE_BLINKT ajmp ABFRAGE LAMPE_AN: clr TR0 clr P3.2 ajmp ABFRAGE
;Timer0 ausschalten ;Licht einschalten ;Springe zur Adresse ABFRAGE
LAMPE_AUS: clr TR0 setb P3.2 ajmp ABFRAGE
;Timer0 ausschalten ;Licht ausschalten ;Springe zur Adresse ABFRAGE
LAMPE_BLINKT: mov TL0,#0h mov TH0,#0h setb TR0
;LOW-Byte Zaehlregister von Timer0 ;auf 0h setzen ;HIGH-Byte Zaehlregister von Timer0 ;auf 0h setzen ;Timer0 aktivieren, TR0 wird bei ;Sprung auf die ;ISR (Adresse 0Bh) von der Hardware ;wieder zurueckgesetzt
ajmp ABFRAGE ; ;-----------------------------------------------------------------------;Unterprogramm für Timer 0 Interrupt Service Routine ;-----------------------------------------------------------------------; TIMER_0: djnz R2,SPRUNG ;Sprung falls R2 noch nicht 0 cpl P3.2 ;komplementiere P3.2 mov R2,#V_BLINK ;Register 2 erhaelt wieder den Wert ;V_BLINK SPRUNG: ret end
124
Austesten des Programms Das Programm wird nunmehr zunächst in der Keil Entwicklungsumgebung assembliert, dann gelinkt, sowie eine Wandlung des Dateiformates durchgeführt und in die EURO_80535-Karte geladen. Die zweite Möglichkeit besteht darin, den Simulator in der Keil Entwicklungsumgebung zu verwenden. Hierzu wählen Sie im „Zauberstab“ Options for Target in der Registerkarte DEBUG den Simulator.
Abb. 5.8 Die Schaltfläche „Zauberstab“ in der Keil Entwicklungsumgebung
Abb. 5.9 Die Einstellungen für den Simulator
Sobald Sie im Debug-Mode sind, können Sie im Menü unter Peripherals die Ports, die Interrupteinstellungen und die Zeitgebereinstellungen
5 Projekte mit Assembler gelöst
125
anzeigen lassen. Unter dem Menüpunkt VIEW können Sie das Periodic Window Update einschalten und sich somit den Blinkvorgang direkt anzeigen lassen.
Abb. 5.10 Die Einstellungen für den Simulator
126
5.3
Projekt A/D-Wandlung
Aufgabe: Eine Spannung variiert zwischen 0V...5V. Zwei Leuchten sollen den Spannungswert nach folgender Tabelle codieren: Tabelle 5.11 Codierung Spannung 0V≤ U ≤ 2 V 2V< U ≤ 3 V 3V< U ≤ 4 V 4V< U ≤ 5 V
Leuchte 2 AUS AUS EIN EIN
Leuchte 3 AUS EIN AUS EIN
Lösung: Die Spannung von 0 bis 5V wird an einem Potentiometer abgegriffen. Ein A/D-Wandler wandelt diese Spannung und ordnet die erhaltene Bitkombination einer anderen Bitkombination, bestehend aus zwei Bits, nach der geforderten Codierung zu. Der wesentliche Vorteil des Prozessors 80535 besteht in seinem integrierten A/D-Wandler. Hierdurch können analoge Signale ohne einen zusätzlichen Baustein direkt in digitale Signale umgesetzt werden. Kenntnisse über die Hardware des im 80535-Controller integrierten A/D-Wandlers sind Voraussetzung für die Durchführung einer solchen Wandlung. 5.3.1 • • • • • • • • •
Wesentliche Daten des A/D-Wandlers im 80535
8-Bit-Auflösung innerhalb der programmierbaren Vergleichsspannung. 8 Eingangskanäle über Multiplexer. Wandlungszeit = 13 Maschinenzyklen = 13µs bei 12 MHz Takt (ACMOS) Wandlungszeit = 15 Maschinenzyklen = 15µs bei 12 MHz Takt (MYMOS) jeweils inklusive Sample and Hold Zeit von 5 µs. Interner Trigger für Start der Wandlung. Interrupterzeugung nach Wandlung möglich. Eingänge bei ACMOS-Version auch als Digitaleingänge verwendbar. Die Wandlung wird durch Schreiben in DAPR-Register ausgelöst.
5 Projekte mit Assembler gelöst
127
P6 (0DBH) ACMOS Port 6
ADCON (0D8H)
7 6 5 4 3 2 1 0 ADDAT (0D9H)
AN7/P 6.7 AN6/P 6.6 AN5/P 6.5 AN4/P 6.4 AN3/P 6.3
Multiplexer
AN2/P 6.2
Sample & Hold
A/D-Wandler
7 6 5 4 3 2 1 0
AN1/P 6.1 AN0/P 6.0
V AREF Internal Reference Voltages
V AGND
DAPR (0DAH) 7 6 5 4 3 2 1 0 Programmierung
V intAREF
Programmierung
V intAGND
interner Bus
Abb. 5.11 Blockbild A/D-Wandler im 80535
Anschluß EURO_535 VCC
1 KΩ
+5V
VGA Pin 4
VAREF
VGA Pin 26
AN0
VGA Pin 27
VAGND GND 0V
VGA Pin 31 VGA Pin 21
Abb. 5.12 Anschluss eines Potentiometers an EURO_535
Für die Wandlung einer Spannung im Bereich von 0V....5V kann VAREF auf +5V und VAGND auf 0V gelegt werden. Der Mittelabgriff eines Potentiometers, das zwischen 0V und +5V angeschlossen ist, wird auf AN0 geführt. Die am Potentiometer abgegriffene Spannung 0V....5V wird durch 8 Bit geteilt, dies entspricht 255 Inkrementen. Ein Bit entspricht somit: 5V / 255 = 19,6 mV. Ein Multiplexer ist dem A/D-Wandler vorgeschaltet. Die Auswahl des entsprechenden Kanals kann durch das ADCON-Register beeinflusst werden.
128 Tabelle 5.12 Wert – Spannung Zahl 0 U in V 0
1 …… 0,0196
101 102 1,9803 2
103 ….. 2,0196
254 255 4,9804 5
Für den komfortablen Test der A/D-Wandlung mit komfortablen mechanischen Anschlüssen wurde die ADDA535-Karte mit folgenden Eigenschaften entwickelt: • 8 geschützte A/D-Eingänge mit Klemmanschluss • AN0, AN1 zusätzlich mit Koaxial-Anschluss • zuschaltbares Potentiometer 0-5V an AN0 • 2 D/A-Wandler AD558 mit Klemmanschluss
Wichtiger Hinweis: Die Spannungsdifferenz bei der Programmierung des DAPR-Registers muss größer 1 V sein! VCC
P5.0 P5.1 P5.2 P5.3 P5.4 P5.5 P5.6 P5.7
1 2 3 4 5 6 7 8
IC1 DB0 V OUT DB1 V OUT SENSE DB2 V OUT SELECT DB3 GND DB4 GND DB5 +VCC DB6 CS DB7 CE AD558
1 2 3 4 5 6 7 8
IC2 DB0 V OUT DB1 V OUT SENSE DB2 V OUT SELECT DB3 GND DB4 GND DB5 +VCC DB6 CS DB7 CE AD558
P4.1
P5.0 P5.1 P5.2 P5.3 P5.4 P5.5 P5.6 P5.7
16 15 14 13 12 11 10 9
R11
1
1K
B1
R9 ANALOG OUT1
1
J3 JUMPER
DA1
B13
VCC
1K lin
GND
P4.0
16 15 14 13 12 11 10 9
1K VCC
1
BNC 2
B2 ANALOG OUT2
DA0
B14
BNC1
R2
AN0 R10
100
D2 ZD 5V6
PIN1
1
GND 1
BNC2
R3
AN1
BNC 2
100 D3 ZD 5V6
PIN3
1 +5V
VCC
P4.0 P5.0 P5.2 P5.4 P5.6
VCC
AN0 AN2 AN4 AN6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
VG1 A1 C1 A2 C2 A3 C3 A4 C4 A5 C5 A6 C6 A7 C7 A8 C8 A9 C9 A10 C10 A11 C11 A12 C12 A13 C13 A14 C14 A15 C15 A16 C16 A17 C17 A18 C18 A19 C19 A20 C20 A21 C21 A22 C22 A23 C23 A24 C24 A25 C25 A26 C26 A27 C27 A28 C28 A29 C29 A30 C30 A31 C31 A32 C32 VG_535Z
VCC
VSS
X4
R1
AN2 2
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
1 AN3 VDD
P4.1 P5.1 P5.3 P5.5 P5.7
X3
2
1 AN4 2
AD/DA Zusatzkarte fuer 80535-Board VCC
AN1 AN3 AN5 AN7
8 Analogeingaenge
1 AN5 2
2 Analogausgaenge Joachim Juengst, Januar 1994 Fachhochschule Karlsruhe, FB F
1 AN6 2
1 AN7 2
1
Abb. 5.13 Schaltbild ADDA535-Karte
PIN5
100 D1 ZD 5V6 R4
PIN6
100 D4 ZD 5V6 R5
PIN7
PIN1
100
PIN3
R6
PIN5 PIN6 PIN7 PIN8 PIN9 PIN10
D5 ZD 5V6
PIN8
100 D6 ZD 5V6 R7
R8
PL1 PIN1 PIN2 PIN3 PIN4 PIN5 PIN6 PIN7 PIN8 PIN9 PIN10
PINLEISTE_10
PIN9
100 D7 ZD 5V6
100 D8 ZD 5V6
1 2 3 4 5 6 7 8 9 10
PIN10
5 Projekte mit Assembler gelöst
129
ADCON REGISTER - A/D-Wandler-Steuerung Bitadressierbar 0D8H
0DFH BD
0DEH CLK
0DDH 0DCH BSY
0DBH 0DAH 0D9H ADM MX2 MX1
0D8H MX0
ADCON
Tabelle 5.13 ADCON REGISTER Bit MX2 MX1 MX0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 ADM BSY CLK BD
Funktion MYMOS ACMOS Anlog Eingang 0 AN0 P6.0 Anlog Eingang 1 AN1 P6.1 Anlog Eingang 2 AN2 P6.2 Anlog Eingang 3 AN3 P6.3 Anlog Eingang 4 AN4 P6.4 Anlog Eingang 5 AN5 P6.5 Anlog Eingang 6 AN6 P6.6 Anlog Eingang 7 AN7 P6.7 "1" Kontinuierliche Wandlung. "0" Stop nach jeder Wandlung "1" Busy Flag / Wandlung findet statt. "0" Wandlung beendet frei CLK - Wird nicht für A/D-Wandler verwendet Baudrate - Wird nicht für A/D-Wandler verwendet
Das Ergebnis der Wandlung befindet sich im ADDAT-Register. 0D9H
ADDAT
Start der Wandlung Die Wandlung wird durch Schreiben in das DAPR-Register ausgelöst. Je nach ADM-Bit erfolgt entweder nur eine Wandlung oder kontinuierliche Wandlungen bis das ADM-Bit zurückgesetzt wird. Wird am Eingang ein Spannungsbereich von 0-5V verlangt, ist das DAPR mit 0 zu beschreiben. Die Auflösung kann durch Schreiben nachfolgender Werte in das DAPR-Register entsprechend erhöht werden. Durch Erhöhen der Auflösung wird natürlich der Spannungsbereich eingeengt. Die Spannungsdifferenz muss beim Programmieren des DAPRRegisters größer als 1 V gewählt werden.
130
0DAH
7
DAPR .4 - .7 5 4
6
3
2
DAPR .0 - .3 1 0
DAPR
Tabelle 5.14 Erhöhung der Auflösung durch Einschränkung des Messbereiches DAPR .3 - .0 DAPR .4 - .7 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
VintAGND 0. - 3. Bit 0,0 0,3125 0,625 0,9375 1,25 1,5625 1,875 2,1875 2,5 2,8125 3,125 3,4375 3,75 -
VintAREF 4. - 7. Bit 5,0 1,25 1,5625 1,875 2,1875 2,5 2,8125 3,125 3,4375 3,75 4,0625 4,375 4,68754
(aus SAB 80515/SAB80C515 Users Manual S. 96/97) Der Ausgangswiderstand der zu messenden Analogspannungsquelle sollte kleiner als 1 kΩ sein. Das A/D-Wandlerprogramm im Quellcode. $nomod51 $debug $nolist $include(reg535.pdf)
;der Modus fuer 8051 wird abgeschaltet ;Debuggen wird möglich ;es wird kein Listing für reg535 erstellt ;die 80535-spezifischen Daten werden zur ;Verfügung gestellt ;es wird ein Listing erstellt
$list $ title (AN0_COD) ;-----------------------------------------------------------------------;Programmbeschreibung ;-----------------------------------------------------------------------;Programm: A/D-Wandler Spannungen dekodiert ; ;U/V Leuchte 2 Leuchte 3 ;0<=U<=2V aus aus ;2< U<=3V aus ein ;3< U<=4V ein aus ;4< U<=5V ein ein ;Programmiert:
;
J. Walter 11.12.93
5 Projekte mit Assembler gelöst
131
;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ; ; ;Kommentar: ; ;Aenderungen: ; ;-----------------------------------------------------------------------;Programmbeginn ;-----------------------------------------------------------------------CSEG AT 0H jmp ANFANG
;Legt absolute Codesegmentadresse auf 0h
ORG 100H
;Programmstart bei 100H
ANFANG: clr P3.2 ;Port setzen, Programm läuft mov ADCON,#10000000B ;Kanal AN0 angewaehlt, Stop nach der Wandlung mov DAPR,#0 ;Wandlung Start jb BSY,$ ;warten bis Wandlung stop mov A,ADDAT ;Wert im ACCU ; ;-----------------------------------------------------------------------;Codierung ;-----------------------------------------------------------------------; clr C ;Carry löschen subb A,#103 ;entspricht U>2V jc AUS_AUS ;Sprung da U<=2V subb A,#51 ;entspricht U>3V jc AUS_EIN ;Sprung da U<=3V subb A,#51 ;entspricht U>4V jc EIN_AUS ;Sprung da U<=4V clr P3.3 ;Leuchte 2 ein clr P3.4 ;Leuchte 3 ein jmp ANFANG ;Sprung zum Programmbeginn AUS_AUS: setb P3.3 setb P3.4 jmp ANFANG AUS_EIN: setb P3.3 clr P3.4
;Leuchte 2 aus ;Leuchte 3 aus
;Leuchte 2 aus ;Leuchte 3 ein
jmp ANFANG EIN_AUS: clr P3.3 setb P3.4 jmp ANFANG end
;Leuchte 2 ein ;Leuchte 3 aus
132
Das Programm wird assembliert, gelinkt und für die entsprechende Entwicklungsumgebung vorbereitet. Der Test des Programms erfolgt wiederum in einem Remote-Debug-System wie MON51 oder im Simulator. Wählen Sie hierbei folgende Einstellungen: • Menü: View -> Periodic Window Update • Fenster: Watches -> Watch#1 -> mit F2 ADDAT eingeben • Menü: Peripherals -> A/D-Converter Über ein Watch-Point (Beobachtungsfenster) lässt sich der Inhalt des ADDAT-Registers lesen. Im Simulator können Sie die Spannungen durch Eingabe in das Feld AIN0 bis AIN7 vorgeben. Der Wert 3V entspricht 99H.
Abb. 5.14 Anzeige des ADDAT-Inhalts im Debug-Programm
5 Projekte mit Assembler gelöst
5.4
133
Projekt Serielle Schnittstelle
Serielle Schnittstellen ermöglichen das Einsparen von Leitungen. Soll beispielsweise ein Byte übertragen werden, müssten normalerweise acht Leitungen und eine Masseleitung vorhanden sein. Diese Information kann aber auch nacheinander über eine Leitung übertragen werden. Da aber eine "1" oder eine "0" am Anfang des zu übertragenden Bytes stehen kann, muss ein Start-Bit, welches immer "0" ist, vorhanden sein. An diesem Start-Bit erkennt der Empfänger, dass eine Information gesendet wird. Es kann auch eine zusätzliche Leitung verwendet werden, die den Sender und den Empfänger im Takt synchronisiert, so dass der Empfänger weiß, zu welchem Zeitpunkt er den Zustand der Leitung abfragen muss. Synchrone, und asynchrone Übertragung kann mit dem 8051-Kern realisiert werden. Zusätzlich können noch die Baudraten variiert werden. Die synchrone Übertragung ermöglicht hierbei die höchsten Übertragungsraten. Eine weitere Betriebsart stellt die Verwendung eines neunten Bits dar, mit dem eine Multiprozessor-Kommunikation programmiert werden kann. Das nachfolgende Bild zeigt eine asynchrone Umsetzung von parallel in seriell und wieder von seriell in parallel mit acht Datenbits. Im oberen Teil erfolgte eine Momentaufnahme bei der Übertragung. Der untere Teil veranschaulicht die Bitfolge, die nacheinander auf der Leitung liegt. Dies entspricht dem Mode 1 der seriellen Vollduplex-Schnittstelle. Bei einer Vollduplex-Schnittstelle sind jeweils auf beiden Seiten Empfänger und Sender vorhanden und es kann gleichzeitig gesendet und empfangen werden. Bei der Übertragung wird ein Start-Bit vorangestellt. Das niederwertigste Bit wird nach dem Start-Bit auf die Leitung gelegt. Danach folgen die nächst höherwertigen Bits, bis zum siebten Bit. Diesem wird ein Stop-Bit angehängt, damit der Empfänger kontrollieren kann, ob er auch acht Bit empfangen hat.
Abb. 5.15 Umsetzung von parallel in seriell
134
Aufgabe Zum einfachen Test der seriellen Schnittstelle wird ein Zeichen von einem anderen PC zur EURO_535-Karte gesendet. Die EURO_535-Karte erkennt das Zeichen und sendet es zurück. Lösung Das Programm lässt sich bei Einsatz eines PCs mit dem Simulator testen. Die serielle Schnittstelle auf der Euro_535 dient zur Kommunikation mit dem Remote-Debug-System und ist deshalb schon belegt. Die serielle Schnittstelle bietet eine Vielzahl von Einstellungen. Die einfachste Vorgehensweise besteht darin, eine funktionierende Einstellung entsprechend der Vorgaben anzupassen. Im Fall der EURO_535 besteht im Remote-Debug-Betrieb bereits eine Kommunikation über die serielle Schnittstelle. Es liegt deshalb nahe, zuerst die dort getroffenen Einstellungen anzusehen. Die Einstellungen der seriellen Schnittstelle sind: • • •
9600 Baud seriell, asynchron, interruptgesteuert 1 Startbit, 8 Datenbits, 1 Stoppbit
Die Einstellung der Baudrate im Monitorprogramm können Sie nicht erkennen. Diese müssen jedoch genauso eingestellt werden, damit die Kommunikation funktioniert.
Abb. 5.16 Einstellungen der seriellen Schnittstelle
Auf der PC-Seite müssen die Einstellungen übereinstimmen. Interessanterweise enthält der PC meist einen einzelnen Chip (8251), der völlig identisch mit der seriellen Schnittstelle ON-Chip im Controller ist. Zuerst wird das Programm vorgestellt. Die Erklärungen zur Einstellung der Baudrate
5 Projekte mit Assembler gelöst
135
und der Funktionsweise der seriellen Schnittstelle erfolgen im Anschluss an das Programm SER_ZEICH.A51. $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 (SER_ZEICH.A51) ;-----------------------------------------------------------------------;Programmbeschreibung: ;Programmierung der seriellen Schnittstelle fuer ein ;EPROM. Ein grosses Zeichen vom Terminal gesendet ;wird in kleines Zeichen gewandelt und an das Terminal ;zurueckgeschickt. ;Demo im Simulator ;-----------------------------------------------------------------------; ;Datum: 29.11.2004 ;Programmiert: J. Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ; ; ;Kommentar: ; ;Aenderungen: ;Datum: ; ;-----------------------------------------------------------------------;Initialisierungsteil für allgemeine Konstanten ;-----------------------------------------------------------------------CSEG AT 0H
;Legt absolute Codesegmentadresse auf 0h
ljmp INIT
;Interruptadressen ueberspringen
;-----------------------------------------------------------------------;Interrupt-Vektoren ;-----------------------------------------------------------------------org 23H call SERINT reti
;Adresse vom Programmspeicher ;Interrupt-Adresse serieller Interrupt ;Sprung zur Interrupt-Service Routine ;Ruecksprung aus Interrupt
;-----------------------------------------------------------------------;Programmbeginn ;-----------------------------------------------------------------------org 100H INIT: jb P1.1,INIT clr RI clr TI mov PCON,#80H mov SCON,#50H setb BD
;Programmstart ;Start mit T1 ;Sendeinterrupt zuruecksetzen/freigeben ;Empfangsinterrupt zuruecksetzen/ freigeben ;9600 Bit/s einstellen ;8-Bit UART ;Empfaenger Bit Freigabe ;internen Baudratengenerator einschalten
136 ;-----------------------------------------------------------------------;Programmierung der Interrupteinheit ;-----------------------------------------------------------------------setb EAL ;allgemeine Interrupt Freigabe setb ES ;seriellen Interrupt freigeben clr P3.2 ;LED 1 zeigt an, dass die Initialisierung ab;geschlossen ist WARTE: jnb P1.3,ENDE jmp warte SERINT: cpl P3.3 mov A,SBUF add A,#20h mov SBUF,A serint1: jnb TI,serint1 clr TI clr RI ret ENDE: ljmp 8000H end
;Programmende ;warten
;empfangenes Zeichen in den Akkumulator ;in kleines Zeichen wandeln ;Zeichen senden ;warten bis serielle Daten gesendet ;Flag fuer das Ende der Uebertragung loeschen ;Empfangs-Interrupt freigeben
;Monitorruecksprung
Die Einstellungen der seriellen Schnittstelle in der Keil Entwicklungsumgebung finden Sie in „Zauberstift“ > Options for Target > Settings:
Abb. 5.17. Einstellungen der seriellen Schnittstelle am „PC“
Compilieren Sie das Programm, gehen Sie in den Debug-Mode und starten Sie es mit RUN. Port 1.1 wird auf 0 gesetzt und damit die serielle Schnittstelle konfiguriert. Im Menü „View“ öffnen Sie das Serial Window #1 und geben einen großen Buchstaben ein. Zu diesem wird jetzt 20H addiert und damit erhalten Sie einen kleinen Buchstaben im Fenster Serial #1. Ein Klick mit der rechten Maustaste auf das Serial #1 Fenster öffnet ein Menü mit der Auswahlmöglichkeit zwischen Hex und ASCII Mode. Im Fenster der seriellen Schnittstelle wurde ein großes A eingegeben. Der Hexadezimale Wert von A ist 41h und somit wird der Wert 61h zurückgesendet.
5 Projekte mit Assembler gelöst
137
Das Programm lässt sich sehr einfach im Simulator testen. Vergessen Sie nicht, das Programm zu starten und anschließend den Port 1.1 kurzzeitig auf 0 zu setzen. Testen Sie das Programm aus und addieren oder subtrahieren Sie auch andere Werte. Beachten Sie jedoch den Bereich der ASCII-Codierung, innerhalb dessen sinnvolle Zeichen erscheinen müssen.
Abb. 5.18 Einstellungen der seriellen Schnittstelle 80535
138
5.4.1
Die serielle Schnittstelle im Detail
Die serielle Schnittstelle des 8051 kann, wie bereits erwähnt, gleichzeitig senden und empfangen. Dieser Betrieb wird Vollduplex-Betrieb genannt. Es bestehen vier Betriebsarten: Mode 0: Synchrone Übertragung mit 1MBit/s Mode 1: Asynchrone 8-Bit-Übertragung mit variabler Baudrate Mode 2: Asynchrone 9-Bit-Übertragung mit fester Baudrate Mode 3: Asynchrone 9-Bit-Übertragung mit variabler Baudrate Die Baudraten werden im nächsten Kapitel behandelt. SCON REGISTER - Steuerung Serielle Schnittstelle Bitadressierbar 98H
09FH SM0
09EH SM1
09DH SM2
09CH REN
09B TB8
09AH RB8
099H TI
098H RI
SCON
Tabelle 5.15 SCON Bits Bit SM0 SM1 0 0 1 1 SM2
REN TB8 RB8 TI RI
Symbol 0 Mode 0: Synchroner Modus, feste Baudrate fosc/12 1 Mode 1: 8-Bit UART, variable Baudrate 0 Mode 2: 9-Bit UART, feste Baudrate fosc/64 oder fosc/32 1 Mode 3: 9-Bit UART, variable Baudrate 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 Stopbit empfangen wird. In Mode 0 muß SM2="0" sein. Receiver enable. "1" Gibt den seriellen Empfang durch Software frei. "0" sperrt den Empfang. Übertragungsbit 8. Das neunte Bit für Mode 2 und 3 Wird durch Software gesetzt und rückgesetzt. Empfangsbit 8. Neunte Bit für Empfang in Mode 2 und 3 Übertragungsinterrupt. Wird durch die Hardware 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. 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 Modi. Muss durch Software zurückgesetzt werden.
5 Projekte mit Assembler gelöst
139
SBUF Empfangs- und Senderegister für serielle Schnittstelle 99H
5.4.2
SBUF
Die Baudrate
Die Einheit BAUD wird bei Datenflüssen verwendet. Es ist eine zusammengesetzte Einheit und gibt die Anzahl der Bits pro Sekunde bei einem Informationsfluss an. Bei der Verwendung eines 80535-Controllers gibt es zwei Möglichkeiten die Baudrate zu erzeugen . Die einfachste wurde im oberen Programm verwendet. Die Baudrate leitete sich durch Verwendung der internen Baudrateneinheit aus der Oszillatorfrequenz ab.
fosc/2
Timer 1 Overflow ADCON.7 (BD)
SM0 SM1 SMOD
*1/39
*1/2 Baud Rate
Abb. 5.19 Erzeugen der Baudrate
Die Einstellung der beiden Bits BD und SMOD erfolgt in zwei Spezialregistern, die auch andern Einheiten zugeordnet sind. Eigentlich sollte der Ausdruck Baudrate durch „Bit pro Sekunde“ ersetzt werden. Da dieser Ausdruck jedoch im Datenblatt von Siemens / Infineon steht, wird er auch hier verwendet. Baudraten im PCON Power Control Register 99H
SMOD
Bit SMOD
PCON
Funktion "1" Baudrate wird in Mode 1,2,3 verdoppelt
140
Baudraten im ADCON REGISTER - A/D-Wandler Steuerung Bitadressierbar 0D8H
0DFH BD
0DEH CLK
0DDH -
0DCH
0DB
0DAH
0D9H
0D8H ADCON
Tabelle 5.16 ADCON REGISTER Bit BD CLK
Funktion Baudrate - Wird nicht für A/D-Wandler verwendet "1" Der Takt wird nach außen an Pin P1.6/CLKOUT weitergeleitet
Die zweite Möglichkeit, die Baudrate zu erzeugen, besteht in der Benutzung der Timereinheit 1. Insbesondere beim 8051-Kern muss diese Art gewählt werden. Leider lassen sich Standardbaudraten nur mit einem veränderten Grundtakt erzeugen. Die Taktfrequenz muss 11.059 MHz betragen. Dies war und ist ein großer Nachteil von Controllern mit 8051-Kern und wird bei fast allen Derivaten durch einen internen Baudratengenerator umgangen. Hilfreich ist die folgende Tabelle, falls Sie mit dem Timer 1 die Baudraten erzeugen wollen: Tabelle 5.17 Allgemein verwendete Baudraten Baud Rate Mode 1,3 62,5 Kbaud 19,5 Kbaud 9,6 Kbaud 4,8 Kbaud 2,4 Kbaud 1,2 Kbaud 110 Baud 110 Baud
fosc(MHz) 12,0 11,059 11,059 11,059 11,059 11,059 6,0 12,0
SMOD 1 1 0 0 0 0 0 0
C/(/T) 0 0 0 0 0 0 0 0
TIMER 1 Mode 2 2 2 2 2 2 2 1
Reload Value 0FFH 0FDH 0FDH 0FAH 0F4H 0E8H 72H 0FEEBH
Als EPROM-Version des Programmes SER_ZEICH.A51 kann das folgende Programm SERTEST.A51 verwendet werden (um Kommentare verkürzt). CSEG AT 0H ljmp INIT org 23H call serint reti org 100H INIT:
;Legt absolute Codesegmentadresse auf 0h ;Interruptadressen ueberspringen ;Interrupt-Adresse serieller Interrupt ;Sprung zur Interrupt-Service Routine ;Programmstart
5 Projekte mit Assembler gelöst jb P1.1,INIT clr RI clr TI mov PCON,#80H mov SCON,#50H setb BD setb EAL setb ES clr P3.2 WARTE: jmp warte serint: cpl P3.3 mov R0,SBUF mov SBUF,R0 serint1: jnb TI,serint1 clr TI clr RI reti end
5.5
141
;Sendeinterrupt freigeben ;Empfangsinterrupt freigeben ;9600 Baud einstellen ;8-Bit UART,Empfaenger Bit Freigabe ;internen Baudratengenerator einschalten ;allgemeine Interrupt Freigabe ;seriellen Interrupt freigeben ;LED 1 zeigt an, daß die Init. abgeschlossen ist ;warten ;empfangenes Zeichen nach Register R0 ;Zeichen senden ;warten bis serielle Daten gesendet ;Kennung fuer das Ende der Uebertragung loeschen ;Empfangs-Interrupt freigeben
Projekt Effektivwertmesser
Bei der Aufgabe, einen Effektivwertmesser zu bauen, werden die verschiedenen Befehle der 8051-Familie angewendet. Bei einer solchen Aufgabe werden jedoch nicht nur die Befehle benötigt, sondern es muss das gesamte Umfeld inklusive der Derivatauswahl des µ-Controllers betrachtet werden. Struktur und Organisation des Programms spielen hierbei eine ebenso wichtige Rolle. Aufgabe Bau eines Effektivwertmessers für ein elektrisches Signal Ue mit folgenden Eigenschaften: • Spannungsbereich 1V≤Ue≤3V • Signalfrequenz fu=100 Hz • Signalformen Dreieck, Sinus, Rechteck Die Signalformen werden so gewählt, dass eine leichte Überprüfung des Ergebnisses möglich ist. Die Überprüfung des Projektsergebnisses erfolgt immer durch einen Vergleich mit bereits bestehenden Geräten, die mit einer anderen Technik realisiert wurden. Lösung Der Effektivwert berechnet sich mit:
Ueff =
1 T/ 2 2 ∫ u dt T −T / 2
142
• • • • •
Für die Lösung müssen folgende Operationen durchgeführt werden: Quadrieren Multiplizieren mit dt - Δt Integrieren - Summieren Dividieren Wurzel ziehen
Anzeige des Effektivwertes Hierbei sind folgende Möglichkeiten gegeben: • Digitale Anzeige mit 7-Segmentanzeige oder LCD-Display • Anzeige über Analoginstrument durch Ausgabe einer Spannung über D/A-Wandler • Anzeige über einen PC Da bei dem Projekt sehr unterschiedliche Befehle studiert werden, erfolgt die Anzeige über einen PC. Der Datentransfer von und zum PC wird über die serielle Schnittstelle abgewickelt. 5.5.1
Erweiterungen - Wiederverwendung der Software
Es gibt prinzipiell zwei Möglichkeiten, eine solche Aufgabe zu lösen: 1. Schnelle Lösung der Aufgabe ohne Erweiterungsmöglichkeit und Wiederverwendbarkeit der Software. 2. Methodische Lösung der Aufgabe mit Erweiterungsmöglichkeiten und Wiederverwendbarkeit der Software. Der erste Lösungsweg ist nicht zu empfehlen, da mir keine Aufgabenstellung bekannt ist, die sich während der Projektzeit nicht geändert hätte. Zudem ist es mit hohen Kosten verbunden, wenn bei jedem Projekt neue Software entwickelt werden muss. Im ersten Lösungsweg wird das Wort "schnell" verwendet. Dies würde jeden Verantwortlichen überzeugen, diese Lösung zu wählen. Jeder Erfahrene würde jedoch sofort nach ähnlichen, bestehenden Lösungen fragen. Sind solche Projekte bereits vorher nach dem Muster der zweiten Lösung entstanden, kann das Projekt noch wesentlich schneller bearbeitet werden. 5.5.2
Modularisierung
Den ersten Schritt für die Bearbeitung eines solchen Projektes bildet die ingenieurmäßige Darstellung mittels eines Blockschaltbildes.
5 Projekte mit Assembler gelöst
Ueff
µ-Controller
Signalgenerator
143
A/D-Wandler
t
Zeitgeber Serielle Schnittstelle
Abb. 5.20 Blockschaltbild für Effektivwertmesser
Jetzt lässt sich bereits eine grobe Modularisierung des Projektes in Teilaufgaben durchführen: • • • • •
Projektkoordination und grundlegende Überlegungen Abtastung Berechnung des Effektivwertes Wertübergabe an PC Darstellung auf PC
Für die erste Aufgabe, die Projektkoordination sowie die grundlegenden Überlegungen muss genügend Zeit eingeplant werden. Jeder Fehler an dieser Stelle hat negative Auswirkungen bei der Projektbearbeitung. Deshalb die nachfolgende Simulation und die theoretische Darstellung des Signals bzw. der abgetasteten Werte: Sinus mit 100 Hz; abgetastet mit 1000 Hz 3
2,5
Ue
2
1,5
1
0,5
0 0
5
10
15
20
25 t in ms
Bild 5.21. Abgetasteter Sinus
30
35
40
45
144
Möglichkeiten der Anzeige: • Schreiberanzeige • Balkenanzeige • Analoginstrument Nachahmung Überlegungen zu Datenfluss und Datenspeicherung 1. Speicherung der Zeitwerte 2. Ohne Speicherung der Zeitwerte Die Speicherung wird bevorzugt, da weitere Kennwerte des Signals gefordert sein können. Überlegungen zur Vorgehensweise Die Aufgabe kann zuvor auf einem PC in Hochsprache simuliert werden. Diese Vorgehensweise ist sehr vorteilhaft, da Projektplanungsfehler hierdurch sehr schnell erkannt werden. Ein weiterer Vorteil ist die Überprüfung der Ergebnisse durch Vergleich der Simulation mit der 80535Programmausführung. Dabei können numerische Überlegungen und Überprüfungen eine Rolle spielen. Die Simulation kann mit Programmen wie Maple, Excel, oder C# durchgeführt werden. Verwendet man Excel, kann die Darstellung des Signals sehr einfach in einer Grafik realisiert werden. Als Lösung ist die oben aufgeführte Erklärung mit Doppelpuffer ideal, aber für den Anfänger kompliziert zu programmieren. Deshalb sollen die Aufgabenteile zuerst in einfachster Form gelöst werden. Danach kann das Programm an die Aufgabe angepasst und erweitert werden. 5.5.3
Vereinfachung der Aufgabenstellung
Aufgabe Es sollen 40 Werte mit dem A/D-Wandler bei einer Abtastzeit von 1 ms in den Speicher ab Adresse 2000H eingelesen werden. Anschließend wird mit diesen Werten eine Effektivwertberechnung durchgeführt. Der Effektivwert wird an den PC übergeben. Folgende Programme sind zu erstellen: 1. AD_40T2 Wandelt 40 Werte, Wandlungsdauer 1ms und legt diese im Speicher ab. 2. AD_40_OO Subtrahiert den Offset und bildet Betrag 3. MUL_40 Bildet das Quadrat der gemessenen Werte 4. ADD_40 Addiert die quadrierten Werte auf 5. DIV_40 Bildet delta_t / Messdauer 6. SER_40 Übergibt den Wert über die serielle Schnittstelle zum PC
5 Projekte mit Assembler gelöst
145
A/D-Wandlung von 40 Werten mit Periodendauer 1ms
Die notwendigen Einstellungen für die Programmierung des A/DWandlers konnten Sie im Projekt "A/D-Wandlung" kennen lernen. Eine weitere Herausforderung besteht jedoch in der Realisation der Abtastzeit von 1 ms. Dazu bieten sich mehrere Möglichkeiten an: 1. Ein 16-Bit-Zeitgeber - Timer 0 oder 1 - wird gemeinsam mit der Interrupt-Funktion verwendet. Bei Überlauf löst der Zeitgeber ein Interrupt aus, der wiederum eine A/D-Wandlung auslöst. Der Zeitgeber wird neu geladen und gestartet. Die Interruptfunktion benötigt jedoch zwischen drei und acht Maschinenzyklen. Glücklicherweise steht genau diese Zeit im Timer und kann somit von der Zählzeit abgezogen werden. Die Zeit zur Ausführung der Befehle muss ebenfalls von der Zählzeit, mit der die Timerregister geladen werden, abgezogen werden. 2. Ein 16-Bit-Zeitgeber -Timer 0 oder 1- wird verwendet und das TF-Bit / Timer Overflow - Bit überwacht. Entsteht ein Überlauf, wird die Wandlung ausgelöst. Nachteil dieser Lösung ist, dass der Controller durchgehend das TF-Bit abfragen muss. 3. Timer 0 oder 1 werden im Autoreload-Modus betrieben. Da mit 8 Bit maximal bis 255 gezählt werden kann, ist es sinnvoll, das AutoreloadRegister THx (x=0,1) mit 6 zu laden. Hierdurch erzeugt TF0 Interrupts mit der Frequenz von 4 kHz. Teilt man diese Frequenz durch 4, beispielsweise durch Abwärtszählen eines Registers, ergibt sich die Abtastfrequenz von 1 kHz. 4. Bei Verwendung eines 80535-Controllers ermöglicht Zeitgeber 2 ein automatisches Wiederladen mit 16-Bit-Breite. Für die Erzeugung von einer Millisekunde wird das Reload-Register mit FC18h geladen. Die nachfolgende Lösung verfährt nach Punkt 4. Zur Übung empfehle ich, die anderen Verfahren ebenfalls zu programmieren. 5.5.4
Timer 2
Für die Programmierung des Zeitgebers 2 ist nachfolgendes Blockschaltbild hilfreich:
146
P1.5/T2EX Fosc/12(24) Gegattertes Fosc/12(24) Fallende Flanke an P1.7/T2
Timer 2 16 Bit
Timer 2 Interrupt Interrupts
16 Bit
16 Bit
Komparator
Komparator
16 Bit Komparator
16 Bit Komparator
P1.0/CC0 E/ASteuerung 8 CCH3 CCL3
CCH2 CCL2
CCH1 CCL1
CRCH CRCL
P1.1/CC1 P1.2/CC2 P1.3/CC3
Interner Bus 8 Bit
Abb. 5.22 Blockschaltbild Zeitgeber 2 Tabelle 5.18 Verwendetet Abkürzungen Abkürzung CRCH, CRCL CCH1, CCL1 CCH2, CCL2 CCH3, CCL3
Bedeutung Compare Reload Capture High / Low Register Compare Capture High / Low Register 1 Compare Capture High / Low Register 2 Compare Capture High / Low Register 3
Die Timer 2 Einheit hat drei Funktionsarten: 1. Reload / Automatisches Wiederladen Tritt ein Überlauf am Zeitgeber 2 oder eine externe ReloadAnforderung auf, so wird der Zeitgeber 2 mit dem Inhalt der beiden Register CRCH, CRCL geladen. Die Periodendauer des Zählers lässt sich durch den Inhalt der beiden Register variieren. 2. Capture / Übernahme des Zählerstandes Liegt an Port P1.0, P1.1, P1.2, P1.3 ein externes Signal zur Speicherung des Zeitgebers 2 an, wird der Inhalt des Zählers 2 in die Capture-Register übernommen. 3. Compare / Vergleich Zählerstand - Vergleichsregister Der Inhalt des Zeitgebers 2 und der Inhalt der Vergleichsregister werden verglichen. Bei Übereinstimmung der beiden Werte erzeugt jede Compare-Einheit ein Signal am Ausgang. Gleichzeitig wird ein Interrupt angefordert.
5 Projekte mit Assembler gelöst
147
T2CON BITS - Timer 2 - Control Bits Bitadressierbar 0C8H
0CFH T2PS
0CEH I3FR
0CDH I2FR
0CCH T2R1
0CBH T2R0
0CAH T2CM
0C9H T2I1
0C8H T2I0
T2CON
Tabelle 5.19 Timer 2 Control-Bits Bit T2I1 0 0 1 1
Funktion Timer 2 input selection. Auswahl des Eingangs. Kein Eingang gewählt. - Zeitgeber zählt nicht Zeitgeberbetrieb. Frequenz = fosc/12 (T2PS="0" ) - fosc/24 (T2PS="1" ). Zählerbetrieb. An Pin T2/P1.7 muss externes Signal anliegen. Zeitgeberbetrieb mit Gatterfunktion. Gatter wird über Pin T2/P1.7 gesteuert. T2R1 T2R0 Timer 2 reload mode selection. Zeitgeber 2 Wiederladebetrieb 0 X Wiederladen gesperrt. 1 0 Modus 0: Wiederladen bei Timer 2 Überlauf ( TF2 ) 1 1 Modus 1: Wiederladen bei fallender Flanke an Pin T2EX/P1.5 T2CM Compare mode / Vergleichsmodus für Register CRC, CC1, CC2, CC3. "0" Vergleich bei Überlauf des Timers 2 "1" Fallende Flanke an Pin T2EX/P1.5 löst Vergleich aus. I2FR Dieses Bit wird nicht zur Kontrolle des Zeitgebers 2 verwendet I3FR External Interrupt 3 falling / rising edge flag. Wird ebenso für die Übernahmefunktion in Kombination mit dem CRC Register benutzt. "0" Übernahme erfolgt bei negativer Flanke an P1.0. "1" Übernahme erfolgt bei Freigabe an positiver Flanke an P1.0. T2PS Prescaler select bit / Vorteiler Bit. "0" für die Zählerfunktion 1/12 der Oszillatorfrequenz "1" Interner Takt mit 1/24 der Oszillatorfrequenz. T2I0 0 1 0 1
Für die Lösung der Aufgabe muss Timer 2 folgendermaßen programmiert werden: Reload-Register CRCH, CRCL: Der Timer zählt aufwärts von 0 bis 0FFFFH. Für 1ms programmiert man 1000 Zählerschritte mit jeweils 1µs, die bei einem 12 MHz Takt einem Zyklus entspricht. Ein Takt ist für die Reload-Funktion zu rechnen. Dies ergibt die Zahl 64536=0FC18H -> 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
80535
2000H 2001H 2002H
30H
externer Speicher 1. Wert 2. Wert
interner Speicher 57H
CPU
2027H 2028H 2029H
40. Wert 1. Wert LB 1. Wert HB
2077H
40. Wert HB
Quadrieren
Abb. 5.27 Speicherinhalt nach Quadrieren 80535
2000H 2001H 2002H
CPU
externer Speicher 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
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* Δt 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 40 ms 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 tim0init: mov A,TMOD anl A,#11110000B orl A,#00000001B
;Warten bis Wandlung fertig ;Werte aus A/D-Wandlerregister in Akku ;Werte in externen Speicher ; ; ;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
div_40: mov R7,#0 mov R6,#0 mov TMP_0,#0 mov TMP_1,#0 mov TMP_2,#0
;This divides the 32 bit OP register ;by the value supplied
;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: 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: clr C quot: lcall shift_q
;subtract the divisor from the partial ;remainder ;A = R6-R0 ;A = R7-R1-Borrow ;shift a 1 into the quotient ;shift a 0 into the quotient
;shift the Carry-bit into the quotient ;Test for competion
170 djnz R5,div_loop mov mov mov mov ;
OP_0,TMP_0 OP_1,TMP_1 OP_2,TMP_2 OP_3,TMP_3
;Now we are all done, mov the TMP values ;back into OP
;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: 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: 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
;shift the dividend one bit to the ;left and return the MSB in C
;shift the quotient one bit to the left ;and return the MSB in C
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 ; ; h_a_tab: db '0123456789ABCDEF' ;
;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
; 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 ;
; bytesend: mov DPTR,#h_a_tab mov R0,A ; anl A,#0f0h swap A movc A,@A+DPTR lcall SERSEND
;UP bytesend: wandelt das Zeichen aus ;dem ACCU in ASCII und sendet es ;ueber die serielle Schnittstelle ;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
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:
;UP ASCII ->HEX: Adresse ASCII-Wert in R0 ;Adresse hex-Wert in R1 ;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 SERSEND: mov SBUF,A jnb TI,$ clr TI ret end
;low-nibble hex_wert speichern ; UP sersend: sendet ein Zeichen aus dem ACCU ;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.
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
Link & Locate
File
DateiKonverter *.M51 Listing File
Compiler
*.HTX sp8051kl
L51
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 ? Taster 1 TR0 aus Port 3.2 löschen Licht ein
Taster 2 TR0 aus Port 3.2 setzen Licht aus
ja
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) {
}
} return;
/* 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; }
/* 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<2V
2V<Wert<=3V
Leuchte_2 aus
Leuchte_2 aus
Leuchte_3 aus
Leuchte_3 ein
3V<Wert<=4V
Leuchte_2 ein Leuchte_3 aus
4V<Wert<=5V
Leuchte_2 ein Leuchte_3 ein
Abb. 7.4 Struktogramm AN0_COD.C
Die Programmierung in C erweist sich als leicht lesbar und kann somit sehr gut erweitert und wiederverwendet werden. /********************************************************************** ** ** ** Datei:AN0_COD.C ** ** Das Programm bewirkt: ** ** A/D-Wandler, Spannung dekodieren nach folgender Tabelle ** ** ** ** U/V Leuchte 2 Leuchte 3 ** ** 0V<=U<=2V aus aus ** ** 2V< U<=3V aus ein ** ** 3V< U<=4V ein aus ** ** 4V< U<=5V ein ein ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rueckgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: W. Marx / J. Walter ** ** Datum: 29.6.1994 SS 94 ** ** ** **********************************************************************/ /***************** Steueranweisungen fuer den Compiler ***************/ #pragma OBJECTEXTEND
/* typengerechtes Programm Debug */
194
7
Projekte in C gelöst
#pragma CODE DEBUG #pragma SYMBOLS
/* Symbolisches Debuggen ein */ /* alle Symbole werden aufgelistet */
/******************* Text im Quelltext einbinden *********************/ #include <euro_535.h>
/* Definitionen fuer EURO_535-Karte */
/*************************** Konstanten ******************************/ #define aus 1 #define ein 0 /*********************** globale Variablen ***************************/
/************************ Hauptprogramm ******************************/ void main(void); void Leuchten(char, char);
/* Funktions-Prototypen */
void main(void) { Leuchte_1 = 0; ADCON = 0x80;
/* main-Programm */
while (1) { DAPR = 0x0; while (BSY);
/* Lampe einschalten */ /* Kanal AN0 angewaehlt */ /* Stop nach der Wandlung */ /* Wandlung Start */ /* warten bis Wandlung fertig */
if (ADDAT <= 102) Leuchten(aus, aus); else if ((ADDAT > 102) && (ADDAT <= 153)) Leuchten(aus, ein); else if ((ADDAT > 153) && (ADDAT <= 204)) Leuchten(ein, aus); else Leuchten(ein, ein); } return; } void Leuchten(char Lampe1, char Lampe2) { Leuchte_2 = Lampe2; Leuchte_3 = Lampe3; return; }
Der Bildschirminhalt einer Debug-Sitzung wird im folgenden Bild dargestellt. Verschiedene Fenster ermöglichen das parallele Beobachten bei der Abarbeitung der Befehle in Assembler und Hochsprache. Um die Vorgänge am A/D-Wandler zu beobachten, wurde das Watch-Fenster eingeblendet. Die Adresse ADDAT kann aus der Liste der PUBLIC-Adressen gewählt werden. Damit die Veränderungen des Registers angezeigt werden, müssen Sie wieder das periodische Updaten, d.h. das automatische erneute Einlesen
7 Projekte in C gelöst
195
dieses Registers, aktivieren. Im Gegensatz zur Umsetzung mit Assembler erhalten Sie die Werte durch einfachen if-Vergleich. Außerdem können Sie unter „Peripherals“ sehr schön die Eingabewerte vom A/D-Wandler variieren. Beim Eingang AIN0 wurden 3.0000 V eingestellt. Deshalb erscheint im Watch #1 Fenster 99H. Ändern Sie den Wert von AIN0 können Sie sofort den Wert in ADDAT in Hexadezimal sehen.
Abb. 7.5 Ausschnitt einer Debug-Sitzung von AN0_COD.C
196
7
Projekte in C gelöst
7.4
Die serielle Schnittstelle in C
Bei dieser Aufgabenstellung studieren Sie die Funktionsweise der seriellen Schnittstelle bei Verwendung der Standard Ein- /Ausgabe-Bibliothek STDIO.H. Bei der Lösung in C sperre ich absichtlich den Interrupt der seriellen Schnittstelle, um nachzuweisen, dass die Funktion _getkey nicht im Interrupt-Betrieb (Unterbrechungsbetrieb), sondern im Pollingbetrieb (Abfragebetrieb) arbeitet. Das Programm in C kann wie folgt aussehen: /********************************************************************** ** ** ** Datei:SERIEL_1.C ** ** Das Programm bewirkt: ** ** Ein Grossbuchstaben der von einem PC ueber Serial #1 ** ** zum Controller gesendet wird, kommt als Kleinbuchstaben ** ** zurueck. ** ** Nach dem DownLoad wird das Programm gestartet. ** ** Nachdem der Taster 1 gedrueckt wurde, kann im Serial #1 ** ** ein Zeichen eingegeben werden, welches vom 80535 ** ** zurueckgesendet wird. ** ** ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rueckgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: W. Marx / J. Walter ** ** Datum: 29.6.1994 /2007 ** ** ** **********************************************************************/ /***************** Steueranweisungen fuer 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> #include <stdio.h>
/* Definitionen fuer EURO_535-Karte */ /* Input Output Funktionen Bibliothek */
/*************************** Konstanten ******************************/
/*********************** globale Variablen ***************************/ /************************ Hauptprogramm ******************************/ void main(void) { char zeichen;
/* main-Programm */
7 Projekte in C gelöst
197
/***** Warten bis P1.1 gesetzt wird ***/ while (Taster_1); /* Warten, bis Terminal-Prog. */ /* gestartet, Taste 1 druecken */ Leuchte_1 = 0; /* Lampe 1 einschalten */ /* Serielle Schnittstelle 9600 Baud, 8 Datenbit, Keine Paritaet, */ /* 1 Stopbit, Xon/Xoff */ ES = 0; PCON = 0x80; SCON = 0x52; BD = 1;
/* serieller Interrupt sperren */ /* Baudrate wird in Mode 1,2,3 */ /* verdoppelt */ /* 8-Bit UART,variable Baudrate, */ /* Receiver enable, Stop Bit */ /* Baud rate enable */
/* Zeichen wird erwartet */ while (1) { zeichen = _getkey(); putchar(zeichen + 0x20); Leuchte_2 = ~Leuchte_2;
}
} return;
/* /* /* /* /* /*
Zeichen empfangen */ Zeichen in kleine */ Buchstaben wandeln */ und senden */ Lampe 2 nach jedem */ Zeichen invertieren */
Nach dem Laden des Programmes in den Simulator muss es gestartet werden. Öffnen Sie zusätzlich das Serial Window #1. Setzen Sie P1.1 auf „0“ und danach wieder auf „1“. Dies entspricht einem Tastendruck T1 ( Taster_1 ) auf der Hardware. Vom Fenster Serial #1 aus können Sie jetzt Großbuchstaben senden und bekommen als Echo Kleinbuchstaben. Ergebnisse über die serielle Schnittstelle zu senden, ist ein häufig angewendetes Verfahren beim Bau von Prototypen. Da die serielle Schnittstelle auf der EURO_535 zum Debuggen verwendet wird, wurde eine zweite serielle Schnittstelle per Software implementiert. Diese arbeitet bis 9600 Bit/s. Auch lässt sich ein solches Verfahren in ein Tabellenkalkulationsprogramm integrieren, um damit schnell beliebige Anzeigen erstellen zu können. Ein weiteres Einsatzgebiet könnte beispielsweise in der Qualitätskontrolle liegen. Hier werden oft Messschieber mit einer seriellen Schnittstelle eingesetzt. Die Ergebnisse können dann eingelesen und gespeichert werden. Bei Bedarf können diese Werte dann an ein übergeordnetes System zur Auswertung weitergegeben werden.
198
7
Projekte in C gelöst
7.5
Das Programm Effektivwert in C
Dieses Programm überzeugt durch seine Effektivität bei Verwendung einer Hochsprache. Wie mühsam waren dagegen die mathematischen Operationen wie Addition, Multiplikation und Division in Assembler! In Hochsprache ist dies ein Genuss. Dieses Programm können Sie jedoch nur mit der Vollversion von Keil und der EURO_535 Hardware ausführen. Zwar können Sie kompilieren, beim DEBUG-Betrieb erhalten Sie dann aber folgende Meldung: *** Currently used: 3361 Bytes (164%) *** error 120: code size limit exceeded
/********************************************************************** ** ** ** Datei:EFF_WERT.C ** ** Das Programm bewirkt: ** ** Einlesen von 40 A/D-Werten, Berechnung des Effekticwertes ** ** und Uebergabe ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rueckgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: W. Mueller / J. Walter ** ** Datum: 30.6.1994 SS 94 ** ** ** **********************************************************************/ /***************** Steueranweisungen fuer 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> #include <stdio.h> #include <math.h>
/* Definitionen fuer EURO_535-Karte */ /* Standard I/O-Biobliothek */ /* Mathematik-Bibliothek */
/*************************** Konstanten ******************************/ #define anzahl_ad_werte 40 #define offset 102
/* Anzahl zu wandelnden Werte */ /* Offset von 2 V */
/*********************** globale Variablen ***************************/ unsigned char ad_werte[40]; unsigned long speicher_H1=0;
/* Feld der Messwerte */ /* Hilfsspeicher 1 */
/************************ Hauptprogramm ******************************/
7 Projekte in C gelöst void main(void) { int i;
/* allgemeiner Schleifenzaehler */
/***** Warten bis HITOP verlassen und Terminal aufgerufen ***/ while (Taster_3);
/* Warten, bis Terminal-Prog. */ /* gestartet, Taste 3 druecken */ /* Lampe 3 einschalten */
Leuchte_3 = 0;
/**************** Werte berechnen und an Terminal senden ***********/ while(Taster_1)
/* T1 betaetigt ? */
/*********** 40 Werte von A/D-Wandler einlesen *********************/ TMOD = (TMOD & 0xf0) | 0x1; /* Timer 0 initialisieren */ TH0 = 0xfc; /* 1ms = 65536 - 1000 + 5 Befehle */ TL0 = 0x1c; /* fc1c Hexadezimal */ TR0 = 1; /* Timer 0 startet */ SCON = 0x52; /* Serielle Schnittstelle init. */ BD = 1; /* interner Baudratengenerator ein */ PCON = 0x80; /* 9600 Baud */ TF0 = 0; /* Overflow Flag loeschen */ ES = 0; /**************** Messwerte einlesen *******************************/ for (i=0;i
}
/* /* /* /*
Warten bis Timer Overflow */ Overflow Flag loeschen */ Timer 0 stop */ Timer neu laden */
/* Timer 0 neu starten */ A/D-Wandlung starten *********/
DAPR=0; while(BSY); ad_werte[i]=ADDAT;
/* 0-5V-Wandlung starten */ /* Wandlung fertig ? */ /* Werte in Feld speichern */
/********* Offset subtrahieren, Effektivwert bilden */ for (i=0;i
199
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 Maschinensteuerregister 32 Bit CR0 CR1 Reserviert CR2 CR3 GDT 48 Bit IDT 48 Bit LDT LSS DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 TR6 TR7
Codesegment Extrasegment Stapelsegment Datensegment (1) Datensegment (2) Datensegment (3)
Maschinensteuerregister Seitenfehler lineare Adresse Seiteninhaltsverz. Basisadr. Globale Deskriptortabelle Interruptdeskriptor-Tabelle Lokale Deskriptortabelle Prozessstatussegment
Reserviert
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 &
Zweiseitiger Zugriff DAG 1
DAG 2
Program
Processor Port
8x4x32
8x4x24
Sequenzer
Emulation
I/O Port
DATA DATA ADDR ADDR ADDR DATA DATA ADDR
IOD
48
PM Address Bus 24
EXTERNAL PORT
IOA
17
PM Data Bus 48
48
Data Bus Mux
DM Data Bus 40
Control
32
Address Bus Mux Host Port & Multiprocessor Interface
DM Address Bus 32
Bus
7
4 Register
IOP Registers
File 16x40 Multiplier
Barrel Shifter
DMA Controller
Serial Ports 0,1
ALU Memory Mapped
6 6 36
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
9
Entwicklung von µ-Computer-Hardware
Hardware bildet immer die Voraussetzungen für die Software. Diesen Sachverhalt möchte ich noch durch folgende, überspitzte Aussage verstärken: "Es laufen keine Menschengedanken auf einem Affengehirn ab". Umgekehrt ist es theoretisch möglich, aber nicht wünschenswert. Das Wissen über Software bildet sehr oft die Grundlage für Hardwareentwicklungen. Wie eng diese beiden Bereiche miteinander verzahnt sind, spiegelt sich in der Entwicklung von "durch Software konfigurierbarer Hardware" wieder. Die Erstellung eines Blockschaltbildes der gesamten Anlage vermeidet Schnittstellenprobleme und gibt einen Überblick. Dieser Entwicklungsschritt wird sehr oft unterschätzt. Eine empfehlenswerte Vorgehensweise ist die Anfertigung eines Datenblattes zu Beginn der Entwicklung. Für den Einstieg in die Hardwareentwicklung empfiehlt es sich, nach folgender Checkliste vorzugehen: 1. Klärung der Anforderungen 2. Abschätzung der CPU-Belastung - Datenflüsse 3. Wahl der CPU 4. Blockschaltbild der Karte. Wichtig! Top-Down-Entwurf 5. Schaltplan, Einstellungen, I/O Ports 6. Stückliste - Bezugsquellen 7. Layout - Bestückungsplan 8. Fertigungsunterlagen, Test- und Verarbeitungsunterlagen Burn-In-Test 9. Fehlerfindung, Diagnose 10. Manual - Lieferumfang 11. Software - Liste Verfügbare Software 12. Weiterentwicklungswünsche, Verbesserungen Diese Checkliste hat sich darüber hinaus als Inhaltverzeichnis für die Dokumentation bewährt. Als weiterführende Literatur seien die beiden VDI/VDE Richtlinien VDI/VDE 2222 und VDI/VDE 2422 sehr empfohlen. Die nachfolgenden Seiten zeigen am Beispiel der EURO_535-Karte die einzelnen Punkte auf.
218
9.1 Klärung der Anforderungen
Nur eine umfangreiche und kontinuierliche Klärung und Überprüfung der Anforderungen führt zu einem erfolgreichen Entwicklungsabschluss. Die Abschottung der Abteilungen gegeneinander führt im Ergebnis zu einem nicht konkurrenzfähigen Produkt. Die Konstruktionslehre führte sehr früh ein methodisches Vorgehen bei der Entwicklung eines Produktes ein. Die nachfolgende Anforderungsliste ist aus der Konstruktionslehre [DIN 2222] übernommen und deckt auch scheinbar nebensächliche Aspekte, wie das Thema „Verpackung“, ab. Tabelle 9.1 Anforderungsliste für EURO_535 Karte Änderung / Datum
F W
4.4.1993 4.4.1993
F F
4.4.1993 4.4.1993 4.4.1993
F F F
4.4.1993
F
4.4.1993
W
4.4.1993 4.4.1993
F W
4.4.1993 4.4.1993
F W
4.4.1993 4.4.1993
F W
4.4.1993 4.4.1993
F F
4.4.1993
F
Anforderungen für Aufgabe / Teilaufgabe: EURO_535 V2.0 Physik.-technische Funktion Geometrie Über serielle Schnittstelle an PC anschließbar Grundfläche(L x B) Einsteckkarte Europaformat im Gehäuse, jedoch für Messungen zugänglich liegend für Laborbetrieb Programmentwicklung Remote-Debug System Kinematik statisch Kräfte ohne äußere Belastung Anforderungen an die Technologie Gebrauch Lehre für µ-Controller Versuch - Labor Transport Postweg Tragekoffer Montage Einfache Handbestückung möglich maschinelle Fertigung Kontrolle Diagnoseboard Endkontrolle Energie 5V-Netzteil
Verantwortlich
J. Entwick J. Entwick F. Mecha G. Laba F. Soft F. Mecha F. Mecha H. Dozent H. Dozent F. Mecha F. Mecha F. Mecha F. Mecha G. Laba G. Laba G. Laba
9 Entwicklung von µ-Computer-Hardware Änderung / F Datum W 4.4.1993 4.4.1993
F F
4.4.1993
F
Anforderungen für Aufgabe / Teilaufgabe: EURO_535 V2.0 Wirtschaftlichkeit Fertigung Zweilagige Platine einfachste Ausführung Recycling Recyclingdaten im EPROM hinterlegt
4.4.1993
F
Kosten <150.-
F. Soft
4.4.1993
F
Termin Beginn Sommersemester 1994
H. Konti
4.4.1993 4.4.1993 4.4.1993 4.4.1993
F F F F
4.4.1993
F
4.4.1993 4.4.1993
F W
4.4.1993
F
Mensch-Produkt-Beziehung Signal Schnittstellen zwei RS 232 3 Taster 3 Leuchten RESET Sicherheit Netzteil von 220~ auf 5 V-
219
Verantwortlich
H. Konti H. Konti F. Soft
J. Entwick J. Entwick J. Entwick J. Entwick J. Entwick
Ergonomie Anschlüsse lösbar J. Entwick Bei erhöhter Zugbelastung lösen sich Anschlüs- J. Entwick se Teile gut sichtbar und zugänglich J. Entwick
Die nachfolgenden Leitlinien für das Erstellen einer Anforderungsliste sollten bei jeder Entwicklung in Hardware und Software beachtet werden [Pahl, Gerhard; Beitz, Wolfgang; Konstruktionslehre]. Die Einteilung erfolgt nach Kriteriengruppen (fettgedruckt, große Schrift), Hauptmerkmalen (fettgedruckt) und Beispielen. Die wichtigste Angabe für eine korrekte Abschätzung und für ein richtiges Angehen der Aufgabe durch die Entwickler bei µ-Controlleraufgaben ist die Stückzahl. Starten Sie keine Entwicklung ohne Angabe der zu erwartenden Stückzahl. Begründung: Der Entwickler wird voraussichtlich bei einer Stückzahl von 10 Karten wenige, aber teure Bauteile, die eine Entwicklung schnell ermöglichen, verwenden. Bei einer Stückzahl von 100 entsteht dagegen, beispielsweise bei der Entflechtung, ein wesentlicher Kostenunterschied zwischen einlagiger und mehrlagiger Platinenfertigung.
220 Tabelle 9.2 Leitlinien zum Aufstellen einer Anforderungsliste Änderung / Datum
F W
Anforderungen für Aufgabe / Teilaufgabe: Physik.-technische Funktion Geometrie Größe, Breite, Höhe, Durchmesser, Raumbedarf, Anzahl, Ausbau, Anschluss Kinematik Bewegungsart, Geschwindigkeit, Beschleunigung Kräfte Kraftgröße, Kraftrichtung, Gewicht, Stabilität, Resonanzen Anforderungen an die Technologie Gebrauch Geräusch, Anwendung, Einsatzort, Verschleißrate Transport Bahnprofil, Transportwege, Versandart und -bedingungen Montage Zusammenbau, Einbau Kontrolle Mess- und Prüfmöglichkeiten (TÜV) Energie Leistung, Wirkungsgrad, Erwärmung, Energieumformung, Speicherung Wirtschaftlichkeit Fertigung Fertigungsmittel, Qualität und Toleranzen Recycling Wiederverwendung, Endlagerung, Beseitigung Kosten Stückzahl, max. zulässige Herstellkosten, Investition und Amortisation Termin Ende der Entwicklung, Lieferzeit
Verantwortlich
9 Entwicklung von µ-Computer-Hardware Änderung / Datum
F W
Anforderungen für Aufgabe / Teilaufgabe:
221
Verantwortlich
Mensch-Produkt-Beziehung Signal Eingangs- und Ausgangssignal, Anzeigeart, Signalformen Sicherheit Unmittelbare Sicherheitstechnik, Schutzsysteme, Betriebs- Arbeits- und Umweltsicherheit Ergonomie Mensch- Maschinen- Beziehung, Bedienung, Übersichtlichkeit, Beleuchtung, Formgestaltung
9.2 Abschätzung der CPU-Belastung - Datenflüsse Eine einfache Darstellung mit Ein-, Ausgangsgrößen der Anlage erleichtert die Aufgabenstellung. Anhand eines Beispiels lässt sich dieser wichtige Arbeitsschritt zeigen. Aufgabe In einer Gefriertruhe soll das Mikroklima gemessen werden. Hierzu werden 16 Temperatursensoren verwendet. Die Daten sollen über einen Zeitraum von mindestens 12h in Intervallen von 20 Sekunden erfasst und an einen übergeordneten Rechner übertragen werden. Lösung Die einfache Darstellung der Anlage sieht folgendermaßen aus.
16 Sensoren T
?
RS 232 zum Rechner
Abb. 9.1 Einfache Aufgabendarstellung für CPU - Datenflussabschätzung
222
Der Rechner gibt alle n Sekunden (n=20 s .......1800 s) ein Signal an die zu entwickelnde Einrichtung und erwartet dann 16 Temperaturwerte. Die verwendeten Sensoren (SMT 160-30) erzeugen ein der Temperatur proportionales Impuls-Pausenverhältnis mit einer maximalen Frequenz von 4 kHz. Zur Lösung der Aufgabe müssen Sie eine Konstellation annehmen und die Aufgabe durchrechnen. Annahme: Die Aufgabe kann mit der EURO_535-Karte gelöst werden. Für die Genauigkeit von 0.1°C müssen 28.600 Abtastungen des Sensorsignals durchgeführt werden. Eine Abtastung dauert 14 µs. Dies muss durch ein Programm verifiziert werden. Damit ergibt sich folgende Rechnung:
Terror = Terror schen) Trange ts tm tp
Trange ⋅ ts 6 ⋅ tm ⋅ tp
= Messfehler (Standardabweichung durch das Abtastrau= Betriebstemperaturbereich = Abtastrate des Mikrocontrollers = Gesamtdauer der Messung = Periodendauer des Sensorausgangssignals
Mit den konkreten Werten: Terror = 0.1°C Trange = 175°C ts = 14 µs tp = 250 µs (Worst Case bei 4 kHz) ⇒ tm
≈ 0.4 ms, das entspricht 28.600 Abtastungen.
Bei 16 Sensoren beträgt die Dauer der Messwerterfassung 6,4 Sekunden. Die Übergabe der Daten von 32 Byte benötigt bei 9600 Baud ca. t=
Daten 32 Byte = = 0,032 s Datenfluß 1000Byte / s
Die Gesamtzeit zur Lösung der Aufgabe wird damit:
tges = 0,032 s + 6,4 s = 6,432 s
9 Entwicklung von µ-Computer-Hardware
223
Mit einer Sicherheit von 30% ergibt sich:
tges / S = 6,432 s *1,3 = 8,352 s tges / S < 20 s Die Aufgabe kann mit ausreichender Reserve mit dem EURO_535Board gelöst werden. 9.3
Wahl der CPU
Dieses Kapitel greift nochmals die wesentlichen Inhalte von Kapitel 8 auf und kombiniert sie mit nichttechnischen Gesichtspunkten. Die Bezeichnung "CPU" (Central Processing Unit) wird in diesem Kapitel sehr weit gefasst. Die Betonung liegt auf "Processing Unit" und nicht auf "Central". Die Auswahl der Prozessoren im Zusammenspiel mit der Peripherie steht damit im Vordergrund. Die Wahl der CPU hängt sehr stark von der CPU-Belastung und den Datenflüssen innerhalb des Systems ab. Die technischen Gesichtspunkte sind jedoch nur eine notwendige Bedingung. Oftmals spielen weitere Faktoren für die Wahl der CPU eine wichtige Rolle. Diese "menschlichen" Faktoren sind oft ausschlaggebender bei komplexen Entwicklungen als ein unerfahrener Entwicklungsingenieur möglicherweise ahnt. Diese sind: • Bereits vorhandenes System • Bereits vorhandenes Wissen über eine Rechnerarchitektur • Bereits vorhandenes Wissen im Umgang mit einer Software • Gute Unterstützung seitens der Lieferfirma • Der Entscheidungsträger kennt sich mit einem System bereits aus • Der Vertriebsingenieur des Distributors ist vertrauenswürdig • Der Kunde stellt spezielle Anforderungen an die Sicherheit (Sprache C) • Die erhältliche Literatur ist umfangreich Die Wahl auf die CPU 80535 bei der EURO_535-Karte ist aufgrund eines Dozenten gefallen, der bei der Siemens AG arbeitete und somit diesen Prozessor kannte. Eine prinzipielle technische Auswahl der CPU lässt sich, wie bereits in Kapitel 8 erwähnt, aus dem CPU-Namen herauslesen. Dieser sehr einfache Sachverhalt wird leider nicht immer genügend beachtet.
224 Tabelle 9.3 Verschiedene Prozessoren - CPU's CPU µ-Controller
Verwendungszweck Gerätebau, Computerperipherie, Telefon, kleine Automatisierungssysteme; maximale Signalfrequenz < 100 Hz µ-Prozessor Personal Computer, Automatisierungssysteme ( nur zentral ) RISC, CISC Reduced Instruction Set Computer, Complex Instruction Set Computer DSP Digitale Signalverarbeitung; Signale im Audio-Bereich ArithmetikprozessorMathematische Aufgaben Grafikprozessor Grafische Aufgaben Transputer Datentransfer, Kommunikationsaufgaben und Rechenaufgaben
9.4 Blockschaltbild der Karte Wesentliche Eigenschaften der Karte sind im Blockschaltbild zu erkennen. Die erste Version der EURO_535 hatte bereits alle wesentlichen Prozessorsignale auf einer VG-64-Leiste herausgeführt. Entwickler von Messsystemen treffen meistens anhand des Blockschaltbildes die Entscheidung, welche Karte einzusetzen ist. Deshalb sollte unbedingt ein entsprechend hoher Aufwand in ein solches Blockbild investiert werden. Bei größeren Stückzahlen ist es empfehlenswert, das Blockschaltbild durch einen Grafiker überarbeiten zu lassen. Er versteht es, die wesentlichen Grundgedanken der Kartenentwicklung deutlich im Blockschaltbild hervorzuheben. Datum
EURO_535 V1.0 Port 0
Low-Byte-Adresse / Datum
ALE
80535
Port 2
AdressLatch
Low-Byte-Adresse
High-Byte-Adresse
Microcontroller VAGND VAREF
OE
CE
Port 1
PSEN
AN Port 5
Eprom
J2 3,8
Port 4
RAM
Port 3
J1 WR / P3.6
WE
CS OE
A15 RD / P3.7
AdressLogik J4,5,6,7
Steckerleiste
RxD / P3.0
V24-
TxD / P3.1
Treiber
Abb. 9.2 Blockschaltbild als Unterlage für die Dokumentation
PC
9 Entwicklung von µ-Computer-Hardware
9.5 Schaltplan
Abb. 9.3 Schaltplan für Dokumentationsunterlagen
225
226
9.6 Stückliste - Bezugsquellen Die Stückliste lässt sich sehr einfach mit Hilfe eines CAD-Programms für die Schaltplanerstellung generieren. Bei Textdateien arbeitet man vorteilhaft mit Suchen & Ersetzen von einem Textverarbeitungsprogramm, damit die Vorlage in das entsprechende Format umgesetzt werden kann. Die Tabelle beinhaltet die wichtigsten Unterlagen für eine korrekte Anfrage und Bestellung. Ein Zweitlieferant ist auf jeden Fall zu empfehlen. Tabelle 9.4 Stückliste für EURO_535 EAGLE Layout Editor Version 2.61 Copyright (c) 1988,92 CadSoft Partlist EUROPART.LST exported from MCS80535.BRD at 3-01-1994 8:26:03a Lieferant 1 Lieferant 2 Part Value Package Library Preis Preis C1 27pF C-2,5 DISCRETE C2 27pF C-2,5 DISCRETE C3 100nF C-2,5 DISCRETE C4 100nF C-2,5 DISCRETE C5 100nF C-2,5 DISCRETE C6 100nF C-2,5 DISCRETE C7 100nF C-2,5 DISCRETE CE1 10µF ES-2,5 DISCRETE CE2 10µF ES-2,5 DISCRETE CE3 4.7µF ES-2,5 DISCRETE CE4 4.7µF ES-2,5 DISCRETE CE5 4.7µF ES-2,5 DISCRETE CE6 10µF ES-2,5 DISCRETE CE7 4.7 µF ES-2,5 DISCRETE D1 1N4148 D-10 DISCRETE D2 LED2,5 LED2,5 LAMPS D3 LED2,5 LED2,5 LAMPS D4 LED2,5 LED2,5 LAMPS D5 LED2,5 LED2,5 LAMPS E$1 TESTPIN E$2 TESTPIN J1 CON03X1 1X03 CONNEC J2 CON03X1 1X03 CONNEC J3 CON03X1 1X03 CONNEC J4 CON03X1 1X03 CONNEC J5 CON03X1 1X03 CONNEC J6 CON03X1 1X03 CONNEC
9 Entwicklung von µ-Computer-Hardware J8 QU1 R1 R2 R3 R4 R5 R6 S2 ST3 ST4 ST5 ST6 T1 T2 T3 T4 U2 U3 U4 U5 U6 U7 U8 U9
CON03X1 12MHz 100 100K 1.8k 1.8k 1.8k 1.8K DIL8POL MCS535_96P D-09F90ø D-09F90ø KB35MMLP TASTER_1 TASTER_1 TASTER_1 TASTER_1 55256 27256 7474 7402 7486 MAX232 75HC573 80C535
1X03 QS R-12,5 R-12,5 R-10 R-10 R-10 R-12,5 DIL16POL VG96M90ø D-09F90ø D-09F90ø KB35MMLP TASTER_1 TASTER_1 TASTER_1 TASTER_1 DIL28 DIL28 DIP14 DIP14 DIP14 DIP16 DIL-20 PLCC-S68
227
CONNEC DEMO DISCRETE DISCRETE DISCRETE DISCRETE DISCRETE DISCRETE SCHALTER CONNEC CONNEC CONNEC CONNEC SCHALTER SCHALTER SCHALTER SCHALTER SPEICHER SPEICHER 74-99 74-99 74-99 INTERFAC 745XX
Serielles Kabel 9600 Baud; 1 Startbit; 8 Datenbits, 1 Stoppbit Tabelle 9.5 Kabelbelegung EURO_535 - PC EURO_535 1 2 3 4 5 6 7 8 9 Schirm
Signal Brücke 1 R1IN T1OUT Brücke 1 Masse Brücke 1 Brücke 2 Brücke 2 -
Farbe Farbe braun ------ braun orange rot rot orange braun gelb ------ gelb blau grün grün blau schwarz ------ schwarz
Signal PC Carier Detect 1 Receive Data 2 Transmit Data 3 Data Terminal Ready 4 Signal Ground 5 Data Set Ready 6 Request to send 7 Clear to send 8 Ring Indicator 9 Schirm
228
9.7 Schnittstellen Einer der wichtigsten Punkte für Anwender ist die vollständige Schnittstellenbeschreibung. Hierzu sollten, je nach Blickwinkel, verschiedene Darstellungsformen gewählt werden. Beispielhaft wird dies nachfolgend für die EURO_535-Karte aufgeführt: Tabelle 9.6 Steckerbelegung VG-Leiste EURO_535 PIN 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
STECKER 1 ( VG-A) nicht belegt nicht belegt nicht belegt VCC IO23 IO21 IO19 IO17 IO24 IO26 IO28 IO30 IO0 IO2 IO4 IO6 IO15 IO13 IO11 IO9 GND nicht belegt nicht belegt nicht belegt siehe PIN 31 AN8(VAREF) AN0 AN2 AN4 AN6 AN9(VAGND) nicht belegt
STECKER 2 (VG-B) A0 A1 A2 A3 A4 A5 A6 A7 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 A15 A14 A13 A12 A11 A10 A09 A08 nicht belegt nicht belegt nicht belegt nicht belegt nicht belegt nicht belegt nicht belegt nicht belegt
STECKER 3 (VG-C) nicht belegt nicht belegt nicht belegt VCC IO22 IO20 IO18 IO16 IO25 IO27 IO29 IO31 IO1 IO3 IO5 IO7 IO14 IO12 IO10 IO8 GND nicht belegt nicht belegt nicht belegt siehe PIN 31 AN8 AN1 AN3 AN5 AN7 AN9 nicht belegt
9 Entwicklung von µ-Computer-Hardware
229
Tabelle 9.7 Pinbelegung des VG-Steckers mit Funktionsbeschreibung SYMBOLPIN A0 - A15 ST2 1-8, 17-24 AD0AD7
VCC IO 00 IO 01 IO 02 IO 03 IO 04 IO 05 IO 06 IO 07 IO 08 IO 09 IO 10 IO 11 IO 12 IO 13 IO 14 IO 15 IO 16 IO 17 IO 18 IO 19 IO 20 IO 21 IO 22 IO 23 IO 24 IO 25 IO 26 IO 27 IO 28 IO 29 IO 30 IO 31
ST2 9-16
ST2 25-32 ST1 01-03 ST1 04 ST 1 13 ST 3 13 ST 1 14 ST 3 14 ST 1 15 ST 3 15 ST 1 16 ST 3 16 ST 3 20 ST 1 20 ST 3 19 ST 1 19 ST 3 18 ST 1 18 ST 3 17 ST 1 17 ST 3 08 ST 1 08 ST 3 07 ST 1 07 ST 3 06 ST 1 06 ST 3 05 ST 1 05 ST 1 09 ST 3 09 ST 1 10 ST 3 10 ST 1 11 ST 3 11 ST 1 12 ST 3 12
Input (I), Output (O) O O
I/O
I/O
FUNKTION A0 -A7: Vollständig gelatchtes niederwertiges Byte der Adresse. A8-A15: High Byte der Adresse direkt aus Port 2 In Gegensatz zu A0 - A7 ungelatchtes niederwertiges Byte der Adresse gemultiplext mit den Datenleitungen. Bei ALE Signal = low Datenübertragung möglich. Nicht belegt Nicht belegt Betriebsspannung I/O Port 1 Die Sonderfunktionen werden folgendermaßen genutzt : IO 00: INT3/CC0 IO 04:INT2 IO 01: INT4/CC1 IO 05:T2EX IO 02: INT5/CC2 IO 06:CLKOUT IO 03: INT6/CC3 IO 07:T2 I/O Port 3 Die Sonderfunktionen werden folgendermaßen genutzt : IO 08: RxD IO 09: TxD IO 10: INT0 IO 11: INT1
IO 12: T0 IO 13: T1 IO 14: WR IO 15: RD
I/O Port 4 des Mikrocontrollers. Bidirektionaler I/O Port mit internen Pull-upWiderstand.
I/O Port 5 des Mikrocontrollers.
230
9.8 Layout - Bestückungsplan
Abb. 9.4 Layout - Bestückungsplan
Der Bestückungsplan dient nicht nur zum Bestücken der Karte, sondern dokumentiert darüber hinaus die Voreinstellungen der Jumper und DIPSwitches. Außerdem wird dieser Plan automatisch vom Layout-Programm erstellt. Die entsprechende Datei lässt sich in eine Textverarbeitung einbinden.
9 Entwicklung von µ-Computer-Hardware
231
9.9 Fertigungsunterlagen Fabrikation-, Test- und Prozessdokumentation beschreiben, WELCHE Tätigkeiten - von wem und wo - durchgeführt werden. Vorteilhaft ist die Benennung von Ansprechpartnern. Tabelle 9.8 Fertigungsunterlagen Nr. 1. 2. 3.
4. 5. 6. 7. 8. 9.
Tätigkeit Herstellung der Leiterplatte Testen der Leiterplatte Bestücken der Leiterplatte mit Fassungen Widerstände Kondensatoren Stecker Fassungen - ICs Lötbad Sichtkontrolle Bestücken mit gesockelten Bauteilen wie: PALs, PROMs Speicher Selbständige Betriebsart - Stand-alone-Betrieb Test-Programme 48 Stunden-Test im Wärmeofen Test in Originalumgebung PC Verpacken Hardware Software
Wer ? Lieferant L Lieferant L Lieferant L
Lieferant L Lieferant L Lieferant L im Haus im Haus im Haus
Lieferant L: Leiterplattenbestückung, Heinrichstr. 4711, 11478 Bithausen Ansprechpartner : Tel.: Ansprechpartner im Hause: Tel.: Testeinrichtungen inkl. Dokumentation Diese Einrichtungen sind sehr firmenspezifisch und geben Erfahrungen mit eingetretenen Fehlern wieder. Deshalb sollten die Testeinrichtungen genauestens dokumentiert sein.
232
9.10
• • • • • •
Fehlerfindung, Diagnose
Fehlerfindung - Diagnose erfolgt mit folgenden Geräten: Logikstift Diagnoseplatine mit Vergleichsplatine und EPROM Emulator Simulator Logikanalysator Testadapter
9.11
Lieferumfang
Die Informationen über den vorteilhaften Lieferumfang können vom Entwickler oder auch von der Produktabteilung kommen. Damit der Kunde vollständig informiert ist, wird beispielhaft folgendes Blatt vorgestellt:
VolksController-Set (Lieferumfang) Hardware: EURO_535 Karte EPROM: HITEX-Monitor ADDA535 Karte Netzteil V-24-Kabel: EURO_535 - PC Dokumentation: Technische Beschreibung EURO_535 Software: C-Compiler (Studentenversion) Keil Assembler Intel (Studentenversion) oder Keil
9 Entwicklung von µ-Computer-Hardware
9.12
233
Software - Liste verfügbarer Software
Diese Liste sollte jedem Produkt beigefügt werden. Sie erleichtert die Arbeit mit dem Produkt und verhindert unnötige Eigenentwicklungen. Mögliche Formen dieser Information sind: • Beispielprogramme befinden sich auf beiliegender CD • Third-Party Produkte Von sehr großem Informationswert sind die Informationen der Hersteller von Controllern. Ein verkürzter Auszug ist nachfolgend aufgeführt. Software für die EURO_535-Karte finden Sie unter C500. Tabelle 9.9 Auszug aus www.infineon.com Firmenname Altium Limited
Produkt C C XC Beschreibung Name 500 800 800 TASKING X X X Das TASKING 8051 ist ein komplettes 8051 toolset Werkzeug mit C Compiler, Assembler/Linker und einem Debugger mit einer integrierten Entwicklungsumgebung
Crossware 8051 Products Development Suite Hitex
X
Die Crossware 8051 Entwicklung Suite für Windows liefert ein komplette Umgebung, in der 8051 Programme entwickelt werden können.
freeHiTOP XC800
X
freeHiTOP XC800 ist eine freie SoftwareWerkzeugkette für die XC800 8 Familie. Das Paket schließt den SDCC C Compiler mit ein, der für XC800 optimiert wurde. Den HiTOP Debugger, der in einen bedienungsfreundlichen IDE integriert ist.
IAR Sys- Embedded X Workbench tems for 8051
X
X
Der IAR Werktisch EW8051 bietet eine integrierte Entwicklungsumgebung für die Controller von Infineon XC800, C800 und C500 an.
Keil Soft- Professional X Developers ware Kit for 8051
X
X
Die µVision IDE von Keil Software hat Projektmanagement, die Prüfung vom Quellprogramm, das Kompilieren, Debug und Simulation in einer leistungsfähigen Umgebung.
234
9.13
Weiterentwicklungswünsche, Verbesserungen
Jeder Entwickler hat nach Beendigung seiner Entwicklung neue Ideen. Diese lassen sich oftmals aufgrund äußerer Bedingungen nicht umsetzen. Trotzdem empfehle ich, diese Ideen in Form einer Anforderungsliste zu dokumentieren. Verbesserungen und Wünsche kommen natürlich auch von Seiten der Anwender. Diese Wünsche sind unbedingt zu dokumentieren und bei einer Neuauflage zu berücksichtigen. Diese Vorgehensweise ermöglicht es, ein Produkt kontinuierlich zu verbessern. Dies ist keine bloße Theorie, sondern zeigt sich deutlich an der EURO_535 Karte. Bei den ersten Versionen dieser Karte vergeudeten die Studenten sehr viel Zeit bei der Fehlersuche in den Programmen. Meistens war die Ursache die fehlende Stromversorgung. Durch eine einfache Leuchtdiode ließ sich dieser Fehler vermeiden. Als weiteres Beispiel für Verbesserungen, sei die Anordnung der Schalter und eine fehlende Beschriftung angeführt. Diese Anregungen der Studenten wurden aufgegriffen und bei der nächsten Auflage korrigiert. Oberster Grundsatz bei einer solchen "Verbesserung" muss aber die Kompatibilität innerhalb der Serie sein. Als Beispiel dient die Anforderungsliste, die für die Weiterentwicklung EURO_535 V1.0 auf EURO_535 V2.0 verwendet wurde: Tabelle 9.10 Beispiel für kontinuierliche Verbesserung durch Anforderungslisten Änderung F Datum W
Nov. 93 F F Nov. 93 F Nov. 93 F Febr. 94 F Nov. 93 W Febr. 94 F Jan. 94 Jan. 94
F F
Anforderungen für Aufgabe / Teilaufgabe: EURO_535 V2.0 Physik.-technische Funktion Geometrie alle Schnittstellen zum PC und Netzteil auf eine Seite Taster T1, T2, T3 und Leuchte L1, L2, L3 vollständig in Entflechtung integrieren Kein Experimentierplatz auf der Platine Zweite V24-Schnittstelle auf der Karte realisieren Verbindung von zwei Boards untereinander über V24 und Standard Modemkabel Experimentierfeld an VG-Leiste Anschlusskabel V24 Modem gleichartig Software C-Compiler frei kopierbare Studentenversion Frei kopierbarer Intel Evaluation Assembler
Verantwortlich J. Walter B. Beck B. Beck B. Beck B. Beck B. Beck B. Beck J. Walter J. Walter
9 Entwicklung von µ-Computer-Hardware
235
Änderung F Datum W
Anforderungen für Aufgabe / Teilaufgabe: EURO_535 V2.0
Verantwortlich
Nov. 93 F
Anforderungen an die Technologie Transport Stehordner
J. Walter
Nov. 93 W
Montage Zusammenbau, Einbau
extern
Nov. 93 F
Kontrolle MESZ- und Prüfmöglichkeiten (TÜV)
J. Walter
Nov. 93 F
Energie Mittelwert von neu gefertigten Karten mit CPU ermit- Labor teln
Nov. 93 F
Wirtschaftlichkeit Fertigung Rahmen vereinfachen, Stangenmaterial
Werkstatt
Nov. 93 F
Recycling EPROM Recyclingdaten integrieren
Info II
Nov. 93 F Nov. 93 F
Kosten 60 Stück fertigen Rechnungsstellung - Abrechnungsmodus klären
J. Walter J. Walter
Nov. 93 F
Nov. 93 Nov. 93 F Nov. 93 F Nov. 93 F Juni 94
F
Termin Ende der Entwicklung, Beginn Sommersemester 94 Lieferzeit 14 Tage nach Semesterbeginn Mensch-Produkt-Beziehung LARS-Projekt (Leistungsanreize in Lehre und Forschung des Landes Baden-Württemberg) beantragen Signal neue V24-Schnittstelle über C ansprechbar Beschriftung verbessern: CPU, VG-Leiste, RESET von anderen Schaltern trennen. Emblem aufbringen Sicherheit Netzteil über Klinkenstecker anschließbar Ergonomie Stromversorgung, Serielle Schnittstelle, Stifte auf eine Seite
J. Walter B. Beck B. Beck / J. Walter
Schuhmach.
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
JP7
JP5
CE Ram 1
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
5.
µ-Controller (3 Punkte, jeweils nur eine Lösung)
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 >>ALU<< verstanden? a b c d
Ein Rechenwerk für Addition Ein Rechenwerk für logische Operationen Ein Steuerwerk, das den Akkumulator bitweise auf 0 bzw. 1 setzen kann Ein Rechenwerk, das mit den Registern die Durchführung Boolescher und algebraischer Operationen ermöglicht
15. Welche Aussage ist für 8051-Derivate falsch? a b c d
80535 hat 256 KByte externen RAM Alle 8051-Derivate haben einen USART 8051-Derivate haben mindestens 128 Byte internen RAM Jedes 8051-Derivat hat 4 Ports
16. Welcher Chip kann bei 8051-Prozessoren für das Demultiplexen von Daten und Adressen verwendet werden? a b c d
74 LS 74 74 F 08 74 F 573 0815 DE_DA_AD
17. Welche Flags werden beim MUL A,B-Befehl beeinflusst? a b c d
CY,AC,OV CY,AC CY,P,OV keines
10 Übungsaufgaben
253
18. Die Interrupt-Vektor-Adresse des 80515-Prozessors für den seriellen Kanal ist? a b c d
SIN 35 0A3H SBUF
19. Beim Übergang auf 80515-Prozessoren wird eine Symboltabelle verwendet. Welchen Sinn hat diese Symboltabelle? a b c d
Die Symbole stehen für Operationen Die Symbole können für Byte-Adressen und Bit-Adressen stehen Die Symbole bezeichnen den verwendeten Chip Die Symbole sind Platzhalter für die Versorgungsspannung
20. Um vier verschiedene 8051-Prozessorprogramme quasiparallel abzuarbeiten, verwendet man vorteilhaft folgende Einheiten im 8051 für die Speicherung der Register. a b c d
Das interne EPROM Die 4 externen Registerbänke Die 4 internen Registerbänke SP_QU-Register
254
Lösungen Übungsklausur 2 Lösung Aufgabe 1 a.
Grober Ablauf / Struktogramm
Initialisierung • Assembler-Anweisungen • Variablen • CSEG, ORG Zahl einlesen • Carry zu Null setzen Division • Shift rechts • Zahl in externen Speicher schreiben Monitor 80535 • Rücksprung in Monitorprogramm b. Programm $NOMOD51 $title(DIV_2) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Division von 8-bit Zahl durch 2 ;Programmiert: J. Walter, Juli 93 ; ;Eingang: 8 Bit-Zahl von externem Speicher ; ;Ausgang: Ergebnis der Division ; ;Verwendete Einsprünge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ; ; ; ;Kommentar: ; ;Aenderungen: ; ; ; ; ;Einfaches Programm zur Division von 8 Bit Zahl durch 2 Zahl_zur_Division EQU 2000H ;Adresse der Zahl zur Division
10 Übungsaufgaben Erg_der_Division EQU 2001H CSEG AT 0H ORG 0H jmp ANFANG gestellt
255
;Adresse des Ergebnisses
;Legt absolute Codesegmentadresse auf 0h ;Programmzähler auf 0 ;Auf Startadresse springen, da Monitor auf
;PC=0
ein-
ORG 100H ;Setzt Adresszähler auf 100H ; ;Programmteil ANFANG: mov dptr,#Zahl_zur_Division ;Datenpointer mit Adresse laden mov a,@dptr ;Akku mit Zahl laden clr C;Carry zu Null setzen rrc ;Nach rechts schieben inc dptr ;Adresse für Ergebnis mov @dptr,a ;Ergebnis in externen Speicher PROGRAMM_ENDE: ljmp 8000H ;Monitoreinsprung end
c. asm51 DIV_2.asm d. • • • • • •
MS51 laden PC-Programm für PC-80535-Kommunikation DIV_2.OBJ Download des Programmes auf 80535-Board Schreiben einer Zahl z.B. 1001 0011b = 147 in den Speicher an Adresse 2000H G0 Start des Programmes Kontrolle des Speicherinhaltes an Adresse 2001H, muss sein 0100 1010b = 74 Bei Fehler Programm im Einzelschrittbetrieb abarbeiten
256
Lösung Aufgabe 2 a. R0 mit Adresse: Adr_10_Zahlen laden Zählregister R6:=10 1. Zahl holen oberes Nibble in ASCII codieren zur seriellen Schnittstelle, senden unteres Nibble in ASCII codieren zur seriellen Schnittstelle, senden cr,cf senden Inkrementieren von DPTR Dekrementieren von Schleifenzähler JA \ ist Zählregister =0 Ende | Schleife Monitoreinsprung b. $NOMOD51 $title(Z_Z_PC) $xref $debug $nolist $include(reg535.pdf) $list ; ;Programm: Zehn Zahlen zum PC ;Programmiert: J. Walter, Juli 93 ; ;Eingang: 10 8 Bit-Zahlen von externem Speicher ; ;Ausgang: ASCII an serielle Schnittstelle ; ;Verwendete Einsprünge: ; ;Verwendete Unterprogramme: ; ;Verwendete Register und Variable: ;Registerbank(0) ;R0 indirekte Adressierung ;R2 Zählvariable ; ;Kommentar: ; ;Aenderungen: ; ;
/
nein
10 Übungsaufgaben Adr_10_Zahlen EQU monitor EQU CSEG AT 0H ORG 0H jmp Anfang gestellt
30H 8000H
;Adresse der 1. Zahl ;Monitoreinsprung
;Legt absolute Codesegmentadresse auf 0h ;Programmzähler auf 0 ;Auf Startadresse springen, da Monitor auf
;PC=0
ORG 100H ;Setzt Adresszähler auf 100H ; ;Programmteil ANFANG: mov R0,#Adr_10_Zahlen ;Zeiger auf 1. Zahl mov r2,#10 ;10 Werte SCHLEIFE_10: mov a,@R0 ;Zahl holen call BYTE_2_ASCII_SENDEN ;Byte-Hex Wandlung aufrufen inc R0 ;auf neue Adresse djnz r2,SCHLEIFE_10 ;r2 dekrementieren, noch nicht 0 ? ljmp monitor ;zum Monitor BYTE_2_ASCII_SENDEN: mov b,a ;L-Nibble retten swap a ;H-Nibble nach rechts anl a,#0FH ;Reine 4-Bit Zahl call L_NIBBLE_ASCII call SER_BYTE ;über serielle Schnittstelle ausgeben mov a,b ;L-Nibble holen anl a,#0FH ;reine 4-Bit Zahl call L_NIBBLE_ASCII call SER_BYTE ret L_NIBBLE_ASCII: ;Low nibble wird in ASCII gewandelt cjne a,#0AH,ZAHL ;Zahl ? oder Buchstabe - # größer a ->Carry 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:
TPLIV = 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 − 100ns = 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 0<=U<=2V 2< U<=3V 3< U<=4V 4< U<=5V
Leuchte 2 an P3.3 aus aus ein ein
Leuchte 3 an P3.4 aus ein aus ein
a. b. c. d.
Erstellen Sie ein Struktogramm Schreiben Sie das Programm Schreiben Sie die Anweisung zum Assemblieren mit ASM51 Um das Programm zu debuggen, beschreiben Sie die notwendigen Schritte e. Ist das Programm auf jedem 8051-Derivat ausführbar? 2. 8051-Assembler Blin_var(12 Punkte) Die Blinkfrequenz einer Leuchte (P3.2) wird über eine Spannung am Eingang des A/D-Wandlers eingestellt. Die Periodendauer variiert dabei von (1.....25) x 65536µs x 2. Die Zahl 1 bis 25 lässt sich mit einem Potentiometerabgriff 0...5V am A/D-Wandlereingang und Division durch 10 realisieren. a. Erstellen Sie ein Struktogramm b. Schreiben Sie das Programm
260
3. Prozessorwahl ( 8 Punkte ) Wählen Sie für die nachfolgenden Aufgaben den optimalen (innerhalb der Vorlesung behandelten) Prozessor aus. (bzgl. Kosten / Programmieraufwand bei 1000 Stück ) . a. Randbedingungen: • 62KB Programmumfang • 56KB Daten • A/D-Wandlung 8 Bit • 156 Byte Speicher für Parameter Bitte genaue Bezeichnung des Prozessors Prozessor:________________________ b. Aufgabe: Waschmaschine Programmsteuerung • 12 digitale Eingänge • 1 Temperaturmessung mit Sensor T ∼ f • 1 Wasserstandsmeldung U ∼ h • 1 Drehzahlregelung Prozessor:____________________________ c. Zwei hochfrequente Signale mit Signalfrequenzen von jeweils 40 kHz müssen bearbeitet werden. Prozessor:_____________________________ d. Für eine Anwendung sind zwei serielle Schnittstellen im Prozessor notwendig. Welchen Prozessor verwenden Sie? Prozessor:__________________________________
10 Übungsaufgaben
261
4. Timing-Berechnung (12 Punkte) Bemerkungen: Timing-Berechnung 573HCT = 44ns 5V Betriebsspannung; NOR-ACT-Typ, EURO_535-Karte ist modifiziert. Sie müssen die EURO_535 - Karte mit RAM-Speicher bestücken. Der Einsatz der Karte ist im industriellen Bereich (Umgebungstemperatur <85°) spezifiziert. Wählen Sie den notwendigen RAM-Speicher für den Lesezugriff aus den beiliegenden Datenblättern aus. Port 0
74HCT573
AdressLatch
Low-Byte-Adresse / Datum
ALE Port 2
Low-Byte-Adresse
RAM
LE 50
11
High-Byte-Adresse
62256A-10L 20
80535 Port 3
/WR /RD
27
22
/WE
/OE
27 28
RD
> =1 > =1
PSEN
/CS
49
OE RAM
> =1
Abb. 10.3 Anschluss des RAM - Speichers
Hinweis: Nur der Lesezugriff auf den Programmspeicher muss zur Lösung der Aufgabe überprüft werden. 5V, Vorsicht /CE = /OE - modifizierte Karte, NOR = HCT-Typ.
262
5. µ-Controller (3 Punkte, jeweils nur eine Lösung) 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 über den Akku indirekt adressierbar Der Programmspeicher ist nur direkt adressierbar Es gibt 32 Register in den Registerbänken zur indirekten Adressierung Der Datenpointer dient zur indirekten Adressierung
2. Ein Echtzeitbetriebssystem mit Antwortzeiten von 1s kann für folgende Aufgaben nicht eingesetzt werden: a b c d
Ozonmessung am Europaplatz Abstandsregelung bei Fahrzeugen auf der Autobahn Wasserstandmeldung am Rhein Temperaturregelung mit Zeitkonstanten von 1 Minute.
3. Die Architektur von Prozessoren hat entscheidenden Einfluss auf die Leistung. Das Verwenden von mehreren Datenpointern ist bei folgenden Prozessoren gegeben: a b c d
8051 8052 8052 + 80535 80537
4. Ein Signalprozessor hat folgende Eigenschaften: a b c d
Ist sehr langsam Befehlszykluszeit >1ms Rechnet sehr langsam Hat mehrere Register Kann direkt an 220 V∼ betrieben werden
10 Übungsaufgaben
263
5. Bei welchen Prozessoren / Rechnern kann C nicht eingesetzt werden? a b c d
80535 Signalprozessor µ-Prozessor Analogrechner
6. Im Hause werden zwei Netzwerk-Organisationen verwendet. Welche Aussage stimmt nicht? a b c d
Das Novell-Netz hat einen Server Unter Windows for Workgroups kann auf die Festplatten untereinander zugegriffen werden Das Novell-Netz erlaubt einen gegenseitigen Festplattenzugriff ohne Server Die den Studenten zur Verfügung stehenden Rechner sind nicht für alle Aufgaben geeignet
6. Allgemeine Fragen (5 Punkte, jeweils nur eine Lösung) 1. Auf einem Speicher ist die Angabe 27C64-200 zu lesen. Welche Aussage ist richtig? a b c d
Der Speicher hat 640 KBit Der Speicher hat 64 KByte Die Zugriffszeit beträgt 200ns Der Speicher gehört zur 200-er Serie
2. Welche logische Verknüpfung von zwei Signalen wird bei der 8051Familie zur Erzeugung einer Harvard-Architektur verwendet? a b c d
NOR ODER UND keine
264
3. Der µ-Controller 8051 verfügt über mehrere Registerbänke. Welche Aufgaben lassen sich damit elegant lösen? a b c d
Taskumschaltung für 3 Tasks Schnelle Sprachverarbeitung Datenbanken mit 256 Datensätzen Watchdog-Funktionen
4. Was wird unter dem Begriff >>CACHE<< verstanden? a b c d
Ein schneller Speicher, auf den der Prozessor mit erhöhter Geschwindigkeit zugreift Ein "Fangen" des Akkuinhaltes Ein Überschreiben der Registerinhalte Eine boolesche Operation im 8051
5. Welche Aussage ist für die serielle Schnittstelle des 8051 richtig? a b c d
Die serielle Schnittstelle kann nicht im Vollduplex-Betrieb arbeiten Die synchrone Betriebsart ist die schnellste Die Schnittstelle hat einen integriertes FIFO Die Schnittstelle am Prozessor hat eine Ausgangsspannung von ± 12 V
6. Der A/D-Wandler des 80535 kann durch das DAPR-Register verschiedene Auflösungen erreichen. Welche Aussage ist richtig? a b c d
Die Spannungsdifferenz muss größer 1V sein Die Spannungsdifferenz muss größer 0,1V sein Die Spannungsdifferenz muss größer 10V sein Die Spannungsdifferenz muss größer 2V sein
7. Welche Flags werden beim ADD Befehl beeinflusst? a b c d
CY,AC,OV CY,AC CY,P,OV,AC keines
10 Übungsaufgaben
265
8. Die A/D-Wandler Interrupt-Vektor-Adresse vom 80515-Prozessor ist? a b c d
SIN 67 0A3H SBUF
9. Bei der Hitex Oberfläche wird eine .SDF-Datei verwendet. Welchen Sinn hat diese? a b c d
Es werden die System Dateien Für arithmetische Operationen geladen Die Einstellungen der On-Chip Einheiten lassen sich damit anzeigen Die Symbol-Daten Feinheiten ist zum Debuggen boolescher Prozessoren Die Syntax Datei Für syntaktische Fehler im Programm
10. Das Monitor-Programm der EURO_535-Karte zum Debuggen der Software hat folgende Nachteile: a b c d
Einzelschrittbetrieb Symbolisches Debuggen Nur eine serielle Schnittstelle Keine
266
Lösungen der Übungsklausur 3 Lösung Aufgabe 1a.
Initialisierung Läuft bis RESET Wandlung auslösen Akku=? Akku<103 L2=aus L3=aus
Akku<154 L2=aus L3=ein
Akku<205 L2=ein L3=aus
Akku<256 L2=ein L3=ein
Lösung 1b $nomod51 $debug $nolist $include(reg535.pdf)
;der Modus fuer 8051 wird abgeschaltet ;Debuggen wird moeglich ;es wird kein Listing fuer reg535 erstellt ;die 80535-spezifischen Daten werden zur Verfuegung ;gestellt ;es wird ein Listing erstellt
$list $ title (AN0_COD) ; ; ;Programm: A/D-Wandler Spannungen dekodiert ;U/V Leuchte 2 Leuchte 3 ;0<=U<=2V aus aus ;2< U<=3V aus ein ;3< U<=4V ein aus ;4< U<=5V ein ein ;Programmiert: J. Walter 11.12.93 ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ; ; ;Kommentar: ; ;Aenderungen:
10 Übungsaufgaben CSEG AT 0H jmp ANFANG
;Legt absolute Codesegmentadresse auf 0h ;ueberspringt Interrupts
ORG 100H
;Programmstart bei 100H
ANFANG: clr P3.2 mov ADCON,#10000000B mov DAPR,#0 jb BSY,$ mov A,ADDAT clr C subb A,#103 jc AUS_AUS subb A,#51 jc AUS_EIN subb A,#51 jc EIN_AUS clr P3.4 clr P3.3 jmp ANFANG
;Leuchte 1 Port setzen, Programm laeuft ;Kanal AN0 angewaehlt, Stop nach der Wandlung ;Wandlung Start ;warten bis Wandlung stop ;Wert im ACCU ;Carry loeschen ;entspricht U>2V ;Sprung da U<=2V ;entspricht U>3V ;Sprung da U<=3V ;entspricht U>4V ;Sprung da U<=4V ;Leuchte 3 ein ;Leuchte 2 ein ;Sprung zum Programmbeginn
AUS_AUS: setb P3.4 setb P3.3 jmp ANFANG
;Leuchte 3 aus ;Leuchte 2 aus
AUS_EIN: clr P3.4 setb P3.3 jmp ANFANG
;Leuchte 3 ein ;Leuchte 2 aus
EIN_AUS: setb P3.4 clr P3.3 jmp ANFANG
;Leuchte 3 aus ;Leuchte 2 ein
end
Lösung 1c asm51 AN0_COD.asm Lösung 1d • • • • •
linken Umwandlung in .htx-Format Aufrufen von Debug-Programm Laden des Programms AN_COD.HTX Starten des Programms
267
268
Lösung 2a Assembler-Anweisungen Programmbeschreibung Initialisierung TIMER_0
Welcher Taster Taster 1
Taster 2
TR0 aus Port 3.2 löschen Licht ein
TR0 aus Port 3.2 setzen Licht aus
Taster 3 A/D Wert in R2 Blinken TR0 an TIMER_0
ja
Register 2 = 0 ?
nein
P 3.2 Komplement
ret
Lösung 2b $NOMOD51 $title(BLIN_VAR.ASM) $xref $debug $nolist $include(REG535.PDF) $list ; ;Programm: Blinkprogramm mit Änderung der Blinkfrequenz ; durch A/D-Wandler - Poti ; ;Betaetigung Taster 1: Licht einschalten ;Betaetigung Taster 2: Licht ausschalten ;Betaetigung Taster 3: Licht blinkt ;Programmiert: J. Walter 11.12.93 / S. Schumacher Juni 94 ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 Zaehlvariable n*65,536mys ; ;Kommentar: ; ;Aenderungen: ; cseg at 0h ;Codesegmentadresse 0h ljmp INIT ;springe zum Initialisierungs-Unterprog. ;fuer Timer0, AD-Wandler ist voreingestellt org 0Bh ;Sprungmarke zur ISR fuer Timer0 TIME_INT0: ;ISR fuer Timer0 (Adresse 0Bh) call TIMER_0 ;Aufruf: UP Schleife reti
10 Übungsaufgaben org 100h INIT : setb P3.2 mov IEN0,#10010010b mov TMOD,#00000001b mov TCON,#00000000b mov R2,#1 ABFRAGE: jnb P1.1,LAMPE_AN jnb P1.2,LAMPE_AUS jnb P1.3,LAMPE_BLINKT ajmp ABFRAGE LAMPE_AN: clr TR0 clr P3.2 ajmp ABFRAGE LAMPE_AUS clr TRO setb P3.2 ajmp ABFRAGE LAMPE_BLINKT: mov TL0,#0h mov TH0,#0h setb TR0 ajmp ABFRAGE TIMER_0: djnz R2,SPRUNG cpl P3.2 mov DAPR,#0 jb BSY,$ mov A,ADDAT mov B,#10 div AB ADD A,#1 mov R2,A
269
;UP zum Initialisieren von Timer 0 ;Lampe ausschalten ;Generelle Interrupt Freigabe,Freigabe ;Timer0 Interrupt ;Modus1: 16 Bit Zaehler/Zeitgeber ;Timer0 vorerst noch ausschalten ;sonst muss beim ersten Mal gewartet werden ;Abfrage Taster 1 ;Abfrage Taster 2 ;Abfrage Taster 3
;Timer 0 ausschalten ;Licht einschalten ;Springe nach ABFRAGE ;Timer 0 ausschalten ;Licht ausschalten
;LOW-Byte Zaehlregister von Timer0 auf 0h ;setzen ;HIGH-Byte Zaehlregister von Timer0 auf 0h ;setzen ;Timer0 aktivieren, TR0 wird bei Sprung auf ;die ISR (Adresse 0Bh) von der Hardware ;wieder zurueckgesetzt
;Sprung falls R2 noch nicht 0 ;komplementiere P3.2 ;Wandlung auslösen ;Warten bis Wandlung fertig ;Wert in Akku ;Division Blinkperiode von ca. 1..25*130ms ; ;da zuerst dekrementiert wird ;Register 2 erhaelt Wert VON Akku
SPRUNG: ret end
Weitere Lösungsmöglichkeit: Ohne Interrupt
270
Lösung Aufgabe 3a 80535 Lösung Aufgabe 3b 8051 Lösung Aufgabe 3c DSP - Signalprozessor Lösung Aufgabe 3d 80517 Lösung Aufgabe 4 Ausgehend von den Gleichungen für den Lesezugriff am EPROM (Script) gilt: T AVIV − Tprop > tACC T LLIV > tCE da aber /CE mit /OE verbunden ist gilt: T PLIV > T OE T PXIZ > tDF T AVIV − Tprop > tACC T PLIV − ( NOR HL + NOR LH ) > tCE T PLIV − ( NOR HL + NOR LH ) > T OE T PXIZ > tDF
max302ns - 44ns > 120ns max125ns - 9ns -10ns > 10ns max125ns - 9ns -10ns > 5ns max63ns - 9ns -10ns > 40ns
Die ersten drei Bedingungen sind für 120ns-Baustein erfüllt. Aufgrund der letzten Bedingung muss ein 100ns-Speicher eingesetzt werden. Lösung Aufgabe 5 1d; 2b; 3d; 4c; 5d; 6c; Lösung Aufgabe 6 1c; 2d; 3a; 4a; 5b; 6a; 7c; 8b; 9b; 10c;
10 Übungsaufgaben
271
10.4 Übungsklausur 4 1. 8051-Assembler abwechselndes Blinken ABW_BLI (14 Punkte) Schreiben Sie ein Programm ABW_BLI (mit allgemeinem Kopf zum symbolischen Debuggen und List-file, ablauffähig auf EURO_535 Karte), das die beiden Leuchtdioden L1 - P3.2 und L2 - P3.3 abwechselnd aufleuchten lässt. Die Leuchtdauer jeweils einer Diode soll hierbei 1 Sekunde betragen. Wird der Taster 2 gedrückt, soll die Leuchtdauer auf 0,2 Sekunden verkürzt werden. a. Erstellen Sie ein Struktogramm b. Schreiben Sie das Programm in Assembler oder C c. Schreiben Sie die Anweisung zum Assemblieren mit ASM51 oder zum Compilieren mit C d. Um das Programm zu debuggen, beschreiben Sie die notwendigen Schritte e. Ist Ihr Programm auf jedem 8051-Derivat ausführbar? 2. 8051-Assembler Externer Speicher Null setzen (8 Punkte) Schreiben Sie ein Programm EXT_SP_0.ASM /C, das den Inhalt des externen Speichers oberhalb von 0100H bis 6FFFH zu Null setzt. a. Erstellen Sie ein Struktogramm b. Schreiben Sie das Programm 3. Controllerwahl ( 8 Punkte ) Wählen Sie für die nachfolgende Aufgaben den optimalen Controller (bzgl. Kosten / Programmieraufwand bei 1000 Stück) aus. Randbedingungen: • 32 KB Programmumfang • 13 KB Daten • Ein 16-Bit-Timer • 56 Byte Speicher für Parameter Bitte genaue Bezeichnung des Prozessors Controller:_______________________ b. Aufgabe: Geräuschausgabe mit Dauer von 1 Sekunde Randbedingungen: • 8 Bit Auflösung • fg = 3,4 KHz
272 • •
1 D/A-Wandler wurde an Port 1 angeschlossen Write-Impuls D/A-Wandler wird mit Port 3 erzeugt.
Controller:____________________________ c. Zur Berechnung der Kreuzkorrelation werden zwei Signale mit der oberen Grenzfrequenz von 4 KHz gewandelt und die Berechnung der Kreuzkorrelation im PC durchgeführt. Für den Dateneinzug werden Daten über einen Port an die parallele Schnittstelle des PCs weitergegeben. Mit welchem Controller kann diese Aufgabe gelöst werden? Controller:_____________________________ d. Welchen Controller würden Sie für das Programm aus Aufgabe 2 dieser Klausur einsetzen? Controller:__________________________
4. Timing-Berechnung (12 Punkte) Erstellen Sie für die folgende Schaltung die Boolesche Gleichung für das /CE-Signal von EPROM 2 (Signalbezeichnung /CE_EP2). Hierbei wurde Verbindung 4 aktiviert. Berechnen Sie die maximale Zeit tCE die das EPROM haben darf. Randbedingungen: TA = 0° - 70° Prozessortakt: 12 MHz Die maximale Durchlaufzeit des Decoders tPHL beträgt 44ns.
10 Übungsaufgaben
Port 0
74HC573 Low-Byte-Adresse / Datum
ALE 50
Port 2
AdressLatch
+5V CS1
P2.7 P2.6 P2.5 P2.4
3 2 1
4
A12
LE
CS2 6
Eprom Low-Byte-Adresse
15 14 13 12 11 10 9 7
74LS138
P2.3 P2.2 P2.1 P2.0
A11 A10
5 CS3
A9
11 Y0 Y1
Y3 Y4 Y5 Y6 Y7
A8
TMS
Y2
27128JL-25 20
/CE
80535
/PSEN
49
22
/OE
Port 3
Abb. 10.4 Eprom über Decoder an 80535
Tabelle 10.2 Wahrheitstabelle 74LS138 Inputs Outputs CS1 CS2 CS3 A2 A1 A0 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 X X L H H H H H H H H
X X X L L L L L L L L
H X X L L L L L L L L
X X X L L L L H H H H
X X X L L H H L L H H
X X X L H L H L H L H
H H H L H H H H H H H
H H H H L H H H H H H
H H H H H L H H H H H
H H H H H H L H H H H
H H H H H H H L H H H
H H H H H H H H L H H
H H H H H H H H H L H
H H H H H H H H H H L
273
274
5.
µ-Controller (3 Punkte, jeweils nur eine Lösung)
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 über den Akku indirekt adressierbar Der Programmspeicher ist nur direkt adressierbar Es gibt 32 Register in den Registerbänken zur indirekten Adressierung Die Register R0 und R1 können zur indirekten Adressierung verwendet werden
2. Ein Echtzeitbetriebssystem mit Antwortzeiten von 1s kann für folgende Aufgaben nicht eingesetzt werden: a b c d
PH-Wertmessung Nachführung eines Solarpanels Motorregelung für Übungsgerät zum Training von Beinmuskulatur Temperaturregelung mit Zeitkonstanten von 1 Minute
3. Die Architektur von Prozessoren hat entscheidenden Einfluss auf die Leistung. Welche Möglichkeiten haben die peripheren Einheiten wie Timer 0? a b c d
Der Timer läuft nur, wenn der Prozessor Befehle ausführt Der Timer läuft immer Der Timer kann laufen, während der Prozessor Befehle ausführt Der Timer läuft nur mit dem Watchdog
10 Übungsaufgaben
275
4. Ein Signalprozessor hat folgende Eigenschaften: a b c d
Hat sehr langsame Befehlszykluszeit >1ms Arbeitet Befehle innerhalb eines Befehlszyklus ab (RISC) Hat keine Register Kann direkt an 220 V∼ betrieben werden
5. Bei welchen Prozessoren / Rechenmaschinen kann C nicht eingesetzt werden? a b c d
80535 Signalprozessor µ-Prozessor Rechenschieber
6. Im Hause werden zwei Netzwerk-Organisationen verwendet. Welche Aussage stimmt nicht? a b c d
Das Novell-Netz hat einen Server Unter Windows for Workgroups kann auf die Festplatten untereinander zugegriffen werden. Die Server können untereinander keine Daten austauschen Der LAT Arbeitsstationen sind mit Netzwerk im 640K Hauptspeicher beschränkt
276
6.
Allgemeine Fragen (5 Punkte, jeweils nur eine Lösung)
1. Auf einem Speicher ist die Angabe 27C128-20 zu lesen. Welche Aussage ist richtig? a b c d
Der Speicher hat 640 KBit Der Speicher hat 16 KByte Die Zugriffszeit beträgt 20ns Der Speicher gehört zur 200er-Serie
2. Welche Architektur entsteht bei der Verundung der beiden Signale /RD und /PSEN bei 8051-Controllern? a b c d
Fächerarchitektur Harvard-Architektur Von-Neumann-Architektur Modifizierte Harvard-Architektur
3. Was ist bei Verwendung von 2 Registerbänken zu beachten? a b c d
Verkleinerung des Speichers Vermeidung einer indirekten Adressierung Der Stackpointer wird in einen anderen Bereich gelegt Der Datenpointer muss auf 0 gesetzt werden
4. Was wird unter dem Begriff >>Polling<< verstanden? a b c d
Eine als Pollenflug auftretende Krankheit Das Abfragen von Flags oder Registern Die Interrupteinheit Die dauernde Unterbrechung bei NOP-Befehlen
5. Welche Aussage ist für die serielle Schnittstelle des 8051 richtig? a b c d
Die serielle Schnittstelle arbeitet mit 10 MBaud Die allgemeine und die serielle Interruptfreigabe muss bei Interruptbetrieb freigegeben sein Die Schnittstelle hat einen parallelen Ausgang Die Schnittstelle muss über "Pollingbetrieb" arbeiten
10 Übungsaufgaben
277
6. Der A/D-Wandler des 80535 wird durch das DAPR-Register ausgelöst. Was ist richtig? a b c d
Bei Einschreiben von 84H wird im Bereich von 1,25 V bis 2,5 V gewandelt Zur Wandlung muss das ADM-Bit gesetzt werden Der Baudratengenerator kann direkt die Wandlung auslösen Die A/D-Werte stehen nach der Wandlung im Akku
7. Welche Flags werden beim clr C - Befehl beeinflusst? a b c d
CY,AC,OV CY,AC CY,P,OV,AC CY
8. Die serielle Interrupt-Vektor-Adresse vom 80535-Prozessor ist? a b c d
SIN 35 0A3H SBUF
9. Bei der Hitex-Oberfläche wird eine .SYM-Datei verwendet. Welchen Sinn hat diese? a b c d
Es laden die System Dateien Mit logischen Bibliotheken Die Einstellungen der On-Chip-Einheiten lassen sich damit anzeigen Zugriff auf symbolische Adressen beim Debuggen Die Syntax Datei Für syntaktische Fehler im Programm
10. Das Monitor-Programm der EURO_535-Karte zum Debuggen der Software hat folgende Nachteile: a b c d
Einzelschrittbetrieb Symbolisches Debuggen Kein Echtzeitbetrieb möglich Die Oberfläche erlaubt keine Fenster
278
Lösungen Übungsklausur 4 Lösung Aufgabe 1a Programmkopf Compileranweisungen Initialisierung von Timer_2 Leuchte_1 an; Leuchte_2 aus TIMER_2 Interrupt Service Routine
Endlosschleife ja
Taster 1 betätigt ?
lang_blink=1
nein
lang_blink=5
Zaehler >= 2*Lang_blink ja
nein
Leuchte_1 Kompl. Leuchte_2 Kompl. ret
Lösung 1b /********************************************************************** ** ** ** Datei:ABW_BLI.C ** ** Das Programm bewirkt: ** ** L1 und L2 blinkt abwechselnd mit: ** ** Periodendauer 2s ** ** Periodendauer 0,4s Taster 2 betätigt ** ** ** ** Eingangsparameter: KEINE! (void) ** ** ** ** Ausgangsparameter: KEINE! (void) ** ** ** ** Rueckgabewert: KEINER! (void) ** ** ** *********************************************************************** ** ** ** Autor: J. Walter ** ** Datum: 29.6.1994 SS 94 ** ** ** **********************************************************************/ /***************** Steueranweisungen fuer den Compiler ***************/ #pragma OBJECTEXTEND #pragma CODE DEBUG #pragma SYMBOLS
/* typengerechtes Programm Debug */ /* Symbolisches Debuggen ein */ /* alle Symbole werden aufgelistet */
10 Übungsaufgaben /******************* Text im Quelltext einbinden *********************/ #include <euro_535.h> #include <math.h>
/* Definitionen fuer EURO_535-Karte */ /* Einbindung Mathematik-Bibliothek */
/*************************** Konstanten ******************************/ data unsigned char lang_blink=5; data unsigned char zaehler=0; /*********************** globale Variablen ***************************/ /************************ Hauptprogramm ******************************/ void init(void); void main(void) { init(); while(1) { if(Taster_2) lang_blink=5; else lang_blink=1; } return; } void init() { Leuchte_1=0; Leuchte_2=1; EAL=1; ET2=1; T2PS=1; CRCH=0x3C; CRCL=0xB0; T2R1=1; T2I0=1; }
/* Endlosschleife */
/* Leuchten Ein-Aus */ /* /* /* /* /* /* /*
allgemeine Interrupt-Freigabe */ Timer_2 Ueberlauf-Freigabe */ Frequenz = 1/24 */ 65536-50000=15536=3CBOH=0,1s */ Zaehle auf 10 oder 2 */ Automatisches Wiederladen */ Zeitgeberbetrieb */
void Timer_2_ISR(void) interrupt 5 /* ISR-Routine */ { TF2=0; /* Overflow-Bit zuruecksetzen */ zaehler++; /* +1 bei jedem Einsprung */ if (zaehler>=(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
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 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
I2FR
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.
Literaturverzeichnis
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [10] [11] [12]
Hitex - Systementwicklung; Bedienungshandbuch telemon 8051. Karlsruhe, 1992 Hofstadter, Douglas R.: Gödel, Escher, Bach. Ein endlos geflochtenes Band. Stuttgart: Klett-Cotta, 1986 Hofstadter, Douglas R.: Metamagicum. Fragen nach der Essenz von Geist und Struktur. Stuttgart: Klett-Cotta, 1988 Koch, G. / Rembold, U.: Einführung in die Informatik. München/ Wien: Carl Hanser, 1977 Pahl, Gerhard; Beitz, Wolfgang: Konstruktionslehre. Berlin Heidelberg New York: Springer-Verlag, 1977 Siemens: Addendum to SAB 80515/80C515 Family, User's Manual. München: Siemens AG 1991 Siemens: Data Sheet 11.92 Microcomputer Components; SAB 80C515/80C535 ;SAB 80C515-16 /80C535-16 8-Bit CMOS Microcontroller München: Siemens AG 1992 Siemens: Datenbuch SAB 80515/80C515 Family, User's Manual. München: Siemens AG 1993 Wahrig, Gerhard: Deutsches Wörterbuch, Jubiläumsausgabe. Güterloh/München: Bertelsmann Lexikon Verlag, 1986/91 Ginsbury Electronic GmbH: Digitaler Temperatursensor SMT 160-30, Datenblatt. München: Ginsbury Electronic GmbH AMD CMOS Memory Product 1991 Data Book/Handbook VDI/VDE 2422 Entwicklungsmethodik für Geräte mit Steuerung durch Mikroelektronik, Düsseldorf, 1992 Kerninghan Brian W., Dennis M. Ritchie: The C programming language, Prentice Hall, Englewood Cliffs, New Jersey1988
Bildverzeichnis Abb. 1.1 Abb. 1.2 Abb. 1.3 Abb. 1.4 Abb. 1.5 Abb. 1.6 Abb. 2.1 Abb. 2.2 Abb. 2.3 Abb. 2.4 Abb. 2.5 Abb. 2.6 Abb. 2.7 Abb. 2.8 Abb. 2.9 Abb. 2.10 Abb. 2.11 Abb. 2.12 Abb. 2.13 Abb. 2.14 Abb. 2.15 Abb. 2.16 Abb. 2.17 Abb. 2.18 Abb. 2.19 Abb. 3.1 Abb. 3.2 Abb. 3.3 Abb. 3.4 Abb. 3.5 Abb. 3.6 Abb. 3.7 Abb. 3.8 Abb. 3.9 Abb. 3.10 Abb. 3.11 Abb. 3.12 Abb. 3.13 Abb. 3.14 Abb. 3.15 Abb. 3.16 Abb. 3.17 Abb. 3.18 Abb. 3.19 Abb. 3.20
Ebenen-Problem µ-Prozessor, µ-Controller, µ-Computer Turingmaschine Schaltnetz - Schaltwerk µ-Controller als Fotografie und als technische Darstellung TTL Pegel am Eingang und Ausgang Logisches Symbol für D-Kippglied und Fotografie Impulsdiagramm für D-Flip-Flop ( Funktion ) verfeinertes Impulsdiagramm -Timing- für Clock von D-Flip-Flop Verfeinertes Impulsdiagramm für Setzen - Rücksetzen - Ausgang Q Verfeinertes Impulsdiagramm für Daten - Clock Logisches Diagramm für 3-State-Ausgang und Fotografie Logisches Diagramm für ein 3-State-Register Interner Aufbau des 3-State-Register 74F374 Logisches Symbol für das 3-State-Register und Fotografie Logisches Symbol für das 3-State-Register und Fotografie Blockbild für einfache Datenübergabe von System 1 zu System 2 Blockbild für bidirektionale Datenübergabe von System 1 zu System 2 Logisches Symbol eines 1 aus 4 Decoders und Fotografie Blockschaltbild - Bussysteme für 80535-System Aufbau der EURO_535-Platine Ablauf der zeitgemultiplexten Adress-Daten-Zustände 2x4 Multiplexer und Fotografie Schaltplan EURO_535 Teil 1 Schaltplan EURO_535 V2.0 Teil 2 Logisches Symbol des 8051 Prinzipieller Aufbau eines 8051-Ports Datenweg: Zustand des Port-Pins lesen Datenweg: Pin beschreiben mit Speichern Zustand des Port-Latches lesen Aufbau des Treiberbausteins Port 1 bis 5 Funktionsweise der FET's im Controller Port 0 als Adressausgang mit 0-Pegel am Ausgang Port 0 als Adressausgang mit 1-Pegel am Ausgang Port 0 als Datenausgang mit 0-Pegel Port 0 als Datenausgang mit 1-Pegel am Ausgang Port 1 als bidirektionaler Port mit internem Pull-up Widerstand Port 2 als bidirektionaler Port mit internem Pull-up-Widerstand Port 3 als bidirektionaler Port mit Alternate Functions Blockdiagramm des 8051 - 8051 A Verfeinertes Blockdiagramm des 8051 - 8051 A Klassischer Aufbau eines Digitalrechners Verfeinertes Blockdiagramm des 8051 mit Zuordnungen zu den Einheiten.. 80C535 Erweiterungen 80C515 / 80C535 Blockdiagramm (grau - zum 8051 zusätzliche Einheiten)
3 5 7 8 8 10 11 12 13 14 15 16 17 17 18 18 20 21 22 24 25 26 26 28 29 30 32 32 33 33 34 34 35 35 36 36 37 37 38 39 41 43 43 45 45
306 Abb. 3.21 Abb. 3.22 Abb. 3.23 Abb. 3.24 Abb. 3.25 Abb. 3.26 Abb. 3.27 Abb. 3.28 Abb. 3.29 Abb. 3.30 Abb. 3.31 Abb. 3.32 Abb. 3.33 Abb. 3.34 Abb. 3.35 Abb. 3.36 Abb. 3.37 Abb. 3.38 Abb. 3.39 Abb. 3.40 Abb. 4.1 Abb. 4.2 Abb. 4.3 Abb. 4.4 Abb. 4.5 Abb. 4.6 Abb. 4.7 Abb. 4.8 Abb. 4.9 Abb. 4.10 Abb. 4.11 Abb. 4.12 Abb. 4.13 Abb. 4.14 Abb. 4.15 Abb. 4.16 Abb. 4.17 Abb. 4.18 Abb. 4.19 Abb. 4.20 Abb. 4.21 Abb. 4.22 Abb. 4.23 Abb. 4.24 Abb. 4.25 Abb. 4.26 Abb. 4.27 Abb. 4.28 Abb. 5.1 Abb. 5.2 Abb. 5.3
Adressbereiche 8051 mit den Befehlen zum Ansprechen 46 Von-Neumann-Architektur 47 Harvard-Architektur 47 Erzeugen der Von-Neumann-Architektur 47 Bedeutung der Signalformen 48 Prinzip für Lesen des Programmspeichers 49 Programmspeicher lesen ohne Multiplex-Verfahren 49 Programmspeicher lesen vereinfacht 50 Blockbild für einfache Timingberechnungen 50 Programmspeicher Lesezugriff vollständig 51 Zeitbedingungen für EPROM und 80C535 in einem Signal-Zeit-Diagramm 51 Vor und nach der Adressspiegelung 54 Zustand nach dem Einschalten oder Reset 54 Zustand bei Zugriff auf Adresse > 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