Eingebettete Systeme - Kurzanleitung
System
Ein System ist eine Anordnung, bei der alle Einheiten nach einem Regelwerk zusammenarbeiten. Es kann auch als eine Art des Arbeitens, Organisierens oder Erledigens einer oder mehrerer Aufgaben nach einem festen Plan definiert werden. Beispielsweise ist eine Uhr ein Zeitanzeigesystem. Seine Komponenten folgen einer Reihe von Regeln, um die Zeit anzuzeigen. Wenn eines seiner Teile ausfällt, funktioniert die Uhr nicht mehr. Wir können also sagen, dass in einem System alle seine Unterkomponenten voneinander abhängen.
Eingebettetes System
Wie der Name schon sagt, bedeutet Embedded etwas, das mit einer anderen Sache verbunden ist. Ein eingebettetes System kann als ein Computerhardwaresystem betrachtet werden, in das Software eingebettet ist. Ein eingebettetes System kann ein unabhängiges System sein oder Teil eines großen Systems. Ein eingebettetes System ist ein Mikrocontroller- oder Mikroprozessor-basiertes System, das zur Ausführung einer bestimmten Aufgabe ausgelegt ist. Ein Feueralarm ist beispielsweise ein eingebettetes System. es wird nur Rauch spüren.
Ein eingebettetes System besteht aus drei Komponenten:
Es hat Hardware.
Es hat Anwendungssoftware.
Es verfügt über ein Echtzeit-Betriebssystem (RTOS), das die Anwendungssoftware überwacht und einen Mechanismus bereitstellt, mit dem der Prozessor einen Prozess gemäß Zeitplan ausführen kann, indem er einem Plan zur Steuerung der Latenzen folgt. RTOS definiert die Funktionsweise des Systems. Es legt die Regeln während der Ausführung des Anwendungsprogramms fest. Ein kleines eingebettetes System verfügt möglicherweise nicht über RTOS.
So können wir ein eingebettetes System als ein auf Mikrocontrollern basierendes, softwaregesteuertes, zuverlässiges Echtzeit-Steuerungssystem definieren.
Eigenschaften eines eingebetteten Systems
Single-functioned- Ein eingebettetes System führt normalerweise eine spezielle Operation aus und führt diese wiederholt aus. Zum Beispiel: Ein Pager fungiert immer als Pager.
Tightly constrained- Alle Computersysteme unterliegen Einschränkungen hinsichtlich der Entwurfsmetriken, die auf einem eingebetteten System können jedoch besonders eng sein. Entwurfsmetriken sind ein Maß für die Funktionen einer Implementierung wie Kosten, Größe, Leistung und Leistung. Es muss so groß sein, dass es auf einen einzelnen Chip passt, schnell genug ist, um Daten in Echtzeit zu verarbeiten, und minimale Energie verbrauchen, um die Batterielebensdauer zu verlängern.
Reactive and Real time- Viele eingebettete Systeme müssen kontinuierlich auf Änderungen in der Systemumgebung reagieren und bestimmte Ergebnisse unverzüglich in Echtzeit berechnen. Betrachten Sie ein Beispiel eines Auto-Tempomats. Es überwacht und reagiert kontinuierlich auf Geschwindigkeits- und Bremssensoren. Es muss innerhalb einer begrenzten Zeit wiederholt Beschleunigungen oder Entbeschleunigungen berechnen. Eine verzögerte Berechnung kann dazu führen, dass das Fahrzeug nicht mehr gesteuert werden kann.
Microprocessors based - Es muss auf einem Mikroprozessor oder einem Mikrocontroller basieren.
Memory- Es muss einen Speicher haben, da seine Software normalerweise im ROM eingebettet ist. Es werden keine sekundären Speicher im Computer benötigt.
Connected - Es müssen Peripheriegeräte angeschlossen sein, um Ein- und Ausgabegeräte anzuschließen.
HW-SW systems- Software wird für mehr Funktionen und Flexibilität verwendet. Hardware wird für Leistung und Sicherheit verwendet.
Vorteile
- Leicht anpassbar
- Energieeffizient
- Kostengünstig
- Verbesserte Performance
Nachteile
- Hoher Entwicklungsaufwand
- Größere Markteinführungszeit
Grundstruktur eines eingebetteten Systems
Die folgende Abbildung zeigt die Grundstruktur eines eingebetteten Systems -
Sensor- Es misst die physikalische Größe und wandelt sie in ein elektrisches Signal um, das von einem Beobachter oder einem beliebigen elektronischen Instrument wie einem A2D-Wandler gelesen werden kann. Ein Sensor speichert die gemessene Menge im Speicher.
A-D Converter - Ein Analog-Digital-Wandler wandelt das vom Sensor gesendete analoge Signal in ein digitales Signal um.
Processor & ASICs - Prozessoren verarbeiten die Daten, um die Ausgabe zu messen und im Speicher zu speichern.
D-A Converter - Ein Digital-Analog-Wandler wandelt die vom Prozessor eingespeisten digitalen Daten in analoge Daten um
Actuator - Ein Stellantrieb vergleicht die vom DA-Wandler ausgegebene Leistung mit der darin gespeicherten tatsächlichen (erwarteten) Leistung und speichert die genehmigte Leistung.
Der Prozessor ist das Herz eines eingebetteten Systems. Es ist die Grundeinheit, die Eingaben entgegennimmt und nach der Verarbeitung der Daten eine Ausgabe erzeugt. Für einen Entwickler eingebetteter Systeme ist es erforderlich, Kenntnisse sowohl über Mikroprozessoren als auch über Mikrocontroller zu haben.
Prozessoren in einem System
Ein Prozessor hat zwei wesentliche Einheiten -
- Programmflusssteuereinheit (CU)
- Hinrichtungseinheit (EU)
Die CU enthält eine Abrufeinheit zum Abrufen von Anweisungen aus dem Speicher. Die EU verfügt über Schaltkreise, die die Anweisungen für den Datenübertragungsvorgang und die Datenkonvertierung von einem Formular in ein anderes umsetzen.
Die EU umfasst die Arithmetik- und Logikeinheit (ALU) sowie die Schaltkreise, die Anweisungen für eine Programmsteuerungsaufgabe wie Interrupt ausführen oder zu einem anderen Befehlssatz springen.
Ein Prozessor führt die Abrufzyklen aus und führt die Anweisungen in derselben Reihenfolge aus, in der sie aus dem Speicher abgerufen werden.
Arten von Prozessoren
Prozessoren können der folgenden Kategorien angehören:
General Purpose Processor (GPP)
- Microprocessor
- Microcontroller
- Eingebetteter Prozessor
- Digitaler Signalprozessor
- Medienprozessor
Anwendungsspezifischer Systemprozessor (ASSP)
Anwendungsspezifische Befehlsprozessoren (ASIPs)
GPP-Kern (e) oder ASIP-Kern (e) auf einer anwendungsspezifischen integrierten Schaltung (ASIC) oder einer VLSI-Schaltung (Very Large Scale Integration).
Mikroprozessor
Ein Mikroprozessor ist ein einzelner VLSI-Chip mit einer CPU. Darüber hinaus kann es auch andere Einheiten wie Reisebusse, Gleitkomma-Recheneinheiten und Pipelining-Einheiten geben, die bei der schnelleren Verarbeitung von Anweisungen helfen.
Der Abruf- und Ausführungszyklus von Mikroprozessoren früherer Generationen wurde von einer Taktfrequenz in der Größenordnung von ~ 1 MHz geleitet. Prozessoren arbeiten jetzt mit einer Taktfrequenz von 2 GHz
Mikrocontroller
Ein Mikrocontroller ist eine Single-Chip-VLSI-Einheit (auch genannt) microcomputer), die zwar nur über begrenzte Rechenkapazitäten verfügt, jedoch über eine verbesserte Eingabe- / Ausgabefähigkeit und eine Reihe von On-Chip-Funktionseinheiten verfügt.
Zentralprozessor | RAM | Rom |
E / A-Port | Timer | Serieller COM-Anschluss |
Mikrocontroller werden insbesondere in eingebetteten Systemen für Echtzeitsteuerungsanwendungen mit On-Chip-Programmspeicher und -Geräten verwendet.
Mikroprozessor gegen Mikrocontroller
Schauen wir uns nun die bemerkenswertesten Unterschiede zwischen einem Mikroprozessor und einem Mikrocontroller an.
Mikroprozessor | Mikrocontroller |
---|---|
Mikroprozessoren sind von Natur aus Multitasking. Kann mehrere Aufgaben gleichzeitig ausführen. Auf dem Computer können wir beispielsweise Musik abspielen, während wir Text im Texteditor schreiben. | Einzelaufgabeorientiert. Beispielsweise ist eine Waschmaschine nur zum Waschen von Kleidung vorgesehen. |
RAM, ROM, E / A-Ports und Timer können extern hinzugefügt werden und in der Anzahl variieren. | RAM, ROM, E / A-Ports und Timer können nicht extern hinzugefügt werden. Diese Komponenten sollen zusammen auf einem Chip eingebettet und in Zahlen festgelegt werden. |
Designer können die Anzahl der benötigten Speicher- oder E / A-Ports festlegen. | Die feste Nummer für Speicher oder E / A macht einen Mikrocontroller ideal für eine begrenzte, aber spezifische Aufgabe. |
Die externe Unterstützung von externem Speicher und E / A-Ports macht ein mikroprozessorbasiertes System schwerer und teurer. | Mikrocontroller sind leicht und billiger als ein Mikroprozessor. |
Externe Geräte benötigen mehr Platz und haben einen höheren Stromverbrauch. | Ein auf Mikrocontrollern basierendes System verbraucht weniger Strom und benötigt weniger Platz. |
Die 8051-Mikrocontroller arbeiten mit einem 8-Bit-Datenbus. Sie können also einen externen Datenspeicher von bis zu 64 KB und einen externen Programmspeicher von höchstens 64 KB unterstützen. Insgesamt können 8051-Mikrocontroller 128 KB externen Speicher adressieren.
Wenn Daten und Code in unterschiedlichen Speicherblöcken liegen, wird die Architektur als bezeichnet Harvard architecture. Wenn Daten und Code im selben Speicherblock liegen, wird die Architektur als bezeichnetVon Neumann architecture.
Von Neumann Architektur
Die Von Neumann-Architektur wurde zuerst von einem Informatiker John von Neumann vorgeschlagen. In dieser Architektur existiert ein Datenpfad oder Bus sowohl für Befehl als auch für Daten. Infolgedessen führt die CPU jeweils eine Operation aus. Es ruft entweder einen Befehl aus dem Speicher ab oder führt eine Lese- / Schreiboperation für Daten durch. Ein Befehlsabruf und eine Datenoperation können also nicht gleichzeitig erfolgen, wenn ein gemeinsamer Bus gemeinsam genutzt wird.
Die Von-Neumann-Architektur unterstützt einfache Hardware. Es ermöglicht die Verwendung eines einzelnen sequentiellen Speichers. Die heutige Verarbeitungsgeschwindigkeit übertrifft die Speicherzugriffszeiten erheblich, und wir verwenden eine sehr schnelle, aber kleine Menge an Speicher (Cache) lokal im Prozessor.
Harvard-Architektur
Die Harvard-Architektur bietet separate Speicher- und Signalbusse für Anweisungen und Daten. Diese Architektur enthält einen Datenspeicher, der vollständig in der CPU enthalten ist, und es gibt keinen Zugriff auf den Befehlsspeicher als Daten. Computer verfügen über separate Speicherbereiche für Programmanweisungen und Daten mithilfe interner Datenbusse, die den gleichzeitigen Zugriff auf Anweisungen und Daten ermöglichen.
Programme mussten von einem Bediener geladen werden; Der Prozessor konnte sich nicht selbst booten. In einer Harvard-Architektur müssen die beiden Speicher keine gemeinsamen Eigenschaften aufweisen.
Von-Neumann-Architektur gegen Harvard-Architektur
Die folgenden Punkte unterscheiden die Von Neumann-Architektur von der Harvard-Architektur.
Von-Neumann-Architektur | Harvard-Architektur |
---|---|
Einzelner Speicher, der von Code und Daten gemeinsam genutzt werden kann. | Separate Speicher für Code und Daten. |
Der Prozessor muss Code in einem separaten Taktzyklus und Daten in einem anderen Taktzyklus abrufen. Es sind also zwei Taktzyklen erforderlich. | Ein einziger Taktzyklus ist ausreichend, da separate Busse für den Zugriff auf Code und Daten verwendet werden. |
Höhere Geschwindigkeit und damit weniger Zeitaufwand. | Langsamer in der Geschwindigkeit und damit zeitaufwändiger. |
Einfach im Design. | Komplex im Design. |
CISC und RISC
CISC ist ein komplexer Befehlssatzcomputer. Es ist ein Computer, der eine große Anzahl von Anweisungen adressieren kann.
In den frühen 1980er Jahren empfahlen Computerdesigner, dass Computer mit einfachen Konstrukten weniger Anweisungen verwenden sollten, damit sie innerhalb der CPU viel schneller ausgeführt werden können, ohne Speicher verwenden zu müssen. Solche Computer werden als RISC (Reduced Instruction Set Computer) klassifiziert.
CISC gegen RISC
Die folgenden Punkte unterscheiden ein CISC von einem RISC -
CISC | RISC |
---|---|
Größere Anweisungen. Einfach zu programmieren | Kleinere Anweisungen. Schwer zu programmieren. |
Einfacheres Design des Compilers unter Berücksichtigung größerer Anweisungen. | Komplexes Design des Compilers. |
Viele Adressierungsmodi verursachen komplexe Befehlsformate. | Nur wenige Adressierungsmodi, Befehlsformat korrigieren. |
Die Befehlslänge ist variabel. | Die Befehlslänge variiert. |
Höhere Taktzyklen pro Sekunde. | Niedriger Taktzyklus pro Sekunde. |
Der Schwerpunkt liegt auf Hardware. | Der Schwerpunkt liegt auf Software. |
Die Steuereinheit implementiert einen großen Befehlssatz unter Verwendung einer Mikroprogrammeinheit. | Jeder Befehl ist von der Hardware auszuführen. |
Langsamere Ausführung, da Anweisungen aus dem Speicher gelesen und von der Decodereinheit decodiert werden sollen. | Schnellere Ausführung, da jeder Befehl von der Hardware ausgeführt werden soll. |
Pipelining ist nicht möglich. | Das Pipelining von Anweisungen ist unter Berücksichtigung eines einzelnen Taktzyklus möglich. |
Compiler und Assembler
Compiler
Ein Compiler ist ein Computerprogramm (oder eine Reihe von Programmen), das den in einer Programmiersprache (der Quellsprache) geschriebenen Quellcode in eine andere Computersprache (normalerweise ein Binärformat) umwandelt. Der häufigste Grund für die Konvertierung ist das Erstellen eines ausführbaren Programms. Der Name "Compiler" wird hauptsächlich für Programme verwendet, die den Quellcode von einer höheren Programmiersprache in eine niedrigere Sprache (z. B. Assemblersprache oder Maschinencode) übersetzen.
Cross-Compiler
Wenn das kompilierte Programm auf einem Computer mit einer anderen CPU oder einem anderen Betriebssystem als dem Computer ausgeführt werden kann, auf dem der Compiler das Programm kompiliert hat, wird dieser Compiler als Cross-Compiler bezeichnet.
Dekompiler
Ein Programm, das ein Programm von einer einfachen Sprache in eine höhere Sprache übersetzen kann, wird als Dekompiler bezeichnet.
Sprachkonverter
Ein Programm, das Programme übersetzt, die in verschiedenen Hochsprachen geschrieben sind, wird normalerweise als Sprachübersetzer, Übersetzer von Quelle zu Quelle oder Sprachkonverter bezeichnet.
Ein Compiler führt wahrscheinlich die folgenden Operationen aus:
- Preprocessing
- Parsing
- Semantische Analyse (Syntaxgesteuerte Übersetzung)
- Codegenerierung
- Codeoptimierung
Monteure
Ein Assembler ist ein Programm, das grundlegende Computeranweisungen (als Assemblersprache bezeichnet) in ein Bitmuster konvertiert, mit dem der Prozessor des Computers seine grundlegenden Operationen ausführen kann. Ein Assembler erstellt Objektcode, indem er Assembly-Anweisungs-Mnemonics in Opcodes übersetzt und symbolische Namen in Speicherorte auflöst. Die Assemblersprache verwendet eine Mnemonik, um jede Maschinenoperation auf niedriger Ebene (Opcode) darzustellen.
Debugging-Tools in einem eingebetteten System
Das Debuggen ist ein methodischer Prozess, um die Anzahl der Fehler in einem Computerprogramm oder einer elektronischen Hardware zu finden und zu reduzieren, damit es wie erwartet funktioniert. Das Debuggen ist schwierig, wenn Subsysteme eng miteinander verbunden sind, da eine kleine Änderung in einem Subsystem Fehler in einem anderen verursachen kann. Die in eingebetteten Systemen verwendeten Debugging-Tools unterscheiden sich stark in Bezug auf Entwicklungszeit und Debugging-Funktionen. Wir werden hier die folgenden Debugging-Tools diskutieren -
- Simulators
- Mikrocontroller-Starter-Kits
- Emulator
Simulatoren
Code wird für die MCU / das System getestet, indem er auf dem für die Codeentwicklung verwendeten Host-Computer simuliert wird. Simulatoren versuchen, das Verhalten des gesamten Mikrocontrollers in Software zu modellieren.
Funktionen von Simulatoren
Ein Simulator führt die folgenden Funktionen aus:
Definiert den Prozessor oder die Verarbeitungsgerätefamilie sowie die verschiedenen Versionen für das Zielsystem.
Überwacht die detaillierten Informationen eines Quellcodeteils mit Beschriftungen und symbolischen Argumenten, während die Ausführung für jeden einzelnen Schritt fortgesetzt wird.
Gibt den Status des RAM und der simulierten Ports des Zielsystems für jede einzelne Schrittausführung an.
Überwacht die Systemreaktion und bestimmt den Durchsatz.
Bietet eine Verfolgung der Ausgabe des Inhalts des Programmzählers gegenüber den Prozessorregistern.
Gibt die detaillierte Bedeutung des vorliegenden Befehls an.
Überwacht die detaillierten Informationen der Simulatorbefehle, wenn diese über die Tastatur eingegeben oder aus dem Menü ausgewählt werden.
Unterstützt die Bedingungen (bis zu 8 oder 16 oder 32 Bedingungen) und bedingungslose Haltepunkte.
Bietet Haltepunkte und den Trace, die zusammen das wichtige Test- und Debugging-Tool darstellen.
Erleichtert die Synchronisierung der internen Peripheriegeräte und Verzögerungen.
Mikrocontroller Starter Kit
Ein Mikrocontroller-Starter-Kit besteht aus -
- Hardware-Karte (Evaluierungskarte)
- Systeminterner Programmierer
- Einige Software-Tools wie Compiler, Assembler, Linker usw.
- Manchmal beschränkt eine IDE und die Codegröße die Evaluierungsversion eines Compilers.
Ein großer Vorteil dieser Kits gegenüber Simulatoren besteht darin, dass sie in Echtzeit arbeiten und somit eine einfache Überprüfung der Eingabe- / Ausgabefunktionalität ermöglichen. Starter-Kits sind jedoch völlig ausreichend und die billigste Option, um einfache Mikrocontroller-Projekte zu entwickeln.
Emulatoren
Ein Emulator ist ein Hardware-Kit oder ein Softwareprogramm oder kann beides sein, das die Funktionen eines Computersystems (des Gasts) in einem anderen Computersystem (dem Host) emuliert, die sich vom ersten unterscheiden, so dass das emulierte Verhalten dem Verhalten sehr ähnlich ist des realen Systems (der Gast).
Emulation bezieht sich auf die Fähigkeit eines Computerprogramms in einem elektronischen Gerät, ein anderes Programm oder Gerät zu emulieren (zu imitieren). Die Emulation konzentriert sich auf die Wiederherstellung einer ursprünglichen Computerumgebung. Emulatoren haben die Fähigkeit, eine engere Verbindung zur Authentizität des digitalen Objekts aufrechtzuerhalten. Ein Emulator hilft dem Benutzer, an jeder Art von Anwendung oder Betriebssystem auf einer Plattform auf ähnliche Weise zu arbeiten, wie die Software in ihrer ursprünglichen Umgebung ausgeführt wird.
Peripheriegeräte in eingebetteten Systemen
Eingebettete Systeme kommunizieren über ihre Peripheriegeräte mit der Außenwelt, z.
- Serielle Kommunikationsschnittstellen (SCI) wie RS-232, RS-422, RS-485 usw.
- Synchrone serielle Kommunikationsschnittstelle wie I2C, SPI, SSC und ESSI
- Universal Serial Bus (USB)
- Multimedia-Karten (SD-Karten, Compact Flash usw.)
- Netzwerke wie Ethernet, LonWorks usw.
- Feldbusse wie CAN-Bus, LIN-Bus, PROFIBUS usw.
- Imere wie PLL (s), Capture / Compare und Time Processing Units.
- Diskrete E / A oder GPIO (General Purpose Input / Output)
- Analog zu Digital / Digital zu Analog (ADC / DAC)
- Debugging wie JTAG-, ISP-, ICSP-, BDM-Port-, BITP- und DP9-Ports
Kriterien für die Auswahl des Mikrocontrollers
Stellen Sie bei der Auswahl eines Mikrocontrollers sicher, dass er die jeweilige Aufgabe erfüllt und kostengünstig ist. Wir müssen sehen, ob ein 8-Bit-, 16-Bit- oder 32-Bit-Mikrocontroller die Rechenanforderungen einer Aufgabe am besten bewältigen kann. Darüber hinaus sollten bei der Auswahl eines Mikrocontrollers die folgenden Punkte beachtet werden:
Speed - Was ist die höchste Geschwindigkeit, die der Mikrocontroller unterstützen kann?
Packaging- Ist es 40-poliges DIP (Dual-Inline-Gehäuse) oder QFP (Quad-Flat-Gehäuse)? Dies ist wichtig für den Platzbedarf, die Montage und das Prototyping des Endprodukts.
Power Consumption - Dies ist ein wichtiges Kriterium für batteriebetriebene Produkte.
Amount of RAM and ROM auf dem Chip.
Count of I/O pins and Timers auf dem Chip.
Cost per Unit - Dies ist wichtig für die Endkosten des Produkts, in dem der Mikrocontroller verwendet werden soll.
Stellen Sie außerdem sicher, dass dem Mikrocontroller Tools wie Compiler, Debugger und Assembler zur Verfügung stehen. Am wichtigsten ist, dass Sie einen Mikrocontroller von einer zuverlässigen Quelle kaufen.
Kurze Geschichte von 8051
Der erste Mikroprozessor 4004 wurde von der Intel Corporation erfunden. 8085 und 8086Mikroprozessoren wurden ebenfalls von Intel erfunden. 1981 führte Intel einen 8-Bit-Mikrocontroller namens The ein8051. Es wurde als bezeichnetsystem on a chipweil es 128 Bytes RAM, 4 KByte On-Chip-ROM, zwei Timer, eine serielle Schnittstelle und 4 Ports (8 Bit breit) auf einem einzigen Chip hatte. Als es weit verbreitet wurde, erlaubte Intel anderen Herstellern, verschiedene 8051-Varianten mit dem mit 8051 kompatiblen Code herzustellen und zu vermarkten. Wenn Sie Ihr Programm für eine 8051-Version schreiben, wird es auch auf anderen Varianten ausgeführt, unabhängig von der Hersteller. Dies hat zu mehreren Versionen mit unterschiedlichen Geschwindigkeiten und Mengen an On-Chip-RAM geführt.
8051 Aromen / Mitglieder
8052 microcontroller- 8052 verfügt über alle Standardfunktionen des 8051-Mikrocontrollers sowie über zusätzliche 128 Byte RAM und einen zusätzlichen Timer. Es hat auch 8 KByte On-Chip-Programm-ROM anstelle von 4 KByte.
8031 microcontroller- Es ist ein weiteres Mitglied der 8051-Familie. Dieser Chip wird oft als 8051 ohne ROM bezeichnet, da er über 0 KByte On-Chip-ROM verfügt. Sie müssen ein externes ROM hinzufügen, um es zu verwenden, das das abzurufende und auszuführende Programm enthält. Dieses Programm kann bis zu 64 KB groß sein. Beim Hinzufügen eines externen ROM zum 8031 gingen jedoch 2 von 4 Ports verloren. Um dieses Problem zu lösen, können wir dem 8031 eine externe E / A hinzufügen
Vergleich zwischen 8051 Familienmitgliedern
In der folgenden Tabelle werden die in 8051, 8052 und 8031 verfügbaren Funktionen verglichen.
Merkmal | 8051 | 8052 | 8031 |
---|---|---|---|
ROM (Bytes) | 4K | 8 TAUSEND | 0K |
RAM (Bytes) | 128 | 256 | 128 |
Timer | 2 | 3 | 2 |
E / A-Pins | 32 | 32 | 32 |
Serielle Schnittstelle | 1 | 1 | 1 |
Quellen unterbrechen | 6 | 8 | 6 |
Merkmale des 8051 Mikrocontrollers
Ein 8051-Mikrocontroller wird mit den folgenden Funktionen geliefert:
- On-Chip-Programmspeicher (ROM) mit 4 KByte
- 128 Bytes On-Chip-Datenspeicher (RAM)
- Vier Registerbanken
- 128 benutzerdefinierte Software-Flags
- Bidirektionaler 8-Bit-Datenbus
- Unidirektionaler 16-Bit-Adressbus
- 32 Allzweckregister mit jeweils 8 Bit
- 16-Bit-Timer (normalerweise 2, können aber mehr oder weniger haben)
- Drei interne und zwei externe Interrupts
- Vier 8-Bit-Ports (kurzes Modell mit zwei 8-Bit-Ports)
- 16-Bit-Programmzähler und Datenzeiger
- Der 8051 verfügt möglicherweise auch über eine Reihe von Sonderfunktionen wie UARTs, ADC, Operationsverstärker usw.
Blockdiagramm des 8051-Mikrocontrollers
Die folgende Abbildung zeigt das Blockschaltbild eines 8051-Mikrocontrollers -
In 8051 werden E / A-Vorgänge mit vier Ports und 40 Pins ausgeführt. Das folgende Pin-Diagramm zeigt die Details der 40 Pins. Der E / A-Betriebsport reserviert 32 Pins, wobei jeder Port 8 Pins hat. Die anderen 8 Pins werden als V bezeichnet cc , GND, XTAL1, XTAL2, RST, EA (bar), ALE / PROG (bar) und PSEN (bar).
Es handelt sich um ein 40-poliges PDIP (Plastic Dual Inline Package).
Note- In einem DIP-Paket erkennen Sie den ersten und den letzten Stift am Schnitt in der Mitte des IC. Der erste Stift ist auf der linken Seite dieser Schneidmarkierung und dem letzten Stift (dh der 40 th Stift in diesem Fall) ist rechts von der Schneidmarkierung.
E / A-Ports und ihre Funktionen
Die vier Ports P0, P1, P2 und P3 verwenden jeweils 8 Pins, was sie zu 8-Bit-Ports macht. Beim RESET werden alle Ports als Eingänge konfiguriert und können als Eingangsports verwendet werden. Wenn die erste 0 in einen Port geschrieben wird, wird sie zu einer Ausgabe. Um es als Eingabe neu zu konfigurieren, muss eine 1 an einen Port gesendet werden.
Port 0 (Pin Nr. 32 - Pin Nr. 39)
Es hat 8 Pins (32 bis 39). Es kann für die Eingabe oder Ausgabe verwendet werden. Im Gegensatz zu den Ports P1, P2 und P3 verbinden wir P0 normalerweise mit Pull-up-Widerständen von 10 kOhm, um es als Eingangs- oder Ausgangsport als offenen Drain zu verwenden.
Es wird auch als AD0-AD7 bezeichnet, sodass es sowohl als Adresse als auch als Daten verwendet werden kann. Im Fall von 8031 (dh ROMless Chip) wird P0 sowohl für den Adress- als auch für den Datenbus verwendet, wenn auf das externe ROM zugegriffen werden muss. ALE (Pin Nr. 31) zeigt an, ob P0 Adresse oder Daten hat. Wenn ALE = 0 ist, liefert es Daten D0-D7, aber wenn ALE = 1 ist, hat es die Adresse A0-A7. Falls kein externer Speicheranschluss verfügbar ist, muss P0 extern an einen 10K-Ohm-Pull-up-Widerstand angeschlossen werden.
MOV A,#0FFH ;(comments: A=FFH(Hexadecimal i.e. A=1111 1111)
MOV P0,A ;(Port0 have 1's on every pin so that it works as Input)
Port 1 (Pin 1 bis 8)
Es ist ein 8-Bit-Port (Pin 1 bis 8) und kann entweder als Eingang oder Ausgang verwendet werden. Es sind keine Pull-up-Widerstände erforderlich, da diese bereits intern angeschlossen sind. Beim Zurücksetzen wird Port 1 als Eingangsport konfiguriert. Der folgende Code kann verwendet werden, um abwechselnde Werte von 55H und AAH an Port 1 zu senden.
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ;complement(invert) reg. A
SJMP BACK
Wenn Port 1 so konfiguriert ist, dass er als Ausgabeport verwendet wird, programmieren Sie ihn, um ihn erneut als Eingabeport zu verwenden, indem Sie 1 in alle seine Bits schreiben, wie im folgenden Code beschrieben.
;Toggle all bits of continuously
MOV A ,#0FFH ;A = FF hex
MOV P1,A ;Make P1 an input port
MOV A,P1 ;get data from P1
MOV R7,A ;save it in Reg R7
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R6,A ;save it in R6
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R5,A ;save it in R5
Port 2 (Pins 21 bis 28)
Port 2 belegt insgesamt 8 Pins (Pins 21 bis 28) und kann sowohl für Eingangs- als auch für Ausgangsoperationen verwendet werden. Genau wie P1 (Port 1) benötigt P2 auch keine externen Pull-up-Widerstände, da diese bereits intern angeschlossen sind. Es muss zusammen mit P0 verwendet werden, um die 16-Bit-Adresse für den externen Speicher bereitzustellen. Daher wird es auch als (A0 - A7) bezeichnet, wie im Pin-Diagramm gezeigt. Wenn der 8051 mit einem externen Speicher verbunden ist, stellt er einen Pfad für die oberen 8-Bit-16-Bit-Adressen bereit und kann nicht als E / A verwendet werden. Beim Zurücksetzen wird Port 2 als Eingangsport konfiguriert. Der folgende Code kann verwendet werden, um abwechselnde Werte von 55H und AAH an Port 2 zu senden.
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ; complement(invert) reg. A
SJMP BACK
Wenn Port 2 so konfiguriert ist, dass er als Ausgangsport verwendet wird, programmieren Sie ihn, um ihn erneut als Eingabeport zu verwenden, indem Sie 1 in alle seine Bits schreiben, wie im folgenden Code beschrieben.
;Get a byte from P2 and send it to P1
MOV A,#0FFH ;A = FF hex
MOV P2,A ;make P2 an input port
BACK:
MOV A,P2 ;get data from P2
MOV P1,A ;send it to Port 1
SJMP BACK ;keep doing that
Port 3 (Pins 10 bis 17)
Es besteht ebenfalls aus 8 Bit und kann als Eingabe / Ausgabe verwendet werden. Dieser Port liefert einige äußerst wichtige Signale. P3.0 und P3.1 sind RxD (Empfänger) bzw. TxD (Sender) und werden gemeinsam für die serielle Kommunikation verwendet. Die Pins P3.2 und P3.3 werden für externe Interrupts verwendet. P3.4 und P3.5 werden für die Zeitgeber T0 bzw. T1 verwendet. P3.6 und P3.7 sind Schreib- (WR) und Lese- (RD) Pins. Dies sind aktive Low-Pins, dh sie sind aktiv, wenn ihnen 0 zugewiesen wird, und diese werden verwendet, um Lese- und Schreiboperationen für externe ROMs in 8031-basierten Systemen bereitzustellen.
P3 Bit | Funktion | Stift |
---|---|---|
P3.0 | RxD | 10 |
P3.1 < | TxD | 11 |
P3.2 < | Ergänzung von INT0 | 12 |
P3.3 < | INT1 | 13 |
P3.4 < | T0 | 14 |
P3.5 < | T1 | 15 |
P3.6 < | WR | 16 |
P3.7 < | Ergänzung von RD | 17 |
Doppelte Rolle von Port 0 und Port 2
Dual role of Port 0- Port 0 wird auch als AD0 - AD7 bezeichnet, da er sowohl für die Daten- als auch für die Adressverarbeitung verwendet werden kann. Beim Anschließen eines 8051 an einen externen Speicher kann Port 0 sowohl Adresse als auch Daten bereitstellen. Der 8051-Mikrocontroller multiplext dann den Eingang als Adresse oder Daten, um Pins zu speichern.
Dual role of Port 2- Neben der Arbeit als E / A wird Port P2 zusammen mit Port 0 auch zur Bereitstellung eines 16-Bit-Adressbusses für den externen Speicher verwendet. Port P2 wird auch als (A8– A15) bezeichnet, während Port 0 die unteren 8-Bit-Adressen über bereitstellt A0 - A7. Mit anderen Worten können wir sagen, dass, wenn ein 8051 an einen externen Speicher (ROM) angeschlossen ist, der maximal bis zu 64 KB betragen kann und dies über einen 16-Bit-Adressbus möglich ist, da wir 216 = 64 KB kennen. Port2 wird für das obere 8-Bit der 16-Bit-Adresse verwendet und kann nicht für E / A verwendet werden. Auf diese Weise wird jeder Programmcode des externen ROM adressiert.
Hardware-Anschluss von Pins
Vcc - Pin 40 versorgt den Chip mit Strom und beträgt +5 V.
Gnd - Pin 20 bietet Masse für die Referenz.
XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 verfügt über einen On-Chip-Oszillator, benötigt jedoch einen externen Takt, um ihn auszuführen. Ein Quarzkristall ist zwischen dem XTAL1- und XTAL2-Pin des Chips angeschlossen. Dieser Kristall benötigt auch zwei Kondensatoren von 30 pF, um ein Signal mit der gewünschten Frequenz zu erzeugen. Eine Seite jedes Kondensators ist mit Masse verbunden. 8051 IC ist in verschiedenen Geschwindigkeiten erhältlich und alles hängt von diesem Quarzkristall ab. Beispielsweise benötigt ein 20-MHz-Mikrocontroller einen Kristall mit einer Frequenz von nicht mehr als 20 MHz.
RST (Pin No. 9)- Es ist ein Eingangspin und ein aktiver High-Pin. Wenn ein hoher Impuls an diesen Pin angelegt wird, dh 1, setzt der Mikrocontroller alle Aktivitäten zurück und beendet sie. Dieser Vorgang ist bekannt alsPower-On Reset. Durch Aktivieren eines Power-On-Resets gehen alle Werte im Register verloren. Es wird ein Programmzähler auf alle Nullen gesetzt. Um eine gültige Eingabe von Reset sicherzustellen, muss der hohe Impuls mindestens zwei Maschinenzyklen lang hoch sein, bevor er niedrig werden darf, was vom Kondensatorwert und der Rate abhängt, mit der er aufgeladen wird. (Machine Cycle ist die Mindestfrequenz, die ein einzelner Befehl für die Ausführung benötigt).
EA or External Access (Pin No. 31)- Es ist ein Eingangspin. Dieser Pin ist ein aktiver Low-Pin. Beim Anlegen eines niedrigen Impulses wird dieser aktiviert. Im Fall eines Mikrocontrollers (8051/52) mit einem On-Chip-ROM ist der EA-Pin (Bar-Pin) mit V cc verbunden . In einem 8031-Mikrocontroller ohne On-Chip-ROM wird der Code jedoch in einem externen ROM gespeichert und dann vom Mikrocontroller abgerufen. In diesem Fall müssen wir den (Pin Nr. 31) EA mit Gnd verbinden, um anzuzeigen, dass der Programmcode extern gespeichert ist.
PSEN or Program store Enable (Pin No 29)- Dies ist auch ein aktiver Low-Pin, dh er wird nach Anlegen eines Low-Pulses aktiviert. Es ist ein Ausgangs-Pin und wird zusammen mit dem EA-Pin in 8031-basierten (dh ROMLESS) Systemen verwendet, um die Speicherung von Programmcode in einem externen ROM zu ermöglichen.
ALE or (Address Latch Enable)- Dies ist ein Ausgangspin und ist aktiv hoch. Es wird speziell für 8031 IC verwendet, um es mit dem externen Speicher zu verbinden. Es kann verwendet werden, um zu entscheiden, ob P0-Pins als Adressbus oder Datenbus verwendet werden. Wenn ALE = 1 ist, arbeiten die P0-Pins als Datenbus, und wenn ALE = 0, fungieren die P0-Pins als Adressbus.
E / A-Ports und Bitadressierbarkeit
Es ist eine am häufigsten verwendete Funktion von 8051 beim Schreiben von Code für 8051. Manchmal müssen wir nur auf 1 oder 2 Bits des Ports anstatt auf die gesamten 8 Bits zugreifen. 8051 bietet die Möglichkeit, auf einzelne Bits der Ports zuzugreifen.
Beim Einzelbitzugriff auf einen Port verwenden wir die Syntax "SETB X. Y", wobei X die Portnummer (0 bis 3) und Y die Bitnummer (0 bis 7) für die Datenbits D0-D7 ist Dabei ist D0 das LSB und D7 das MSB. Zum Beispiel setzt "SETB P1.5" das High-Bit 5 von Port 1.
Der folgende Code zeigt, wie wir das Bit P1.2 kontinuierlich umschalten können.
AGAIN:
SETB P1.2
ACALL DELAY
CLR P1.2
ACALL DELAY
SJMP AGAIN
Einzelbit-Anweisungen
Anleitung | Funktion |
---|---|
SETB-Bit | Setzen Sie das Bit (Bit = 1) |
CLR-Bit | lösche das Bit (Bit = 0) |
CPL-Bit | Ergänzen Sie das Bit (Bit = NICHT Bit) |
JB-Bit, Ziel | zum Ziel springen, wenn Bit = 1 (springen, wenn Bit) |
JNB-Bit, Ziel | zum Ziel springen, wenn Bit = 0 (springen, wenn kein Bit) |
JBC-Bit, Ziel | zum Ziel springen, wenn Bit = 1, Bit löschen (Sprung, wenn Bit, dann löschen) |
Programm zähler
Der Programmzähler ist ein 16- oder 32-Bit-Register, das die Adresse des nächsten auszuführenden Befehls enthält. Der PC erhöht sich jedes Mal, wenn eine Anweisung abgerufen wird, automatisch zum nächsten sequentiellen Speicherort. Verzweigungs-, Sprung- und Unterbrechungsoperationen laden den Programmzähler mit einer anderen Adresse als der nächsten sequentiellen Position.
Durch Aktivieren eines Power-On-Resets gehen alle Werte im Register verloren. Dies bedeutet, dass der Wert des PCs (Programmzählers) beim Zurücksetzen 0 ist, wodurch die CPU gezwungen wird, den ersten Opcode vom ROM-Speicherplatz 0000 abzurufen. Dies bedeutet, dass das erste Byte des Upcodes im ROM-Speicherort 0000 abgelegt werden muss, da sich dort der Wert befindet Die CPU erwartet, den ersten Befehl zu finden
Vektor zurücksetzen
Die Bedeutung des Rücksetzvektors besteht darin, dass er den Prozessor auf die Speicheradresse verweist, die den ersten Befehl der Firmware enthält. Ohne den Vektor zurücksetzen würde der Prozessor nicht wissen, wo er mit der Ausführung beginnen soll. Beim Zurücksetzen lädt der Prozessor den Programmzähler (PC) mit dem Rücksetzvektorwert von einem vordefinierten Speicherort. In der CPU08-Architektur befindet sich dies am Standort$FFFE:$FFFF.
Wenn der Rücksetzvektor nicht erforderlich ist, nehmen Entwickler ihn normalerweise als selbstverständlich an und programmieren nicht in das endgültige Bild. Infolgedessen startet der Prozessor nicht mit dem Endprodukt. Es ist ein häufiger Fehler, der während der Debug-Phase auftritt.
Stapelzeiger
Der Stapel ist im RAM implementiert und ein CPU-Register wird verwendet, um darauf zuzugreifen, das als SP-Register (Stack Pointer) bezeichnet wird. Das SP-Register ist ein 8-Bit-Register und kann Speicheradressen im Bereich von 00h bis FFh adressieren. Zu Beginn enthält das SP-Register den Wert 07, um auf Position 08 als die erste Position zu verweisen, die vom 8051 für den Stapel verwendet wird.
Wenn der Inhalt eines CPU-Registers in einem Stapel gespeichert ist, wird dies als PUSH-Operation bezeichnet. Wenn der Inhalt eines Stapels in einem CPU-Register gespeichert ist, wird dies als POP-Operation bezeichnet. Mit anderen Worten, ein Register wird auf den Stapel geschoben, um es zu speichern, und vom Stapel entfernt, um es abzurufen.
Endlosschleife
Eine Endlosschleife oder eine Endlosschleife kann aus folgenden Gründen als eine Folge von Anweisungen in einem Computerprogramm identifiziert werden, die endlos in einer Schleife ausgeführt werden:
- Schleife ohne Abschlussbedingung.
- Schleife mit einer Abschlussbedingung, die niemals erfüllt werden kann.
- Schleife mit einer Abschlussbedingung, die bewirkt, dass die Schleife von vorne beginnt.
Solche Endlosschleifen führten normalerweise dazu, dass ältere Betriebssysteme nicht mehr reagierten, da eine Endlosschleife die gesamte verfügbare Prozessorzeit beansprucht. E / A-Operationen, die auf Benutzereingaben warten, werden auch als "Endlosschleifen" bezeichnet. Eine mögliche Ursache für das "Einfrieren" eines Computers ist eine Endlosschleife. andere Ursachen sinddeadlock und access violations.
Eingebettete Systeme "beenden" im Gegensatz zu einem PC niemals eine Anwendung. Sie durchlaufen eine Endlosschleife und warten darauf, dass ein Ereignis in Form eines Interrupts oder eines Interrupts stattfindetpre-scheduled task. Um Strom zu sparen, geben einige Prozessoren spezielle einsleep oder wait modes anstatt durch eine Endlosschleife zu laufen, verlassen sie diesen Modus entweder durch einen Timer oder einen externen Interrupt.
Unterbricht
Interrupts sind meistens Hardwaremechanismen, die das Programm anweisen, dass ein Ereignis aufgetreten ist. Sie können jederzeit auftreten und sind daher asynchron zum Programmablauf. Sie erfordern eine spezielle Behandlung durch den Prozessor und werden letztendlich von einer entsprechenden Interrupt Service Routine (ISR) behandelt. Interrupts müssen schnell behandelt werden. Wenn Sie sich zu viel Zeit nehmen, um einen Interrupt zu warten, verpassen Sie möglicherweise einen anderen Interrupt.
Little Endian gegen Big Endian
Obwohl Zahlen immer auf die gleiche Weise angezeigt werden, werden sie nicht auf die gleiche Weise im Speicher gespeichert. Big-Endian-Maschinen speichern das höchstwertige Datenbyte in der niedrigsten Speicheradresse. Eine Big-Endian-Maschine speichert 0x12345678 als -
ADD+0: 0x12
ADD+1: 0x34
ADD+2: 0x56
ADD+3: 0x78
Little-Endian-Maschinen hingegen speichern das niedrigstwertige Datenbyte in der niedrigsten Speicheradresse. Eine Little-Endian-Maschine speichert 0x12345678 als -
ADD+0: 0x78
ADD+1: 0x56
ADD+2: 0x34
ADD+3: 0x12
Assemblersprachen wurden entwickelt, um bereitzustellen mnemonicsoder Symbole für die Anweisungen auf Maschinenebene. Assembler-Programme bestehen aus Mnemonik, daher sollten sie in Maschinencode übersetzt werden. Ein Programm, das für diese Konvertierung verantwortlich ist, heißtassembler. Assemblersprache wird häufig als Low-Level-Sprache bezeichnet, da sie direkt mit der internen Struktur der CPU zusammenarbeitet. Um in Assemblersprache zu programmieren, muss ein Programmierer alle Register der CPU kennen.
Verschiedene Programmiersprachen wie C, C ++, Java und verschiedene andere Sprachen werden als Hochsprachen bezeichnet, da sie sich nicht mit den internen Details einer CPU befassen. Im Gegensatz dazu wird ein Assembler verwendet, um ein Assembler-Programm in Maschinencode zu übersetzen (manchmal auch aufgerufen)object code oder opcode). Ebenso übersetzt ein Compiler eine Hochsprache in Maschinencode. Um beispielsweise ein Programm in C-Sprache zu schreiben, muss ein C-Compiler verwendet werden, um das Programm in Maschinensprache zu übersetzen.
Struktur der Assemblersprache
Ein Assembler-Programm besteht aus einer Reihe von Anweisungen, die entweder Assembler-Anweisungen wie ADD und MOV oder aufgerufene Anweisungen sind directives.
Ein instruction teilt der CPU mit, was zu tun ist, während a directive (auch genannt pseudo-instructions) gibt dem Assembler Anweisungen. Beispielsweise sind ADD- und MOV-Anweisungen Befehle, die von der CPU ausgeführt werden, während ORG und END Assembler-Anweisungen sind. Der Assembler platziert den Opcode bei Verwendung der ORG-Direktive an der Speicherstelle 0, während END das Ende des Quellcodes angibt. Ein Programmierunterricht besteht aus den folgenden vier Feldern:
[ label: ] mnemonics [ operands ] [;comment ]
Eine eckige Klammer ([]) zeigt an, dass das Feld optional ist.
Das label fieldErmöglicht dem Programm, mit Namen auf eine Codezeile zu verweisen. Die Beschriftungsfelder dürfen eine bestimmte Anzahl von Zeichen nicht überschreiten.
Das mnemonics und operands fieldsFühren Sie gemeinsam die eigentliche Arbeit des Programms aus und erledigen Sie die Aufgaben. Anweisungen wie ADD A, C & MOV C, # 68, wobei ADD und MOV die Mnemonik sind, die Opcodes erzeugen; "A, C" und "C, # 68" sind Operanden. Diese beiden Felder können Anweisungen enthalten. Anweisungen generieren keinen Maschinencode und werden nur vom Assembler verwendet, während Anweisungen in Maschinencode übersetzt werden, damit die CPU sie ausführen kann.
1.0000 ORG 0H ;start (origin) at location 0
2 0000 7D25 MOV R5,#25H ;load 25H into R5
3.0002 7F34 MOV R7,#34H ;load 34H into R7
4.0004 7400 MOV A,#0 ;load 0 into A
5.0006 2D ADD A,R5 ;add contents of R5 to A
6.0007 2F ADD A,R7 ;add contents of R7 to A
7.0008 2412 ADD A,#12H ;add to A value 12 H
8.000A 80FE HERE: SJMP HERE ;stay in this loop
9.000C END ;end of asm source file
Das comment field beginnt mit einem Semikolon, das ein Kommentarindikator ist.
Beachten Sie die Bezeichnung "HIER" im Programm. Auf jedes Etikett, das sich auf eine Anweisung bezieht, sollte ein Doppelpunkt folgen.
Zusammenstellen und Ausführen eines 8051-Programms
Hier werden wir über die Grundform einer Assemblersprache diskutieren. Die Schritte zum Erstellen, Zusammenstellen und Ausführen eines Assembler-Programms lauten wie folgt:
Zuerst verwenden wir einen Editor, um ein Programm einzugeben, das dem obigen Programm ähnlich ist. Editoren wie das MS-DOS EDIT-Programm, das mit allen Microsoft-Betriebssystemen geliefert wird, können zum Erstellen oder Bearbeiten eines Programms verwendet werden. Der Editor muss in der Lage sein, eine ASCII-Datei zu erstellen. Die Erweiterung "asm" für die Quelldatei wird im nächsten Schritt von einem Assembler verwendet.
Die Quelldatei "asm" enthält den in Schritt 1 erstellten Programmcode. Sie wird einem 8051-Assembler zugeführt. Der Assembler konvertiert dann die Assembler-Anweisungen in Maschinencode-Anweisungen und erzeugt eine.obj file (Objektdatei) und a .lst file(Listendatei). Es wird auch als bezeichnetsource fileAus diesem Grund benötigen einige Assembler, dass diese Datei die Erweiterungen "src" hat. Die "lst" -Datei ist optional. Es ist sehr nützlich für das Programm, da es alle Opcodes und Adressen sowie Fehler auflistet, die die Assembler erkannt haben.
Assembler benötigen einen dritten Schritt linking. Das Verknüpfungsprogramm nimmt eine oder mehrere Objektdateien und erzeugt eine absolute Objektdatei mit der Erweiterung "abs".
Als nächstes wird die "abs" -Datei einem Programm namens "OH" (Objekt-Hex-Konverter) zugeführt, das eine Datei mit der Erweiterung "hex" erstellt, die zum Einbrennen in das ROM bereit ist.
Datentyp
Der 8051-Mikrocontroller enthält einen einzelnen Datentyp von 8 Bit, und jedes Register hat auch eine Größe von 8 Bit. Der Programmierer muss Daten aufteilen, die größer als 8 Bit sind (00 bis FFH oder bis 255 in Dezimalzahl), damit sie von der CPU verarbeitet werden können.
DB (Byte definieren)
Die DB-Direktive ist die am häufigsten verwendete Datenanweisung im Assembler. Es wird verwendet, um die 8-Bit-Daten zu definieren. Es kann auch zum Definieren von Daten im Dezimal-, Binär-, Hex- oder ASCII-Format verwendet werden. Für Dezimalstellen ist das "D" nach der Dezimalzahl optional, für "B" (binär) und "Hl" (hexadezimal) jedoch erforderlich.
Um ASCII anzuzeigen, setzen Sie die Zeichen einfach in Anführungszeichen ('like this'). Der Assembler generiert automatisch ASCII-Code für die Zahlen / Zeichen. Die DB-Direktive ist die einzige Direktive, mit der ASCII-Zeichenfolgen definiert werden können, die größer als zwei Zeichen sind. Daher sollte es für alle ASCII-Datendefinitionen verwendet werden. Einige Beispiele für DB sind unten angegeben -
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
Um ASCII-Zeichenfolgen können einfache oder doppelte Anführungszeichen verwendet werden. DB wird auch verwendet, um Speicher in Blöcken mit Byte-Größe zuzuweisen.
Assembler-Anweisungen
Einige der Richtlinien von 8051 lauten wie folgt:
ORG (origin)- Die Ursprungsanweisung wird verwendet, um den Beginn der Adresse anzugeben. Es werden die Zahlen im Hexa- oder Dezimalformat verwendet. Wenn H nach der Zahl angegeben wird, wird die Zahl als Hexa behandelt, andernfalls als Dezimalzahl. Der Assembler konvertiert die Dezimalzahl in Hexa.
EQU (equate)- Es wird verwendet, um eine Konstante zu definieren, ohne einen Speicherplatz zu belegen. EQU ordnet einem Datenetikett einen konstanten Wert zu, sodass das Etikett im Programm angezeigt wird. Das Etikett wird durch seinen konstanten Wert ersetzt. Während der Ausführung der Anweisung "MOV R3, #COUNT" wird das Register R3 mit dem Wert 25 geladen (beachten Sie das # -Zeichen). Der Vorteil der Verwendung von EQU besteht darin, dass der Programmierer es einmal ändern kann und der Assembler alle seine Vorkommen ändert. Der Programmierer muss nicht das gesamte Programm durchsuchen.
END directive- Zeigt das Ende der Quelldatei (asm) an. Die END-Direktive ist die letzte Zeile des Programms. Alles, was nach der END-Direktive steht, wird vom Assembler ignoriert.
Beschriftungen in Assemblersprache
Alle Beschriftungen in Assemblersprache müssen den folgenden Regeln entsprechen -
Jeder Markenname muss eindeutig sein. Die Namen, die für Beschriftungen in der Assembler-Programmierung verwendet werden, bestehen aus alphabetischen Buchstaben in Groß- und Kleinbuchstaben, Nummer 0 bis 9, und Sonderzeichen wie Fragezeichen (?), Punkt (.) Mit der Rate @, Unterstrich (_), und Dollar ($).
Das erste Zeichen sollte alphabetisch sein. Es kann keine Zahl sein.
Reservierte Wörter können nicht als Bezeichnung im Programm verwendet werden. Beispielsweise sind ADD- und MOV-Wörter die reservierten Wörter, da es sich um Anweisungsmnemonik handelt.
Register werden in der CPU verwendet, um Informationen vorübergehend zu speichern, bei denen es sich um zu verarbeitende Daten handeln kann, oder um eine Adresse, die auf die abzurufenden Daten verweist. In 8051 gibt es einen Datentyp mit 8 Bits, vom MSB (höchstwertiges Bit) D7 bis zum LSB (niedrigstwertiges Bit) D0. Bei einem 8-Bit-Datentyp muss jeder Datentyp, der größer als 8 Bit ist, vor der Verarbeitung in 8-Bit-Blöcke aufgeteilt werden.
Die am häufigsten verwendeten Register des 8051 sind A (Akkumulator), B, R0-R7, DPTR (Datenzeiger) und PC (Programmzähler). Alle diese Register sind 8-Bit, mit Ausnahme von DPTR und PC.
Speicherregister in 8051
Wir werden die folgenden Arten von Speicherregistern hier diskutieren -
- Accumulator
- R registrieren
- B registrieren
- Datenzeiger (DPTR)
- Programmzähler (PC)
- Stapelzeiger (SP)
Akkumulator
Der Akkumulator, Register A, wird für alle arithmetischen und logischen Operationen verwendet. Wenn der Akkumulator nicht vorhanden ist, ist jedes Ergebnis jeder Berechnung (Addition, Multiplikation, Verschiebung usw.) im Hauptspeicher zu speichern. Der Zugriff auf den Hauptspeicher ist langsamer als der Zugriff auf ein Register wie den Akkumulator, da die für den großen Hauptspeicher verwendete Technologie langsamer (aber billiger) ist als die für ein Register verwendete.
Die "R" -Register
Die "R" -Register sind ein Satz von acht Registern, nämlich R0, R1 bis R7. Diese Register fungieren in vielen Operationen als Hilfs- oder Zwischenspeicherregister. Betrachten Sie ein Beispiel für die Summe von 10 und 20. Speichern Sie eine Variable 10 in einem Akkumulator und eine andere Variable 20 beispielsweise in Register R4. Führen Sie den folgenden Befehl aus, um die Additionsoperation zu verarbeiten:
ADD A,R4
Nach dem Ausführen dieses Befehls enthält der Akkumulator den Wert 30. Somit sind "R" -Register sehr wichtige Hilfsregister oder helper registers. Der Akku allein wäre ohne diese "R" -Register nicht sehr nützlich. Die "R" -Register dienen zur temporären Speicherung von Werten.
Nehmen wir ein anderes Beispiel. Wir addieren die Werte in R1 und R2 und subtrahieren dann die Werte von R3 und R4 vom Ergebnis.
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
Wie Sie sehen können, haben wir R5 verwendet, um die Summe von R3 und R4 vorübergehend zu halten. Natürlich ist dies nicht die effizienteste Methode zur Berechnung von (R1 + R2) - (R3 + R4), aber es zeigt die Verwendung der "R" -Register als Methode zum temporären Speichern von Werten.
Das "B" -Register
Das "B" -Register ist dem Akkumulator in dem Sinne sehr ähnlich, dass es einen 8-Bit-Wert (1 Byte) enthalten kann. Das "B" -Register wird nur von zwei 8051-Anweisungen verwendet:MUL AB und DIV AB. Um A schnell und einfach mit einer anderen Zahl zu multiplizieren oder zu teilen, können Sie die andere Zahl in "B" speichern und diese beiden Anweisungen verwenden. Abgesehen von der Verwendung von MUL- und DIV-Anweisungen wird das "B" -Register häufig als ein weiteres temporäres Speicherregister verwendet, ähnlich wie ein neuntes R-Register.
Der Datenzeiger
Der Data Pointer (DPTR) ist das einzige vom Benutzer zugängliche 16-Bit-Register (2 Byte). Die Register Accumulator, R0 - R7 und B sind 1-Byte-Wertregister. DPTR dient zum Zeigen auf Daten. Es wird vom 8051 verwendet, um unter Verwendung der von DPTR angegebenen Adresse auf externen Speicher zuzugreifen. DPTR ist das einzige verfügbare 16-Bit-Register und wird häufig zum Speichern von 2-Byte-Werten verwendet.
Der Programmzähler
Der Programmzähler (PC) ist eine 2-Byte-Adresse, die dem 8051 mitteilt, wo sich der nächste auszuführende Befehl im Speicher befindet. Der PC startet um 00:00 Uhr, wenn der 8051 initialisiert wird, und wird jedes Mal erhöht, nachdem ein Befehl ausgeführt wurde. Der PC wird nicht immer um 1 erhöht. Einige Anweisungen erfordern möglicherweise 2 oder 3 Bytes. In solchen Fällen wird der PC um 2 oder 3 erhöht.
Branch, jump, und interruptOperationen laden den Programmzähler mit einer anderen Adresse als dem nächsten sequentiellen Speicherort. Durch Aktivieren eines Power-On-Resets gehen alle Werte im Register verloren. Dies bedeutet, dass der Wert des PCs beim Zurücksetzen 0 ist, wodurch die CPU gezwungen wird, den ersten Opcode vom ROM-Speicherort 0000 abzurufen. Dies bedeutet, dass das erste Byte des Upcodes im ROM-Speicherort 0000 abgelegt werden muss, da die CPU dort erwartet, den zu finden erste Anweisung.
Der Stapelzeiger (SP)
Der Stapelzeiger kann wie alle Register außer DPTR und PC einen 8-Bit-Wert (1 Byte) enthalten. Der Stapelzeiger gibt an, an welcher Stelle der nächste Wert vom Stapel entfernt werden soll. Wenn ein Wert auf den Stapel geschoben wird, wird der Wert von SP inkrementiert und dann der Wert am resultierenden Speicherort gespeichert. Wenn ein Wert vom Stapel genommen wird, wird der Wert von dem durch SP angegebenen Speicherort zurückgegeben, und dann wird der Wert von SP dekrementiert.
Diese Reihenfolge ist wichtig. SP wird auf 07h initialisiert, wenn der 8051 initialisiert wird. Wenn gleichzeitig ein Wert auf den Stapel geschoben wird, wird der Wert in der internen RAM-Adresse 08h gespeichert, da der 8051 zuerst den Wert von SP erhöht (von 07h auf 08h) und dann den geschobenen Wert in diesem Speicher speichert Adresse (08h). SP wird direkt vom 8051 durch sechs Anweisungen geändert: PUSH, POP, ACALL, LCALL, RET und RETI.
ROM-Speicherplatz in 8051
Einige Familienmitglieder von 8051 haben nur 4 KB On-Chip-ROM (z. B. 8751, AT8951); Einige haben 8K-ROM wie AT89C52, und es gibt einige Familienmitglieder mit 32K-Bytes und 64K-Bytes On-Chip-ROM wie Dallas Semiconductor. Der zu beachtende Punkt ist, dass kein Mitglied der 8051-Familie auf mehr als 64 KB Opcode zugreifen kann, da der Programmzähler in 8051 ein 16-Bit-Register ist (0000 bis FFFF-Adresse).
Der erste Ort des Programm-ROM im 8051 hat die Adresse 0000H, während der letzte Ort je nach Größe des ROM auf dem Chip unterschiedlich sein kann. Unter den Mitgliedern der 8051-Familie hat AT8951 $ k Bytes On-Chip-ROM mit einer Speicheradresse von 0000 (erster Ort) bis 0FFFH (letzter Ort).
8051 Flag Bits und PSW Register
Das Programmstatuswortregister (PSW) ist ein 8-Bit-Register, auch bekannt als flag register. Es ist 8 Bit breit, aber es werden nur 6 Bit verwendet. Die zwei nicht verwendeten Bits sinduser-defined flags. Vier der Flags werden aufgerufenconditional flagsDies bedeutet, dass sie eine Bedingung anzeigen, die sich nach Ausführung einer Anweisung ergibt. Diese vier sindCY (Tragen), AC (Hilfstrage), P (Parität) und OV(Überlauf). Die Bits RS0 und RS1 werden zum Ändern der Bankregister verwendet. Die folgende Abbildung zeigt das Programmstatuswortregister.
Das PSW-Register enthält die Statusbits, die den aktuellen Status der CPU widerspiegeln.
CY | CA. | F0 | RS1 | RS0 | OV | - - | P. |
---|
CY | PSW.7 | Fahne tragen |
AC | PSW.6 | Auxiliary Carry Flag |
F0 | PSW.5 | Flag 0 steht dem Benutzer für allgemeine Zwecke zur Verfügung. |
RS1 | PSW.4 | Register Bank Selector Bit 1 |
RS0 | PSW.3 | Register Bank Selector Bit 0 |
OV | PSW.2 | Überlauf-Flag |
- - | PSW.1 | Benutzerdefinierte FLAG |
P. | PSW.0 | Paritätsflagge. Wird während des Befehlszyklus von der Hardware gesetzt / gelöscht, um die gerade / ungerade Zahl von 1 Bit im Akkumulator anzuzeigen. |
Wir können das entsprechende Registerbank-Bit unter Verwendung von RS0- und RS1-Bits auswählen.
RS1 | RS2 | Bank registrieren | Adresse |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag- Dieses Übertragsflag wird gesetzt (1), wenn ein Übertrag vom D7-Bit erfolgt. Es ist nach einer 8-Bit-Additions- oder Subtraktionsoperation betroffen. Sie kann auch direkt durch einen Befehl wie "SETB C" und "CLR C" auf 1 oder 0 zurückgesetzt werden, wobei "SETB" für Set-Bit-Carry und "CLR" für Clear-Carry steht.
AC, auxiliary carry flag- Wenn während einer ADD- oder SUB-Operation ein Übertrag von D3 und D4 auftritt, wird das AC-Bit gesetzt. Andernfalls wird es gelöscht. Es wird für den Befehl verwendet, um eine binär codierte Dezimalarithmetik auszuführen.
P, the parity flag- Das Paritätsflag repräsentiert nur die Anzahl der Einsen im Akkumulatorregister. Wenn das A-Register eine ungerade Anzahl von Einsen enthält, ist P = 1; und für eine gerade Anzahl von Einsen ist P = 0.
OV, the overflow flag- Dieses Flag wird gesetzt, wenn das Ergebnis einer Operation mit vorzeichenbehafteter Zahl zu groß ist und das höherwertige Bit in das vorzeichenbehaftete Bit überläuft. Es wird nur verwendet, um Fehler in vorzeichenbehafteten arithmetischen Operationen zu erkennen.
Beispiel
Zeigen Sie den Status der CY-, AC- und P-Flags nach dem Hinzufügen von 9CH und 64H in der folgenden Anweisung an.
MOV A, # 9CH
ADD A, # 64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's
Der 8051-Mikrocontroller verfügt über insgesamt 128 Byte RAM. Wir werden die Zuweisung dieser 128 Bytes RAM diskutieren und ihre Verwendung als Stapel und Register untersuchen.
RAM-Speicherplatzzuweisung in 8051
Den 128 Bytes RAM im 8051 wird die Adresse 00 bis 7FH zugewiesen. Sie können direkt als Speicherorte aufgerufen werden und sind wie folgt in drei verschiedene Gruppen unterteilt:
32 Bytes von 00H bis 1FH werden für Registerbänke und den Stapel reserviert.
16 Bytes von 20H bis 2FH-Speicherplätzen sind für den bitadressierbaren Lese- / Schreibspeicher reserviert.
80 Bytes von 30H bis 7FH-Speicherorten werden zum Lesen und Schreiben verwendet; es heißt alsscratch pad. Diese 80 Speicherplätze werden häufig zum Speichern von Daten und Parametern von 8051-Programmierern verwendet.
Registrieren Sie Banken in 8051
Für die Registerbänke und den Stapel sind insgesamt 32 Byte RAM reserviert. Diese 32 Bytes sind in vier Registerbänke unterteilt, in denen jede Bank 8 Register R0 - R7 hat. RAM-Positionen von 0 bis 7 werden für die Bank 0 von R0 - R7 reserviert, wobei R0 die RAM-Position 0, R1 die RAM-Position 1, R2 die Position 2 usw. ist, bis die Speicherposition 7, die zu R7 der Bank gehört 0.
Die zweite Registerbank R0 - R7 beginnt an der RAM-Position 08 und geht zu den Positionen OFH. Die dritte Bank von R0 - R7 beginnt am Speicherplatz 10H und geht zum Speicherort 17H. Schließlich werden die RAM-Positionen 18H bis 1FH für die vierte Bank von R0 - R7 reserviert.
Standard Register Bank
Wenn die RAM-Positionen 00–1F für die vier Registerbanken reserviert sind, auf welche Registerbank von R0 - R7 haben wir Zugriff, wenn der 8051 eingeschaltet wird? Die Antwort lautet Registerbank 0; Das heißt, auf RAM-Speicherorte von 0 bis 7 wird beim Programmieren des 8051 mit den Namen R0 bis R7 zugegriffen. Da es viel einfacher ist, diese RAM-Speicherorte durch Namen wie R0 bis R7 zu referenzieren, als durch ihre Speicherorte.
So wechseln Sie die Registerbanken
Die Registerbank 0 ist die Standardeinstellung, wenn der 8051 eingeschaltet ist. Wir können über das PSW-Register zu den anderen Banken wechseln. D4- und D3-Bits des PSW werden verwendet, um die gewünschte Registerbank auszuwählen, da auf sie über die bitadressierbaren Anweisungen SETB und CLR zugegriffen werden kann. Zum Beispiel setzt "SETB PSW.3" PSW.3 = 1 und wählt das Bankregister 1 aus.
RS1 | RS2 | Bank ausgewählt |
---|---|---|
0 | 0 | Bank0 |
0 | 1 | Bank1 |
1 | 0 | Bank2 |
1 | 1 | Bank3 |
Stack und seine Operationen
Stapeln Sie den 8051
Der Stapel ist ein Abschnitt eines RAM, der von der CPU verwendet wird, um Informationen wie Daten oder Speicheradressen vorübergehend zu speichern. Die CPU benötigt diesen Speicherbereich unter Berücksichtigung einer begrenzten Anzahl von Registern.
Wie auf Stapel zugegriffen wird
Da der Stapel ein Abschnitt eines RAM ist, gibt es in der CPU Register, die darauf verweisen. Das Register, das für den Zugriff auf den Stapel verwendet wird, ist als Stapelzeigerregister bekannt. Der Stapelzeiger im 8051 ist 8 Bit breit und kann für FFH den Wert 00 annehmen. Wenn der 8051 initialisiert wird, enthält das SP-Register den Wert 07H. Dies bedeutet, dass der RAM-Speicherort 08 der erste Speicherort ist, der für den Stapel verwendet wird. Die Speicheroperation eines CPU-Registers im Stapel ist als a bekanntPUSHDas Zurückholen des Inhalts vom Stapel in ein CPU-Register wird als a bezeichnet POP.
In den Stapel schieben
Im 8051 zeigt der Stapelzeiger (SP) auf die zuletzt verwendete Position des Stapels. Wenn Daten auf den Stapel geschoben werden, wird der Stapelzeiger (SP) um 1 erhöht. Wenn PUSH ausgeführt wird, wird der Inhalt des Registers auf dem Stapel gespeichert und SP wird um 1 erhöht. Um die Register auf den Stapel zu schieben, werden wir müssen ihre RAM-Adressen verwenden. Zum Beispiel drückt der Befehl "PUSH 1" das Register R1 auf den Stapel.
Vom Stapel springen
Das Zurücklegen des Inhalts des Stapels in ein bestimmtes Register ist das Gegenteil des Push-Vorgangs. Bei jeder Pop-Operation wird das oberste Byte des Stapels in das durch den Befehl angegebene Register kopiert und der Stapelzeiger einmal dekrementiert.
Der Programmablauf verläuft sequentiell von einem Befehl zum nächsten Befehl, es sei denn, ein Steuerübertragungsbefehl wird ausgeführt. Die verschiedenen Arten von Steuerübertragungsanweisungen in Assemblersprache umfassen bedingte oder unbedingte Sprünge und Aufrufanweisungen.
Schleifen- und Sprunganweisungen
Schleifen in der 8051
Das wiederholte Wiederholen einer Befehlsfolge wird als a bezeichnet loop. Eine AnweisungDJNZ reg, labelwird verwendet, um eine Schleifenoperation auszuführen. In dieser Anweisung wird ein Register um 1 dekrementiert; Wenn es nicht Null ist, springt 8051 zu der Zieladresse, auf die sich das Etikett bezieht.
Das Register wird mit dem Zähler für die Anzahl der Wiederholungen vor dem Start der Schleife geladen. In diesem Befehl werden sowohl das Dekrement der Register als auch die Entscheidung zum Springen zu einem einzigen Befehl zusammengefasst. Die Register können R0 - R7 sein. Der Zähler kann auch ein RAM-Speicherort sein.
Beispiel
Multiply 25 by 10 using the technique of repeated addition.
Solution- Die Multiplikation kann erreicht werden, indem der Multiplikand so oft wie der Multiplikator wiederholt addiert wird. Zum Beispiel,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Schleifenaktion mit der Anweisung DJNZ Reg labelist nur auf 256 Iterationen beschränkt. Wenn kein bedingter Sprung gemacht wird, wird die Anweisung ausgeführt, die dem Sprung folgt.
Schleifen innerhalb einer Schleife
Wenn wir eine Schleife in einer anderen Schleife verwenden, heißt sie a nested loop. Zwei Register werden verwendet, um die Zählung zu halten, wenn die maximale Anzahl auf 256 begrenzt ist. Daher verwenden wir diese Methode, um die Aktion mehrmals als 256 zu wiederholen.
Example
Schreiben Sie ein Programm an -
- Laden Sie den Akku mit dem Wert 55H.
- Ergänzen Sie den ACC 700-mal.
Solution- Da 700 größer als 255 ist (die maximale Kapazität eines Registers), werden zwei Register verwendet, um die Zählung zu halten. Der folgende Code zeigt, wie zwei Register, R2 und R3, für die Zählung verwendet werden.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Andere bedingte Sprünge
In der folgenden Tabelle sind die in 8051 verwendeten bedingten Sprünge aufgeführt.
Anweisung | Aktion |
---|---|
JZ | Springe wenn A = 0 |
JNZ | Springe, wenn A ≠ 0 ist |
DJNZ | Dekrementieren und springen, wenn Register ≠ 0 ist |
CJNE A, Daten | Springe wenn A ≠ Daten |
CJNE reg, #data | Springe wenn Byte ≠ Daten |
JC | Springe, wenn CY = 1 ist |
JNC | Springe wenn CY ≠ 1 |
JB | Springe, wenn Bit = 1 |
JNB | Springe, wenn Bit = 0 ist |
JBC | Springe, wenn Bit = 1 und lösche Bit |
JZ (jump if A = 0)- In dieser Anweisung wird der Inhalt des Akkus überprüft. Wenn es Null ist, springt der 8051 zur Zieladresse. Der JZ-Befehl kann nur für den Akkumulator verwendet werden und gilt nicht für andere Register.
JNZ (jump if A is not equal to 0)- In dieser Anweisung wird geprüft, ob der Inhalt des Akkumulators ungleich Null ist. Wenn es nicht Null ist, springt der 8051 zur Zieladresse.
JNC (Jump if no carry, jumps if CY = 0)- Das Carry-Flag-Bit im Flag- (oder PSW-) Register wird verwendet, um die Entscheidung zu treffen, ob "JNC-Label" gesprungen werden soll oder nicht. Die CPU überprüft das Übertragsflag, um festzustellen, ob es ausgelöst wird (CY = 1). Wenn es nicht ausgelöst wird, beginnt die CPU, Anweisungen von der Adresse des Etiketts abzurufen und auszuführen. Wenn CY = 1 ist, springt es nicht, sondern führt den nächsten Befehl unter JNC aus.
JC (Jump if carry, jumps if CY = 1) - Wenn CY = 1 ist, springt es zur Zieladresse.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Es ist zu beachten, dass alle bedingten Sprünge kurze Sprünge sind, dh die Adresse des Ziels muss innerhalb von –128 bis +127 Bytes des Inhalts des Programmzählers liegen.
Unbedingte Sprunganweisungen
Es gibt zwei bedingungslose Sprünge in 8051 -
LJMP (long jump)- LJMP ist ein 3-Byte-Befehl, bei dem das erste Byte den Opcode darstellt und das zweite und dritte Byte die 16-Bit-Adresse des Zielorts darstellen. Die 2-Byte-Zieladresse soll einen Sprung zu einem beliebigen Speicherort von 0000 zu FFFFH ermöglichen.
SJMP (short jump)- Es handelt sich um einen 2-Byte-Befehl, bei dem das erste Byte der Opcode und das zweite Byte die relative Adresse des Zielorts ist. Die relative Adresse reicht von 00H bis FFH, die in Vorwärts- und Rückwärtssprünge unterteilt ist. Das heißt, innerhalb von –128 bis +127 Byte Speicher relativ zur Adresse des aktuellen PCs (Programmzähler). Im Falle eines Vorwärtssprungs kann sich die Zieladresse innerhalb eines Bereichs von 127 Bytes vom aktuellen PC befinden. Im Falle eines Rückwärtssprungs kann die Zieladresse innerhalb von –128 Bytes vom aktuellen PC liegen.
Berechnung der Kurzsprungadresse
Alle bedingten Sprünge (JNC, JZ und DJNZ) sind kurze Sprünge, da es sich um 2-Byte-Anweisungen handelt. In diesen Anweisungen repräsentiert das erste Byte den Opcode und das zweite Byte die relative Adresse. Die Zieladresse ist immer relativ zum Wert des Programmzählers. Um die Zieladresse zu berechnen, wird das zweite Byte dem PC des Befehls unmittelbar unter dem Sprung hinzugefügt. Schauen Sie sich das unten angegebene Programm an -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Berechnung der Rückwärtssprungzieladresse
Im Falle eines Vorwärtssprungs ist der Verschiebungswert eine positive Zahl zwischen 0 und 127 (00 bis 7F in hex). Für einen Rückwärtssprung ist die Verschiebung jedoch ein negativer Wert von 0 bis –128.
CALL-Anweisungen
CALL wird verwendet, um eine Unterroutine oder Methode aufzurufen. Unterprogramme werden verwendet, um Operationen oder Aufgaben auszuführen, die häufig ausgeführt werden müssen. Dies macht ein Programm strukturierter und spart Speicherplatz. Es gibt zwei Anweisungen - LCALL und ACALL.
LCALL (langer Anruf)
LCALL ist ein 3-Byte-Befehl, bei dem das erste Byte den Opcode darstellt und das zweite und dritte Byte verwendet werden, um die Adresse des Zielunterprogramms bereitzustellen. Mit LCALL können Unterprogramme aufgerufen werden, die im 64-KByte-Adressraum des 8051 verfügbar sind.
Um nach Ausführung des aufgerufenen Unterprogramms erfolgreich zum Punkt zurückzukehren, speichert die CPU die Adresse des Befehls unmittelbar unter dem LCALL auf dem Stapel. Wenn also ein Unterprogramm aufgerufen wird, wird die Steuerung an dieses Unterprogramm übertragen, und der Prozessor speichert den PC (Programmzähler) auf dem Stapel und beginnt, Anweisungen vom neuen Speicherort abzurufen. Der Befehl RET (return) überträgt die Steuerung nach Beendigung der Ausführung des Unterprogramms an den Aufrufer zurück. Jedes Unterprogramm verwendet RET als letzten Befehl.
ACALL (Absoluter Anruf)
ACALL ist ein 2-Byte-Befehl, im Gegensatz zu LCALL mit 3 Byte. Die Zieladresse des Unterprogramms muss innerhalb von 2 KB liegen, da nur 11 Bit der 2 Bytes für die Adresse verwendet werden. Der Unterschied zwischen ACALL und LCALL besteht darin, dass sich die Zieladresse für LCALL an einer beliebigen Stelle innerhalb des 64-KByte-Adressraums des 8051 befinden kann, während sich die Zieladresse von CALL innerhalb eines 2-KByte-Bereichs befindet.
Ein addressing modebezieht sich darauf, wie Sie einen bestimmten Speicherort adressieren. Es gibt fünf verschiedene Möglichkeiten oder fünf Adressierungsmodi, um diese Anweisung auszuführen:
- Sofortiger Adressierungsmodus
- Direkter Adressierungsmodus
- Registrieren Sie den direkten Adressierungsmodus
- Registrieren Sie den indirekten Adressierungsmodus
- Indizierter Adressierungsmodus
Sofortiger Adressierungsmodus
Beginnen wir mit einem Beispiel.
MOV A, #6AH
Im Allgemeinen können wir schreiben,
MOV A, #data
Es wird als bezeichnet immediate weil 8-Bit-Daten sofort zum Akkumulator (Zieloperand) übertragen werden.
Die folgende Abbildung beschreibt die obige Anweisung und ihre Ausführung. Der Opcode 74H wird unter der Adresse 0202 gespeichert. Die Daten 6AH werden unter der Adresse 0203 im Programmspeicher gespeichert. Nach dem Lesen des Opcodes 74H werden die Daten an der nächsten Programmspeicheradresse an den Akkumulator A übertragen (E0H ist die Adresse des Akkumulators). Da der Befehl aus 2 Bytes besteht und in einem Zyklus ausgeführt wird, wird der Programmzähler um 2 erhöht und zeigt auf 0204 des Programmspeichers.
Note- Das Symbol '#' vor 6AH zeigt an, dass es sich bei dem Operanden um Daten handelt (8 Bit). Ohne '#' wird die Hexadezimalzahl als Adresse verwendet.
Direkter Adressierungsmodus
Dies ist eine andere Möglichkeit, einen Operanden zu adressieren. Hier wird die Adresse der Daten (Quelldaten) als Operand angegeben. Nehmen wir ein Beispiel.
MOV A, 04H
Die Registerbank Nr. 0 (4. Register) hat die Adresse 04H. Wenn der MOV-Befehl ausgeführt wird, werden die in Register 04H gespeicherten Daten zum Akkumulator verschoben. Da das Register 04H die Daten 1FH enthält, wird 1FH zum Akkumulator bewegt.
Note- Im Gegensatz zum Sofortmodus haben wir im Direktadressierungsmodus kein '#' verwendet. Wenn wir '#' verwendet hätten, wäre der Datenwert 04H anstelle von 1FH an den Akkumulator übertragen worden.
Schauen Sie sich nun die folgende Abbildung an. Es zeigt, wie die Anweisung ausgeführt wird.
Wie in der obigen Abbildung gezeigt, handelt es sich um einen 2-Byte-Befehl, für dessen Abschluss 1 Zyklus erforderlich ist. Der PC wird um 2 erhöht und zeigt auf 0204. Der Opcode für den Befehl MOV A, Adresse ist E5H. Wenn der Befehl bei 0202 ausgeführt wird (E5H), wird der Akkumulator aktiv und bereit, Daten zu empfangen. Dann geht der PC zur nächsten Adresse als 0203 und sucht die Adresse des Ortes von 04H, an dem sich die Quelldaten (die zum Akkumulator übertragen werden sollen) befinden. Um 04 Uhr findet die Steuerung die Daten 1F und überträgt sie an den Akkumulator, und daher ist die Ausführung abgeschlossen.
Registrieren Sie den direkten Adressierungsmodus
In diesem Adressierungsmodus verwenden wir den Registernamen direkt (als Quelloperand). Versuchen wir anhand eines Beispiels zu verstehen.
MOV A, R4
Zu einem Zeitpunkt können die Register Werte von R0 bis R7 annehmen. Es gibt 32 solcher Register. Um 32 Register mit nur 8 Variablen zur Adressierung von Registern zu verwenden, werden Registerbänke verwendet. Es gibt 4 Registerbanken mit den Namen 0 bis 3. Jede Bank besteht aus 8 Registern mit den Namen R0 bis R7.
Es kann jeweils eine einzelne Registerbank ausgewählt werden. Die Auswahl einer Registerbank wird durch a ermöglichtSpecial Function Register (SFR) benannt Processor Status Word(PSW). PSW ist ein 8-Bit-SFR, bei dem jedes Bit nach Bedarf programmiert werden kann. Bits werden von PSW.0 bis PSW.7 bezeichnet. PSW.3 und PSW.4 werden zur Auswahl von Registerbänken verwendet.
Schauen Sie sich nun die folgende Abbildung an, um ein klares Verständnis der Funktionsweise zu erhalten.
Opcode EC wird für MOV A, R4 verwendet. Der Opcode wird unter der Adresse 0202 gespeichert, und wenn er ausgeführt wird, geht die Steuerung direkt zu R4 der respektierten Registerbank (die in PSW ausgewählt ist). Wenn die Registerbank Nr. 0 ausgewählt ist, werden die Daten von R4 der Registerbank Nr. 0 in den Akkumulator verschoben. Hier wird 2F um 04 Uhr gespeichert. 04H repräsentiert die Adresse von R4 der Registerbank # 0.
Die Datenbewegung (2F) ist fett hervorgehoben. 2F wird vom Datenspeicherplatz 0C H zum Akkumulator übertragen und ist als gepunktete Linie dargestellt. 0CH ist der Adressort von Register 4 (R4) der Registerbank Nr. 1. Der obige Befehl ist 1 Byte und erfordert 1 Zyklus für die vollständige Ausführung. Dies bedeutet, dass Sie Programmspeicher sparen können, indem Sie den direkten Adressierungsmodus des Registers verwenden.
Registrieren Sie den indirekten Adressierungsmodus
In diesem Adressierungsmodus wird die Adresse der Daten als Operand im Register gespeichert.
MOV A, @R0
Hier wird der Wert innerhalb von R0 als Adresse betrachtet, die die Daten enthält, die an den Akkumulator übertragen werden sollen. Example: Wenn R0 den Wert 20H hat und die Daten 2FH an der Adresse 20H gespeichert sind, wird der Wert 2FH nach Ausführung dieses Befehls an den Akkumulator übertragen. Siehe folgende Abbildung.
Also der Opcode für MOV A, @R0ist E6H. Unter der Annahme, dass die Registerbank # 0 ausgewählt ist, enthält der R0 der Registerbank # 0 die Daten 20H. Die Programmsteuerung bewegt sich zu 20H, wo sie die Daten 2FH lokalisiert und 2FH zum Akkumulator überträgt. Dies ist ein 1-Byte-Befehl, und der Programmzähler erhöht sich um 1 und bewegt sich zu 0203 des Programmspeichers.
Note- Nur R0 und R1 dürfen eine Register-Indirekt-Adressierungsanweisung bilden. Mit anderen Worten, der Programmierer kann eine Anweisung entweder mit @ R0 oder @ R1 erstellen. Alle Registerbanken sind erlaubt.
Indizierter Adressierungsmodus
Wir werden zwei Beispiele nehmen, um das Konzept des indizierten Adressierungsmodus zu verstehen. Schauen Sie sich die folgenden Anweisungen an -
MOVC A, @A+DPTR
und
MOVC A, @A+PC
Dabei ist DPTR der Datenzeiger und PC der Programmzähler (beide sind 16-Bit-Register). Betrachten Sie das erste Beispiel.
MOVC A, @A+DPTR
Der Quelloperand ist @ A + DPTR. Es enthält die Quelldaten von diesem Speicherort. Hier fügen wir den Inhalt von DPTR mit dem aktuellen Inhalt des Akkumulators hinzu. Dieser Zusatz gibt eine neue Adresse an, die die Adresse der Quelldaten ist. Die Daten, auf die diese Adresse zeigt, werden dann an den Akkumulator übertragen.
Der Opcode ist 93H. DPTR hat den Wert 01FE, wobei 01 in DPH (höhere 8 Bits) und FE in DPL (niedrigere 8 Bits) liegt. Der Akku hat den Wert 02H. Dann wird eine 16-Bit-Addition durchgeführt und 01FE H + 02H ergibt 0200 H. Daten am Ort 0200H werden an den Akkumulator übertragen. Der vorherige Wert im Akkumulator (02H) wird durch die neuen Daten ab 0200H ersetzt. Die neuen Daten im Akkumulator sind in der Abbildung hervorgehoben.
Dies ist ein 1-Byte-Befehl mit 2 Zyklen, die für die Ausführung benötigt werden, und die für diesen Befehl erforderliche Ausführungszeit ist im Vergleich zu vorherigen Befehlen (die alle jeweils 1 Zyklus waren) hoch.
Das andere Beispiel MOVC A, @A+PCfunktioniert genauso wie im obigen Beispiel. Anstatt DPTR mit dem Akkumulator hinzuzufügen, werden hier die Daten innerhalb des Programmzählers (PC) mit dem Akkumulator hinzugefügt, um die Zieladresse zu erhalten.
Ein Sonderfunktionsregister (oder ein Sonderregister oder einfach ein Sonderregister) ist ein Register innerhalb eines Mikroprozessors, das die verschiedenen Funktionen eines Mikroprozessors steuert oder überwacht. Da die Sonderregister eng mit einer bestimmten Funktion oder einem bestimmten Status des Prozessors verbunden sind, können sie möglicherweise nicht direkt mit normalen Anweisungen (wie Hinzufügen, Verschieben usw.) beschrieben werden. Stattdessen erfordern einige spezielle Register in einigen Prozessorarchitekturen spezielle Anweisungen, um sie zu ändern.
Im 8051 gehören die Register A, B, DPTR und PSW zu der Gruppe von Registern, die üblicherweise als SFR (Special Function Registers) bezeichnet werden. Auf einen SFR kann über seinen Namen oder seine Adresse zugegriffen werden.
Die folgende Tabelle zeigt eine Liste der SFRs und ihrer Adressen.
Byteadresse | Bitadresse | ||||||||
---|---|---|---|---|---|---|---|---|---|
FF | |||||||||
F0 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | B. |
E0 | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 | ACC |
D0 | D7 | D6 | D5 | D4 | D3 | D2 | - - | D0 | PSW |
B8 | - - | - - | - - | BC | BB | BA | B9 | B8 | IP |
B0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P3 |
A2 | AF | - - | - - | AC | AB | AA | A9 | A8 | IE |
A0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | P2 |
99 | Nicht bitadressierbar | SBUF | |||||||
98 | 9F | 9E | 9D | 9C | 9B | 9A | 99 | 98 | SCON |
90 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 | P1 |
8D | Nicht bitadressierbar | TH1 | |||||||
8C | Nicht bitadressierbar | TH0 | |||||||
8B | Nicht bitadressierbar | TL1 | |||||||
8A | Nicht bitadressierbar | TL0 | |||||||
89 | Nicht bitadressierbar | TMOD | |||||||
88 | 8F | 8E | 8D | 8C | 8B | 8A | 89 | 88 | TCON |
87 | Nicht bitadressierbar | PCON | |||||||
83 | Nicht bitadressierbar | DPH | |||||||
82 | Nicht bitadressierbar | DPL | |||||||
81 | Nicht bitadressierbar | SP | |||||||
80 | 87 | 87 | 85 | 84 | 83 | 82 | 81 | 80 | P0 |
Beachten Sie die folgenden zwei Punkte zu den SFR-Adressen.
Ein spezielles Funktionsregister kann eine Adresse zwischen 80H und FFH haben. Diese Adressen liegen über 80H, da die Adressen von 00 bis 7FH die Adressen des RAM-Speichers im 8051 sind.
Nicht der gesamte Adressraum von 80 bis FF wird vom SFR verwendet. Nicht verwendete Speicherorte (80H bis FFH) sind reserviert und dürfen vom 8051-Programmierer nicht verwendet werden.
CY | PSW.7 | Fahne tragen |
AC | PSW.6 | Auxiliary Carry Flag |
F0 | PSW.5 | Flag 0 steht dem Benutzer für allgemeine Zwecke zur Verfügung. |
RS1 | PSW.4 | Register Bank Selector Bit 1 |
RS0 | PSW.3 | Register Bank Selector Bit 0 |
OV | PSW.2 | Überlauf-Flag |
- - | PSW.1 | Benutzerdefinierte FLAG |
P. | PSW.0 | Paritätsflagge. Wird während des Befehlszyklus von der Hardware gesetzt / gelöscht, um die gerade / ungerade Zahl von 1 Bit im Akkumulator anzuzeigen. |
Im folgenden Beispiel werden die Namen der SFR-Register durch ihre Adressen ersetzt.
CY | AC | F0 | RS1 | RS0 | OV | - - | P. |
---|
Wir können das entsprechende Registerbank-Bit unter Verwendung von RS0- und RS1-Bits auswählen.
RS1 | RS2 | Bank registrieren | Adresse |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
Das Programmstatuswort (PSW) enthält Statusbits, die den aktuellen Status der CPU widerspiegeln. Die 8051-Varianten liefern ein spezielles Funktionsregister, PSW, mit diesen Statusinformationen. Der 8251 bietet zwei zusätzliche Statusflags, Z und N, die in einem zweiten speziellen Funktionsregister namens PSW1 verfügbar sind.
EIN timerist ein spezieller Uhrentyp, mit dem Zeitintervalle gemessen werden. Ein Timer, der zur Messung der verstrichenen Zeit von Null aufwärts zählt, wird häufig als a bezeichnetstopwatch. Es ist ein Gerät, das ab einem bestimmten Zeitintervall herunterzählt und zum Generieren einer Zeitverzögerung verwendet wird. Beispielsweise ist eine Sanduhr ein Timer.
EIN counterist ein Gerät, das speichert (und manchmal anzeigt), wie oft ein bestimmtes Ereignis oder ein bestimmter Prozess in Bezug auf ein Taktsignal aufgetreten ist. Es wird verwendet, um die Ereignisse außerhalb des Mikrocontrollers zu zählen. In der Elektronik können Zähler recht einfach unter Verwendung von Registerschaltungen wie einem Flip-Flop implementiert werden.
Unterschied zwischen einem Timer und einem Zähler
Die Punkte, die einen Timer von einem Zähler unterscheiden, sind wie folgt:
Timer | Zähler |
---|---|
Das Register wurde für jeden Maschinenzyklus erhöht. | Das Register wird unter Berücksichtigung des Übergangs von 1 zu 0 an seinem externen Eingangspin (T0, T1) inkrementiert. |
Die maximale Zählrate beträgt 1/12 der Oszillatorfrequenz. | Die maximale Zählrate beträgt 1/24 der Oszillatorfrequenz. |
Ein Timer verwendet die Frequenz der internen Uhr und erzeugt eine Verzögerung. | Ein Zähler verwendet ein externes Signal, um Impulse zu zählen. |
Timer von 8051 und ihre zugehörigen Register
Der 8051 verfügt über zwei Timer, Timer 0 und Timer 1. Sie können als Timer oder als Ereigniszähler verwendet werden. Sowohl Timer 0 als auch Timer 1 sind 16 Bit breit. Da der 8051 einer 8-Bit-Architektur folgt, wird auf jedes 16-Bit als zwei separate Register von Low-Byte und High-Byte zugegriffen.
Timer 0 Registrieren
Auf das 16-Bit-Register von Timer 0 wird als Low- und High-Byte zugegriffen. Das Low-Byte-Register heißt TL0 (Low-Byte von Timer 0) und das High-Byte-Register heißt TH0 (High-Byte von Timer 0). Auf diese Register kann wie auf jedes andere Register zugegriffen werden. Zum Beispiel die AnweisungMOV TL0, #4H verschiebt den Wert in das Low-Byte von Timer # 0.
Timer 1 Registrieren
Auf das 16-Bit-Register von Timer 1 wird als Low- und High-Byte zugegriffen. Das Low-Byte-Register heißt TL1 (Low-Byte von Timer 1) und das High-Byte-Register heißt TH1 (High-Byte von Timer 1). Auf diese Register kann wie auf jedes andere Register zugegriffen werden. Zum Beispiel die AnweisungMOV TL1, #4H verschiebt den Wert in das Low-Byte von Timer 1.
TMOD-Register (Timer Mode)
Sowohl Timer 0 als auch Timer 1 verwenden dasselbe Register, um die verschiedenen Timer-Betriebsmodi einzustellen. Es ist ein 8-Bit-Register, in dem die unteren 4 Bits für Timer 0 und die oberen vier Bits für Timer reserviert sind. In jedem Fall werden die unteren 2 Bits verwendet, um den Zeitgebermodus im Voraus einzustellen, und die oberen 2 Bits werden verwendet, um den Ort anzugeben.
Gate - Wenn eingestellt, läuft der Timer nur, während INT (0,1) hoch ist.
C/T - Zähler / Timer-Auswahlbit.
M1 - Modusbit 1.
M0 - Modusbit 0.
TOR
Jeder Timer kann gestartet und gestoppt werden. Einige Timer tun dies nach Software, andere nach Hardware, und einige verfügen sowohl über Software- als auch über Hardwaresteuerung. 8051-Timer verfügen sowohl über Software- als auch über Hardwaresteuerungen. Das Starten und Stoppen eines Timers wird von der Software unter Verwendung der Anweisung gesteuertSETB TR1 und CLR TR1 für Timer 1 und SETB TR0 und CLR TR0 für Timer 0.
Der SETB-Befehl wird zum Starten verwendet und durch den CLR-Befehl gestoppt. Diese Anweisungen starten und stoppen die Timer, solange GATE = 0 im TMOD-Register ist. Timer können von einer externen Quelle gestartet und gestoppt werden, indem GATE = 1 im TMOD-Register festgelegt wird.
C / T (UHR / TIMER)
Dieses Bit im TMOD-Register wird verwendet, um zu entscheiden, ob ein Timer als verwendet wird delay generator oder ein event manager. Wenn C / T = 0 ist, wird es als Zeitgeber für die Erzeugung der Zeitgeberverzögerung verwendet. Die Taktquelle zum Erzeugen der Zeitverzögerung ist die Kristallfrequenz des 8051. Wenn C / T = 0 ist, bestimmt die an den 8051 angeschlossene Kristallfrequenz auch die Geschwindigkeit, mit der der 8051-Timer in regelmäßigen Abständen tickt.
Die Timerfrequenz beträgt immer 1/12 der Frequenz des an den 8051 angeschlossenen Kristalls. Obwohl verschiedene 8051-basierte Systeme eine XTAL-Frequenz von 10 MHz bis 40 MHz haben, arbeiten wir normalerweise mit der XTAL-Frequenz von 11,0592 MHz. Dies liegt daran, dass die Baudrate für die serielle Kommunikation des 8051.XTAL = 11.0592 es dem 8051-System ermöglicht, fehlerfrei mit dem PC zu kommunizieren.
M1 / M2
M1 | M2 | Modus |
---|---|---|
0 | 0 | 13-Bit-Timer-Modus. |
0 | 1 | 16-Bit-Timer-Modus. |
1 | 0 | 8-Bit-Auto-Reload-Modus. |
1 | 1 | Verschütteter Modus. |
Verschiedene Arten von Timern
Modus 0 (13-Bit-Timer-Modus)
Sowohl Timer 1 als auch Timer 0 im Modus 0 arbeiten als 8-Bit-Zähler (mit einem durch 32 dividierten Prescaler). Das Zeitgeberregister ist als 13-Bit-Register konfiguriert, das aus allen 8 Bits von TH1 und den unteren 5 Bits von TL1 besteht. Die oberen 3 Bits von TL1 sind unbestimmt und sollten ignoriert werden. Durch Setzen des Run-Flags (TR1) wird das Register nicht gelöscht. Das Timer-Interrupt-Flag TF1 wird gesetzt, wenn der Zähler von allen Einsen auf alle Nullen wechselt. Der Betrieb von Modus 0 ist für Timer 0 der gleiche wie für Timer 1.
Modus 1 (16-Bit-Timer-Modus)
Der Timer-Modus "1" ist ein 16-Bit-Timer und wird häufig verwendet. Es funktioniert genauso wie der 13-Bit-Modus, außer dass alle 16 Bit verwendet werden. TLx wird von 0 bis maximal 255 inkrementiert. Sobald der Wert 255 erreicht ist, wird TLx auf 0 zurückgesetzt und THx wird um 1 erhöht. Als vollständiger 16-Bit-Timer kann der Timer bis zu 65536 verschiedene Werte enthalten läuft nach 65.536 Maschinenzyklen wieder auf 0 über.
Modus 2 (8 Bit Auto Reload)
Beide Timer-Register sind als 8-Bit-Zähler (TL1 und TL0) mit automatischem Neuladen konfiguriert. Der Überlauf von TL1 (TL0) setzt TF1 (TF0) und lädt TL1 (TL0) mit dem Inhalt von Th1 (TH0) neu, der von der Software voreingestellt wird. Das Nachladen lässt TH1 (TH0) unverändert.
Der Vorteil des Auto-Reload-Modus besteht darin, dass der Timer immer einen Wert zwischen 200 und 255 enthalten kann. Wenn Sie den Modus 0 oder 1 verwenden, müssen Sie den Code einchecken, um den Überlauf zu sehen, und in diesem Fall Setzen Sie den Timer auf 200 zurück. In diesem Fall überprüfen wertvolle Anweisungen den Wert und / oder werden neu geladen. Im Modus 2 kümmert sich der Mikrocontroller darum. Sobald Sie einen Timer in Modus 2 konfiguriert haben, müssen Sie sich nicht mehr darum kümmern, ob der Timer übergelaufen ist, und Sie müssen sich auch nicht um das Zurücksetzen des Werts kümmern, da die Mikrocontroller-Hardware alles für Sie erledigt. Der Auto-Reload-Modus wird zum Festlegen einer gemeinsamen Baudrate verwendet.
Modus 3 (Split-Timer-Modus)
Der Timer-Modus "3" ist bekannt als split-timer mode. Wenn Timer 0 in Modus 3 versetzt wird, werden zwei separate 8-Bit-Timer verwendet. Timer 0 ist TL0 und Timer 1 ist TH0. Beide Timer zählen von 0 bis 255 und werden im Falle eines Überlaufs auf 0 zurückgesetzt. Alle Bits von Timer 1 werden jetzt an TH0 gebunden.
Wenn sich Timer 0 im Split-Modus befindet, kann der echte Timer 1 (dh TH1 und TL1) in den Modi 0, 1 oder 2 eingestellt werden, er kann jedoch nicht gestartet / gestoppt werden, da die Bits, die dies tun, jetzt mit TH0 verbunden sind. Der Real-Timer 1 wird mit jedem Maschinenzyklus erhöht.
Timer initialisieren
Legen Sie den Timer-Modus fest. Stellen Sie sich einen 16-Bit-Timer vor, der kontinuierlich läuft und unabhängig von externen Pins ist.
Initialisieren Sie den TMOD SFR. Verwenden Sie die niedrigsten 4 Bits von TMOD und betrachten Sie Timer 0. Behalten Sie die beiden Bits GATE 0 und C / T 0 als 0 bei, da der Timer unabhängig von den externen Pins sein soll. Da der 16-Bit-Modus der Timer-Modus 1 ist, löschen Sie T0M1 und stellen Sie T0M0 ein. Tatsächlich ist das einzige Bit, das eingeschaltet werden muss, Bit 0 von TMOD. Führen Sie nun die folgende Anweisung aus:
MOV TMOD,#01h
Jetzt befindet sich Timer 0 im 16-Bit-Timer-Modus, aber der Timer läuft nicht. Um den Timer im laufenden Modus zu starten, setzen Sie das TR0-Bit, indem Sie die folgende Anweisung ausführen:
SETB TR0
Jetzt beginnt Timer 0 sofort mit dem Zählen und wird bei jedem Maschinenzyklus einmal erhöht.
Timer lesen
Ein 16-Bit-Timer kann auf zwei Arten gelesen werden. Lesen Sie entweder den tatsächlichen Wert des Timers als 16-Bit-Zahl oder Sie erkennen, wenn der Timer übergelaufen ist.
Timerüberlauf erkennen
Wenn ein Timer von seinem höchsten Wert auf 0 überläuft, setzt der Mikrocontroller automatisch das TFx-Bit im TCON-Register. Anstatt den genauen Wert des Timers zu überprüfen, kann das TFx-Bit überprüft werden. Wenn TF0 eingestellt ist, ist Timer 0 übergelaufen. Wenn TF1 eingestellt ist, ist Timer 1 übergelaufen.
Ein Interrupt ist ein Signal an den Prozessor, das von Hardware oder Software ausgegeben wird und auf ein Ereignis hinweist, das sofortige Aufmerksamkeit erfordert. Immer wenn ein Interrupt auftritt, schließt die Steuerung die Ausführung des aktuellen Befehls ab und startet die Ausführung einesInterrupt Service Routine (ISR) oder Interrupt Handler. ISR teilt dem Prozessor oder Controller mit, was zu tun ist, wenn der Interrupt auftritt. Die Interrupts können entweder Hardware-Interrupts oder Software-Interrupts sein.
Hardware-Interrupt
Ein Hardware-Interrupt ist ein elektronisches Warnsignal, das von einem externen Gerät wie einem Festplattencontroller oder einem externen Peripheriegerät an den Prozessor gesendet wird. Wenn wir beispielsweise eine Taste auf der Tastatur drücken oder die Maus bewegen, lösen sie Hardware-Interrupts aus, die den Prozessor veranlassen, den Tastenanschlag oder die Mausposition zu lesen.
Software-Interrupt
Ein Software-Interrupt wird entweder durch eine Ausnahmebedingung oder einen speziellen Befehl im Befehlssatz verursacht, der einen Interrupt verursacht, wenn er vom Prozessor ausgeführt wird. Wenn beispielsweise die arithmetische Logikeinheit des Prozessors einen Befehl zum Teilen einer Zahl durch Null ausführt, um eine Ausnahme zum Teilen durch Null zu verursachen, wodurch der Computer die Berechnung abbricht oder eine Fehlermeldung anzeigt. Anweisungen für Software-Interrupts funktionieren ähnlich wie Unterprogrammaufrufe.
Was ist Polling?
Der Zustand der kontinuierlichen Überwachung ist bekannt als polling. Der Mikrocontroller überprüft ständig den Status anderer Geräte. Dabei führt es keine andere Operation aus und verbraucht die gesamte Verarbeitungszeit für die Überwachung. Dieses Problem kann mithilfe von Interrupts behoben werden.
Bei der Interrupt-Methode reagiert die Steuerung nur, wenn eine Unterbrechung auftritt. Daher muss die Steuerung den Status (Flags, Signale usw.) von angeschlossenen und eingebauten Geräten nicht regelmäßig überwachen.
Unterbricht die v / s-Abfrage
Hier ist eine Analogie, die einen Interrupt vom Polling unterscheidet -
Unterbrechen | Umfragen |
---|---|
Ein Interrupt ist wie ein shopkeeper. Wenn jemand eine Dienstleistung oder ein Produkt benötigt, geht er zu ihm und informiert ihn über seine Bedürfnisse. Im Falle von Interrupts benachrichtigen sie den Controller beim Empfang der Flags oder Signale, dass sie gewartet werden müssen. | Die Abfragemethode ist wie eine salesperson. Der Verkäufer geht von Tür zu Tür und fordert ihn auf, ein Produkt oder eine Dienstleistung zu kaufen. In ähnlicher Weise überwacht die Steuerung die Flags oder Signale nacheinander für alle Geräte und bietet Service für jede Komponente, die ihren Service benötigt. |
Serviceroutine unterbrechen
Für jeden Interrupt muss eine Interrupt-Serviceroutine (ISR) vorhanden sein, oder interrupt handler. Wenn ein Interrupt auftritt, führt der Mikrocontroller die Interrupt-Serviceroutine aus. Für jeden Interrupt gibt es einen festen Speicherort im Speicher, der die Adresse seiner Interrupt-Serviceroutine ISR enthält. Die Tabelle der Speicherplätze, die für die Adressen von ISRs reserviert sind, wird als Interrupt-Vektortabelle bezeichnet.
Vektortabelle unterbrechen
Es gibt sechs Interrupts einschließlich RESET in 8051.
Unterbricht | ROM-Speicherort (Hex) | Stift |
---|---|---|
Unterbricht | ROM-Speicherort (HEX) | |
Serielle COM (RI und TI) | 0023 | |
Timer 1 unterbricht (TF1) | 001B | |
Externer HW-Interrupt 1 (INT1) | 0013 | P3.3 (13) |
Externer HW-Interrupt 0 (INT0) | 0003 | P3.2 (12) |
Timer 0 (TF0) | 000B | |
Zurücksetzen | 0000 | 9 |
Wenn der Reset-Pin aktiviert ist, springt der 8051 zum Adressort 0000. Dies ist ein Power-Up-Reset.
Für die Timer sind zwei Interrupts reserviert: einer für Timer 0 und einer für Timer 1. Die Speicherplätze in der Interruptvektortabelle sind 000BH bzw. 001BH.
Für externe Hardware-Interrupts sind zwei Interrupts vorgesehen. Pin Nr. 12 und Pin Nr. 13 in Port 3 sind für die externen Hardware-Interrupts INT0 bzw. INT1. Die Speicherplätze in der Interrupt-Vektortabelle sind 0003H bzw. 0013H.
Die serielle Kommunikation hat einen einzigen Interrupt, der sowohl zum Empfangen als auch zum Senden gehört. Der Speicherort 0023H gehört zu diesem Interrupt.
Schritte zum Ausführen eines Interrupts
Wenn ein Interrupt aktiv wird, führt der Mikrocontroller die folgenden Schritte aus:
Der Mikrocontroller schließt den aktuell ausgeführten Befehl und speichert die Adresse des nächsten Befehls (PC) auf dem Stapel.
Außerdem wird der aktuelle Status aller Interrupts intern gespeichert (dh nicht auf dem Stapel).
Es springt zum Speicherort der Interrupt-Vektortabelle, die die Adresse der Interrupt-Serviceroutine enthält.
Der Mikrocontroller erhält die Adresse des ISR aus der Interrupt-Vektortabelle und springt dorthin. Es beginnt mit der Ausführung des Interrupt-Service-Unterprogramms RETI (Return from Interrupt).
Nach Ausführung des RETI-Befehls kehrt der Mikrocontroller an den Ort zurück, an dem er unterbrochen wurde. Zuerst erhält es die Programmzähleradresse (PC-Adresse) vom Stapel, indem die obersten Bytes des Stapels in den PC gesteckt werden. Dann beginnt die Ausführung von dieser Adresse aus.
Kantenauslösung vs. Pegelauslösung
Es gibt zwei Arten von Interrupt-Modulen: pegelgetriggert oder flankengetriggert.
Level ausgelöst | Flanke ausgelöst |
---|---|
Ein pegelgetriggertes Interrupt-Modul erzeugt immer dann einen Interrupt, wenn der Pegel der Interruptquelle aktiviert ist. | Ein flankengetriggertes Interrupt-Modul erzeugt einen Interrupt nur dann, wenn es eine aktivierende Flanke der Interrupt-Quelle erkennt. Die Flanke wird erkannt, wenn sich der Interrupt-Quellpegel tatsächlich ändert. Sie kann auch durch periodisches Abtasten und Erkennen eines bestätigten Pegels erfasst werden, wenn die vorherige Stichprobe deaktiviert wurde. |
Wenn die Interrupt-Quelle weiterhin aktiviert ist, während der Firmware-Interrupt-Handler den Interrupt verarbeitet, generiert das Interrupt-Modul den Interrupt neu, wodurch der Interrupt-Handler erneut aufgerufen wird. | Flankengetriggerte Interrupt-Module können sofort aktiviert werden, unabhängig davon, wie sich die Interrupt-Quelle verhält. |
Level-ausgelöste Interrupts sind für die Firmware umständlich. | Durch Flanken ausgelöste Interrupts halten die Codekomplexität der Firmware niedrig, reduzieren die Anzahl der Bedingungen für die Firmware und bieten mehr Flexibilität bei der Behandlung von Interrupts. |
Aktivieren und Deaktivieren eines Interrupts
Beim Zurücksetzen werden alle Interrupts deaktiviert, auch wenn sie aktiviert sind. Die Interrupts müssen mithilfe von Software aktiviert werden, damit der Mikrocontroller auf diese Interrupts reagieren kann.
Das IE-Register (Interrupt Enable) ist für das Aktivieren und Deaktivieren des Interrupts verantwortlich. IE ist ein bitadressierbares Register.
Interrupt Enable Register
EA | - - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - Globales Aktivieren / Deaktivieren.
- - Undefiniert.
ET2 - Timer 2 Interrupt aktivieren.
ES - Aktivieren Sie den Interrupt der seriellen Schnittstelle.
ET1 - Timer 1 Interrupt aktivieren.
EX1 - Externen 1 Interrupt aktivieren.
ET0 - Timer 0 Interrupt aktivieren.
EX0 - Externen 0-Interrupt aktivieren.
Um einen Interrupt zu aktivieren, führen wir die folgenden Schritte aus:
Bit D7 des IE-Registers (EA) muss hoch sein, damit der Rest des Registers wirksam wird.
Wenn EA = 1 ist, werden Interrupts aktiviert und beantwortet, wenn ihre entsprechenden Bits im IE hoch sind. Wenn EA = 0 ist, reagieren keine Interrupts, selbst wenn die zugehörigen Pins im IE-Register hoch sind.
Unterbrechungspriorität in 8051
Wir können die Interrupt-Priorität ändern, indem wir einem der Interrupts die höhere Priorität zuweisen. Dies wird durch Programmieren eines aufgerufenen Registers erreichtIP (Interrupt-Priorität).
Die folgende Abbildung zeigt die Bits des IP-Registers. Beim Zurücksetzen enthält das IP-Register alle Nullen. Um einem der Interrupts eine höhere Priorität zu geben, setzen wir das entsprechende Bit im IP-Register hoch.
- - | - - | - - | - - | PT1 | PX1 | PT0 | PX0 |
---|
- - | IP.7 | Nicht implementiert. |
- - | IP.6 | Nicht implementiert. |
- - | IP.5 | Nicht implementiert. |
- - | IP.4 | Nicht implementiert. |
PT1 | IP.3 | Definiert die Interrupt-Prioritätsstufe von Timer 1. |
PX1 | IP.2 | Definiert die Prioritätsstufe für externen Interrupt 1. |
PT0 | IP.1 | Definiert die Interrupt-Prioritätsstufe Timer 0. |
PX0 | IP.0 | Definiert die Prioritätsstufe für den externen Interrupt 0. |
Interrupt innerhalb Interrupt
Was passiert, wenn der 8051 einen ISR ausführt, der zu einem Interrupt gehört, und ein anderer aktiv wird? In solchen Fällen kann ein Interrupt mit hoher Priorität einen Interrupt mit niedriger Priorität unterbrechen. Dies ist bekannt alsinterrupt inside interrupt. In 8051 kann ein Interrupt mit niedriger Priorität durch einen Interrupt mit hoher Priorität unterbrochen werden, jedoch nicht durch einen anderen Interrupt mit niedriger Priorität.
Auslösen eines Interrupts durch Software
Es gibt Zeiten, in denen wir einen ISR durch Simulation testen müssen. Dies kann mit den einfachen Anweisungen erfolgen, um den Interrupt hoch zu setzen und dadurch den 8051 zu veranlassen, zur Interrupt-Vektortabelle zu springen. Setzen Sie beispielsweise das IE-Bit für Timer 1 auf 1. Eine AnweisungSETB TF1 unterbricht den 8051 in allem, was er tut, und zwingt ihn, zur Interrupt-Vektortabelle zu springen.