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 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 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 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 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 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