Programmierung eines Mikrocontrollers: Verzögerungen und Transfers, Exercises of Robotics and Autonomous Systems

Dieses Dokument beschreibt die Programmierung eines Mikrocontrollers mit dem Beispiel eines einfachen Programms, das Verzögerungen und Transfers zwischen Variablen und Eingaben/Ausgaben umfasst. Es werden verschiedene Anweisungen wie MOV, TON, TOF, CName und AName erklärt.

Typology: Exercises

2019/2020

Uploaded on 05/11/2020

ee-has
ee-has 🇺🇸

5 documents

1 / 28

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
EINFÜHRUNG
===========
LDmicro erzeugt einen systemspezifischen Code für einige Microchip PIC16
und Atmel AVR Mikroprozessoren. Üblicherweise wird die Software für diese
Prozessoren in Programmsprachen, wie Assembler, C oder BASIC geschrieben.
Ein Programm, welches in einer dieser Sprachen abgefasst ist, enthält
eine Anweisungsliste. Auch sind die diese Sprachen sehr leistungsfähig
und besonders gut geeignet für die Architektur dieser Prozessoren,
welche diese Anweisungsliste intern abarbeiten.
Programme für speicherprogrammierbare Steuerungen (SPS) andererseits,
werden oftmals im Kontaktplan (KOP = ladder logic) geschrieben.
Ein einfaches Programm, könnte wie folgt aussehen:
|| ||
|| Xbutton1 Tdon Rchatter Yred ||
1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||
|| | ||
|| Xbutton2 Tdof | ||
||-------]/[---------[TOF 2.000 s]-+ ||
|| ||
|| ||
|| ||
|| Rchatter Ton Tneu Rchatter ||
2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||
|| ||
|| ||
|| ||
||------[END]---------------------------------------------------------||
|| ||
|| ||
(TON ist eine Anzugsverzögerung, TOF eine Abfallverzögerung.
Die --] [-- Anweisungen bedeuten Eingänge, die sich ähnlich, wie Relais-
kontakte verhalten. Die --( )-- Anweisungen bedeuten Ausgänge, die sich
ähnlich, wie Relaisspulen verhalten. Viele gute Bezugsquellen werden für
KOP im Internet oder sonst wo angeboten; Einzelheiten zu dieser speziellen
Ausführung werden weiter unten angegeben.)
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c

Partial preview of the text

Download Programmierung eines Mikrocontrollers: Verzögerungen und Transfers and more Exercises Robotics and Autonomous Systems in PDF only on Docsity!

EINFÜHRUNG

LDmicro erzeugt einen systemspezifischen Code für einige Microchip PIC und Atmel AVR Mikroprozessoren. Üblicherweise wird die Software für diese Prozessoren in Programmsprachen, wie Assembler, C oder BASIC geschrieben. Ein Programm, welches in einer dieser Sprachen abgefasst ist, enthält eine Anweisungsliste. Auch sind die diese Sprachen sehr leistungsfähig und besonders gut geeignet für die Architektur dieser Prozessoren, welche diese Anweisungsliste intern abarbeiten. Programme für speicherprogrammierbare Steuerungen (SPS) andererseits, werden oftmals im Kontaktplan (KOP = ladder logic) geschrieben. Ein einfaches Programm, könnte wie folgt aussehen: || || || Xbutton1 Tdon Rchatter Yred || 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------|| || | || || Xbutton2 Tdof | || ||-------]/[---------[TOF 2.000 s]-+ || || || || || || || || Rchatter Ton Tneu Rchatter || 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------|| || || || || || || ||------[END]---------------------------------------------------------|| || || || || (TON ist eine Anzugsverzögerung, TOF eine Abfallverzögerung. Die --] [-- Anweisungen bedeuten Eingänge, die sich ähnlich, wie Relais- kontakte verhalten. Die --( )-- Anweisungen bedeuten Ausgänge, die sich ähnlich, wie Relaisspulen verhalten. Viele gute Bezugsquellen werden für KOP im Internet oder sonst wo angeboten; Einzelheiten zu dieser speziellen Ausführung werden weiter unten angegeben.)

Einige Unterschiede sind jedoch offensichtlich:

  • Das Programm wird in einem grafischen Format dargestellt und nicht mit einer aus Anweisungen bestehenden Textliste. Viele Anwender werden dies zunächst als besser verständlich auffassen.
  • Diese Programme erscheinen wie einfachste Schaltpläne, mit Relaiskontakten (Eingängen) and Spulen (Ausgängen). Dies ist recht intuitiv für Programmierer, die über Kenntnisse der Theorie von Elektroschaltplänen verfügen.
  • Der ‘ladder logic compiler’ übernimmt was wo berechnet wird. Es ist nicht notwendig einen Code zu schreiben, um zu errechnen, wann der Status (Zustand) der Ausgänge neu bestimmt werden muss, z.B. auf Grund einer Änderung eines Eingangs oder Timers. Auch braucht man die Reihenfolge der Berechnungen nicht anzugeben; die SPS-Hilfsprogramme übernehmen dies. LDmicro kompiliert ‘ladder logic’ (KOP) in PIC16- oder AVR-Code. Die folgenden Prozessoren werden unterstützt:
  • PIC16F
  • PIC16F
  • PIC16F876 (ungetestet)
  • PIC16F88 (ungetestet)
  • PIC16F819 (ungetestet)
  • PIC16F887 (ungetestet)
  • PIC16F886 (ungetestet)
  • ATmega8 (ungetestet)
  • ATmega16 (ungetestet)
  • ATmega32 (ungetestet)
  • ATmega
  • ATmega
  • ATmega162 (ungetestet) Es wäre einfach noch weitere AVR- oder PIC16-Prozessoren zu unterstützen, aber ich habe keine Möglichkeit diese zu testen. Falls Sie einen bestimmten benötigen, so nehmen Sie Kontakt mit mir auf und ich werde sehen, was ich tun kann.

OPTIONEN DER BEFEHLSZEILEN

ldmicro.exe läuft normalerweise ohne eine Befehlszeilen-Option. Das heißt, dass Sie nur ein Tastenkürzel zu dem Programm benötigen oder es auf dem Desktop abspeichern und dann auf das Symbol (die Ikone) doppelklicken, um es laufen zu lassen. Danach können Sie alles ausführen, was das GUI (Graphical User Interface) zulässt. Wenn man an LDmicro einen alleinstehenden Dateinamen in der Befehlszeile vergeben hat (z. B. ‘ldmicro.exe asd.ld’), wird LDmicro versuchen ‘asd.ld’ zu öffnen, falls diese existiert. Dies bedeutet, dass man ldmicro.exe mit .ld Dateien verbinden kann, sodass dies automatisch abläuft, wenn man auf eine .ld Datei doppelklickt. Wenn man an LDmicro das Argument in der Befehlszeile in folgender Form vergeben hat: ‘ldmicro.exe /c src.ld dest.hex’, so wird es versuchen ‘src.ld’ zu kompilieren und unter ‘dest.hex’ abzuspeichern. LDmicro endet nach dem Kompilieren, unabhängig davon, ob die Kompilierung erfolgreich war oder nicht. Alle Meldungen werden auf der Konsole ausgegeben. Dieser Modus ist hilfreich, wenn man LDmicro von der Befehlszeile laufen aus lässt. GRUNDLAGEN ========== Wenn Sie LDmicro ohne Argumente aufrufen, so beginnt es als ein leeres Programm. Wenn Sie LDmicro mit dem Namen eines ‘ladder’ (KOP)-Programms (z.B. xxx.ld) in der Befehlszeile öffnen, dann wird es versuchen dieses Programm am Anfang zu laden. LDmicro verwendet sein eigenes internes Format für das Programm und man kann kein logisches Zeichen aus einem anderen (Fremd-)Programm importieren. Falls Sie nicht ein schon vorhandenes Programm laden, dann wird Ihnen ein Programm mit einem leeren Netzwerk geliefert. In dieses können Sie

einen Befehl einfügen; z. B. könnten Sie auch eine Reihe von Kontakten einfügen (Anweisung -> Kontakte Einfügen), die zunächst mit ‘Xneu’ bezeichnet werden. ‘X’ bedeutet, dass der Kontakt auf einen Eingang des Mikroprozessors festgelegt ist. Diesen Pin können Sie später zuweisen, nachdem Sie den Mikroprozessor gewählt haben und die Kontakte umbenannt haben. Der erste Buchstabe zeigt an, um welche Art Objekt es sich handelt. Zum Beispiel:

  • XName -- Auf einen Eingang des Mikroprozessors festgelegt
  • YName -- Auf einen Ausgang des Mikroprozessors festgelegt
  • RName -- Merker: Ein Bit im Speicher (Internes Relais)
  • TName -- Ein Timer; Anzugs- oder Abfallverzögerung
  • CName -- Ein Zähler, Aufwärts- oder Abwärtszähler
  • AName -- Eine Ganzzahl, von einem A/D-Wandler eingelesen
  • Name -- Eine Allzweck-Variable als Ganzzahl Wählen Sie den Rest des Namens, sodass dieser beschreibt, was das Objekt bewirkt und das dieser auch einmalig im Programm ist. Der gleiche Name bezieht sich immer auf das gleiche Objekt im Programm. Es wäre zum Beispiel falsch eine Anzugsverzögerung (TON) ‘TVerzög’ zu nennen und im selben Programm eine Abfallverzögerung ‘TVerzög’ (TOF), weil jeder Zähler (oder Timer) seinen eigenen Speicher benötigt. Andererseits wäre es korrekt einen „Speichernden Timer“ (RTO) ‘TVerzög’ zu nennen und eine entsprechende Rücksetz-Anweisung (RES) = ‘TVerzög’, weil in diesem Fall beide Befehle dem gleichen Timer gelten. Die Namen von Variablen können aus Buchstaben, Zahlen und Unter- strichen (_) bestehen. Der Name einer Variablen darf nicht mit einer Nummer beginnen. Die Namen von Variablen sind fallabhängig. Ein Befehl für eine gewöhnliche Variable (MOV, ADD, EQU, usw.), kann mit Variablen mit jedem Namen arbeiten. Das bedeutet, dass diese Zugang zu den Timer- und Zähler-Akkumulatoren haben. Das kann manchmal recht hilfreich sein; zum Beispiel kann man damit prüfen, ob die Zählung eines Timers in einem bestimmten Bereich liegt. Die Variablen sind immer 16-Bit Ganzzahlen. Das heißt sie können von -32768 bis 32767 reichen. Die Variablen werden immer als vorzeichen- behaftet behandelt. Sie können auch Buchstaben als Dezimalzahlen festlegen (0, 1234, -56). Auch können Sie ASCII-Zeichenwerte (‘A’, ‘z’) festlegen,

im Simulationsbetrieb unterschiedlich dargestellt. Es gibt keine Schreibmarke (cursor) mehr. Die „erregten“ Anweisungen erscheinen hellrot, die „nicht erregten“ erscheinen grau. Drücken Sie die Leertaste, um das SPS-Programm nur einen einzelnen Zyklus durchlaufen zu lassen. Wählen Sie für einen kontinuierlichen Umlauf in Echtzeit ‘Simulieren -> Start Echtzeit-Simulation’ oder drücken Sie <Strg+R>. Die Maske (Bildanzeige) des Programms wird jetzt in Echtzeit, entsprechend der Änderungen des Status (des Zustands) des Programms aktualisiert. Sie können den Status (Zustand) eines Eingangs im Programm einstellen, indem Sie auf den jeweiligen auf der Liste am unteren Ende der Maske (Bildanzeige) doppelklicken oder auf die jeweilige ‘XName’ Kontakt-Anweisung im Programm. Wenn Sie den Status (Zustand) eines Eingangs-Pins ändern, so wird diese Änderung nicht unmittelbar in der Maske (Bildanzeige) wiedergegeben, sondern erst wenn sich die SPS im zyklischen Umlauf befindet. Das geschieht automatisch wenn das SPS-Programm in Echtzeit-Simulation läuft, oder wenn Sie die Leertaste drücken. KOMPILIEREN ZUM SYSTEMSPEZIFISCHEN CODE ======================================= Letztlich ist es dann nur sinnvoll eine .hex Datei zu erzeugen, mit der Sie Ihren Mikroprozessor programmieren können. Zunächst müssen Sie die Teilenummer des Mikroprozessors im Menü ‘Voreinstellungen -> Prozessor’ wählen. Danach müssen jedem ‘XName’ oder ‘YName’ Objekt einen E/A-Pin zuweisen. Tun Sie dies, indem auf den Namen des Objekts doppelklicken, welcher sich in der Liste ganz unten in der Maske (Bildanzeige) befindet. Ein Dialogfenster wird dann erscheinen und Sie können daraufhin einen noch nicht vergebenen Pin von der Liste aussuchen. Als nächstes müssen Sie die Zykluszeit wählen, mit der Sie das Programm laufen lassen wollen, auch müssen Sie dem Compiler mitteilen mit welcher Taktgeschwindigkeit der Prozessor arbeiten soll. Diese Einstellungen werden im Menü ‘Voreinstellungen -> Prozessor Parameter...’ vorgenommen. Üblicherweise sollten Sie die Zykluszeit nicht ändern, denn diese ist auf 10ms voreingestellt, dies ist ein guter Wert für die meisten Anwendungen. Tippen Sie die Frequenz des Quarzes (oder des Keramik-Resonators) ein, mit der Sie den Prozessor betreiben wollen und

klicken auf Okay. Jetzt können Sie einen Code von Ihrem Programm erzeugen. Wählen Sie ‘Kompilieren -> Kompilieren’ oder ‘Kompilieren -> Kompilieren unter...’, falls Sie vorher Ihr Programm schon kompiliert haben und einen neuen Namen für die Ausgangsdatei vergeben wollen. Wenn Ihr Programm fehlerfrei ist, wird LDmicro eine Intel IHEX Datei erzeugen, mit der sich Ihr Prozessor programmieren lässt. Verwenden Sie hierzu irgendeine Programmier Soft- und Hardware, die Sie besitzen, um die Hex-Datei in den Mikroprozessor zu laden. Beachten Sie die Einstellungen für die Konfigurationsbits (fuses)! Bei den PIC Prozessoren sind diese Konfigurationsbits bereits in der Hex-Datei enthalten. Die meisten Programmiersoftwares schauen automatisch nach diesen. Für die AVR-Prozessoren müssen Sie die Konfigurationsbits von Hand einstellen. ANWEISUNGS-VERZEICHNIS ======================

KONTAKT, SCHLIESSER XName RName YName ----] [---- ----] [---- ----] [---- Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so ist das Ausgangssignal ‘unwahr’. Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so ist das Ausgangssignal ‘wahr’. Dies nur, falls der vorliegende Eingangspin, Ausgangspin oder eines Merkers (Hilfsrelais) ‘wahr’ ist, anderenfalls ist es unwahr. Diese Anweisung fragt den Status (Zustand) eines Eingangspins, Ausgangspins oder Merkers (Hilfsrelais) ab. KONTAKT, ÖFFNER XName RName YName ----]/[---- ----]/[---- ----]/[---- Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so ist das Ausgangssignal ‘unwahr’. Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so ist das Ausgangssignal ‘wahr’. Dies nur, falls der vorliegende Eingangspin, Ausgangspin oder der Merker (= internes Hilfsrelais) ‘unwahr’ ist, anderenfalls ist es ‘unwahr’. Diese Anweisung

Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende Merker (Hilfsrelais) oder Ausgangspin rückgesetzt. Anderenfalls bleibt der Status (Zustand) des Merkers (Hilfsrelais) oder Ausgangspins unverändert. Diese Anweisung kann nur den Status (Zustand) einer Spule von ‘wahr’ nach ‘unwahr’ verändern, insofern wird diese üblicherweise in einer Kombination mit einer Setz-Anweisung für eine Spule verwendet. Diese Anweisung muss ganz rechts im Netzwerk stehen.

ANZUGSVERZÖGERUNG Tdon -[TON 1.000 s]- Wenn ein Signal diese Anweisung erreicht, welches seinen Status (Zustand) von ‘unwahr’ nach ‘wahr’ ändert, so bleibt das Ausgangssignal für 1,000 s ‘unwahr’, dann wird es ‘wahr’. Wenn ein Signal diese Anweisung erreicht, welches seinen Status (Zustand) von ‘wahr’ nach ‘unwahr’ ändert, so wird das Ausgangssignal sofort ‘unwahr’. Der Timer wird jedes Mal rückgesetzt (bzw. auf Null gesetzt), wenn der Eingang ‘unwahr’ wird. Der Eingang muss für 1000 aufeinanderfolgende Millisekunden ‘wahr’ bleiben, bevor auch der Ausgang ‘wahr’ wird. Die Verzögerung ist konfigurierbar. Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit, von Null ab hoch. Der Ausgang der TON-Anweisung wird wahr, wenn die Zählervariable größer oder gleich der vorliegenden Verzögerung ist. Es möglich die Zählervariable an einer anderen Stelle im Programm zu bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV). ABFALLVERZÖGERUNG Tdoff -[TOF 1.000 s]- Wenn ein Signal diese Anweisung erreicht, welches seinen Status (Zustand) von ‘wahr’ nach ‘unwahr’ ändert, so bleibt das Ausgangssignal für 1,000 s ‘wahr’, dann wird es ‘unwahr’. Wenn ein Signal diese Anweisung erreicht, welches seinen Status (Zustand) von ‘unwahr’ nach ‘wahr’ ändert, so wird das Ausgangssignal sofort ‘wahr’. Der Timer wird jedes Mal rückgesetzt (bzw. auf Null gesetzt), wenn der Eingang ‘unwahr’ wird. Der Eingang muss für 1000 aufeinanderfolgende Millisekunden ‘unwahr’

bleiben, bevor auch der Ausgang ‘unwahr’ wird. Die Verzögerung ist konfigurierbar. Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit, von Null ab hoch. Der Ausgang der TOF Anweisung wird wahr, wenn die Zählervariable größer oder gleich der vorliegenden Verzögerung ist. Es möglich die Zählervariable an einer anderen Stelle im Programm zu bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV).

SPEICHERNDER TIMER Trto -[RTO 1.000 s]- Diese Anweisung zeichnet auf, wie lange sein Eingang ‘wahr’ gewesen ist. Wenn der Eingang für mindestens 1.000 s ‘wahr’ gewesen ist, dann wird der Ausgang ‘wahr’. Andernfalls ist er ‘unwahr’. Der Eingang muss für 1000 aufeinanderfolgende Millisekunden ‘wahr’ gewesen sein; wenn der Eingang für 0,6 s ‘wahr’ war, dann ‘unwahr’ für 2,0 s und danach für 0,4 s wieder ‘wahr’, so wird sein Ausgang ‘wahr’. Nachdem der Ausgang ‘wahr’ wurde, so bleibt er ‘wahr’, selbst wenn der Eingang ‘unwahr’ wird, so lange der Eingang für länger als 1.000 s ‘wahr’ gewesen ist. Der Timer muss deshalb von Hand mit Hilfe der Rücksetz-Anweisung rückgesetzt (auf Null gesetzt) werden. Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit, von Null ab hoch. Der Ausgang der RTO-Anweisung wird wahr, wenn die Zählervariable größer oder gleich der vorliegenden Verzögerung ist. Es möglich die Zählervariable an einer anderen Stelle im Programm zu bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV). RÜCKSETZEN Trto Citems ----{RES}---- ----{RES}---- Diese Anweisung rücksetzt einen Timer oder Zähler. TON oder TOF Timer werden automatisch rückgesetzt, wenn ihr Eingang ‘wahr’ oder ‘unwahr’ wird, somit ist die RES-Anweisung für diese Timer nicht erforderlich. RTO Timer und CTU/CTD Zähler werden nicht automatisch rückgesetzt, somit müssen diese von Hand mit Hilfe der RES-Anweisung rückgesetzt (auf Null) werden. Wenn der Eingang ‘wahr’ ist, so wird der Timer oder Zähler

verwendet werden: Eine (vielleicht abhängige), um den „gegebenenfalls gesperrten“ Abschnitt zu starten und eine weitere, um diesen zu beenden.

TRANSFER, MOV {destvar := } {Tret := } -{ 123 MOV}- -{ srcvar MOV}- Wenn der Eingang dieser Anweisung ‘wahr’ ist, so setzt diese die vorliegende Zielvariable gleich der vorliegenden Quellvariablen oder Konstanten. Wenn der Eingang dieser Anweisung ‘unwahr’ ist, so geschieht nichts. Mit der TRANSFER-Anweisung (MOV) können Sie jede Variable zuweisen; dies schließt Timer und Zähler Statusvariablen ein, welche mit einem vorgestellten ‘T’ oder ‘C’ unterschieden werden. Eine Anweisung zum Beispiel, die eine ‘0’ in einen ‘TBewahrend’ transferiert, ist äquivalent mit einer RES-Anweisung für diesen Timer. Diese Anweisung muss ganz rechts im Netzwerk stehen. ARITHMETISCHE OPERATIONEN {ADD kay :=} {SUB Ccnt :=} -{ 'a' + 10 }- -{ Ccnt - 10 }- {MUL dest :=} {DIV dv := } -{ var * -990 }- -{ dv / -10000}- Wenn der Eingang einer dieser Anweisungen ‘wahr’ ist, so setzt diese die vorliegende Zielvariable gleich dem vorliegenden arithmetischem Ausdruck. Die Operanden können entweder Variabelen (einschließlich Timer- und Zählervariabelen) oder Konstanten sein. Diese Anweisungen verwenden 16-Bitzeichen Mathematik. Beachten Sie, dass das Ergebnis jeden Zyklus ausgewertet wird, wenn der Eingangszustand ‘wahr’ ist. Falls Sie eine Variable inkrementieren oder dekrementieren (d.h., wenn die Zielvariable ebenfalls einer der Operanden ist), dann wollen Sie dies vermutlich nicht; normalerweise würden Sie einen Impuls (one-shot) verwenden, sodass die Variable nur bei einer steigenden oder fallenden Flanke des Eingangszustands ausgewertet wird. Dividieren kürzt: D.h. 8 / 3 = 2. Diese Anweisungen müssen ganz rechts im Netzwerk stehen. VERGLEICHEN [var ==] [var >] [1 >=] -[ var2 ]- -[ 1 ]- -[ Ton]-

[var !=] [-4 < ] [1 <=] -[ var2 ]- -[ vartwo]- -[ Cup]- Wenn der Eingang dieser Anweisung ‘unwahr’ ist, so ist der Ausgang auch ‘unwahr’. Wenn der Eingang dieser Anweisung ‘wahr’ ist, dann ist Ausgang ‘wahr’; dies aber nur, wenn die vorliegende Bedingung ‘wahr’ ist. Diese Anweisungen können zum Vergleichen verwendet werden, wie: Auf gleich, auf größer als, auf größer als oder gleich, auf ungleich, auf kleiner als, auf kleiner als oder gleich, eine Variable mit einer Variablen oder eine Variable mit einer 16-Bitzeichen-Konstanten. ZÄHLER CName CName --[CTU >= 5]-- --[CTD > -5]-- Ein Zähler inkrementiert (CTU, aufwärtszählen) oder dekrementiert (CTD, abwärtszählen) die bezogene Zählung bei jeder steigenden Flanke des Eingangszustands des Netzwerks (d.h. der Eingangszustand des Netzwerks geht von ‘unwahr’ auf ‘wahr’ über). Der Ausgangszustand des Zählers ist ‘wahr’, wenn die Zähler- variable ist größer oder gleich 5 und andernfalls ‘unwahr’. Der Ausgangszustand des Netzwerks kann ‘wahr’ sein, selbst wenn der Eingangszustand ‘unwahr’ ist; das hängt lediglich von Zählervariablen ab. Sie können einer CTU- und CTD-Anweisung den gleichen Namen zuteilen, um den gleichen Zähler zu inkrementieren und dekrementieren. Die RES-Anweisung kann einen Zähler rücksetzen oder auch eine gewöhnliche Variablen-Operation mit der Zählervariablen ausführen. ZIRKULIERENDER ZÄHLER CName --{CTC 0:7}-- Ein zirkulierender Zähler arbeitet wie ein normaler CTU-Zähler, außer nach der Erreichung seiner Obergrenze, rücksetzt er seine Zählervariable auf Null. Zum Beispiel würde der oben gezeigte Zähler, wie folgt zählen: 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2,.... Dies ist hilfreich in Kombination mit bedingten Anweisungen der Variablen‘CName’; Sie können dies als eine Folgeschaltung verwenden. CTC-Zähler takten mit der aufsteigenden Flanke der Eingangsbedingung des Netzwerks. Diese Anweisung muss ganz rechts im Netzwerk stehen.

f(0) = 2 f(5) = 10 f(10) = 50 f(100) = 100 Dies bedeutet, dass sich die Punkte (x0, y0) = ( 0, 2) (x1, y1) = ( 5, 10) (x2, y2) = ( 10, 50) (x3, y3) = (100, 100) in dieser Kurve befinden. Diese 4 Punkte können Sie in die Tabelle der ‘Näherungs-Linear’-Anweisung eintragen. Die ‘Näherungs-Linear’-Anweisung wird dann auf den Wert von ‘xvar’ schauen und legt den Wert von ‘yvar’ fest. Sie stellt ‘yvar’ so ein, dass die ‘Näherungs-Linear’-Kurve sich durch alle Punkte bewegt, die Sie vorgegeben haben. Wenn Sie z.B. für ‘xvar’ = 10 vorgegeben haben, dann stellt die Anweisung ‘yvar’ auf gleich 50 ein. Falls Sie dieser Anweisung einen Wert ‘xvar’ zuweisen, der zwischen zwei Werten von ‘x’ liegt, denen Sie Punkte zugeordnet haben, dann stellt die Anweisung ‘yvar’ so ein, dass (‘xvar’, ‘yvar’) in der geraden Linie liegt; diejenige die, die zwei Punkte in der Tabelle verbindet. Z.B. erzeugt ‘xvar’ = 55 bei ‘yvar’ = 75. Die beiden Punkte in der Tabelle sind (10,

  1. und (100, 100). 55 liegt auf halbem Weg zwischen 10 und 100 und 75 liegt auf halbem Weg zwischen 50 und 100, somit liegt (55, 75) auf der Linie, die diese zwei Punkte verbindet. Die Punkte müssen in aufsteigender Reihenfolge der x-Koordinaten angegeben werden. Einige mathematische Operationen, erforderlich für bestimmte Nachschlag-Tabellen mit 16-Bit-Mathematik, kann man ggf. nicht ausführen. In diesem Falle gibt LDmicro eine Warnmeldung aus. So würde z.B. die folgende Nachschlag-Tabelle eine Fehlermeldung hervorrufen: (x0, y0) = ( 0, 0) (x1, y1) = (300, 300) Sie können diesen Fehler beheben, indem sie den Abstand zwischen den Punkten kleiner machen. So ist zum Beispiel die nächste Tabelle äquivalent

zur vorhergehenden, ruft aber keine Fehlermeldung hervor. (x0, y0) = ( 0, 2) (x1, y1) = (150, 150) (x2, y2) = (300, 300) Es wird kaum einmal notwendig sein, mehr als fünf oder sechs Punkte zu verwenden. Falls Sie mehr Punkte hinzufügen, so vergrößert dies Ihren Code und verlangsamt die Ausführung. Falls Sie für ‘xvar’ einen Wert vergeben, der größer ist, als die größte x-Koordinate der Tabelle oder kleiner, als die kleinste x-Koordinate in der Tabelle, so ist das Verhalten der Anweisung undefiniert. Diese Anweisung muss ganz rechts im Netzwerk stehen.

A/D-WANDLER EINLESEN AName --{READ ADC}-- LDmicro kann einen Code erzeugen, der ermöglicht, die A/D-Wandler zu verwenden, die in manchen Mikroprozessoren vorgesehen sind. Wenn der Eingangszustand dieser Anweisung ‘wahr’ ist, dann wird eine Einzellesung von dem A/D-Wandler entnommen und in der Variablen ‘AName’ gespeichert. Diese Variable kann anschließend mit einer gewöhnlichen Ganzzahlvariablen bearbeitet werden (wie: Kleiner als, größer als, arithmetisch usw.). Weisen Sie ‘Axxx’ in der gleichen Weise einen Pin zu, wie Sie einen Pin für einen digitalen Ein- oder Ausgang vergeben würden, indem auf diesen in der Liste unten in der Maske (Bildanzeige) doppelklicken. Wenn der Eingangszustand dieses Netzwerks ‘unwahr’ ist, so wird die Variable ‘AName’ unverändert belassen. Für alle derzeitig unterstützten Prozessoren gilt: Eine 0 Volt Lesung am Eingang des A/D-Wandlers entspricht 0. Eine Lesung gleich der Versorgungsspannung (bzw. Referenzspannung) entspricht 1023. Falls Sie AVR-Prozessoren verwenden, so verbinden Sie AREF mit Vdd. (Siehe Atmel Datenblatt, dort wird eine Induktivität von 100μH empfohlen). Sie können arithmetische Operationen verwenden, um einen günstigeren Maßstabfaktor festzulegen, aber beachten Sie, dass das Programm nur Ganzzahl-Arithmetik vorsieht. Allgemein sind nicht alle Pins als A/D-Wandler verwendbar. Die Software gestattet Ihnen nicht, einen Pin zuzuweisen, der kein A/D bzw. analoger Eingang ist. Diese Anweisung muss ganz rechts im Netzwerk

ändert. Bei Spannungswiederkehr wird die Variable automatisch vom EEPROM zurückgespeichert. Falls eine Variable, die häufig ihren Wert ändert, remanent (dauerhaft) gemacht wird, so könnte Ihr Prozessor sehr rasch verschleißen, weil dieser lediglich für eine begrenzte Anzahl von Schreibbefehlen konstruiert ist (~100 000). Wenn der Eingangszustand des Netzwerks ‘unwahr’ ist, so geschieht nichts. Diese Anweisung muss ganz rechts im Netzwerk stehen.

UART (SERIELL) EMPFANGEN var --{UART RECV}-- LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden, welcher in manchen Mikroprozessoren vorgesehen ist. Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0) unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen -> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt LDmicro eine Warnmeldung. Wenn der Eingangszustand dieser Anweisung ‘unwahr’ ist, so geschieht nichts. Wenn der Eingangszustand ‘wahr’ ist, so versucht diese Anweisung ein einzelnes Schriftzeichen vom UART-Eingang zu empfangen. Wenn kein Schriftzeichen eingelesen wird, dann ist der Ausgangszustand ‘unwahr’. Wenn ein ASCII-Zeichen eingelesen wird, so wird sein Wert in ‘var’ abgespeichert und der Ausgangszustand wird für einen einzelnen Zyklus ‘wahr’. UART (SERIELL) SENDEN var --{UART SEND}-- LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden, welcher in manchen Mikroprozessoren vorgesehen ist. Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0) unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen -> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt LDmicro eine Warnmeldung.

Wenn der Eingangszustand dieser Anweisung ‘unwahr’ ist, so geschieht nichts. Wenn der Eingangszustand ‘wahr’ ist, so schreibt diese Anweisung ein einzelnes Schriftzeichen zum UART. Der ASCII-Wert des Schriftzeichens, welches gesendet werden soll, muss vorher in ‘var’ abgespeichert worden sein. Der Ausgangszustand dieses Netzwerks ist ‘wahr’, wenn UART beschäftigt ist (gerade dabei ein Schriftzeichen zu übermitteln) und andernfalls ‘unwahr’. Denken Sie daran, dass einige Zeit zum Senden von Schriftzeichen beansprucht wird. Überprüfen Sie den Ausgangszustand dieser Anweisung, sodass das erste Schriftzeichen bereits übermittelt wurde, bevor Sie versuchen ein zweites Schriftzeichen zu übermitteln. Oder verwenden Sie einen Timer, um eine Verzögerung zwischen die Schriftzeichen fügen. Sie dürfen den Eingangszustand dieser Anweisung nur dann auf ‘wahr’ setzen (bzw. ein Schriftzeichen übermitteln), wenn der Ausgangszustand ‘unwahr’ ist (bzw. UART unbeschäftigt ist). Untersuchen Sie die “Formatierte Zeichenfolge”-Anweisung, bevor Sie diese Anweisung verwenden. Die “Formatierte Zeichenfolge”- Anweisung ist viel einfacher in der Anwendung und fast sicher fähig, das zu tun, was Sie beabsichtigen.

FORMATIERTE ZEICHENFOLGE ÜBER UART var -{"Druck: \3\r\n"}- LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden, welcher in manchen Mikroprozessoren vorgesehen ist. Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0) unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen -> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt LDmicro eine Warnmeldung. Wenn der Eingangszustand des Netzwerks für diese Anweisung von ‘unwahr’ auf ‘wahr’ übergeht, so beginnt diese eine vollständige Zeichenfolge über den seriellen Anschluss zu senden. Wenn die Zeichenfolge die besondere Reihenfolge ‘\3’ enthält, dann wird diese Folge durch den Wert von ‘var’ ersetzt, welcher automatisch in eine Zeichenfolge gewandelt wird. Die Variable wird formatiert, sodass diese exakt 3 Schriftzeichen