Kostenlose technische Bibliothek ENZYKLOPÄDIE DER FUNKELEKTRONIK UND ELEKTROTECHNIK Modulare Programmierung von Steuerungssystemen auf MCS48. Enzyklopädie der Funkelektronik und Elektrotechnik Lexikon der Funkelektronik und Elektrotechnik / Mikrocontroller Es ist bekannt, dass derselbe Mikrocontroller sowohl komplexe technologische Geräte als auch eine Haushaltskaffeemühle oder eine elektronische Uhr steuern kann. Die Anpassung an ein bestimmtes Objekt erfolgt durch Änderung des Mikrocontroller-Programms, die Hardware wird nahezu nicht beeinträchtigt. Dieser Artikel befasst sich mit Programmiertechniken für Mikrocontroller der MCS48-Serie, die in Steuerungssystemen für verschiedene Zwecke weit verbreitet sind. Seine wesentlichen Bestimmungen gelten auch für modernere Geräte. Die Entwicklung und Modernisierung von Steuerungsprogrammen wird erheblich erleichtert, wenn diese modular aufgebaut sind. In diesem Fall kommt es beim Programmieren eines neuen Steuerungssystems (CS) nach dem Sammeln einiger Erfahrungen und vor allem einer eigenen Bibliothek debuggter Module darauf an, einige Module eines bereits vorhandenen und debuggten Programms zu ersetzen und es möglicherweise durch Fragmente zu ergänzen Berücksichtigen Sie die Merkmale eines bestimmten Systems. Dieses Prinzip ist in der Struktur vieler Hochsprachen (PASCAL, C++) verankert und der Programmierer ist buchstäblich gezwungen, ihm zu folgen. Leider überwachen ASSEMBLER (auch für MCS48), obwohl sie dem Programmierer eine größere Freiheit bei der Auswahl von Werkzeugen und Methoden zur Lösung von Problemen bieten, in der Regel überhaupt nicht die Einhaltung der Programmierdisziplin. Dies führt häufig dazu, dass Programme erstellt werden, die so verwirrend sind, dass selbst ihre Autoren nach einiger Zeit nicht mehr herausfinden können, was getan wurde, geschweige denn, die debuggten Fragmente in anderen Programmen zu verwenden. Durch die bewusste Einhaltung allgemeiner modularer Konzepte wird die Programmierung von Mikrocontrollern deutlich einfacher und schneller. Ein Beispiel für ein typisches modulares Programm für ein Steuerungssystem ist in der Tabelle aufgeführt. Seine Syntax entspricht dem tabellarischen Assembler TASM in der Version für den 8048-Mikroprozessor. Wie Sie sehen können, werden Konstanten am Anfang des Programmtextes durch EQU-Direktiven mit Namen und Werten versehen. Die Verwendung benannter Konstanten ist der direkten Angabe numerischer Werte in ausführbaren Prozessorbefehlen immer vorzuziehen. Beispielsweise wird die von einem der unten besprochenen Unterprogramme implementierte Zeitverzögerung durch drei Zahlen bestimmt. Sie werden durch die Konstanten N1, N2 und N3 angegeben. Wenn Sie die Verschlusszeit ändern müssen, reicht es aus, in den EQU-Anweisungen neue Werte anzugeben. Andernfalls müssten wir das gesamte Programm nach Anweisungen mit Operanden entsprechend diesen Nummern durchsuchen, entscheiden, ob sich diese jeweils auf eine Zeitverzögerung beziehen, und gegebenenfalls neue Werte angeben. Offensichtlich sind solche Arbeiten zeitintensiv und oft nicht fehlerfrei. Was es besonders kompliziert macht, ist, dass einige Befehle möglicherweise nicht die gesamte Zahl, sondern beispielsweise deren High- oder Low-Byte verwenden. Der Assembler ist bereits in der Phase der Programmübersetzung in der Lage, einige Konstanten basierend auf den Werten anderer zu berechnen. Dieses Merkmal wird durch die Berechnung der High- (N3N) und Low- (N3L) Bytes der Zahl NXNUMX veranschaulicht. Als nächstes reserviert das Programm Speicher für Variablen. Dies geschieht mit denselben EQU-Direktiven, die jedoch im Gegensatz zu den Beschreibungen von Konstanten nicht die numerischen Werte der Variablen angeben, sondern die Adressen der Speicherzellen, die sie belegen. Wenn es die ASSEMBLY zulässt, sollten Sie die Möglichkeit der Verwendung von Makroanweisungen nicht vernachlässigen. Jeder von ihnen ist wie ein neuer Befehl, der eine Operation ausführt, die nicht direkt vom Prozessorbefehlssystem vorgesehen ist. Bei der Beschreibung eines Makrobefehls gibt der Programmierer ihm einen Namen (natürlich nicht derselbe wie der Name eines der „echten“ Befehle) und gibt die erforderlichen Aktionen in Form einer Abfolge von Maschinenbefehlen an. Jedes Mal, wenn in einem Programm ein Makro auftritt, ersetzt das ASSEMBLY dieses durch die angegebene Sequenz. In diesem Beispiel werden zwei Makrobefehle verwendet. Einer von ihnen sendet den Inhalt des Akkumulators an die durch den Makroparameter angegebene Datenspeicherzelle, der andere sendet ihn zurück. Nach dem Einschalten (oder dem Senden eines Reset-Signals) beginnt der Mikrocontroller mit der Ausführung des Programms ab Adresse Null. Der Befehl, bedingungslos zum eigentlichen Startpunkt des Programms (in diesem Fall zum START-Label) zu springen, wird normalerweise an diese Adresse geschrieben. Dies ist notwendig, da Hardware-Interrupts die Steuerung immer an die festen Adressen 3 und 7 übertragen (bei anderen Mikrocontroller-Typen können die Adressen anders sein, sie liegen aber immer noch am Anfang des Programmspeichers). Das Hauptprogramm muss Befehle „umgehen“, um einen bedingungslosen Übergang zu den entsprechenden Interrupt-Serviceroutinen zu ermöglichen, die sich an diesen Adressen befinden. Der nächste Schritt besteht darin, die Betriebsmodi des Controllers festzulegen (z. B. Speicherbänke und Register auszuwählen) und Variablen und externe Geräte zu initialisieren. Ein typischer Fehler von Programmieranfängern besteht darin, anzunehmen, dass Variablen unmittelbar nach dem Start des Programms bereits bestimmte Werte haben. Dieses Missverständnis wird durch die Tatsache verstärkt, dass einige Hochsprachen (z. B. BASIC) allen Variablen automatisch den Anfangswert Null zuweisen. In ASSEMBLY-Sprachprogrammen (und vielen anderen Sprachen) muss der Programmierer sicherstellen, dass vor dem ersten Lesen des Werts einer Variablen bereits etwas in den ihr zugewiesenen Speicherort geschrieben wurde. Ein guter Programmierstil erfordert, dass Variablen gleich zu Beginn des Programms Anfangswerte zugewiesen werden. In diesem Fall erfolgt dies durch das Unterprogramm 1INIT. Der Abschnitt zum Initialisieren externer Geräte sieht normalerweise aus wie ein sequentieller Aufruf von Unterprogrammen, die jeweils eines davon zurücksetzen (Analog-Digital-Wandler, LED-Anzeige, Drucktasten-Fernbedienung usw.) und beim Finalisieren leicht ersetzt werden können Verbesserung des Systems. Oft überprüfen dieselben Routinen die Funktionalität von Geräten. Als nächstes treten die meisten Steuerprogramme in eine sich endlos wiederholende Hauptschleife ein, deren Ausführung nur zur Verarbeitung von Interrupts unterbrochen wird. Der Zyklus besteht aus Unterprogrammen zum Abfragen der Tastatur und anderer Sensoren, zum Überprüfen von Flags, die durch Interrupt-Verarbeitungs-Unterprogramme gesetzt werden (z. B. das Flag für den Ablauf eines bestimmten Zeitintervalls oder das Ende des Betriebs eines Analog-Digital-Wandlers). Verarbeitung eingehender Informationen gemäß einem vorgegebenen Steueralgorithmus, Ausgabe von Steueraktionen an Aktoren, Anzeige von Informationen über den Zustand des technologischen Prozesses auf einer Flüssigkristallanzeige oder anderen Indikatoren. Ein Ausstieg aus der Hauptschleife ist in der Regel nur in Notsituationen vorgesehen, beispielsweise wenn zur Beseitigung der Folgen eines Fehlers die Wiederholung der Initialisierung aller Variablen und externen Geräte sowie bei der Verarbeitung von Interrupts erforderlich ist. Somit handelt es sich um ein Programm, das nach dem Baukastenprinzip aufgebaut ist und eine Reihe von Unterprogrammen darstellt. Wird in der neuen Steuerung beispielsweise eine andere Tastatur verwendet, reicht ein Austausch des BUTT-Unterprogramms aus. Damit ein solcher Austausch einfach und schmerzlos vonstatten geht, sollten bestimmte Regeln entwickelt und stets befolgt werden. Unterprogramme sollten nach Möglichkeit den Inhalt aller Controller-Register speichern, Quelldaten empfangen und Ergebnisse in denselben Registern und Speicherzellen erzeugen, dieselbe Zeichenkodierung verwenden usw. Sie sollten dem natürlichen Wunsch entgegentreten (besonders bei Programmierern, die die ersten Schwierigkeiten überwunden haben und beginnen, sich wie Profis zu fühlen), das Programm zu vereinfachen, indem Sie sich von strengen Regeln lösen und nicht standardmäßige Techniken verwenden. Was auf den ersten Blick wie eine ungerechtfertigte Komplikation erscheint, wird vollständig kompensiert, indem das Debuggen und Überarbeiten des gesamten Programms erleichtert wird. Schauen wir uns einige Funktionen von Unterprogrammen an. I NCREM und DECREM führen die in vielen Fällen erforderlichen Operationen aus, um eine 16-Bit-Binärzahl um einen bestimmten Betrag zu erhöhen oder zu verringern (ihre High- und Low-Bytes befinden sich in den Registern R6 bzw. R5). Die Konstanten, die das Inkrement definieren, werden am Anfang des Programms beschrieben. Da jeder Mikrocontroller viel schneller arbeitet als technische Geräte, ist es sehr wichtig, eine Zeitverzögerung im Programm organisieren zu können. In diesem Fall wird der interne Zähler/Timer des Prozessors verwendet. Es hat eine begrenzte Kapazität und füllt sich in Millisekunden. Jeder Überlauf erzeugt eine Interrupt-Anfrage. Die Timer-Interrupt-Serviceroutine (TIME) zählt sie und weist bei Erreichen der angegebenen Anzahl dem FLT-Timeout-Flag einen einzelnen Wert zu. Alle Unterprogramme, deren Arbeit von der Zeit abhängt, müssen den Zustand dieses Flags analysieren. Dadurch ist es möglich, Verschlusszeiten von mehreren Sekunden und sogar Minuten zu realisieren. Um mit dem Zählen eines neuen Intervalls zu beginnen, müssen Sie die Anfangswerte in die Arbeitszellen der TIME-Unterroutine eingeben und den Timer einschalten. Das Unterprogramm SET2M stellt beispielsweise eine Zeitverzögerung von 2 Minuten ein. Die Berechnung der Anfangswerte weist mehrere Feinheiten auf. Es ist bekannt, dass bei Mikrocontrollern der MCS48-Serie dem Eingang des internen Zählers/Timers Impulse mit einer Frequenz zugeführt werden, die 480-mal niedriger ist als die Frequenz des Quarzoszillators. Beispielsweise ändert sich bei einer Quarzfrequenz von 7 MHz die im Zähler erfasste Zahl alle 480/7000000 = 0,00006857 s = 68,57 μs. Der Zähler läuft also in 68,57 -(256-N1) µs über (und es wird eine Interrupt-Anfrage generiert), wobei N1 die Zahl ist, die ursprünglich in den Zähler geschrieben wurde. Wenn Sie ab dieser Zahl jedes Mal eine neue Zählung starten, kommt es in 0,1 s (minimale Zeitverzögerung) N2 = 0,1 · 7000000/[1480 · (256-N1)] zu Überläufen. Offensichtlich kann die gleiche Zeitverzögerung mit unterschiedlichen N1 und N2 erreicht werden, aber da diese Zahlen keine Bruchzahlen sein können, wird sie mit einem gewissen Fehler implementiert. Die Aufgabe besteht darin, ein Wertepaar auszuwählen, bei dem der Fehler minimal ist. Im betrachteten Fall ist die beste Option N1 = 13, N2 = 6. Durch Wiederholen des beschriebenen Vorgangs N2 = 3 Mal erhält man eine Zeitverzögerung von 1200 Minuten. Für die Bearbeitung derselben Hardware-Interrupts in unterschiedlichen Programmbetriebsarten ist es häufig erforderlich, unterschiedliche Vorgehensweisen zu verwenden. Eine Möglichkeit, dies zu tun, wird durch die Unterroutine INTER veranschaulicht. Es analysiert den vom Hauptprogramm in der INTT-Zelle eingegebenen Interrupt-Typ-Code und ruft je nach Wert eine der Interrupt-Serviceroutinen ISR1 oder ISR2 auf. Beachten Sie, dass beide mit dem Befehl RET und nicht mit RETR enden. Es ist einfach, die Anzahl der Verarbeitungsmöglichkeiten zu erhöhen und sogar so zu gestalten, dass für einen bestimmten Codewert mehrere verschiedene Unterprogramme nacheinander aufgerufen werden. Es ist überhaupt nicht notwendig, alle notwendigen Unterprogramme in eine Textdatei des Hauptprogramms zu schreiben. Module, die debuggt und wiederholt in verschiedenen Programmen verwendet wurden, können in separaten Dateien gespeichert und mithilfe von INCLUDE-Direktiven mit dem Hauptprogramm verbunden werden. Jede Include-Datei kann eine oder mehrere Routinen enthalten. Der Nachteil dieser Methode besteht darin, dass die Namen von Variablen, Konstanten und Labels in allen verwendeten Modulen nicht wiederholt werden sollten. Die Methode, Module separat zu übersetzen und dann auf Objektcodeebene zu kombinieren, die diesen Fehler nicht aufweist, wird von der TASM ASSEMBLY leider nicht unterstützt. Autor: D. Ryschow, Wladimir Siehe andere Artikel Abschnitt Mikrocontroller. Lesen und Schreiben nützlich Kommentare zu diesem Artikel. Neueste Nachrichten aus Wissenschaft und Technik, neue Elektronik: Eine neue Möglichkeit, optische Signale zu steuern und zu manipulieren
05.05.2024 Primium Seneca-Tastatur
05.05.2024 Das höchste astronomische Observatorium der Welt wurde eröffnet
04.05.2024
Weitere interessante Neuigkeiten: ▪ HP EliteBook Folio-Notebook-PC ▪ Neues CC1100-basiertes HF-Modul kommt auf den Markt ▪ Neuigkeiten zur Mausanatomie ▪ Chinesisches Analogon von GPS News-Feed von Wissenschaft und Technologie, neue Elektronik
Interessante Materialien der Freien Technischen Bibliothek: ▪ Site-Bereich Ton- und Lautstärkeregler. Auswahl an Artikeln ▪ Artikel Eine Stimme, die in der Wildnis weint. Populärer Ausdruck ▪ Artikel Gasschweißgerät. Jobbeschreibung ▪ Artikel Kopfhörer. Enzyklopädie der Funkelektronik und Elektrotechnik
Hinterlasse deinen Kommentar zu diesem Artikel: Alle Sprachen dieser Seite Startseite | Bibliothek | Artikel | Sitemap | Site-Überprüfungen www.diagramm.com.ua |