From 1f483baf37359032ca3224a5d07853aaf725def4 Mon Sep 17 00:00:00 2001 From: Rr42 Date: Mon, 4 Jun 2018 15:25:44 +0530 Subject: Commented all GUI code for core test --- ldmicro/obj/helptext.cpp | 3877 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3877 insertions(+) create mode 100644 ldmicro/obj/helptext.cpp (limited to 'ldmicro/obj/helptext.cpp') diff --git a/ldmicro/obj/helptext.cpp b/ldmicro/obj/helptext.cpp new file mode 100644 index 0000000..16d60fd --- /dev/null +++ b/ldmicro/obj/helptext.cpp @@ -0,0 +1,3877 @@ +// generated by txt2c.pl from +#include +#ifdef LDLANG_DE +char *HelpTextDe[] = { + "", + "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.)", + "", + "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:", + "", + " * PIC16F877", + " * PIC16F628", + " * PIC16F876 (ungetestet)", + " * PIC16F88 (ungetestet)", + " * PIC16F819 (ungetestet)", + " * PIC16F887 (ungetestet)", + " * PIC16F886 (ungetestet)", + " * ATmega8 (ungetestet)", + " * ATmega16 (ungetestet)", + " * ATmega32 (ungetestet)", + " * ATmega128", + " * ATmega64", + " * 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.", + "", + "Mit LDmicro können Sie ein Kontaktplan-Programm zeichnen bzw. entwickeln.", + "Auch können Sie dies in Realzeit mit Ihrem Computer simulieren. Wenn", + "Sie dann überzeugt sind, dass Ihr Programm korrekt ist, so können", + "Sie die Pins, entsprechend dem Programm als Ein- oder Ausgänge, dem", + "Mikroprozessor zuweisen. Nach der Zuweisung der Pins können Sie den PIC-", + "oder AVR-Code für Ihr Programm kompilieren. Der Compiler erzeugt eine", + "Hex-Datei, mit dem Sie dann Ihren Mikroprozessor programmieren. Dies", + "ist mit jedem PIC/AVR-Programmer möglich.", + "", + "LDmicro wurde entworfen, um in etwa mit den meisten kommerziellen", + "SPS-Systemen ähnlich zu sein. Es gibt einige Ausnahmen und viele Dinge", + "sind ohnehin kein Standard in der Industrie. Lesen Sie aufmerksam die", + "Beschreibung jeder Anweisung, auch wenn Ihnen diese vertraut erscheint.", + "Dieses Dokument setzt ein Grundwissen an Kontaktplan-Programmierung", + "und der Struktur von SPS-Software voraus (wie: der Ausführungszyklus,", + "Eingänge lesen, rechnen und Ausgänge setzen).", + "", + "", + "WEITERE ZIELE", + "=============", + "", + "Es ist auch möglich einen ANSI C - Code zu erzeugen. Diesen können", + "Sie dann für jeden Prozessor verwenden, für den Sie einen C-Compiler", + "besitzen. Sie sind dann aber selbst verantwortlich, den Ablauf zu", + "bestimmen. Das heißt, LDmicro erzeugt nur ein Stammprogramm für einen", + "Funktions- SPS-Zyklus. Sie müssen den SPS-Zyklus bei jedem Durchlauf", + "aufrufen und auch die Ausführung (Implementierung) der E/A-Funktionen,", + "die der SPS-Zyklus abruft (wie: lesen/schreiben, digitaler Eingang usw.).", + "Für mehr Einzelheiten: Siehe die Kommentare in dem erzeugten Quellcode.", + "", + "Ganz zuletzt kann LDmicro auch für eine virtuelle Maschine einen", + "prozessor-unabhängigen Byte-Code erzeugen, welche mit der KOP-Kodierung", + "(ladder logic) laufen soll. Ich habe eine Beispiel-Anwendung des", + "VM/Interpreters vorgesehen, in ziemlich gutem C geschrieben. Dieses", + "Anwendungsziel wird halbwegs auf jeder Plattform funktionieren, so lange", + "Sie Ihre eigene VM vorsehen. Dies könnte für solche Anwendungen nützlich", + "sein, für die Sie KOP (ladder logic) als Datentransfer-Sprache verwenden", + "möchten, um ein größeres Programm anzupassen. Für weitere Einzelheiten:", + "Siehe die Kommentare in dem Beispiel-Interpreter.", + "", + "", + "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,", + "indem Sie die Zeichen in „Auslassungszeichen“ einfügen. Sie können", + "ein ASCII-Zeichen an den meisten Stellen verwenden, an denen Sie eine", + "Dezimalzahl verwenden können.", + "", + "Am unteren Ende der Maske (Bildanzeige) sehen Sie eine Liste aller", + "Objekte (Anweisungen, Befehle) des Programms. Diese Liste wird vom", + "Programm automatisch erzeugt; es besteht somit keine Notwendigkeit diese", + "von Hand auf dem Laufenden zu halten. Die meisten Objekte benötigen", + "keine Konfiguration. ‘XName’, ‘YName’, und ‘AName’ Objekte allerdings,", + "müssen einem Pin des Mikroprozessors zugeordnet werden. Wählen Sie zuerst", + "welcher Prozessor verwendet wird (Voreinstellungen -> Prozessor). Danach", + "legen Sie Ihre E/A Pins fest, indem Sie in der Liste auf diese jeweils", + "doppelklicken.", + "", + "Sie können das Programm verändern, indem Sie Anweisungen (Befehle)", + "einfügen oder löschen. Die Schreibmarke (cursor)im Programm blinkt,", + "um die momentan gewählte Anweisung und den Einfügungspunkt anzuzeigen.", + "Falls diese nicht blinkt, so drücken Sie den oder klicken", + "Sie auf eine Anweisung. Jetzt können Sie die momentane Anweisung löschen", + "oder eine neue Anweisung einfügen; links oder rechts (in Reihenschaltung)", + "oder über oder unter (in Parallelschaltung) mit der gewählten Anweisung.", + "Einige Handhabungen sind nicht erlaubt, so zum Beispiel weitere", + "Anweisungen rechts von einer Spule.", + "", + "Das Programm beginnt mit nur einem Netzwerk. Sie können mehr Netzwerke", + "hinzufügen, indem Sie ‘Netzwerk Einfügen Davor/Danach’ im Programm-Menü", + "wählen. Den gleichen Effekt könnten Sie erzielen, indem Sie viele", + "komplizierte parallele Unterschaltungen in einem einzigen Netzwerk", + "unterbringen. Es ist aber übersichtlicher, mehrere Netzwerke zu verwenden.", + "", + "Wenn Sie Ihr Programm fertig geschrieben haben, so können Sie dieses", + "mit der Simulation testen. Danach können Sie es in eine Hex-Datei für", + "den zugedachten Mikroprozessor kompilieren.", + "", + "", + "SIMULATION", + "==========", + "", + "Um den Simulationsbetrieb einzugeben, wählen Sie ‘Simulieren ->", + "Simulationsbetrieb’ oder drücken Sie . Das Programm wird", + "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 . 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 PIC16", + "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", + "fragt den Status (Zustand) eines Eingangspins, Ausgangspins oder Merkers", + "(Hilfsrelais) ab. Dies ist das Gegenteil eines Schließers.", + "", + "", + "> SPULE, NORMAL (MERKER,AUSGANG) RName YName", + " ----( )---- ----( )----", + "", + "Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so wird der", + "vorliegende Merker (Hilfsrelais) oder Ausgangspin nicht angesteuert. Wenn", + "ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende", + "Merker (Hilfsrelais) oder Ausgangspin angesteuert. Es ist nicht sinnvoll", + "dieser Spule eine Eingangsvariable zuzuweisen. Diese Anweisung muss", + "ganz rechts im Netzwerk stehen.", + "", + "", + "> SPULE, NEGIERT (MERKER,AUSGANG) RName YName", + " ----(/)---- ----(/)----", + "", + "Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende", + "Merker (Hilfsrelais)oder Ausgangspin nicht angesteuert. Wenn ein", + "‘unwahres’ Signal diese Anweisung erreicht, so wird der vorliegende Merker", + "(Hilfsrelais) oder Ausgangspin angesteuert. Es ist nicht sinnvoll dieser", + "Spule eine Eingangsvariable zuzuweisen. Dies ist das Gegenteil einer", + "normalen Spule. Diese Anweisung muss im Netzwerk ganz rechts stehen.", + "", + "", + "> SPULE, SETZEN RName YName", + " ----(S)---- ----(S)----", + "", + "Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende", + "Merker (Hilfsrelais)oder Ausgangspin auf ‘wahr’ gesetzt. Anderenfalls", + "bleibt der Status (Zustand) des Merkers (Hilfsrelais) oder Ausgangspins", + "unverändert. Diese Anweisung kann nur den Status (Zustand) einer Spule", + "von ‘unwahr’ nach ‘wahr’ verändern, insofern wird diese üblicherweise in", + "einer Kombination mit einer Rücksetz-Anweisung für eine Spule verwendet.", + "Diese Anweisung muss ganz rechts im Netzwerk stehen.", + "", + "", + "> SPULE, RÜCKSETZEN RName YName", + " ----(R)---- ----(R)----", + "", + "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", + "rückgesetzt; wenn der Eingang ‘unwahr’ ist, so erfolgt keine Aktion.", + "Diese Anweisung muss ganz rechts im Netzwerk stehen.", + "", + " _", + "> ONE-SHOT RISING, STEIGENDE FLANKE --[OSR_/ ]--", + "", + "Diese Anweisung wird normalerweise ‘unwahr’ ausgewiesen. Wenn der Eingang", + "der Anweisung während des momentanen Zyklus ‘wahr’ ist und während des", + "vorgehenden ‘unwahr’ war, so wird der Ausgang ‘wahr’. Daher erzeugt diese", + "Anweisung bei jeder steigenden Flanke einen Impuls für einen Zyklus.", + "Diese Anweisung ist hilfreich, wenn Sie Ereignisse an der steigenden", + "Flanke eines Signals auslösen wollen.", + "", + " _", + "> ONE-SHOT FALLING, FALLENDE FLANKE --[OSF \\_ ]--", + "", + "Diese Anweisung wird normalerweise ‘unwahr’ ausgewiesen. Wenn der Eingang", + "der Anweisung während des momentanen Zyklus ‘unwahr’ ist und während des", + "vorgehenden ‘wahr’ war, so wird der Ausgang ‘wahr’. Daher erzeugt diese", + "Anweisung bei jeder fallenden Flanke einen Impuls für einen Zyklus.", + "Diese Anweisung ist hilfreich, wenn Sie Ereignisse an der fallenden", + "Flanke eines Signals auslösen wollen.", + "", + "", + "> BRÜCKE, ÖFFNUNG ----+----+---- ----+ +----", + "", + "Der Eingangszustand einer Brücke ist immer gleich seinem Ausgangszustand.", + "Der Ausgangszustands einer Öffnung ist immer ‘unwahr’. Diese Anweisungen", + "sind bei der Fehlerbehebung (debugging) besonders hilfreich.", + "", + "", + "> MASTER CONTROL RELAIS -{MASTER RLY}-", + "", + "", + "Im Normalfall ist der Anfang (die linke Stromschiene) von jedem Netzwerk", + "‘wahr’. Wenn eine ‘Master Control Relais’ Anweisung ausgeführt wird dessen", + "Eingang ‘unwahr’ ist, so werden die Anfänge (die linke Stromschiene)", + "aller folgenden Netzwerke ‘unwahr’. Das setzt sich fort bis die nächste", + "‘Master Control Relais’ Anweisung erreicht wird (unabhängig von dem", + "Anfangszustand dieser Anweisung). Diese Anweisungen müssen daher als Paar", + "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.", + "", + "", + "> SCHIEBEREGISTER {SHIFT REG }", + " -{ reg0..3 }-", + "", + "Ein Schieberegister besteht aus einer Reihe von Variablen. So bestünde", + "zum Beispiel ein Schieberegister aus den Variablen ‘reg0’, ‘reg1’,", + "‘reg2’, and ‘reg3’. Der Eingang des Schieberegisters ist ‘reg0’. Bei", + "jeder steigenden Flanke der Eingansbedingung des Netzwerks, schiebt das", + "Schieberegister nach rechts. Dies bedeutet es wie folgt zuweist: ‘reg3’", + "nach ‘reg2’, ‘reg2’ nach ‘reg1’ und ‘reg1’ nach ‘reg0’. ‘reg0’ bleibt", + "unverändert. Ein großes Schieberegister kann leicht viel Speicherplatz", + "belegen. Diese Anweisung muss ganz rechts im Netzwerk stehen.", + "", + "", + "> NACHSCHLAG-TABELLE {dest := }", + " -{ LUT[i] }-", + "", + "Eine Nachschlag-Tabelle ist eine Anordnung von n Werten. Wenn die", + "Eingangsbedingung des Netzwerks ‘wahr’ ist, so wird die Ganzzahl-Variable", + "‘dest’ mit dem Eintrag in der Nachschlag-Tabelle gleichgesetzt, der der", + "Ganzzahl-Variablen ‘i’ entspricht. Das Verzeichnis beginnt bei Null,", + "insofern muss sich ‘i’ zwischen 0 und (n-1) befinden. Das Verhalten", + "dieser Anweisung ist undefiniert, wenn sich die Werte des Verzeichnisses", + "außerhalb dieses Bereichs befinden.", + "", + "", + "> NÄHERUNGS-LINEAR-TABELLE {yvar :=}", + " -{PWL[xvar] }-", + "", + "Dies ist eine gute Methode für die Näherungslösung einer komplizierten", + "Funktion oder Kurve. Sie könnte zum Beispiel hilfreich sein, wenn Sie", + "versuchen eine Eichkurve zu verwenden, um die rohe Ausgangsspannung", + "eines Fühlers in günstigere Einheiten zu wandeln.", + "", + "Angenommen Sie versuchen eine Näherungslösung für eine Funktion zu finden,", + "die eine Eingangs-Ganzzahlvariable ‘x’ in Ausgangs-Ganzzahlvariable ‘y’", + "wandelt. Einige Punkte der Funktion sind Ihnen bekannt; so würden Sie", + "z.B. die folgenden kennen:", + "", + " 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,", + "50) 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", + "stehen.", + "", + "", + "> PULSWEITEN MODULATIONSZYKLUS FESTLEGEN duty_cycle", + " -{PWM 32.8 kHz}-", + "", + "LDmicro kann einen Code erzeugen, der ermöglicht, die PWM-Peripherie", + "zu verwenden, die in manchen Mikroprozessoren vorgesehen ist. Wenn die", + "Eingangsbedingung dieser Anweisung ‘wahr’ ist, so wird der Zyklus der", + "PWM-Peripherie mit dem Wert der Variablen ‘duty cycle’ gleichgesetzt. Der", + "‘duty cycle’ muss eine Zahl zwischen 0 und 100 sein. 0 entspricht immer", + "‘low’ und 100 entsprechend immer ‘high’. (Wenn Sie damit vertraut sind,", + "wie die PWM-Peripherie funktioniert, so bemerken Sie, dass dies bedeutet,", + "dass LDmicro die ‘duty cycle’-Variable automatisch prozentual zu den", + "PWM-Taktintervallen skaliert [= den Maßstabfaktor festlegt].)", + "", + "Sie können die PWM-Zielfrequenz in Hz definieren. Es kann vorkommen, dass", + "die angegebene Frequenz nicht genau erreicht wird, das hängt davon ab,", + "wie sich diese innerhalb der Taktfrequenz des Prozessors einteilt. LDmicro", + "wählt dann die nächst erreichbare Frequenz; falls der Fehler zu groß ist,", + "so wird eine Warnung ausgegeben. Höhere Geschwindigkeiten können die", + "Auflösung beeinträchtigen.", + "", + "Diese Anweisung muss ganz rechts im Netzwerk stehen. Die ‘ladder", + "logic’-Laufzeit verbraucht (schon) einen Timer, um die Zykluszeit", + "zu messen. Dies bedeutet, dass die PWM nur bei den Mikroprozessoren", + "verfügbar ist, bei denen mindestens zwei geeignete Timer vorhanden sind.", + "PWM verwendet den PIN CCP2 (nicht CCP1) bei den PIC16-Prozessoren und", + "OC2 (nicht OC1A) bei den AVR-Prozessoren.", + "", + "", + "> REMANENT MACHEN saved_var", + " --{PERSIST}--", + "", + "Wenn der Eingangszustand dieser Anweisung ‘wahr’ ist, so bewirkt", + "dies, dass eine angegebene Ganzzahl-Variable automatisch im EEPROM", + "gespeichert wird. Dies bedeutet, dass ihr Wert bestehen bleiben wird,", + "auch wenn der Prozessor seine Versorgungsspannung verliert. Es ist", + "nicht notwendig, die Variable an klarer Stelle im EEPROM zu speichern,", + "dies geschieht automatisch, so oft sich der Wert der Variablen", + "ä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", + "übernimmt. Falls die Variable zum Beispiel gleich 35 ist, dann wird die", + "exakte ausgegebene Zeichenfolge, wie folgt aussehen: ‘Druck: 35\\r\\n’", + "(beachten Sie das zusätzliche Freizeichen). Wenn stattdessen die Variable", + "gleich 1432 ist, so wäre das Verhalten der Anweisung undefiniert,", + "weil 1432 mehr als drei Stellen hat. In diesem Fall wäre es notwendig", + "stattdessen ‘\\4’ zu verwenden.", + "", + "Falls die Variable negativ ist, so verwenden Sie stattdessen ‘\\-3d’", + "(oder ‘\\-4d’). LDmicro wird hierdurch veranlasst eine vorgestellte", + "Freistelle für positive Zahlen und ein vorgestelltes Minuszeichen für", + "negative Zahlen auszugeben.", + "", + "Falls mehrere “Formatierte Zeichenfolge”-Anweisungen zugleich ausgegeben", + "werden (oder wenn eine neue Zeichenfolge ausgegeben wird bevor die", + "vorherige vollendet ist), oder auch wenn diese mit UART TX Anweisungen", + "vermischt, so ist das Verhalten undefiniert.", + "", + "Es ist auch möglich diese Anweisung für eine feste Zeichenfolge zu", + "verwenden, die über den seriellen Anschluss gesendet wird, ohne den Wert", + "einer Ganzzahlvariablen in den Text zu interpolieren. In diesem Fall", + "fügen Sie einfach diese spezielle Steuerungsfolge nicht ein.", + "", + "Verwenden Sie ‘\\\\’ für einen zeichengetreuen verkehrten Schrägstrich.", + "Zusätzlich zur Steuerungsfolge für die Interpolierung einer Ganzzahl-", + "Variablen, sind die folgenden Steuerungszeichen erhältlich:", + "", + " * \\r -- carriage return Zeilenschaltung", + " * \\n -- new line Zeilenwechsel", + " * \\f -- form feed Formularvorschub", + " * \\b -- backspace Rücksetzen", + " * \\xAB -- character with ASCII value 0xAB (hex)", + " -- Schriftzeichen mit ASCII-Wert 0xAB (hex)", + "", + "Der Ausgangszustand des Netzwerks dieser Anweisung ist ‘wahr’, während", + "diese Daten überträgt, ansonsten ‘unwahr’. Diese Anweisung benötigt eine", + "große Menge des Programmspeichers, insofern sollte sie sparsam verwendet", + "werden. Die gegenwärtige Umsetzung ist nicht besonders effizient, aber", + "eine bessere würde Änderungen an sämtlichen Ausläufern des Programms", + "benötigen.", + "", + "", + "EIN HINWEIS ZUR VERWENDUNG DER MATHEMATIK", + "=========================================", + "", + "Denken Sie daran, dass LDmicro nur 16-Bit mathematische Operationen", + "ausführt. Dies bedeutet, dass das Endresultat jeder Berechnung,", + "die Sie vornehmen, eine Ganzzahl zwischen -32768 und 32767 sein muss.", + "Dies bedeutet auch, dass die Zwischenergebnisse Ihrer Berechnungen alle", + "in diesem Bereich liegen müssen.", + "", + "Wollen wir zum Beispiel annehmen, dass Sie folgendes berechnen möchten", + "y = (1/x) * 1200, in der x zwischen 1 und 20 liegt.", + "Dann liegt y zwischen 1200 und 60, was in eine 16-Bit Ganzzahl passt,", + "so wäre es zumindest theoretisch möglich diese Berechnung auszuführen.", + "Es gibt zwei Möglichkeiten, wie Sie dies codieren könnten: Sie können", + "die Reziproke (Kehrwert) ausführen and dann multiplizieren:", + "", + " || {DIV temp :=} ||", + " ||---------{ 1 / x }----------||", + " || ||", + " || {MUL y := } ||", + " ||----------{ temp * 1200}----------||", + " || ||", + "", + "Oder Sie könnten einfach die Division in einem Schritt direkt vornehmen.", + "", + " || {DIV y :=} ||", + " ||-----------{ 1200 / x }-----------||", + "", + "", + "Mathematisch sind die zwei äquivalent; aber wenn Sie diese ausprobieren,", + "so werden Sie herausfinden, dass die erste ein falsches Ergebnis von", + "y = 0 liefert. Dies geschieht, weil die Variable einen Unterlauf", + "[= resultatabhängige Kommaverschiebung] ergibt. So sei zum Beispiel x = 3,", + "(1 / x) = 0.333, dies ist aber keine Ganzzahl; die Divisionsoperation", + "nähert dies, als 'temp = 0'. Dann ist y = temp * 1200 = 0. Im zweiten", + "Fall gibt es kein Zwischenergebnis, welches einen Unterlauf [= resultats-", + "abhängige Kommaverschiebung] ergibt, somit funktioniert dann alles.", + "", + "Falls Sie Probleme bei Ihren mathematischen Operationen erkennen,", + "dann überprüfen Sie die Zwischenergebnisse auf Unterlauf [eine", + "resultatabhängige Kommaverschiebung] (oder auch auf Überlauf, der dann", + "im Programm in Umlauf kommt; wie zum Beispiel 32767 + 1 = -32768).", + "Wann immer möglich, wählen Sie Einheiten, deren Werte in einem Bereich", + "von -100 bis 100 liegen.", + "", + "Falls Sie eine Variable um einen bestimmten Faktor vergrößern müssen, tun", + "Sie dies, indem Sie eine Multiplikation und eine Division verwenden. Um", + "zum Beispiel y = 1.8 * x zu vergrößern, berechnen Sie y = (9/5) * x,", + "(was dasselbe ist, weil 1,8 = 9/5 ist), und codieren Sie dies als", + "y = (9 * x)/5, indem Sie die Multiplikation zuerst ausführen.", + "", + " || {MUL temp :=} ||", + " ||---------{ x * 9 }----------||", + " || ||", + " || {DIV y :=} ||", + " ||-----------{ temp / 5 }-----------||", + "", + "", + "Dies funktioniert mit allen x < (32767 / 9), oder x < 3640. Bei höheren", + "Werten würde die Variable ‘temp’ überfließen. Für x gibt es eine", + "ähnliche Untergrenze.", + "", + "", + "KODIER-STIL", + "===========", + "", + "Ich gestatte mehrere Spulen in Parallelschaltung in einem einzigen", + "Netzwerk unterzubringen. Das bedeutet, sie können ein Netzwerk, wie", + "folgt schreiben:", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || Xb Yb ||", + " ||-------] [------+-------( )-------||", + " || | ||", + " || | Yc ||", + " || +-------( )-------||", + " || ||", + " ", + "Anstatt diesem:", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yb ||", + " 2 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yc ||", + " 3 ||-------] [--------------( )-------||", + " || ||", + "", + "Rein theoretisch bedeutet das, dass Sie irgendein Programm, als ein", + "gigantisches Netzwerk, schreiben könnten. Und es bestünde überhaupt", + "keine Notwendigkeit mehrere Netzwerke zu verwenden. In der Praxis ist", + "dies aber eine schlechte Idee, denn wenn Netzwerke komplexer werden, so", + "werden sie auch schwieriger zu editieren, ohne Löschen und neu Schreiben", + "von Anweisungen.", + "", + "Jedoch, ist es manchmal ein guter Einfall, verwandte Logik in einem", + "einzelnen Netzwerk zusammenzufassen. Dies erzeugt einen beinahe", + "identischen Code, als ob sie getrennte Netzwerke entworfen hätten, es", + "zeigt aber, dass diese Anweisungen (Logik) verwandt ist, wenn man diese", + "im Netzwerk-Diagramm betrachtet.", + "", + " * * *", + "", + "Im Allgemeinen hält man es für eine schlechte Form, den Code in einer", + "solchen Weise zu schreiben, dass sein Ergebnis von einer Folge von", + "Netzwerken abhängt. So zum Beispiel ist der folgende Code nicht besonders", + "gut, falls ‘xa’ und ‘xb’ jemals ‘wahr’ würden.", + "", + " || Xa {v := } ||", + " 1 ||-------] [--------{ 12 MOV}--||", + " || ||", + " || Xb {v := } ||", + " ||-------] [--------{ 23 MOV}--||", + " || ||", + " || ||", + " || ||", + " || ||", + " || [v >] Yc ||", + " 2 ||------[ 15]-------------( )-------||", + " || ||", + "", + "Ich werde diese Regel brechen und indem ich dies so mache, entwerfe ich", + "einen Code-Abschnitt, der erheblich kompakter ist. Hier zum Beispiel,", + "zeige ich auf, wie ich eine 4-Bit binäre Größe von ‘xb3:0’ in eine", + "Ganzzahl wandeln würde.", + "", + " || {v := } ||", + " 3 ||-----------------------------------{ 0 MOV}--||", + " || ||", + " || Xb0 {ADD v :=} ||", + " ||-------] [------------------{ v + 1 }-----------||", + " || ||", + " || Xb1 {ADD v :=} ||", + " ||-------] [------------------{ v + 2 }-----------||", + " || ||", + " || Xb2 {ADD v :=} ||", + " ||-------] [------------------{ v + 4 }-----------||", + " || ||", + " || Xb3 {ADD v :=} ||", + " ||-------] [------------------{ v + 8 }-----------||", + " || ||", + "", + "Falls die TRANSFER-Anweisung (MOV) an das untere Ende des Netzwerks", + "gebracht würde, anstatt auf das obere, so würde der Wert von ‘v’, an", + "anderer Stelle im Programm gelesen, gleich Null sein. Das Ergebnis dieses", + "Codes hängt daher von der Reihenfolge ab, in welcher die Anweisungen", + "ausgewertet werden. Im Hinblick darauf, wie hinderlich es wäre, diesen", + "Code auf eine andere Weise zu schreiben, nehme ich dies so hin.", + "", + "", + "BUGS", + "====", + "", + "LDmicro erzeugt keinen sehr effizienten Code; es ist langsam in der", + "Ausführung und geht verschwenderisch mit dem Flash- und RAM-Speicher", + "um. Trotzdem kann ein mittelgroßer PIC- oder AVR-Prozessor alles, was", + "eine kleine SPS kann, somit stört dies mich nicht besonders.", + "", + "Die maximale Länge der Variabelen-Bezeichnungen (-Namen) ist sehr", + "begrenzt. Dies ist so, weil diese so gut in das KOP-Programm (ladder)", + "passen. Somit sehe ich keine gute Lösung für diese Angelegenheit.", + "", + "Falls Ihr Programm zu groß für die Zeit-, Programmspeicher- oder", + "Datenspeicher-Beschränkungen des Prozessors ist, den Sie gewählt haben,", + "so erhalten Sie keine Fehlermeldung. Es wird einfach irgendwo anders alles", + "vermasseln. (Anmerkung: Das AVR STK500 gibt hierzu Fehlermeldungen aus.)", + "", + "Unsorgfältiges Programmieren bei den Datei Öffnen/Abspeichern-Routinen", + "führen wahrscheinlich zu der Möglichkeit eines Absturzes oder es wird", + "ein willkürlicher Code erzeugt, der eine beschädigte oder bösartige .ld", + "Datei ergibt.", + "", + "Bitte berichten Sie zusätzliche Bugs oder richten Sie Anfragen für neue", + "Programm-Bestandteile an den Autor (in Englisch).", + "", + "Thanks to:", + " * Marcelo Solano, for reporting a UI bug under Win98", + " * Serge V. Polubarjev, for not only noticing that RA3:0 on the", + " PIC16F628 didn't work but also telling me how to fix it", + " * Maxim Ibragimov, for reporting and diagnosing major problems", + " with the till-then-untested ATmega16 and ATmega162 targets", + " * Bill Kishonti, for reporting that the simulator crashed when the", + " ladder logic program divided by zero", + " * Mohamed Tayae, for reporting that persistent variables were broken", + " on the PIC16F628", + " * David Rothwell, for reporting several user interface bugs and a", + " problem with the \"Export as Text\" function", + "", + "Particular thanks to Heinz Ullrich Noell, for this translation (of both", + "the manual and the program's user interface) into German.", + "", + "", + "COPYING, AND DISCLAIMER", + "=======================", + "", + "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE", + "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE", + "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION", + "OF LDMICRO OR CODE GENERATED BY LDMICRO.", + "", + "This program is free software: you can redistribute it and/or modify it", + "under the terms of the GNU General Public License as published by the", + "Free Software Foundation, either version 3 of the License, or (at your", + "option) any later version.", + "", + "This program is distributed in the hope that it will be useful, but", + "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY", + "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License", + "for more details.", + "", + "You should have received a copy of the GNU General Public License along", + "with this program. If not, see .", + "", + "", + "Jonathan Westhues", + "", + "Rijswijk -- Dec 2004", + "Waterloo ON -- Jun, Jul 2005", + "Cambridge MA -- Sep, Dec 2005", + " Feb, Mar 2006", + "", + "Email: user jwesthues, at host cq.cx", + "", + "", + NULL +}; +#endif + +#ifdef LDLANG_FR +char *HelpTextFr[] = { + "INTRODUCTION", + "============", + "", + "LDmicro génére du code natif pour certains microcontroleurs Microchip", + "PIC16F et Atmel AVR. Usuellement les programmes de developpement pour ces", + "microcontrolleurs sont écrits dans des langages comme l'assembleur , le", + "C ou le Basic. Un programme qui utilise un de ces langages est une suite", + "de commandes. Ces programmes sont puissants et adaptés à l'architecture", + "des processeurs, qui de façon interne exécutent une liste d'instructions.", + "", + "Les API (Automates Programmables Industriels, PLC en anglais, SPS en", + "allemand) utilisent une autre voie et sont programmés en Langage à", + "Contacts (ou LADDER). Un programme simple est représenté comme ceci :", + "", + "", + " || ||", + " || Xbutton1 Tdon Rchatter Yred ||", + " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||", + " || | ||", + " || Xbutton2 Tdof | ||", + " ||-------]/[---------[TOF 2.000 s]-+ ||", + " || ||", + " || ||", + " || ||", + " || Rchatter Ton Tnew Rchatter ||", + " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||", + " || ||", + " || ||", + " || ||", + " ||------[END]---------------------------------------------------------||", + " || ||", + " || ||", + "", + "(TON est une tempo travail; TOF est une tempo repos. les commandes --] [-- ", + "représentent des Entrées, qui peuvent être des contacts de relais. Les ", + "commandes --( )-- sont des Sorties, qui peuvent représenter des bobines de ", + "relais. Beaucoup de références de programmes de langage à contacts (LADDER) ", + "existent sur Internet et sont à quelques détails près, identiques à ", + "l'implémentation représentée ci-dessus.", + "", + "Un certain nombre de différences apparaissent entre les programmes en", + "langage évolués ( C, Basic, Etc..) et les programmes pour API:", + "", + " * Le programme est représenté dans un format graphique, et non", + " comme une liste de commandes en format texte. Beaucoup de personnes", + " trouve cela plus facile à comprendre.", + "", + " * Au niveau de base, le programme apparait comme un diagramme", + " de circuit avec des contacts de relais (Entrées) et des bobines", + " (Sorties). Ceci est intuitif pour les programmeurs qui connaissent", + " la théorie des circuits électriques.", + "", + " * Le compilateur de langage à contacts vérifie tout ceci lors", + " de la compilation. Vous n'avez pas à écrire de code quand une", + " Sortie est remplacée et est remise en Entrée ou si une temporisation", + " est modifiée, vous n'avez pas non plus à spécifier l'ordre où les", + " calculs doivent être effectués. L'outil API (PLC) s'occupe de cela", + " pour vous.", + "", + "", + "LDmicro compile le langage à contact (ladder) en code pour PIC16F ou", + "AVR. Les processeurs suivants sont supportés:", + "", + " * PIC16F877", + " * PIC16F628", + " * PIC16F876 (non testé)", + " * PIC16F88 (non testé)", + " * PIC16F819 (non testé)", + " * PIC16F887 (non testé)", + " * PIC16F886 (non testé)", + " * ATmega128", + " * ATmega64", + " * ATmega162 (non testé)", + " * ATmega32 (non testé)", + " * ATmega16 (non testé)", + " * ATmega8 (non testé)", + "", + "Il doit être facile de supporter d'autres PIC ou AVR, mais je n'est", + "aucun moyen pour les tester. Si vous en voulez un en particulier faites", + "moi parvenir votre demande et je verrai ce que je peux faire.", + "", + "En utilisant LDmicro, vous dessinez un diagramme à contacts pour votre", + "programme. Vous pouvez simuler le fonctionnement logique en temps réel sur", + "votre PC. Quand vous êtes convaincu que le fonctionnement est correct,", + "vous pouvez affecter les broches du microcontroleur pour les Entrées et", + "Sorties, ensuite vous compilez votre programmeen code AVR ou PIC. Le", + "fichier de sortie du compilateur est un fichier .HEX que vous devrez", + "mettre dans le microcontroleur en utilisant un programmateur pour PIC", + "ou AVR.", + "", + "", + "LDmicro est conçu pour être similaire à la majorité des API commerciaux.", + "Il y a quelques exceptions, et une partie des possibilités n'est", + "pas standard avec le matériel industriel. Lire attentivement la", + "description de chaque instruction même si elle parait familière. Ce", + "document considère que vous avez une connaisance de base du langage à", + "contact et de la structure des logiciels pour automates programmables.", + "Cycle d'exécution : Lecture des Entrées -> Calculs -> Ecriture des Sorties", + "", + "", + "CIBLES ADDITIONNELLES ", + "=====================", + "", + "Il est aussi possible de générer du code ANSI C . Vous pouvez utiliser", + "ceci pour n'importe quel processeur dont vous avez un compilateur C,", + "mais le runtime est de votre responsabilité. LDmicro gérére uniquement", + "le source pour le cycle de l'API. Vous êtes responsable de l'appel de", + "chaque séquence du cycle et de l'implémentation de toutes les Entrées", + "/ Sorties (Lecture/Ecriture des Entrées digitales, etc ...). Voir les", + "commentaires dans le code source pour plus de détails.", + "", + "Finalement, LDmicro peut générer un code byte indépendant du processeur", + "pour une machine virtuelle prévue pour faire fonctionner ce type de code.", + "J'ai prévu un exemple simple d'implémentation d'un interpréteur /VM", + "écrit en code C le plus portable possible. La cible fonctionne juste sur", + "quelques plateformes ou vous pouvez prévoir votre VM. Ceci peut être utile", + "pour des applications ou vous pouvez utiliser le languages à contacts", + "comme du langage script pour customiser un programme important. Voir", + "les commentaires dans l'exemple pour les détails.", + "", + "", + "OPTIONS LIGNE DE COMMANDE", + "=========================", + "", + "LDmicro.exe fonctionne normallement sans options de ligne de commande.", + "Vous pouvez faire un raccourci vers le programme et le sauvegarder sur", + "l'écran , il suffit alors de faire un double clic pour le faire démarrer", + "et vous vous retrouvez ainsi dans l'interface utilisateur.", + "", + "Si un nom de fichier est passé en ligne de de commande de LDmicro, (ex:", + "`ldmicro.exe asd.ld'), alors LDmicro va essayer d'ouvrir `asd.ld', si", + "il existe. Une erreur se produira si `asd.ld' n'existe pas. Vous avez", + "la possibilité d'associer LDmicro avec les fichiers d'extention .ld.", + "Ceci permet à LDmicro de démarrer automatiquement lors d'un double clic", + "sur un fichier xxx.ld.", + "", + "Si les arguments de la ligne de commande sont passés sous la forme:", + "`ldmicro.exe /c src.ld dest.hex', LDmicro compilera le programme`src.ld',", + "et sauvegardera le fichier compilé sous`dest.hex'. Après compilation", + "LDmicro se termine, que la compilation soit correcte ou pas. Aucun", + "message n'est affiché sur la console. Ce mode est pratique uniquement", + "lorsque vous exécutez LDmicro en ligne de commande.", + "", + "", + "BASES", + "=====", + "", + "Si vous exécutez LDmicro sans arguments de ligne de commande, il démarre", + "avec un programme vide. Si vous démarrer avec le nom d'un programme", + "langage à contacts (xxx.ld) en ligne de commande, il va essayer de", + "charger le programme au démarrage. LDmicro utilise son format interne", + "pour le programme , il ne peut pas importer de programmes édités par", + "d'autres outils.", + "", + "Si vous ne chargez pas un programme existant, LDmicro démarre en insérant", + "une ligne vide. Vous pouvez ajouter les instructions pour votre programme:", + "par exemple ajouter un jeu de contacts (Instruction -> Insérer Contact)", + "qui sera nommé `Xnew'. `X' désigne un contact qui peut être lié à une", + "broche d'entrée du microcontroleur, vous pouvez affecter la broche pour", + "ce contact plus tard après avoir choisi le microcontroleur et renommé", + "les contacts. La première lettre indique de quel type de composants il", + "s'agit par exemple :", + "", + " * Xnom -- Relié à une broche d'entrée du microcontroleur", + " * Ynom -- Relié à une broche de sortie du microcontroleur", + " * Rnom -- `Relais interne': un bit en mémoire", + " * Tnom -- Temporisation; Tempo travail, tempo repos, ou totalisatrice", + " * Cnom -- Compteur, Compteur ou décompteur", + " * Anom -- Un entier lu sur un comvertisseur A/D ", + " * nom -- Variable générique (Entier : Integer)", + "", + "Choisir le reste du nom pour décrire l'utilisation de ce que fait cet", + "objet et qui doit être unique dans tout le programme. Un même nom doit", + "toujours se référer au même objet dans le programme en entier.Par", + "exemple , vous aurez une erreur si vous utilisez une tempo travail", + "(TON) appellée TDelai et une tempo repos (TOF) appellée aussi TDelai", + "dans le même programme, le comptage effectué par ces tempo utilisera le", + "même emplacement en mémoire, mais il est acceptable d'avoir une tempo", + "sauvegardée (RTO) Tdelai même nom avec une instruction de RES, dans ce", + "cas l'instruction fonctionne avec le même timer.", + "", + "Les noms de variables peuvent être des lettres, chiffres ou le", + "caractère _. Un nom de variable ne doit pas commencer par un chiffre.", + "Les noms de variables sont sensibles à la casse (majuscule/minuscules).", + "", + "Les instructions de manipulation de variables (MOV, ADD, EQU,", + "etc.) peuvent travailler avec des variables de n'importe quel nom. Elles", + "peuvent avoir accès aux accumulateurs des temporisations ou des", + "compteurs. Cela peut quelquefois être très utile, par exemple si vous", + "voulez contrôler la valeur d'un compteur ou d'une temporisation dans", + "une ligne particulière.", + "", + "Les variables sont toujours des entiers 16 bits. Leur valeur peut", + "donc être comprise entre -32768 et 32767 inclus. Les variables sont", + "toujours signées. Vous pouvez les spécifier de façon littérale comme", + "des nombres décimaux normaux (0, 1234, -56), vous pouvez aussi les", + "spécifier en caractères ASCII ('A', 'z') en mettant le caractère entre", + "des guillemets simples. Vous pouvez utiliser un caractère ASCII dans la", + "majorité des endroits où vous pouvez utiliser les nombres décimaux.", + "", + "En bas de l'écran, vous pouvez voir la liste de tous les objets", + "utilisés dans votre programme. La liste est automatiquement générée", + "à partir du programme. La majorité des objets ne necessitent aucune", + "configuration. Seuls : les objets `Xnom', `Ynom', and `Anom' doivent être", + "affectés à une broche du micro La première chose à faire est de choisir", + "la microcontroleur utilisé : Paramères -> Microcontroleur ensuite vous", + "affectez les broches en faisant un double clic dans la liste.", + "", + "Vous pouvez modifier le programme en insérant ou supprimant des", + "instructions. Le curseur clignote dans la programme pour indiquer", + "l'instruction courante sélectionnée et le point d'insertion. S'il ne", + "clignote pas pressez ou cliquer sur une instruction, ou vous", + "pouvez insérer une nouvelle instruction à la droite ou à la gauche", + "(en série avec), ou au dessous ou au dessus (en parallèle avec) de", + "l'instruction sélectionnée. Quelques opérations ne sont pas permises ,", + "par exemple aucune instruction permise à droite de la bobine.", + "", + "Le programme démarre avec uniquement une ligne. Vous pouvez ajouter", + "plusieurs lignes en sélectionnant Insertion -> Ligne avant ou après", + "dans le menu. Vous pouvez faire un circuit complexe en plaçant plusieurs", + "branches en parallèle ou en série avec une ligne, mais il est plus clair", + "de faire plusieurs lignes.", + "", + "Une fois votre programme écrit, vous pouvez le tester par simulation,", + "et le compiler dans un fichier HEX pour le microcontroleur de destination.", + "", + "SIMULATION", + "==========", + "", + "Pour entrer dans la mode simulation choisir Simulation -> Simuler", + "ou presser le programme est affiché différemment en mode", + "simulation. Les instructions activées sont affichées en rouge vif, les", + "instructions qui ne le sont pas sont affichées en grisé. Appuyer sur la", + "barre d'espace pour démarrer l'API pour 1 cycle. Pour faire fonctionner", + "continuellement en temps réel choisir Simulation ->Démarrer la simulation", + "en temps réel ou presser L'affichage du programme est mise à", + "jour en temps réel en fonction des changements d'état des entrées.", + "", + "Vous pouvez valider l'état des entrées du programme en faisant un", + "double clic sur l'entrée dans la liste au bas de l'écran, ou sur le", + "contact `Xnom' de l'instruction dans le programme, pour avoir le reflet", + "automatiquement de la validation d'une entrée dans le programme, il", + "faut que le programme soit en cycle.(le démarrer par ou barre", + "d'espace pour un seul cycle).", + "", + "COMPILER EN CODE NATIF", + "======================", + "", + "Le point final est de générer un fichier .HEX qui sera programmé dans le", + "microcontroleur que vous avez choisi par Paramètres -> Microcontroleur", + "Vous devez affecter les broches d'entrées sorties pour chaque 'Xnom'", + "et 'Ynom'. Vous pouvez faire cela en faisant un double clic sur la nom", + "de l'objet dans la liste au bas de l'écran. Une boite de dialogue vous", + "demande de choisir une des broches non affectées dans la liste.", + "", + "Vous devez aussi choisir la temps de cycle que voulez utiliser pour", + "votre application, vous devez aussi choisir la fréquence d'horloge du", + "processeur. Faire Paramètres -> Paramètres MCU dans le menu. En général,", + "le temps de cycle peut être laissé à la valeur par défaut (10 ms) qui est", + "une bonne valeur pour la majorité des applications. Indiquer la fréquence", + "du quartz utilisé (ou du résonateur céramique ou autres..) et cliquer OK.", + "", + "Maintenant vous pouvez créer le fichier pour intégrer dans le", + "microcontroleur. Choisir Compilation -> Compiler, ou compiler sous...", + "Si vous avez précédemment compilé votre programme, vous pouvez spécifier", + "un nom différent de fichier de sortie. Si votre programme ne comporte", + "pas d'erreur (lié à la structure du programme), LDmicro génére un fichier", + "IHEX prêt à être programmé dans le chip.", + "", + "Utilisez votre logiciel et matériel de programmation habituel pour", + "charger le fichier HEX dans la microcontroleur. Vérifiez et validez", + "les bits de configuration (fuses), pour les processeurs PIC16Fxxx ces", + "bits sont inclus dans le fichier HEX, et la majorité des logiciels de", + "programmation les valident automatiquement, pour les processeurs AVR ,", + "vous devez le faire manuellement.", + "", + "REFERENCE DES INSTRUCTIONS ", + "==========================", + "", + "> CONTACT, NORMALLEMENT OUVERT Xnom Rnom Ynom", + " ----] [---- ----] [---- ----] [----", + "", + " Si le signal arrivant à cette instruction est FAUX (0) le signal", + " de sortie est aussi faux (0), s'il est vrai , il sera aussi vrai", + " en sortie si et uniquement si la broche d'Entrée ou de Sortie", + " ou de Relais interne est vraie, sinon l'instruction sera fausse.", + " Cette instruction peut vérifier l'état d'une broche d'entrée, d'une", + " broche de sortie ou d'un relais interne", + "", + " ", + "> CONTACT, NORMALLEMENT FERME Xnom Rnom Ynom", + " ----]/[---- ----]/[---- ----]/[----", + "", + " Si le signal arrivant à cette instruction est FAUX (0) le signal", + " de sortie est vrai (1), s'il est vrai , il sera faux en sortie .", + " Cette instruction peut vérifier l'état d'une broche d'entrée, d'une", + " broche de sortie ou d'un relais interne. Fonctionne en opposition", + " par rapport au contact normallement ouvert.", + "", + "", + "> BOBINE, NORMALE Rnom Ynom", + " ----( )---- ----( )----", + "", + " Si le signal arrivant à cette instruction est faux, alors le relais ", + " interne ou la broche de sortie est faux (mise à zéro). Si le signal", + " arrivant à cette instruction est vrai(1), alors le relais interne ou", + " la broche de sortie est validée (mise à 1). Il n'est pas important", + " d'affecter une variable à une bobine.", + " Cette instruction est placée le plus à droite dans une séquence.", + " ", + "", + "> BOBINE, INVERSE Rnom Ynom", + " ----(/)---- ----(/)----", + "", + " Si le signal arrivant à cette instruction est vrai, alors le relais ", + " interne ou la broche de sortie est faux (mise à zéro). Si le signal", + " arrivant à cette instruction est faux(0), alors le relais interne ou", + " la broche de sortie est validée (mise à 1). Il n'est pas important ", + " d'affecter une variable à une bobine.", + " Cette instruction est placée le plus à droite dans une séquence.", + "", + "", + "> BOBINE, ACCROCHAGE Rnom Ynom", + " ----(S)---- ----(S)----", + "", + " Si le signal arrivant à cette instruction est vrai, alors le", + " relais interne ou la broche de sortie est validée (mise à 1). Cette", + " instruction permet de changer l'état d'un relais ou d'une sortie :", + " uniquement passe à vrai, ou reste vrai si elle était déjà à 1,", + " elle est typiquement utilisée en combinaison avec une Bobine REMISE", + " A ZERO.", + " Cette instruction est placée le plus à droite dans une séquence.", + "", + "", + "> BOBINE, REMISE A ZERO Rnom Ynom", + " ----(R)---- ----(R)----", + "", + " Si le signal arrivant à cette instruction est vrai, alors le relais ", + " interne ou la sortie est mise à zéro (0), si elle était déjà à 0, ", + " il n'y a aucun changement, cette instruction change l'état d'une ", + " sortie uniquement si elle était à 1, cette instruction fonctionne en ", + " combinaison avec l'instruction ci-dessus Bobine à ACCROCHAGE.", + " Cette instruction est placée le plus à droite dans une séquence.", + "", + "", + "> TEMPORISATION TRAVAIL Tdon ", + " -[TON 1.000 s]-", + "", + " Quand la signal arrivant à cette instruction passe de faux à vrai", + " (0 à 1), le signal de sortie attend 1.000 seconde avant de passer", + " à 1. Quand le signal de commande de cette instruction passe ZERO,", + " le signal de sortie passe immédiatement à zéro. La tempo est remise", + " à zéro à chaque fois que l'entrée repasse à zéro. L'entrée doit être", + " maintenue vraie à 1 pendant au moins 1000 millisecondes consécutives", + " avant que la sortie ne devienne vraie. le délai est configurable.", + "", + " La variable `Tnom' compte depuis zéro en unités de temps de scan.", + " L'instruction Ton devient vraie en sortie quand la variable du", + " compteur est plus grande ou égale au delai fixé. Il est possible", + " de manipuler la variable du compteur en dehors, par exemple par une", + " instruction MOVE.", + "", + "", + "> TEMPORISATION REPOS Tdoff ", + " -[TOF 1.000 s]-", + "", + " Quand le signal qui arrive à l'instruction passe de l'état vrai", + " (1) à l'état faux (0), la sortie attend 1.000 s avant de dévenir", + " faux (0) Quand le signal arrivant à l'instruction passe de l'état", + " faux à l'état vrai, le signal passe à vrai immédiatement. La", + " temporisation est remise à zéro à chaque fois que l'entrée devient", + " fausse. L'entrée doit être maintenue à l'état faux pendant au moins", + " 1000 ms consécutives avant que la sortie ne passe à l'état faux. La", + " temporisation est configurable.", + "", + " La variable `Tname' compte depuis zéro en unités de temps de scan.", + " L'instruction Ton devient vraie en sortie quand la variable du", + " compteur est plus grande ou égale au delai fixé. Il est possible", + " de manipuler la variable du compteur en dehors, par exemple par une", + " instruction MOVE.", + "", + "", + "> TEMPORISATION TOTALISATRICE Trto ", + " -[RTO 1.000 s]-", + "", + " Cette instruction prend en compte le temps que l'entrée a été à l'état", + " vrai (1). Si l'entrée a été vraie pendant au moins 1.000s la sortie", + " devient vraie (1).L'entrée n'a pas besoin d'être vraie pendant 1000 ms", + " consécutives. Si l'entrée est vraie pendant 0.6 seconde puis fausse", + " pendant 2.0 secondes et ensuite vraie pendant 0.4 seconde, la sortie", + " va devenir vraie. Après être passé à l'état vrai, la sortie reste", + " vraie quelque soit la commande de l'instruction. La temporisation", + " doit être remise à zéro par une instruction de RES (reset).", + "", + " La variable `Tnom' compte depuis zéro en unités de temps de scan.", + " L'instruction Ton devient vraie en sortie quand la variable du", + " compteur est plus grande ou égale au delai fixé. Il est possible", + " de manipuler la variable du compteur en dehors, par exemple par une", + " instruction MOVE.", + "", + "", + "> RES Remise à Zéro Trto Citems", + " ----{RES}---- ----{RES}----", + "", + " Cette instruction fait un remise à zéro d'une temporisation ou d'un", + " compteur. Les tempos TON et TOF sont automatiquement remisent à zéro", + " lorsque leurs entrées deviennent respectivement fausses ou vraies,", + " RES n'est pas donc pas nécessaire pour ces tempos. Les tempos RTO", + " et les compteurs décompteurs CTU / CTD ne sont pas remis à zéro", + " automatiquement, il faut donc utiliser cette instruction. Lorsque", + " l'entrée est vraie , le compteur ou la temporisation est remis à", + " zéro. Si l'entrée reste à zéro, aucune action n'est prise.", + " Cette instruction est placée le plus à droite dans une séquence.", + "", + "", + "> FRONT MONTANT _", + " --[OSR_/ ]--", + "", + " La sortie de cette instruction est normallement fausse. Si", + " l'instruction d'entrée est vraie pendant ce scan et qu'elle était", + " fausse pendant le scan précédent alors la sortie devient vraie. Elle", + " génére une impulsion à chaque front montant du signal d'entrée. Cette", + " instruction est utile si vous voulez intercepter le front montant", + " du signal.", + "", + "", + "> FRONT DESCENDANT _", + " --[OSF \\_]--", + "", + " La sortie de cette instruction est normallement fausse. Si", + " l'instruction d'entrée est fausse (0) pendant ce scan et qu'elle", + " était vraie (1) pendant le scan précédent alors la sortie devient", + " vraie. Elle génére une impulsion à chaque front descendant du signal", + " d'entrée. Cette instruction est utile si vous voulez intercepter le", + " front descendant d'un signal.", + "", + "", + "> COURT CIRCUIT (SHUNT), CIRCUIT OUVERT", + " ----+----+---- ----+ +----", + "", + " Une instruction shunt donne en sortie une condition qui est toujours ", + " égale à la condition d'entrée. Une instruction Circuit Ouvert donne ", + " toujours une valeur fausse en sortie.", + " Ces instructions sont en général utilisées en phase de test.", + "", + "", + "> RELAIS DE CONTROLE MAITRE", + " -{MASTER RLY}-", + "", + " Par défaut, la condition d'entrée d'une ligne est toujours vraie. Si", + " une instruction Relais de contrôle maitre est exécutée avec une", + " valeur d'entrée fausse, alors toutes les lignes suivantes deviendront", + " fausses. Ceci va continuer jusqu'à la rencontre de la prochaine", + " instruction relais de contrôle maitre qui annule l'instruction de", + " départ. Ces instructions doivent toujours être utilisées par paires:", + " une pour commencer (qui peut être sous condition) qui commence la", + " partie déactivée et une pour la terminer.", + "", + "", + "> MOUVOIR {destvar := } {Tret := }", + " -{ 123 MOV}- -{ srcvar MOV}-", + "", + " Lorsque l'entrée de cette instruction est vraie, elle va mettre la", + " variable de destination à une valeur égale à la variable source ou à", + " la constante source. Quand l'entrée de cette instruction est fausse", + " rien ne se passe. Vous pouvez affecter n'importe quelle variable", + " à une instruction de déplacement, ceci inclu l'état de variables", + " compteurs ou temporisateurs qui se distinguent par l'entête T ou", + " C. Par exemple mettre 0 dans Tsauvegardé équivaut à faire une RES", + " de la temporisation. Cette instruction doit être complétement à", + " droite dans une séquence.", + "", + "", + "> OPERATIONS ARITHMETIQUES {ADD kay :=} {SUB Ccnt :=}", + " -{ 'a' + 10 }- -{ Ccnt - 10 }-", + "", + "> {MUL dest :=} {DIV dv := }", + " -{ var * -990 }- -{ dv / -10000}-", + "", + " Quand l'entrée de cette instruction est vraie, elle place en", + " destination la variable égale à l'expression calculée. Les opérandes", + " peuvent être des variables (en incluant les variables compteurs et", + " tempos) ou des constantes. Ces instructions utilisent des valeurs 16", + " bits signées. Il faut se souvenir que le résultat est évalué à chaque", + " cycle tant que la condition d'entrée est vraie. Si vous incrémentez", + " ou décrémentez une variable (si la variable de destination est", + " aussi une des opérandes), le résultat ne sera pas celui escompté,", + " il faut utiliser typiquement un front montant ou descendant de la", + " condition d'entrée qui ne sera évalué qu'une seule fois. La valeur", + " est tronquée à la valeur entière. Cette instruction doit être", + " complétement à droite dans une séquence.", + "", + "", + "> COMPARER [var ==] [var >] [1 >=]", + " -[ var2 ]- -[ 1 ]- -[ Ton]-", + "", + "> [var /=] [-4 < ] [1 <=]", + " -[ var2 ]- -[ vartwo]- -[ Cup]-", + "", + " Si l'entrée de cette instruction est fausse alors la sortie est", + " fausse. Si l'entrée est vraie, alors la sortie sera vraie si et", + " uniquement si la condition de sortie est vraie. Cette instruction", + " est utilisée pour comparer (Egalité, plus grand que,plus grand ou", + " égal à, inégal, plus petit que, plus petit ou égal à) une variable à", + " une autre variable, ou pour comparer une variable avec une constante", + " 16 bits signée.", + "", + "", + "> COMPTEUR DECOMPTEUR Cnom Cnom", + " --[CTU >=5]-- --[CTD >=5]--", + "", + " Un compteur incrémente ( Compteur CTU, count up) ou décrémente", + " (Décompteur CTD, count down) une variable à chaque front montant de", + " la ligne en condition d'entrée (CAD quand la signal passe de l'état", + " 0 à l'état 1. La condition de sortie du compteur est vraie si la", + " variable du compteur est égale ou plus grande que 5 (dans l'exemple),", + " et faux sinon. La condition de sortie de la ligne peut être vraie,", + " même si la condition d'entrée est fausse, cela dépend uniquement de la", + " valeur de la variable du compteur. Vous pouvez avoir un compteur ou", + " un décompteur avec le même nom, qui vont incréménter ou decrémenter", + " une variable. L'instruction Remise à Zéro permet de resetter un", + " compteur (remettre à zéro), il est possible de modifier par des", + " opérations les variables des compteurs décompteurs.", + "", + "", + "> COMPTEUR CYCLIQUE Cnom", + " --{CTC 0:7}--", + "", + " Un compteur cyclique fonctionne comme un compteur normal", + " CTU, exception faite, lorsque le compteur arrive à sa", + " limite supérieure, la variable du compteur revient à 0. dans", + " l'exemple la valeur du compteur évolue de la façon suivante :", + " 0,1,2,4,5,6,7,0,1,2,3,4,5,6,7,0,1,3,4,5,etc. Ceci est très pratique", + " en conbinaison avec des intructions conditionnelles sur la variable", + " Cnom. On peut utiliser ceci comme un séquenceur, l'horloge du compteur", + " CTC est validée par la condition d'entrée associée à une instruction", + " de front montant.", + " Cette instruction doit être complétement à droite dans une séquence.", + " ", + "", + "> REGISTRE A DECALAGE {SHIFT REG }", + " -{ reg0..3 }-", + "", + " Un registre à décalage est associé avec un jeu de variables. Le", + " registre à décalage de l'exemple donné est associé avec les", + " variables`reg0', `reg1', `reg2', and `reg3'. L'entrée du registre à", + " décalage est `reg0'. A chaque front montant de la condition d'entrée", + " de la ligne, le registre à décalage va décaler d'une position à", + " droite. Ce qui donne `reg3 := reg2', `reg2 := reg1'. et `reg1 :=", + " reg0'.`reg0' est à gauche sans changement. Un registre à décalage", + " de plusieurs éléments peut consommer beaucoup de place en mémoire.", + " Cette instruction doit être complétement à droite dans une séquence.", + "", + "", + "> TABLEAU INDEXE {dest := }", + " -{ LUT[i] }-", + "", + " Un tableau indexé et un groupe ordonné de n valeurs Quand la condition", + " d'entrée est vraie, la variable entière `dest' est mise à la valeur", + " correspondand à l'index i du tableau. L'index est compris entre 0 et", + " (n-1). Le comportement de cette instruction est indéfini si l'index", + " est en dehors du tableau", + " Cette instruction doit être complétement à droite dans une séquence.", + "", + "", + "> TABLEAU ELEMENTS LINEAIRES {yvar := }", + " -{ PWL[xvar] }-", + "", + " C'est une bonne méthode pour évaluer de façon approximative une", + " fonction compliquée ou une courbe. Très pratique par exemple pour", + " appliquer une courbe de calibration pour linéariser tension de sortie", + " d'un capteur dans une unité convenable.", + "", + " Supposez que vous essayez de faire une fonction pour convertir une", + " variable d'entrée entière, x, en une variable de sortie entière, y,", + " vous connaissez la fonction en différents points, par exemple vous", + " connaissez :", + "", + " f(0) = 2", + " f(5) = 10", + " f(10) = 50", + " f(100) = 100", + "", + " Ceci donne les points", + "", + " (x0, y0) = ( 0, 2)", + " (x1, y1) = ( 5, 10)", + " (x2, y2) = ( 10, 50)", + " (x3, y3) = (100, 100)", + "", + " liés à cette courbe. Vous pouvez entrer ces 4 points dans un", + " tableau associé à l'instruction tableau d'éléments linéaires. Cette", + " instruction regarde la valeur de xvar et fixe la valeur de yvar", + " correspondante. Par exemple si vous mettez xvar = 10 , l'instruction", + " validera yvar = 50.", + "", + " Si vous mettez une instruction avec une valeur xvar entre deux valeurs", + " de x du tableau (et par conséquence aussi de yvar). Une moyenne", + " proportionnelle entre les deux valeurs , précédente et suivante de", + " xvar et de la valeur liée yvar, est effectuée. Par exemple xvar =", + " 55 donne en sortie yvar = 75 Les deux points xvar (10.50) et yvar", + " (50,75) , 55 est la moyenne entre 10 et 100 et 75 est la moyenne", + " entre 50 et 100, donc (55,75) sont liés ensemble par une ligne de", + " connection qui connecte ces deux points.", + "", + " Ces points doivent être spécifiés dans l'ordre ascendant des", + " coordonnées x. Il peut être impossible de faire certaines opérations", + " mathématiques nécessaires pour certains tableaux, utilisant des", + " entiers 16 bits. Dans ce LDmicro va provoquer une alarme. Ce tableau", + " va provoquer une erreur :", + "", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (300, 300)", + "", + " Vous pouvez supprimer ces erreurs en diminuant l'écart entre les", + " points du tableau, par exemple ce tableau est équivalent à celui ci", + " dessus , mais ne provoque pas d'erreur:", + "", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (150, 150)", + " (x2, y2) = (300, 300)", + "", + " Il n'est pratiquement jamais nécessaire d'utiliser plus de 5 ou", + " 6 points. Ajouter des points augmente la taille du code et diminue", + " sa vitesse d'exécution. Le comportement, si vous passez une valeur", + " à xvar plus grande que la plus grande valeur du tableau , ou plus", + " petit que la plus petite valeur, est indéfini.", + " Cette instruction doit être complétement à droite dans une séquence.", + "", + "", + "> LECTURE CONVERTISSEUR A/D Anom", + " --{READ ADC}--", + "", + " LDmicro peut générer du code pour utiliser les convertisseurs A/D", + " contenus dans certains microcontroleurs. Si la condition d'entrée", + " de l'instruction est vraie, alors une acquisition du convertisseur", + " A/D est éffectuée et stockée dans la variable Anom. Cette variable", + " peut être par la suite traitée comme les autres variables par les", + " différentes opérations arithmétiques ou autres. Vous devez affecter", + " une broche du micro à la variable Anom de la même façon que pour", + " les entrées et sorties digitales par un double clic dans la list", + " affichée au bas de l'écran. Si la condition d'entrée de la séquence", + " est fausse la variable Anom reste inchangée.", + "", + " Pour tous les circuits supportés actuellement, 0 volt en entrée", + " correspond à une lecture ADC de 0, et une valeur égale à VDD (la", + " tension d'alimentation ) correspond à une lecture ADC de 1023. Si", + " vous utilisez un circuit AVR, vous devez connecter Aref à VDD.", + "", + " Vous pouvez utiliser les opérations arithmétiques pour mettre à ", + " l'échelle les lectures effectuées dans l'unité qui vous est la plus ", + " appropriée. Mais souvenez vous que tous les calculs sont faits en ", + " utilisant les entiers.", + "", + " En général, toutes les broches ne sont pas utilisables pour les ", + " lecture de convertisseur A/D. Le logiciel ne vous permet pas ", + " d'affecter une broche non A/D pour une entrée convertisseur.", + " Cette instruction doit être complétement à droite dans une séquence.", + "", + "", + "> FIXER RAPPORT CYCLE PWM duty_cycle", + " -{PWM 32.8 kHz}-", + "", + " LDmicro peut générer du code pour utiliser les périphériques PWM", + " contenus dans certains microcontroleurs. Si la condition d'entrée", + " de cette instruction est vraie, le rapport de cycle du périphérique", + " PWM va être fixé à la valeur de la variable Rapport de cycle PWM.", + " Le rapport de cycle est un nombre compris entre 0 (toujours au", + " niveau bas) et 100 (toujours au niveau haut). Si vous connaissez la", + " manière dont les périphériques fonctionnent vous noterez que LDmicro", + " met automatiquement à l'échelle la variable du rapport de cycle en", + " pourcentage de la période d'horloge PWM.", + "", + " Vous pouvez spécifier la fréquence de sortie PWM, en Hertz. Le", + " fréquence que vous spécifiez peut ne pas être exactement accomplie, en", + " fonction des divisions de la fréquence d'horloge du microcontroleur,", + " LDmicro va choisir une fréquence approchée. Si l'erreur est trop", + " importante, il vous avertit.Les vitesses rapides sont au détriment", + " de la résolution. Cette instruction doit être complétement à droite", + " dans une séquence.", + "", + " Le runtime du language à contacts consomme un timers (du micro) pour", + " le temps de cycle, ce qui fait que le PWM est uniquement possible", + " avec des microcontroleurs ayant au moins deux timers utilisables.", + " PWM utilise CCP2 (pas CCP1) sur les PIC16F et OC2(pas OC1) sur les", + " Atmel AVR.", + "", + "> METTRE PERSISTANT saved_var", + " --{PERSIST}--", + "", + " Quand la condition d'entrée de cette instruction est vraie, la", + " variable entière spécifiée va être automatiquement sauvegardée en", + " EEPROM, ce qui fait que cette valeur persiste même après une coupure", + " de l'alimentation du micro. Il n'y a pas à spécifier ou elle doit", + " être sauvegardée en EEPROM, ceci est fait automatiquement, jusqu'a", + " ce quelle change à nouveau. La variable est automatiquement chargée", + " à partir de l'EEPROM suite à un reset à la mise sous tension.", + "", + " Si une variables, mise persistante, change fréquemment, l'EEPROM de", + " votre micro peut être détruite très rapidement, Le nombre de cycles", + " d'écriture dans l'EEPROM est limité à environ 100 000 cycles Quand", + " la condition est fausse, rien n'apparait. Cette instruction doit", + " être complétement à droite dans une séquence.", + "", + "", + "> RECEPTION UART (SERIE) var", + " --{UART RECV}--", + "", + " LDmicro peut générer du code pour utiliser l'UART, existant dans", + " certains microcontroleurs. Sur les AVR, avec de multiples UART,", + " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la", + " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les", + " vitesses de liaison ne sont pas utilisables avec tous les quartz de", + " toutyes les fréquences. Ldmicro vous avertit dans ce cas.", + "", + " Si la condition d'entrée de cette instruction est fausse, rien ne se", + " passe. Si la condition d'entrée est vraie, elle essaie de recevoir", + " un caractère en provenance de l'UART. Si aucun caractère n'est lu", + " alors la condition de sortie devient fausse. Si un caractère est", + " lu la valeur ASCII est stockée dans 'var' et la condition de sortie", + " est vraie pour un seul cycle API.", + "", + "", + "> EMMISION UART (SERIE) var", + " --{UART SEND}--", + "", + " LDmicro peut générer du code pour utiliser l'UART, existant dans ", + " certains microcontroleurs. Sur les AVR, avec de multiples UART, ", + " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la ", + " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les ", + " vitesses de liaison ne sont pas utilisables avec tous les quartz ", + " de toutyes les fréquences. Ldmicro vous avertit dans ce cas.", + "", + " Si la condition d'entrée de cette instruction est fausse, rien ne", + " se passe. Si la condition d'entrée est vraie alors cette instruction", + " écrit un seul caractère vers l'UART. La valeur ASCII du caractère à", + " transmettre doit avoir été stocké dans 'var' par avance. La condition", + " de sortie de la séquence est vraie, si l'UART est occupée (en cours", + " de transmission d'un caractère), et fausse sinon.", + "", + " Rappelez vous que les caractères mettent un certain temps pour être", + " transmis. Vérifiez la condition de sortie de cette instruction pour", + " vous assurer que le premier caractère à bien été transmis, avant", + " d'essayer d'envoyer un second caractère, ou utiliser une temporisation", + " pour insérer un délai entre caractères; Vous devez uniquement vérifier", + " que la condition d'entrée est vraie (essayez de transmettre un", + " caractère) quand la condition de sortie est fausse(UART non occuppée).", + "", + " Regardez l'instruction Chaine formattée(juste après) avant d'utiliser", + " cette instruction, elle est plus simple à utiliser, et dans la", + " majorité des cas, est capable de faire ce dont on a besoin.", + "", + "", + "> CHAINE FORMATTEE SUR UART var", + " -{\"Pression: \\3\\r\\n\"}-", + "", + " LDmicro peut générer du code pour utiliser l'UART, existant dans ", + " certains microcontroleurs. Sur les AVR, avec de multiples UART, ", + " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la ", + " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les ", + " vitesses de liaison ne sont pas utilisables avec tous les quartz ", + " de toutyes les fréquences. Ldmicro vous avertit dans ce cas.", + "", + " Quand la condition d'entrée de cette instruction passe de faux à vrai,", + " elle commence à envoyer une chaine compléte vers le port série. Si", + " la chaine comporte la séquence spéciale '3', alors cette séquence", + " va être remplacée par la valeur de 'var', qui est automatiquement", + " converti en une chaine. La variable va être formattée pour prendre", + " exactement trois caractères; par exemple si var = 35, la chaine", + " exacte qui va être \"imprimée\" sera 'Pression: 35\\r\\n' (notez les", + " espaces supplémentaires). Si au lieu de cela var = 1432 , la sortie", + " est indéfinie parceque 1432 comporte plus de 3 digits. Dans ce cas", + " vous devez nécessairement utiliser '\\4' à la place.", + "", + " Si la variable peut être négative, alors utilisez '\\-3d' (ou `\\-4d'", + " etc.) à la place. Ceci oblige LDmicro à imprimer un espace d'entête", + " pour les nombres positifs et un signe moins d'entête pour les chiffres", + " négatifs.", + "", + " Si de multiples instructions de chaines formattées sont activées au", + " même moment (ou si une est activée avant de finir la précédente)", + " ou si ces instructions sont imbriquées avec des instructions TX", + " (transmission), le comportement est indéfini.", + "", + " Il est aussi possible d'utiliser cette instruction pour sortie une", + " chaine fixe, sans l'intervention d'une variable en valeur entière", + " dans le texte qui est envoyée sur la ligne série. Dans ce cas,", + " simplement ne pas inclure de séquence spéciale Escape.", + "", + " Utiliser `\\\\' pour l'anti-slash. en addition à une séquence escape ", + " pour intervenir sue une variables entière, les caractères de ", + " contrôles suivants sont utilisables :", + " ", + " * \\r -- retour en début de ligne", + " * \\n -- nouvelle ligne", + " * \\f -- saut de page", + " * \\b -- retour arrière", + " * \\xAB -- caractère avec valeur ASCII 0xAB (hex)", + "", + " La condition de sortie de cette instruction est vraie quand elle", + " transmet des données, sinon elle est fausse. Cette instruction", + " consomme une grande quantité de mémoire, elle doit être utilisée", + " avec modération. L'implémentation présente n'est pas efficace, mais", + " une meilleure implémentation demanderait une modification de tout", + " le reste.", + "", + "NOTE CONCERNANT LES MATHS", + "=========================", + "", + "Souvenez vous que LDmicro travaille uniquement en mathématiques entiers", + "16 bits. Ce qui fait que le résultat final de même que tous les calculs", + "mêmes intermédiaires seront compris entre -32768 et 32767.", + "", + "Par exemple, si vous voulez calculer y = (1/x)*1200,ou x est compris", + "entre 1 et 20, ce qui donne un résultat entre 1200 et 60,le résultat est", + "bien à l'intérieur d'un entier 16 bits, il doit donc être théoriquement", + "possible de faire le calcul. Nous pouvons faire le calcul de deux façons", + "d'abord faire 1/x et ensuite la multiplication:", + "", + " || {DIV temp :=} ||", + " ||---------{ 1 / x }----------||", + " || ||", + " || {MUL y := } ||", + " ||----------{ temp * 1200}----------||", + " || ||", + "", + "Ou uniquement faire simplement la division en une seule ligne :", + "", + " || {DIV y :=} ||", + " ||-----------{ 1200 / x }-----------||", + "", + "Mathématiquement c'est identique, la première donne y = 0 , c'est à dire", + "une mauvais résultat, si nous prenons par exemple x = 3 , 1/x = 0.333 mais", + "comme il s'agit d'un entier, la valeur pour Temp est de 0 et 0*1200 = 0 ", + "donc résultat faux.Dans le deuxième cas, il n'y a pas de résultat ", + "intermédiaire et le résultat est correct dans tous les cas.", + "", + "Si vous trouvez un problème avec vos calculs mathématiques, vérifiez les", + "résultats intermédiaires, si il n'y a pas de dépassement de capacités par", + "rapports aux valeurs entières. (par exemple 32767 + 1 = -32768). Quand", + "cela est possible essayer de choisir des valeurs entre -100 et 100.", + "", + "Vous pouvez utiliser un certain facteur de multiplication ou division pour ", + "mettre à l'echelle les variables lors de calculs par exemple : pour mettre", + "mettre à l'echelle y = 1.8*x , il est possible de faire y =(9/5)*x ", + "(9/5 = 1.8) et coder ainsi y = (9*x)/5 en faisant d'abord la multiplication", + "", + " || {MUL temp :=} ||", + " ||---------{ x * 9 }----------||", + " || ||", + " || {DIV y :=} ||", + " ||-----------{ temp / 5 }-----------||", + "", + "Ceci fonctionne tant que x < (32767 / 9), or x < 3640. Pour les grandes ", + "valeurs de x,la variable `temp' va se mettre en dépassement. Ceci est ", + "similaire vers la limite basse de x.", + "", + "", + "STYLE DE CODIFICATION", + "=====================", + "", + "Il est permis d'avoir plusieurs bobines en parallèle, contrôlées par", + "une simple ligne comme ci-dessous :", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || Xb Yb ||", + " ||-------] [------+-------( )-------||", + " || | ||", + " || | Yc ||", + " || +-------( )-------||", + " || ||", + "", + "à la place de ceci :", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yb ||", + " 2 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yc ||", + " 3 ||-------] [--------------( )-------||", + " || ||", + "", + "Il est permis théoriquement d'écrire un programme avec une séquence très", + "importante et de ne pas utiliser plusieurs lignes pour la faire. En", + "pratique c'est une mauvaise idée, à cause de la compléxité que cela", + "peut engendrer et plus difficile à éditer sans effacer et redessiner un", + "certain nombre d'éléments de logique.", + "", + "Néanmoins, c'est une bonne idée de regrouper différents éléments d'un bloc", + "logique dans une seule séquence. Le code généré est identique dans les", + "deux cas, et vous pouvez voir ce que fait la séquence dans le diagramme", + "à contacts.", + "", + " * * *", + "", + "En général, il est considéré comme mauvais d'écrire du code dont la", + "sortie dépend de l'ordre d'exécution. Exemple : ce code n'est pas très", + "bon lorsque xa et xb sont vrai en même temps :", + "", + " || Xa {v := } ||", + " 1 ||-------] [--------{ 12 MOV}--||", + " || ||", + " || Xb {v := } ||", + " ||-------] [--------{ 23 MOV}--||", + " || ||", + " || ||", + " || ||", + " || ||", + " || [v >] Yc ||", + " 2 ||------[ 15]-------------( )-------||", + " || ||", + "", + "Ci-dessous un exemple pour convertir 4 bits Xb3:0 en un entier :", + "", + " || {v := } ||", + " 3 ||-----------------------------------{ 0 MOV}--||", + " || ||", + " || Xb0 {ADD v :=} ||", + " ||-------] [------------------{ v + 1 }-----------||", + " || ||", + " || Xb1 {ADD v :=} ||", + " ||-------] [------------------{ v + 2 }-----------||", + " || ||", + " || Xb2 {ADD v :=} ||", + " ||-------] [------------------{ v + 4 }-----------||", + " || ||", + " || Xb3 {ADD v :=} ||", + " ||-------] [------------------{ v + 8 }-----------||", + " || ||", + "", + "Si l'instruction MOV est déplacée en dessous des instructions ADD, la", + "valeur de la variable v, quand elle est lue autrepart dans le programme,", + "serait toujours 0. La sortie du code dépend alors de l'ordre d'évaluations", + "des instructions. Ce serait possible de modifier ce code pour éviter cela,", + "mais le code deviendrait très encombrant.", + "", + "DEFAUTS", + "=======", + "", + "LDmicro ne génére pas un code très efficace; il est lent à exécuter et", + "il est gourmand en Flash et RAM. Un PIC milieu de gamme ou un AVR peut", + "tout de même faire ce qu'un petit automate peut faire.", + "", + "La longueur maximum des noms de variables est très limitée, ceci pour", + "être intégrée correctement dans le diagramme logique, je ne vois pas de", + "solution satisfaisante pour solutionner ce problème.", + "", + "Si votre programme est trop important, vitesse exécution, mémoire", + "programme ou contraintes de mémoire de données pour le processeur que vous", + "avez choisi, il n'indiquera probablement pas d'erreur. Il se blocquera", + "simplement quelque part.", + "", + "Si vous êtes programmeur négligent dans les sauvegardes et les", + "chargements, il est possible qu'un crash se produise ou exécute un code", + "arbitraire corrompu ou un mauvais fichier .ld .", + "", + "SVP, faire un rapport sur les bogues et les demandes de modifications.", + "", + "Thanks to:", + " * Marcelo Solano, for reporting a UI bug under Win98", + " * Serge V. Polubarjev, for not only noticing that RA3:0 on the", + " PIC16F628 didn't work but also telling me how to fix it", + " * Maxim Ibragimov, for reporting and diagnosing major problems", + " with the till-then-untested ATmega16 and ATmega162 targets", + " * Bill Kishonti, for reporting that the simulator crashed when the", + " ladder logic program divided by zero", + " * Mohamed Tayae, for reporting that persistent variables were broken", + " on the PIC16F628", + " * David Rothwell, for reporting several user interface bugs and a", + " problem with the \"Export as Text\" function", + "", + "Particular thanks to Marcel Vaufleury, for this translation (of both", + "the manual and the program's user interface) into French.", + "", + "", + "COPYING, AND DISCLAIMER", + "=======================", + "", + "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE", + "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE", + "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION", + "OF LDMICRO OR CODE GENERATED BY LDMICRO.", + "", + "This program is free software: you can redistribute it and/or modify it", + "under the terms of the GNU General Public License as published by the", + "Free Software Foundation, either version 3 of the License, or (at your", + "option) any later version.", + "", + "This program is distributed in the hope that it will be useful, but", + "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY", + "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License", + "for more details.", + "", + "You should have received a copy of the GNU General Public License along", + "with this program. If not, see .", + "", + "", + "Jonathan Westhues", + "", + "Rijswijk -- Dec 2004", + "Waterloo ON -- Jun, Jul 2005", + "Cambridge MA -- Sep, Dec 2005", + " Feb, Mar 2006", + "", + "Email: user jwesthues, at host cq.cx", + "", + "", + NULL +}; +#endif + +#ifdef LDLANG_TR +char *HelpTextTr[] = { + "", + "KULLANIM KÝTAPÇIÐI", + "==================", + "LDMicro desteklenen MicroChip PIC16 ve Atmel AVR mikrokontrolcüler için ", + "gerekli kodu üretir. Bu iþ için kullanýlabilecek deðiþik programlar vardýr.", + "Örneðin BASIC, C, assembler gibi. Bu programlar kendi dillerinde yazýlmýþ", + "programlarý iþlemcilerde çalýþabilecek dosyalar haline getirirler.", + "", + "PLC'de kullanýlan dillerden biri ladder diyagramýdýr. Aþaðýda LDMicro ile", + "yazýlmýþ basit bir program görülmektedir.", + "", + " || ||", + " || Xbutton1 Tdon Rchatter Yred ||", + " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||", + " || | ||", + " || Xbutton2 Tdof | ||", + " ||-------]/[---------[TOF 2.000 s]-+ ||", + " || ||", + " || ||", + " || ||", + " || Rchatter Ton Tnew Rchatter ||", + " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||", + " || ||", + " || ||", + " || ||", + " ||------[END]---------------------------------------------------------||", + " || ||", + " || ||", + "", + "(TON=turn-on gecikme; TOF-turn-off gecikme. --] [-- giriþler, diðer bir ", + "deyiþle kontaklardýr. --( )-- ise çýkýþlardýr. Bunlar bir rölenin bobini ", + "gibi davranýrlar. Ladder diyagramý ile ilgili bol miktarda kaynak internet", + "üzerinde bulunmaktadýr. Burada LDMicro'ya has özelliklerden bahsedeceðiz.", + "", + "LDmicro ladder diyagramýný PIC16 veya AVR koduna çevirir. Aþaðýda desteklenen", + "iþlemcilerin listesi bulunmaktadýr:", + " * PIC16F877", + " * PIC16F628", + " * PIC16F876 (denenmedi)", + " * PIC16F88 (denenmedi)", + " * PIC16F819 (denenmedi)", + " * PIC16F887 (denenmedi)", + " * PIC16F886 (denenmedi)", + " * ATmega128", + " * ATmega64", + " * ATmega162 (denenmedi)", + " * ATmega32 (denenmedi)", + " * ATmega16 (denenmedi)", + " * ATmega8 (denenmedi)", + "", + "Aslýnda daha fazla PIC16 ve AVR iþlemci desteklenebilir. Ancak test ettiklerim", + "ve desteklediðini düþündüklerimi yazdým. Örneðin PIC16F648 ile PIC16F628 ", + "arasýnda fazla bir fark bulunmamaktadýr. Eðer bir iþlemcinin desteklenmesini", + "istiyorsanýz ve bana bildirirseniz ilgilenirim.", + "", + "LDMicro ile ladder diyagramýný çizebilir, devrenizi denemek için gerçek zamanlý ", + "simülasyon yapabilirsiniz. Programýnýzýn çalýþtýðýndan eminseniz programdaki ", + "giriþ ve çýkýþlara mikrokontrolörün bacaklarýný atarsýnýz. Ýþlemci bacaklarý ", + "belli olduktan sonra programýnýzý derleyebilirsiniz. Derleme sonucunda oluþan", + "dosya .hex dosyasýdýr. Bu dosyayý PIC/AVR programlayýcý ile iþlemcinize kaydedersiniz.", + "PIC/AVR ile uðraþanlar konuya yabancý deðildir.", + "", + "", + "LDMicro ticari PLC programlarý gibi tasarlanmýþtýr. Bazý eksiklikler vardýr. ", + "Kitapçýðý dikkatlice okumanýzý tavsiye ederim. Kullaným esnasýnda PLC ve ", + "PIC/AVR hakkýnda temel bilgilere sahip olduðunuz düþünülmüþtür.", + "", + "DÝÐER AMAÇLAR", + "==================", + "", + "ANSI C kodunu oluþturmak mümkündür. C derleyicisi olan herhangi bir", + "iþlemci için bu özellikten faydalanabilirsiniz. Ancak çalýþtýrmak için ", + "gerekli dosyalarý siz saðlamalýsýnýz. Yani, LDMicro sadece PlcCycle()", + "isimli fonksiyonu üretir. Her döngüde PlcCycle fonksiyonunu çaðýrmak, ve", + "PlcCycle() fonksiyonunun çaðýrdýðý dijital giriþi yazma/okuma vs gibi", + "G/Ç fonksiyonlarý sizin yapmanýz gereken iþlemlerdir.", + "Oluþturulan kodu incelerseniz faydalý olur.", + "", + "KOMUT SATIRI SEÇENEKLERÝ", + "========================", + "", + "Normal þartlarda ldmicro.exe komut satýrýndan seçenek almadan çalýþýr.", + "LDMicro'ya komut satýrýndan dosya ismi verebilirsiniz. Örneðin;komut", + "satýrýndan 'ldmicro.exe asd.ld' yazarsanýz bu dosya açýlmaya çalýþýrlýr.", + "Dosya varsa açýlýr. Yoksa hata mesajý alýrsýnýz. Ýsterseniz .ld uzantýsýný", + "ldmicro.exe ile iliþkilendirirseniz .ld uzantýlý bir dosyayý çift týklattýðýnýzda", + "bu dosya otomatik olarak açýlýr. Bkz. Klasör Seçenekleri (Windows).", + "", + "`ldmicro.exe /c src.ld dest.hex', þeklinde kullanýlýrsa src.ld derlenir", + "ve hazýrlanan derleme dest.hex dosyasýna kaydedilir. Ýþlem bitince LDMicro kapanýr.", + "Oluþabilecek tüm mesajlar konsoldan görünür.", + "", + "TEMEL BÝLGÝLER", + "==============", + "", + "LDMicro açýldýðýnda boþ bir program ile baþlar. Varolan bir dosya ile baþlatýrsanýz", + "bu program açýlýr. LDMicro kendi dosya biçimini kullandýðýndan diðer dosya", + "biçimlerinden dosyalarý açamazsýnýz.", + "", + "Boþ bir dosya ile baþlarsanýz ekranda bir tane boþ satýr görürsünüz. Bu satýra", + "komutlarý ekleyebilir, satýr sayýsýný artýrabilirsiniz. Satýrlara Rung denilir.", + "Örneðin; Komutlar->Kontak Ekle diyerek bir kontak ekleyebilirsiniz. Bu kontaða", + "'Xnew' ismi verilir. 'X' bu kontaðýn iþlemcinin bacaðýna denk geldiðini gösterir.", + "Bu kontaða derlemeden önce isim vermeli ve mikrokontrolörün bir bacaðý ile", + "eþleþtirmelisiniz. Eþleþtirme iþlemi içinde önce iþlemciyi seçmelisiniz.", + "Elemanlarýn ilk harfi o elemanýn ne olduðu ile ilgilidir. Örnekler:", + "", + " * Xname -- mikrokontrolördeki bir giriþ bacaðý", + " * Yname -- mikrokontrolördeki bir çýkýþ bacaðý", + " * Rname -- `dahili röle': hafýzada bir bit.", + " * Tname -- zamanlayýcý; turn-on, turn-off yada retentive ", + " * Cname -- sayýcý, yukarý yada aþaðý sayýcý", + " * Aname -- A/D çeviriciden okunan bir tamsayý deðer", + " * name -- genel deðiþken (tamsayý)", + "", + "Ýstediðiniz ismi seçebilirsiniz. Seçilen bir isim nerede kullanýlýrsa", + "kullanýlsýn ayný yere denk gelir. Örnekler; bir satýrda Xasd kullandýðýnýzda", + "bir baþka satýrda Xasd kullanýrsanýz ayný deðere sahiptirler. ", + "Bazen bu mecburi olarak kullanýlmaktadýr. Ancak bazý durumlarda hatalý olabilir.", + "Mesela bir (TON) Turn-On Gecikmeye Tgec ismini verdikten sonra bir (TOF)", + "Turn_Off gecikme devresine de Tgec ismini verirseniz hata yapmýþ olursunuz.", + "Dikkat ederseniz yaptýðýnýz bir mantýk hatasýdýr. Her gecikme devresi kendi", + "hafýzasýna sahip olmalýdýr. Ama Tgec (TON) turn-on gecikme devresini sýfýrlamak", + "için kullanýlan RES komutunda Tgec ismini kullanmak gerekmektedir.", + "", + "Deðiþken isimleri harfleri, sayýlarý, alt çizgileri ihtiva edebilir.", + "(_). Deðiþken isimleri sayý ile baþlamamalýdýr. Deðiþken isimleri büyük-küçük harf duyarlýdýr.", + "Örneðin; TGec ve Tgec ayný zamanlayýcýlar deðildir.", + "", + "", + "Genel deðiþkenlerle ilgili komutlar (MOV, ADD, EQU vs) herhangi bir", + "isimdeki deðiþkenlerle çalýþýr. Bunun anlamý bu komutlar zamanlayýcýlar", + "ve sayýcýlarla çalýþýr. Zaman zaman bu faydalý olabilir. Örneðin; bir ", + "zamanlayýcýnýn deðeri ile ilgili bir karþýlaþtýrma yapabilirsiniz.", + "", + "Deðiþkenler hr zaman için 16 bit tamsayýdýr. -32768 ile 32767 arasýnda", + "bir deðere sahip olabilirler. Her zaman için iþaretlidir. (+ ve - deðere", + "sahip olabilirler) Onluk sayý sisteminde sayý kullanabilirsiniz. Týrnak", + "arasýna koyarak ('A', 'z' gibi) ASCII karakterler kullanabilirsiniz.", + "", + "Ekranýn alt tarafýndaki kýsýmda kullanýlan tüm elemanlarýn bir listesi görünür.", + "Bu liste program tarafýndan otomatik olarak oluþturulur ve kendiliðinden", + "güncelleþtirilir. Sadece 'Xname', 'Yname', 'Aname' elemanlarý için", + "mikrokontrolörün bacak numaralarý belirtilmelidir. Önce Ayarlar->Ýþlemci Seçimi", + "menüsünden iþlemciyi seçiniz. Daha sonra G/Ç uçlarýný çift týklatarak açýlan", + "pencereden seçiminizi yapýnýz.", + "", + "Komut ekleyerek veya çýkararak programýnýzý deðiþtirebilirsiniz. Programdaki", + "kursör eleman eklenecek yeri veya hakkýnda iþlem yapýlacak elemaný göstermek", + "amacýyla yanýp söner. Elemanlar arasýnda tuþu ile gezinebilirsiniz. Yada", + "elemaný fare ile týklatarak iþlem yapýlacak elemaný seçebilirsiniz. Kursör elemanýn", + "solunda, saðýnda, altýnda ve üstünde olabilir. Solunda ve saðýnda olduðunda", + "ekleme yaptýðýnýzda eklenen eleman o tarafa eklenir. Üstünde ve altýnda iken", + "eleman eklerseniz eklenen eleman seçili elemana paralel olarak eklenir.", + "Bazý iþlemleri yapamazsýnýz. Örneðin bir bobinin saðýna eleman ekleyemezsiniz.", + "LDMicro buna izin vermeyecektir.", + "", + "Program boþ bir satýrla baþlar. Kendiniz alta ve üste satýr ekleyerek dilediðiniz", + "gibi diyagramýnýzý oluþturabilirsiniz. Yukarýda bahsedildiði gibi alt devreler", + "oluþturabilirsiniz.", + "", + "Programýnýz yazdýðýnýzda simülasyon yapabilir, .hex dosyasýný oluþturabilirsiniz.", + "", + "SÝMÜLASYON", + "==========", + "", + "Simülasyon moduna geçmek için Simülasyon->Simülasyon modu menüsünü týklatabilir,", + "yada tuþ kombinasyonuna basabilirsiniz. Simülasyon modunda program", + "farklý bir görüntü alýr. Kursör görünmez olur. Enerji alan yerler ve elemanlar", + "parlak kýrmýzý, enerji almayan yerler ve elemanlar gri görünür. Boþluk tuþuna", + "basarak bir çevrim ilerleyebilir yada menüden Simülasyon->Gerçek Zamanlý Simülasyonu Baþlat", + "diyerek (veya ) devamlý bir çevrim baþlatabilirsiniz. Ladder diyagramýnýn", + "çalýþmasýna göre gerçek zamanlý olarak elemanlar ve yollar program tarafýndan deðiþtirilir.", + "", + "Giriþ elemanlarýnýn durumunu çift týklatarak deðiþtirebilirsiniz. Mesela, 'Xname'", + "kontaðýný çift týklatýranýz açýktan kapalýya veya kapalýdan açýða geçiþ yapar.", + "", + "DERLEME", + "=======", + "", + "Ladder diyagramýnýn yapýlmasýndaki amaç iþlemciye yüklenecek .hex dosyasýnýn", + "oluþturulmasýdýr. Buna 'derleme' denir. Derlemeden önce þu aþamalar tamamlanmalýdýr:", + " 1- Ýþlemci seçilmelidir. Ayarlar->Ýþlemci Seçimi menüsünden yapýlýr.", + " 2- G/Ç uçlarýnýn mikrokontrolördeki hangi bacaklara baðlanacaðý seçilmelidir.", + " Elemanýn üzerine çift týklanýr ve çýkan listeden seçim yapýlýr.", + " 3- Çevrim süresi tanýmlanmalýdýr. Ayarlar->Ýþlemci Ayarlarý menüsünden yapýlýr.", + " Bu süre iþlemcinin çalýþtýðý frekansa baðlýdýr. Çoðu uygulamalar için 10ms", + " uygun bir seçimdir. Ayný yerden kristal frekansýný ayarlamayý unutmayýnýz.", + "", + "Artýk kodu üretebilirsiniz. Derle->Derle yada Derle->Farklý Derle seçeneklerinden", + "birini kullanacaksýnýz. Aradaki fark Kaydet ve Farklý Kaydet ile aynýdýr. Sonuçta", + "Intel IHEX dosyanýz programýnýzda hata yoksa üretilecektir. Programýnýzda hata varsa", + "uyarý alýrsýnýz.", + "", + "Progamlayýcýnýz ile bu dosyayý iþlemcinize yüklemelisiniz. Buradaki en önemli nokta", + "iþlemcinin konfigürasyon bitlerinin ayarlanmasýdýr. PIC16 iþlemciler için gerekli ", + "ayar bilgileri hex dosyasýna kaydedildiðinden programlayýcýnýz bu ayarlarý algýlayacaktýr.", + "Ancak AVR iþlemciler için gerekli ayarlarý siz yapmalýsýnýz.", + "", + "KOMUTLAR ve ELEMANLAR", + "=====================", + "", + "> KONTAK, NORMALDE AÇIK Xname Rname Yname", + " ----] [---- ----] [---- ----] [----", + "", + " Normalde açýk bir anahtar gibi davranýr. Komutu kontrol eden sinyal 0 ise ", + " çýkýþýndaki sinyalde 0 olur. Eðer kontrol eden sinyal 1 olursa çýkýþý da 1", + " olur ve çýkýþa baðlý bobin aktif olur. Bu kontak iþlemci bacaðýndan alýnan", + " bir giriþ, çýkýþ bacaðý yada dahili bir röle olabilir.", + "", + "", + "> KONTAK, NORMALDE KAPALI Xname Rname Yname", + " ----]/[---- ----]/[---- ----]/[----", + "", + " Normalde kapalý bir anahtar gibi davranýr. Komutun kontrol eden sinyal 0 ise", + " çýkýþý 1 olur. Eðer kontrol eden sinyal 1 olursa çýkýþý 0 olur ve çýkýþa", + " baðlý elemanlar pasif olur. Normalde çýkýþa gerilim verilir, ancak bu kontaðý ", + " kontrol eden sinyal 1 olursa kontaðýn çýkýþýnda gerilim olmaz. Bu kontak ", + " iþlemci bacaðýndan alýnan bir giriþ, çýkýþ bacaðý yada dahili bir röle olabilir", + "", + "", + "> BOBÝN, NORMAL Rname Yname", + " ----( )---- ----( )----", + "", + " Elemana giren sinyal 0 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.", + " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.", + " Bobine giriþ deðiþkeni atamak mantýksýzdýr. Bu eleman bir satýrda", + " saðdaki en son eleman olmalýdýr.", + "", + "", + "> BOBÝN, TERSLENMÝÞ Rname Yname", + " ----(/)---- ----(/)----", + "", + " Elemana giren sinyal 0 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.", + " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.", + " Bobine giriþ deðiþkeni atamak mantýksýzdýr. Bu eleman bir satýrda", + " saðdaki en son eleman olmalýdýr. Normal bobinin tersi çalýþýr.", + " ", + "", + "> BOBÝN, SET Rname Yname", + " ----(S)---- ----(S)----", + "", + " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.", + " Diðer durumlarda bu bobinin durumunda bir deðiþiklik olmaz. Bu komut", + " bobinin durumunu sadece 0'dan 1'e çevirir. Bu nedenle çoðunlukla", + " BOBÝN-RESET ile beraber çalýþýr. Bu eleman bir satýrda saðdaki en", + " son eleman olmalýdýr.", + "", + "", + "> BOBÝN, RESET Rname Yname", + " ----(R)---- ----(R)----", + "", + " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.", + " Diðer durumlarda bu bobinin durumunda bir deðiþiklik olmaz. Bu komut", + " bobinin durumunu sadece 1'dEn 0'a çevirir. Bu nedenle çoðunlukla", + " BOBÝN-SET ile beraber çalýþýr. Bu eleman bir satýrda saðdaki en", + " son eleman olmalýdýr.", + "", + "", + "> TURN-ON GECÝKME Tdon ", + " -[TON 1.000 s]-", + "", + " Bir zamanlayýcýdýr. Giriþindeki sinyal 0'dan 1'e geçerse ayarlanan", + " süre kadar sürede çýkýþ 0 olarak kalýr, süre bitince çýkýþý 1 olur. ", + " Giriþindeki sinyal 1'den 0'a geçerse çýkýþ hemen 0 olur.", + " Giriþi 0 olduðu zaman zamanlayýcý sýfýrlanýr. Ayrýca; ayarlanan süre", + " boyunca giriþ 1 olarak kalmalýdýr.", + "", + " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.", + " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý", + " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)", + "", + "", + "> TURN-OFF GECÝKME Tdoff ", + " -[TOF 1.000 s]-", + "", + " Bir zamanlayýcýdýr. Giriþindeki sinyal 1'den 0'a geçerse ayarlanan", + " süre kadar sürede çýkýþ 1 olarak kalýr, süre bitince çýkýþý 0 olur. ", + " Giriþindeki sinyal 0'dan 1'e geçerse çýkýþ hemen 1 olur.", + " Giriþi 0'dan 1'e geçtiðinde zamanlayýcý sýfýrlanýr. Ayrýca; ayarlanan", + " süre boyunca giriþ 0 olarak kalmalýdýr.", + "", + " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.", + " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý", + " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)", + "", + "", + "> SÜRE SAYAN TURN-ON GECÝKME Trto ", + " -[RTO 1.000 s]-", + "", + " Bu zamanlayýcý giriþindeki sinyalin ne kadar süre ile 1 olduðunu", + " ölçer. Ayaralanan süre boyunca giriþ 1 ise çýkýþý 1 olur. Aksi halde", + " çýkýþý 0 olur. Ayarlanan süre devamlý olmasý gerekmez. Örneðin; süre ", + " 1 saniyeye ayarlanmýþsa ve giriþ önce 0.6 sn 1 olmuþsa, sonra 2.0 sn", + " boyunca 0 olmuþsa daha sonra 0.4 sn boyunca giriþ tekrar 1 olursa", + " 0.6 + 0.4 = 1sn olduðundan çýkýþ 1 olur. Çýkýþ 1 olduktan sonra", + " giriþ 0 olsa dahi çýkýþ 0'a dönmez. Bu nedenle zamanlayýcý RES reset", + " komutu ile resetlenmelidir.", + "", + " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.", + " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý", + " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)", + "", + "", + "> RESET (SAYICI SIFIRLAMASI) Trto Citems", + " ----{RES}---- ----{RES}----", + "", + " Bu komut bir zamanlayýcý veya sayýcýyý sýfýrlar. TON ve TOF zamanlayýcý", + " komutlarý kendiliðinden sýfýrlandýðýndan bu komuta ihtiyaç duymazlar.", + " RTO zamanlayýcýsý ve CTU/CTD sayýcýlarý kendiliðinden sýfýrlanmadýðýndan", + " sýfýrlanmalarý için kullanýcý tarafýndan bu komutile sýfýrlanmasý", + " gerekir. Bu komutun giriþi 1 olduðunda sayýcý/zamanlayýcý sýfýrlanýr.", + " Bu komut bir satýrýn saðýndaki son komut olmalýdýr.", + "", + "", + "> YÜKSELEN KENAR _", + " --[OSR_/ ]--", + "", + " Bu komutun çýkýþý normalde 0'dýr. Bu komutun çýkýþýnýn 1 olabilmesi", + " için bir önceki çevrimde giriþinin 0 þimdiki çevrimde giriþinin 1 ", + " olmasý gerekir. Komutun çýkýþý bir çevrimlik bir pals üretir.", + " Bu komut bir sinyalin yükselen kenarýnda bir tetikleme gereken", + " uygulamalarda faydalýdýr.", + " ", + "", + "> DÜÞEN KENAR _", + " --[OSF \\_]--", + "", + " Bu komutun çýkýþý normalde 0'dýr. Bu komutun çýkýþýnýn 1 olabilmesi", + " için bir önceki çevrimde giriþinin 1 þimdiki çevrimde giriþinin 0 ", + " olmasý gerekir. Komutun çýkýþý bir çevrimlik bir pals üretir.", + " Bu komut bir sinyalin düþen kenarýnda bir tetikleme gereken", + " uygulamalarda faydalýdýr.", + "", + "", + "> KISA DEVRE, AÇIK DEVRE", + " ----+----+---- ----+ +----", + "", + " Kýsa devrenin çýkýþý her zaman giriþinin aynýsýdýr.", + " Açýk devrenin çýkýþý her zaman 0'dýr. Bildiðimiz açýk/kýsa devrenin", + " aynýsýdýr. Genellikle hata aramada kullanýlýrlar.", + "", + "> ANA KONTROL RÖLESÝ", + " -{MASTER RLY}-", + "", + " Normalde her satýrýn ilk giriþi 1'dir. Birden fazla satýrýn tek bir þart ile ", + " kontrol edilmesi gerektiðinde paralel baðlantý yapmak gerekir. Bu ise zordur.", + " Bu iþlemi kolayca yapabilmek için ana kontrol rölesini kullanabiliriz.", + " Ana kontrol rölesi eklendiðinde kendisinden sonraki satýrlar bu röleye baðlý", + " hale gelir. Böylece; birden fazla satýr tek bir þart ile kontrolü saðlanýr.", + " Bir ana kontrol rölesi kendisinden sonra gelen ikinci bir ana kontrol", + " rölesine kadar devam eder. Diðer bir deyiþle birinci ana kontrol rölesi", + " baþlangýcý ikincisi ise bitiþi temsil eder. Ana kontrol rölesi kullandýktan", + " sonra iþlevini bitirmek için ikinci bir ana kontrol rölesi eklemelisiniz.", + "", + "> MOVE {destvar := } {Tret := }", + " -{ 123 MOV}- -{ srcvar MOV}-", + "", + " Giriþi 1 olduðunda verilen sabit sayýyý (123 gibi) yada verilen deðiþkenin", + " içeriðini (srcvar) belirtilen deðiþkene (destvar) atar. Giriþ 0 ise herhangi", + " bir iþlem olmaz. Bu komut ile zamanlayýcý ve sayýcýlar da dahil olmak üzere", + " tüm deðiþkenlere deðer atayabilirsiniz. Örneðin Tsay zamanlayýcýsýna MOVE ile", + " 0 atamak ile RES ile sýfýrlamak ayný sonucu doðurur. Bu komut bir satýrýn", + " saðýndaki en son komut olmalýdýr.", + "", + "> MATEMATÝK ÝÞLEMLER {ADD kay :=} {SUB Ccnt :=}", + " -{ 'a' + 10 }- -{ Ccnt - 10 }-", + "", + "> {MUL dest :=} {DIV dv := }", + " -{ var * -990 }- -{ dv / -10000}-", + "", + " Bu komutun giriþi doðru ise belirtilen hedef deðiþkenine verilen matematik", + " iþlemin sonucunu kaydeder. Ýþlenen bilgi zamanlayýcý ve sayýcýlar dahil", + " olmak üzere deðiþkenler yada sabit sayýlar olabilir. Ýþlenen bilgi 16 bit", + " iþaretli sayýdýr. Her çevrimde iþlemin yeniden yapýldýðý unutulmamalýdýr.", + " Örneðin artýrma yada eksiltme yapýyorsanýz yükselen yada düþen kenar", + " kullanmanýz gerekebilir. Bölme (DIV) virgülden sonrasýný keser. Örneðin;", + " 8 / 3 = 2 olur. Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + "", + "> KARÞILAÞTIRMA [var ==] [var >] [1 >=]", + " -[ var2 ]- -[ 1 ]- -[ Ton]-", + "", + "> [var /=] [-4 < ] [1 <=]", + " -[ var2 ]- -[ vartwo]- -[ Cup]-", + "", + " Deðiþik karþýlaþtýrma komutlarý vardýr. Bu komutlarýn giriþi doðru (1)", + " ve verilen þart da doðru ise çýkýþlarý 1 olur.", + "", + "", + "> SAYICI Cname Cname", + " --[CTU >=5]-- --[CTD >=5]--", + "", + " Sayýcýlar giriþlerinin 0'dan 1'e her geçiþinde yani yükselen kenarýnda", + " deðerlerini 1 artýrýr (CTU) yada eksiltirler (CTD). Verilen þart doðru ise", + " çýkýþlarý aktif (1) olur. CTU ve CTD sayýcýlarýna ayný ismi erebilirsiniz.", + " Böylece ayný sayýcýyý artýrmýþ yada eksiltmiþ olursunuz. RES komutu sayýcýlarý", + " sýfýrlar. Sayýcýlar ile genel deðiþkenlerle kullandýðýnýz komutlarý kullanabilirsiniz.", + "", + "", + "> DAÝRESEL SAYICI Cname", + " --{CTC 0:7}--", + "", + " Normal yukarý sayýcýdan farký belirtilen limite ulaþýnca sayýcý tekrar 0'dan baþlar", + " Örneðin sayýcý 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2,.... þeklinde", + " sayabilir. Yani bir dizi sayýcý olarak düþünülebilir. CTC sayýcýlar giriþlerinin", + " yükselen kenarýnda deðer deðiþtirirler. Bu komut bir satýrýn saðýndaki", + " en son komut olmalýdýr.", + " ", + "", + "> SHIFT REGISTER {SHIFT REG }", + " -{ reg0..3 }-", + "", + " Bir dizi deðiþken ile beraber çalýþýr. Ýsim olarak reg verdiðinizi ve aþama ", + " sayýsýný 3 olarak tanýmladýysanýz reg0, reg1, reg2 deðikenleri ile çalýþýrsýnýz.", + " Kaydedicinin giriþi reg0 olur. Giriþin her yükselen kenarýnda deðerler kaydedicide", + " bir saða kayar. Mesela; `reg2 := reg1'. and `reg1 := reg0'. `reg0' deðiþmez.", + " Geniþ bir kaydedici hafýzada çok yer kaplar.", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + "", + "> DEÐER TABLOSU {dest := }", + " -{ LUT[i] }-", + "", + " Deðer tablosu sýralanmýþ n adet deðer içeren bir tablodur. Giriþi doðru olduðunda", + " `dest' tamsayý deðiþkeni `i' tamsayý deðiþkenine karþýlýk gelen deðeri alýr. Sýra", + " 0'dan baþlar. bu nedenle `i' 0 ile (n-1) arasýnda olabilir. `i' bu deðerler ", + " arasýnda deðilse komutun ne yapacaðý tanýmlý deðildir.", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + "", + "> PIECEWISE LINEAR TABLE {yvar := }", + " -{ PWL[xvar] }-", + "", + " Bir matris tablo olarak düþünülebilir. Bir deðere baðlý olarak deðerin önceden", + " belirlenen bir baþka deðer ile deðiþtirilmesi içi oluþturulan bir tablodur.", + " Bu bir eðri oluþturmak, sensörden alýnan deðere göre çýkýþta baþka bir eðri", + " oluþturmak gibi amaçlar için kullanýlabilir.", + "", + " Farzedelimki x tamsayý giriþ deðerini y tamsayý çýkýþ deðerine yaklaþtýrmak ", + " istiyoruz. Deðerlerin belirli noktalarda olduðunu biliyoruz. Örneðin;", + "", + " f(0) = 2", + " f(5) = 10", + " f(10) = 50", + " f(100) = 100", + "", + " Bu þu noktalarýn eðride olduðunu gösterir:", + "", + " (x0, y0) = ( 0, 2)", + " (x1, y1) = ( 5, 10)", + " (x2, y2) = ( 10, 50)", + " (x3, y3) = (100, 100)", + "", + " Dört deðeri parçalý lineer tabloya gireriz. Komut, xvar'ýn deðerine bakarak", + " yvar'a deðer verir. Örneðin, yukarýdaki örneðe bakarak, xvar = 10 ise", + " yvar = 50 olur.", + " ", + " Tabloya kayýtlý iki deðerin arasýnda bir deðer verirseniz verilen deðer de", + " alýnmasý gereken iki deðerin arasýnda uygun gelen yerde bir deðer olur.", + " Mesela; xvar=55 yazarsanýz yvar=75 olur. (Tablodaki deðerler (10,50) ve", + " (100,100) olduðuna göre). 55, 10 ve 100 deðerlerinin ortasýndadýr. Bu", + " nedenle 55 ve 75 deðerlerinin ortasý olan 75 deðeri alýnýr.", + " ", + " Deðerler x koordinatýnda artan deðerler olarak yazýlmalýdýr. 16 bit tamsayý", + " kullanan bazý deðerler için arama tablosu üzerinde matematik iþlemler", + " gerçekleþmeyebilir. Bu durumda LDMicro sizi uyaracaktýr. Örneðin aþaðýdaki", + " tablo bir hata oluþturacaktýr:", + "", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (300, 300)", + "", + " Bu tip hatalarý noktalar arsýnda ara deðerler oluþturarak giderebilirsiniz.", + " Örneðin aþaðýdaki tablo yukarýdakinin aynýsý olmasýna raðmen hata ", + " oluþturmayacaktýr.", + " ", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (150, 150)", + " (x2, y2) = (300, 300)", + "", + " Genelde 5 yada 6 noktadan daha fazla deðer kullanmak gerekmeyecektir.", + " Daha fazla nokta demek daha fazla kod ve daha yavaþ çalýþma demektir.", + " En fazla 10 nokta oluþturabilirsiniz. xvar deðiþkenine x koordinatýnda", + " tablonun en yüksek deðerinden daha büyük bir deðer girmenin ve en düþük", + " deðerinden daha küçük bir deðer girmenin sonucu tanýmlý deðildir.", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + "> A/D ÇEVÝRÝCÝDEN OKUMA Aname", + " --{READ ADC}--", + "", + " LDmicro A/D çeviriciden deðer okumak için gerekli kodlarý desteklediði", + " iþlemciler için oluþturabilir. Komutun giriþi 1 olduðunda A/D çeviriciden ", + " deðer okunur ve okunan deðer `Aname' deðiþkenine aktarýlýr. Bu deðiþken", + " üzerinde genel deðiþkenlerle kullanýlabilen iþlemler kullanýlabilir.", + " (büyük, küçük, büyük yada eþit gibi). Bu deðiþkene iþlemcinin bacaklarýndan", + " uygun biri tanýmlanmalýdýr. Komutun giriþi 0 ise `Aname'deðiþkeninde bir", + " deðiþiklik olmaz.", + " ", + " Þu an desteklenen iþlemciler için; 0 Volt için ADC'den okunan deðer 0, ", + " Vdd (besleme gerilimi) deðerine eþit gerilim deðeri için ADC'den okunan deðer", + " 1023 olmaktadýr. AVR kullanýyorsanýz AREF ucunu Vdd besleme gerilimine ", + " baðlayýnýz.", + " ", + " Aritmetik iþlemler ADC deðiþkeni için kullanýlabilir. Ayrýca bacak tanýmlarken", + " ADC olmayan bacaklarýn tanýmlanmasýný LDMicro engelleyecektir.", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + " > PWM PALS GENÝÞLÝÐÝ AYARI duty_cycle", + " -{PWM 32.8 kHz}-", + "", + " LDmicro desteklediði mikrokontrolörler için gerekli PWM kodlarýný üretebilir.", + " Bu komutun giriþi doðru (1) olduðunda PWM sinyalinin pals geniþliði duty_cycle", + " deðiþkeninin deðerine ayarlanýr. Bu deðer 0 ile 100 arasýnda deðiþir. Pals", + " geniþliði yüzde olarak ayarlanýr. Bir periyot 100 birim kabul edilirse bu", + " geniþliðin yüzde kaçýnýn palsi oluþturacaðý ayarlanýr. 0 periyodun tümü sýfýr", + " 100 ise periyodun tamamý 1 olsun anlamýna gelir. 10 deðeri palsin %10'u 1 geri", + " kalan %90'ý sýfýr olsun anlamýna gelir.", + "", + " PWM frekansýný ayarlayabilirsiniz. Verilen deðer Hz olarak verilir.", + " Verdiðiniz frekans kesinlikle ayarlanabilir olmalýdýr. LDMicro verdiðiniz deðeri", + " olabilecek en yakýn deðerle deðiþtirir. Yüksek hýzlarda doðruluk azalýr.", + " ", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + " Periyodun süresinin ölçülebilmesi için iþlemcinin zamanlayýcýlarýnýn bir tanesi", + " kullanýlýr. Bu nedenle PWM en az iki tane zamanlayýcýsý olan iþlemcilerde kullanýlýr.", + " PWM PIC16 iþlemcilerde CCP2'yi, AVR'lerde ise OC2'yi kullanýr.", + "", + "", + "> EEPROMDA SAKLA saved_var", + " --{PERSIST}--", + "", + " Bu komut ile belirtilen deðiþkenin EEPROM'da saklanmasý gereken bir deðiþken olduðunu", + " belirmiþ olursunuz. Komutun giriþi doðru ise belirtilen deðiþkenin içeriði EEPROM'a", + " kaydedilir. Enerji kesildiðinde kaybolmamasý istenen deðerler için bu komut kullanýlýr.", + " Deðiþkenin içeriði gerilim geldiðinde tekrar EEPROM'dan yüklenir. Ayrýca;", + " deðiþkenin içeriði her deðiþtiðinde yeni deðer tekrar EEPROM'a kaydedilir.", + " Ayrýca bir iþlem yapýlmasý gerekmez.", + " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.", + "", + "************************", + "> UART (SERÝ BÝLGÝ) AL var", + " --{UART RECV}--", + "", + " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde", + " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ", + " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,", + " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr. ", + " ", + " Bu komutun giriþi yanlýþsa herhangi bir iþlem yapýlmaz. Doðru ise UART'dan 1 karakter", + " alýnmaya çalýþýlýr. Okuma yapýlamaz ise komutun çýkýþý yanlýþ (0) olur. Karakter", + " okunursa okunan karakter `var' deðiþkeninde saklanýr ve komutun çýkýþý doðru (1) olur.", + " Çýkýþýn doðru olmasý sadece bir PLC çevrimi sürer.", + "", + "", + "> UART (SERÝ BÝLGÝ) GÖNDER var", + " --{UART SEND}--", + "", + " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde", + " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ", + " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,", + " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr.", + " ", + " Bu komutun giriþi yanlýþsa herhangi bir iþlem yapýlmaz. Doðru ise UART'dan 1 karakter", + " gönderilir. Gönderilecek karakter gönderme iþleminden önce `var' deðiþkeninde saklý", + " olmalýdýr. Komutun çýkýþý UART meþgulse (bir karakterin gönderildiði sürece)", + " doðru (1) olur. Aksi halde yanlýþ olur.", + " Çýkýþýn doðru olmasý sadece bir PLC çevrimi sürer.", + " ", + " Karakterin gönderilmesi belirli bir zaman alýr. Bu nedenle baþka bir karakter", + " göndermeden önce önceki karakterin gönderildiðini kontrol ediniz veya gönderme", + " iþlemlerinin arasýna geikme ekleyiniz. Komutun giriþini sadece çýkýþ yanlýþ", + " (UART meþgul deðilse)ise doðru yapýnýz.", + "", + " Bu komut yerine biçimlendirilmiþ kelime komutunu (bir sonraki komut) inceleyiniz.", + " Biçimlendirilmiþ kelime komutunun kullanýmý daha kolaydýr. Ýstediðiniz iþlemleri", + " daha rahat gerçekleþtirebilirsiniz.", + "", + "", + "> UART ÜZERÝNDEN BÝÇÝMLENDÝRÝLMÝÞ KELÝME var", + " -{\"Pressure: \\3\\r\\n\"}-", + "", + " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde", + " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ", + " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,", + " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr.", + "", + " Bu komutun giriþi yanlýþtan doðruya geçerse (yükselen kenar) ise seri port üzerinden", + " tüm kelimeyi gönderir. Eðer kelime `\\3' özel kodunu içeriyorsa dizi içeriði ", + " `var' deðiþkenin içeriði otomatik olarak kelimeye (string) çevrilerek`var'", + " deðiþkeninin içeriði ile deðiþtirilir. Deðiþkenin uzunluðu 3 karakter olacak þekilde", + " deðiþtirilir. Mesela; `var' deðiþkeninin içeriði 35 ise kelime 35 rakamýnýn baþýna bir", + " adet boþul eklenerek `Pressure: 35\\r\\n' haline getirilir. Veya `var'deðiþkeninin", + " içeriði 1453 ise yapýlacak iþlem belli olmaz. Bu durumda `\\4' kullanmak gerekebilir.", + "", + " Deðiþken negatif bir sayý olabilecekse `\\-3d' (veya `\\-4d') gibi uygun bir deðer", + " kullanmalýsýnýz. Bu durumda LDMicro negatif sayýlarýn önüne eksi iþareti, pozitif sayýlarýn", + " önüne ise bir boþluk karakteri yerleþtirecektir.", + "", + " Ayný anda birkaç iþlem tanýmlanýrsa, yada UART ile ilgili iþlemler birbirine", + " karýþýk hale getirilirse programýn davranýþý belirli olmayacaktýr. Bu nedenle", + " dikkatli olmalýsýnýz.", + "", + " Kullanýlabilecek özel karakterler (escape kodlarý) þunlardýr:", + " * \\r -- satýr baþýna geç", + " * \\n -- yeni satýr", + " * \\f -- kaðýdý ilerlet (formfeed)", + " * \\b -- bir karakter geri gel (backspace)", + " * \\xAB -- ASCII karakter kodu 0xAB (hex)", + "", + " Bu komutun çýkýþý bilgi gönderiyorken doðru diðer durumlarda yanlýþ olur.", + " Bu komut program hafýzasýnda çok yer kaplar.", + "", + "", + "MATEMATÝKSEL ÝÞLEMLER ÝLE ÝLGÝLÝ BÝLGÝ", + "======================================", + "", + "Unutmayýn ki, LDMicro 16-bit tamsayý matematik komutlarýna sahiptir.", + "Bu iþlemlerde kullanýlan deðerler ve hesaplamanýn sonucu -32768 ile", + "32767 arasýnda bir tamsayý olabilir.", + "", + "Mesela y = (1/x)*1200 formülünü hesaplamaya çalýþalým. x 1 ile 20", + "arasýnda bir sayýdýr. Bu durumda y 1200 ile 60 arasýnda olur. Bu sayý", + "16-bit bir tamsayý sýnýrlarý içindedir. Ladder diyagramýmýzý yazalým.", + "Önce bölelim, sonra çarpma iþlemini yapalým:", + "", + " || {DIV temp :=} ||", + " ||---------{ 1 / x }----------||", + " || ||", + " || {MUL y := } ||", + " ||----------{ temp * 1200}----------||", + " || ||", + "", + "Yada bölmeyi doðrudan yapalým:", + "", + " || {DIV y :=} ||", + " ||-----------{ 1200 / x }-----------||", + "", + "Matematiksel olarak iki iþlem aynýd sonucu vermelidir. Ama birinci iþlem", + "yanlýþ sonuç verecektir. (y=0 olur). Bu hata `temp' deðiþkeninin 1'den", + "küçük sonuç vermesindendir.Mesela x = 3 iken (1 / x) = 0.333 olur. Ama", + "0.333 bir tamsayý deðildir. Bu nedenle sonuç 0 olur. Ýkinci adýmda ise", + "y = temp * 1200 = 0 olur. Ýkinci þekilde ise bölen bir tamsayý olduðundan", + "sonuç doðru çýkacaktýr.", + "", + "Ýþlemlerinizde bir sorun varsa dikkatle kontrol ediniz. Ayrýca sonucun", + "baþa dönmemesine de dikkat ediniz. Mesela 32767 + 1 = -32768 olur.", + "32767 sýnýrý aþýlmýþ olacaktýr. ", + "", + "Hesaplamalarýnýzda mantýksal deðiþimler yaparak doðru sonuçlar elde edebilirsiniz.", + "Örneðin; y = 1.8*x ise formülünüzü y = (9/5)*x þeklinde yazýnýz.(1.8 = 9/5)", + "y = (9*x)/5 þeklindeki bir kod sonucu daha tutarlý hale getirecektir.", + "performing the multiplication first:", + "", + " || {MUL temp :=} ||", + " ||---------{ x * 9 }----------||", + " || ||", + " || {DIV y :=} ||", + " ||-----------{ temp / 5 }-----------||", + "", + "", + "KODALAMA ÞEKLÝ", + "==============", + "", + "Programýn saðladýðý kolaylýklardan faydalanýn. Mesela:", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || Xb Yb ||", + " ||-------] [------+-------( )-------||", + " || | ||", + " || | Yc ||", + " || +-------( )-------||", + " || ||", + "", + "yazmak aþaðýdakinden daha kolay olacaktýr.", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yb ||", + " 2 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yc ||", + " 3 ||-------] [--------------( )-------||", + " || ||", + "", + " * * *", + "", + "Yazdýðýnýz kodlarýn sonuçlarýna dikkat ediniz. Aþaðýdaki satýrlarda", + "mantýksýz bir programlama yapýlmýþtýr. Çünkü hem Xa hemde Xb ayný", + "anda doðru olabilir.", + "", + " || Xa {v := } ||", + " 1 ||-------] [--------{ 12 MOV}--||", + " || ||", + " || Xb {v := } ||", + " ||-------] [--------{ 23 MOV}--||", + " || ||", + " || ||", + " || ||", + " || ||", + " || [v >] Yc ||", + " 2 ||------[ 15]-------------( )-------||", + " || ||", + "", + "Aþaðýdaki satýrlar yukarda bahsi geçen tarzdadýr. Ancak yapýlan", + "iþlem 4-bit binary sayý tamsayýya çevrilmektedir.", + "", + " || {v := } ||", + " 3 ||-----------------------------------{ 0 MOV}--||", + " || ||", + " || Xb0 {ADD v :=} ||", + " ||-------] [------------------{ v + 1 }-----------||", + " || ||", + " || Xb1 {ADD v :=} ||", + " ||-------] [------------------{ v + 2 }-----------||", + " || ||", + " || Xb2 {ADD v :=} ||", + " ||-------] [------------------{ v + 4 }-----------||", + " || ||", + " || Xb3 {ADD v :=} ||", + " ||-------] [------------------{ v + 8 }-----------||", + " || ||", + "", + "", + "HATALAR (BUG)", + "=============", + "", + "LDmicro tarafýndan üretilen kodlar çok verimli kodlar deðildir. Yavaþ çalýþan", + "ve hafýzada fazla yer kaplayan kodlar olabilirler. Buna raðmen orta büyüklükte", + "bir PIC veya AVR küçük bir PLC'nin yaptýðý iþi yapar. Bu nedenle diðer sorunlar", + "yer yer gözardý edlebilir.", + "", + "Deðiþken isimleri çok uzun olmamalýdýr. ", + "", + "Programýnýz yada kullandýðýnýz hafýza seçtiðiniz iþlemcinin sahip olduðundan", + "büyükse LDMicro hata vermeyebilir. Dikkat etmezseniz programýnýz hatalý çalýþacaktýr.", + "", + "Bulduðunuz hatalarý yazara bildiriniz.", + "", + "Teþekkürler:", + " * Marcelo Solano, Windows 98'deki UI problemini bildirdiði için,", + " * Serge V. Polubarjev, PIC16F628 iþlemcisi seçildiðinde RA3:0'ýn çalýþmadýðý", + " ve nasýl düzelteceðimi bildirdiði için,", + " * Maxim Ibragimov, ATmega16 ve ATmega162 iþlemcileri test ettikleri, problemleri", + " bulduklarý ve bildirdikleri için,", + " * Bill Kishonti, sýfýra bölüm hatasý olduðunda simülasyonun çöktüðünü bildirdikleri", + " için,", + " * Mohamed Tayae, PIC16F628 iþlemcisinde EEPROM'da saklanmasý gereken deðiþkenlerin", + " aslýnda saklanmadýðýný bildirdiði için,", + " * David Rothwell, kullanýcý arayüzündeki birkaç problemi ve \"Metin Dosyasý Olarak Kaydet\"", + " fonksiyonundaki problemi bildirdiði için.", + "", + "", + "KOPYALAMA VE KULLANIM ÞARTLARI", + "==============================", + "", + "LDMICRO TARAFINDAN ÜRETÝLEN KODU ÝNSAN HAYATI VE ÝNSAN HAYATINI ETKÝLEYEBÝLECEK", + "PROJELERDE KULLANMAYINIZ. LDMICRO PROGRAMCISI LDMICRO'NUN KENDÝNDEN VE LDMICRO", + "ÝLE ÜRETÝLEN KODDAN KAYNAKLANAN HÝÇBÝR PROBLEM ÝÇÝN SORUMLULUK KABUL ETMEMEKTEDÝR.", + "", + "Bu program ücretsiz bir program olup, dilediðiniz gibi daðýtabilirsiniz,", + "kaynak kodda deðiþiklik yapabilirsiniz. Programýn kullanýmý Free Software Foundation", + "tarafýndan yazýlan GNU General Public License (version 3 ve sonrasý)þartlarýna baðlýdýr.", + "", + "Program faydalý olmasý ümidiyle daðýtýlmýþtýr. Ancak hiçbir garanti verilmemektedir.", + "Detaylar için GNU General Public License içeriðine bakýnýz.", + "", + "Söz konusu sözleþmenin bir kopyasý bu programla beraber gelmiþ olmasý gerekmektedir.", + "Gelmediyse adresinde bulabilirsiniz.", + "", + "", + "Jonathan Westhues", + "", + "Rijswijk -- Dec 2004", + "Waterloo ON -- Jun, Jul 2005", + "Cambridge MA -- Sep, Dec 2005", + " Feb, Mar 2006", + " Feb 2007", + "", + "Email: user jwesthues, at host cq.cx", + "", + "Türkçe Versiyon : ", + NULL +}; +#endif + +#if defined(LDLANG_EN) || defined(LDLANG_ES) || defined(LDLANG_IT) || defined(LDLANG_PT) +char *HelpText[] = { + "", + "INTRODUCTION", + "============", + "", + "LDmicro generates native code for certain Microchip PIC16 and Atmel AVR", + "microcontrollers. Usually software for these microcontrollers is written", + "in a programming language like assembler, C, or BASIC. A program in one", + "of these languages comprises a list of statements. These languages are", + "powerful and well-suited to the architecture of the processor, which", + "internally executes a list of instructions.", + "", + "PLCs, on the other hand, are often programmed in `ladder logic.' A simple", + "program might look like this:", + "", + " || ||", + " || Xbutton1 Tdon Rchatter Yred ||", + " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||", + " || | ||", + " || Xbutton2 Tdof | ||", + " ||-------]/[---------[TOF 2.000 s]-+ ||", + " || ||", + " || ||", + " || ||", + " || Rchatter Ton Tnew Rchatter ||", + " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||", + " || ||", + " || ||", + " || ||", + " ||------[END]---------------------------------------------------------||", + " || ||", + " || ||", + "", + "(TON is a turn-on delay; TOF is a turn-off delay. The --] [-- statements", + "are inputs, which behave sort of like the contacts on a relay. The", + "--( )-- statements are outputs, which behave sort of like the coil of a", + "relay. Many good references for ladder logic are available on the Internet", + "and elsewhere; details specific to this implementation are given below.)", + "", + "A number of differences are apparent:", + "", + " * The program is presented in graphical format, not as a textual list", + " of statements. Many people will initially find this easier to", + " understand.", + "", + " * At the most basic level, programs look like circuit diagrams, with", + " relay contacts (inputs) and coils (outputs). This is intuitive to", + " programmers with knowledge of electric circuit theory.", + "", + " * The ladder logic compiler takes care of what gets calculated", + " where. You do not have to write code to determine when the outputs", + " have to get recalculated based on a change in the inputs or a", + " timer event, and you do not have to specify the order in which", + " these calculations must take place; the PLC tools do that for you.", + "", + "LDmicro compiles ladder logic to PIC16 or AVR code. The following", + "processors are supported:", + " * PIC16F877", + " * PIC16F628", + " * PIC16F876 (untested)", + " * PIC16F88 (untested)", + " * PIC16F819 (untested)", + " * PIC16F887 (untested)", + " * PIC16F886 (untested)", + " * ATmega128", + " * ATmega64", + " * ATmega162 (untested)", + " * ATmega32 (untested)", + " * ATmega16 (untested)", + " * ATmega8 (untested)", + "", + "It would be easy to support more AVR or PIC16 chips, but I do not have", + "any way to test them. If you need one in particular then contact me and", + "I will see what I can do.", + "", + "Using LDmicro, you can draw a ladder diagram for your program. You can", + "simulate the logic in real time on your PC. Then when you are convinced", + "that it is correct you can assign pins on the microcontroller to the", + "program inputs and outputs. Once you have assigned the pins, you can", + "compile PIC or AVR code for your program. The compiler output is a .hex", + "file that you can program into your microcontroller using any PIC/AVR", + "programmer.", + "", + "LDmicro is designed to be somewhat similar to most commercial PLC", + "programming systems. There are some exceptions, and a lot of things", + "aren't standard in industry anyways. Carefully read the description", + "of each instruction, even if it looks familiar. This document assumes", + "basic knowledge of ladder logic and of the structure of PLC software", + "(the execution cycle: read inputs, compute, write outputs).", + "", + "", + "ADDITIONAL TARGETS", + "==================", + "", + "It is also possible to generate ANSI C code. You could use this with any", + "processor for which you have a C compiler, but you are responsible for", + "supplying the runtime. That means that LDmicro just generates source", + "for a function PlcCycle(). You are responsible for calling PlcCycle", + "every cycle time, and you are responsible for implementing all the I/O", + "(read/write digital input, etc.) functions that the PlcCycle() calls. See", + "the comments in the generated source for more details.", + "", + "Finally, LDmicro can generate processor-independent bytecode for a", + "virtual machine designed to run ladder logic code. I have provided a", + "sample implementation of the interpreter/VM, written in fairly portable", + "C. This target will work for just about any platform, as long as you", + "can supply your own VM. This might be useful for applications where you", + "wish to use ladder logic as a `scripting language' to customize a larger", + "program. See the comments in the sample interpreter for details.", + "", + "", + "COMMAND LINE OPTIONS", + "====================", + "", + "ldmicro.exe is typically run with no command line options. That means", + "that you can just make a shortcut to the program, or save it to your", + "desktop and double-click the icon when you want to run it, and then you", + "can do everything from within the GUI.", + "", + "If LDmicro is passed a single filename on the command line", + "(e.g. `ldmicro.exe asd.ld'), then LDmicro will try to open `asd.ld',", + "if it exists. An error is produced if `asd.ld' does not exist. This", + "means that you can associate ldmicro.exe with .ld files, so that it runs", + "automatically when you double-click a .ld file.", + "", + "If LDmicro is passed command line arguments in the form", + "`ldmicro.exe /c src.ld dest.hex', then it tries to compile `src.ld',", + "and save the output as `dest.hex'. LDmicro exits after compiling,", + "whether the compile was successful or not. Any messages are printed", + "to the console. This mode is useful only when running LDmicro from the", + "command line.", + "", + "", + "BASICS", + "======", + "", + "If you run LDmicro with no arguments then it starts with an empty", + "program. If you run LDmicro with the name of a ladder program (xxx.ld)", + "on the command line then it will try to load that program at startup.", + "LDmicro uses its own internal format for the program; it cannot import", + "logic from any other tool.", + "", + "If you did not load an existing program then you will be given a program", + "with one empty rung. You could add an instruction to it; for example", + "you could add a set of contacts (Instruction -> Insert Contacts) named", + "`Xnew'. `X' means that the contacts will be tied to an input pin on the", + "microcontroller. You could assign a pin to it later, after choosing a", + "microcontroller and renaming the contacts. The first letter of a name", + "indicates what kind of object it is. For example:", + "", + " * Xname -- tied to an input pin on the microcontroller", + " * Yname -- tied to an output pin on the microcontroller", + " * Rname -- `internal relay': a bit in memory", + " * Tname -- a timer; turn-on delay, turn-off delay, or retentive", + " * Cname -- a counter, either count-up or count-down", + " * Aname -- an integer read from an A/D converter", + " * name -- a general-purpose (integer) variable", + "", + "Choose the rest of the name so that it describes what the object does,", + "and so that it is unique within the program. The same name always refers", + "to the same object within the program. For example, it would be an error", + "to have a turn-on delay (TON) called `Tdelay' and a turn-off delay (TOF)", + "called `Tdelay' in the same program, since each counter needs its own", + "memory. On the other hand, it would be correct to have a retentive timer", + "(RTO) called `Tdelay' and a reset instruction (RES) associated with", + "`Tdelay', since it that case you want both instructions to work with", + "the same timer.", + "", + "Variable names can consist of letters, numbers, and underscores", + "(_). A variable name must not start with a number. Variable names are", + "case-sensitive.", + "", + "The general variable instructions (MOV, ADD, EQU, etc.) can work on", + "variables with any name. This means that they can access timer and", + "counter accumulators. This may sometimes be useful; for example, you", + "could check if the count of a timer is in a particular range.", + "", + "Variables are always 16 bit integers. This means that they can go", + "from -32768 to 32767. Variables are always treated as signed. You can", + "specify literals as normal decimal numbers (0, 1234, -56). You can also", + "specify ASCII character values ('A', 'z') by putting the character in", + "single-quotes. You can use an ASCII character code in most places that", + "you could use a decimal number.", + "", + "At the bottom of the screen you will see a list of all the objects in", + "the program. This list is automatically generated from the program;", + "there is no need to keep it up to date by hand. Most objects do not", + "need any configuration. `Xname', `Yname', and `Aname' objects must be", + "assigned to a pin on the microcontroller, however. First choose which", + "microcontroller you are using (Settings -> Microcontroller). Then assign", + "your I/O pins by double-clicking them on the list.", + "", + "You can modify the program by inserting or deleting instructions. The", + "cursor in the program display blinks to indicate the currently selected", + "instruction and the current insertion point. If it is not blinking then", + "press or click on an instruction. Now you can delete the current", + "instruction, or you can insert a new instruction to the right or left", + "(in series with) or above or below (in parallel with) the selected", + "instruction. Some operations are not allowed. For example, no instructions", + "are allowed to the right of a coil.", + "", + "The program starts with just one rung. You can add more rungs by selecting", + "Insert Rung Before/After in the Logic menu. You could get the same effect", + "by placing many complicated subcircuits in parallel within one rung,", + "but it is more clear to use multiple rungs.", + "", + "Once you have written a program, you can test it in simulation, and then", + "you can compile it to a HEX file for the target microcontroller.", + "", + "", + "SIMULATION", + "==========", + "", + "To enter simulation mode, choose Simulate -> Simulation Mode or press", + ". The program is shown differently in simulation mode. There is", + "no longer a cursor. The instructions that are energized show up bright", + "red; the instructions that are not appear greyed. Press the space bar to", + "run the PLC one cycle. To cycle continuously in real time, choose", + "Simulate -> Start Real-Time Simulation, or press . The display of", + "the program will be updated in real time as the program state changes.", + "", + "You can set the state of the inputs to the program by double-clicking", + "them in the list at the bottom of the screen, or by double-clicking an", + "`Xname' contacts instruction in the program. If you change the state of", + "an input pin then that change will not be reflected in how the program", + "is displayed until the PLC cycles; this will happen automatically if", + "you are running a real time simulation, or when you press the space bar.", + "", + "", + "COMPILING TO NATIVE CODE", + "========================", + "", + "Ultimately the point is to generate a .hex file that you can program", + "into your microcontroller. First you must select the part number of the", + "microcontroller, under the Settings -> Microcontroller menu. Then you", + "must assign an I/O pin to each `Xname' or `Yname' object. Do this by", + "double-clicking the object name in the list at the bottom of the screen.", + "A dialog will pop up where you can choose an unallocated pin from a list.", + "", + "Then you must choose the cycle time that you will run with, and you must", + "tell the compiler what clock speed the micro will be running at. These", + "are set under the Settings -> MCU Parameters... menu. In general you", + "should not need to change the cycle time; 10 ms is a good value for most", + "applications. Type in the frequency of the crystal that you will use", + "with the microcontroller (or the ceramic resonator, etc.) and click okay.", + "", + "Now you can generate code from your program. Choose Compile -> Compile,", + "or Compile -> Compile As... if you have previously compiled this program", + "and you want to specify a different output file name. If there are no", + "errors then LDmicro will generate an Intel IHEX file ready for", + "programming into your chip.", + "", + "Use whatever programming software and hardware you have to load the hex", + "file into the microcontroller. Remember to set the configuration bits", + "(fuses)! For PIC16 processors, the configuration bits are included in the", + "hex file, and most programming software will look there automatically.", + "For AVR processors you must set the configuration bits by hand.", + "", + "", + "INSTRUCTIONS REFERENCE", + "======================", + "", + "> CONTACT, NORMALLY OPEN Xname Rname Yname", + " ----] [---- ----] [---- ----] [----", + "", + " If the signal going into the instruction is false, then the output", + " signal is false. If the signal going into the instruction is true,", + " then the output signal is true if and only if the given input pin,", + " output pin, or internal relay is true, else it is false. This", + " instruction can examine the state of an input pin, an output pin,", + " or an internal relay.", + "", + "", + "> CONTACT, NORMALLY CLOSED Xname Rname Yname", + " ----]/[---- ----]/[---- ----]/[----", + "", + " If the signal going into the instruction is false, then the output", + " signal is false. If the signal going into the instruction is true,", + " then the output signal is true if and only if the given input pin,", + " output pin, or internal relay is false, else it is false. This", + " instruction can examine the state of an input pin, an output pin,", + " or an internal relay. This is the opposite of a normally open contact.", + "", + "", + "> COIL, NORMAL Rname Yname", + " ----( )---- ----( )----", + "", + " If the signal going into the instruction is false, then the given", + " internal relay or output pin is cleared false. If the signal going", + " into this instruction is true, then the given internal relay or output", + " pin is set true. It is not meaningful to assign an input variable to a", + " coil. This instruction must be the rightmost instruction in its rung.", + "", + "", + "> COIL, NEGATED Rname Yname", + " ----(/)---- ----(/)----", + "", + " If the signal going into the instruction is true, then the given", + " internal relay or output pin is cleared false. If the signal going", + " into this instruction is false, then the given internal relay or", + " output pin is set true. It is not meaningful to assign an input", + " variable to a coil. This is the opposite of a normal coil. This", + " instruction must be the rightmost instruction in its rung.", + "", + "", + "> COIL, SET-ONLY Rname Yname", + " ----(S)---- ----(S)----", + "", + " If the signal going into the instruction is true, then the given", + " internal relay or output pin is set true. Otherwise the internal", + " relay or output pin state is not changed. This instruction can only", + " change the state of a coil from false to true, so it is typically", + " used in combination with a reset-only coil. This instruction must", + " be the rightmost instruction in its rung.", + "", + "", + "> COIL, RESET-ONLY Rname Yname", + " ----(R)---- ----(R)----", + "", + " If the signal going into the instruction is true, then the given", + " internal relay or output pin is cleared false. Otherwise the", + " internal relay or output pin state is not changed. This instruction", + " instruction can only change the state of a coil from true to false,", + " so it is typically used in combination with a set-only coil. This", + " instruction must be the rightmost instruction in its rung.", + "", + "", + "> TURN-ON DELAY Tdon ", + " -[TON 1.000 s]-", + "", + " When the signal going into the instruction goes from false to true,", + " the output signal stays false for 1.000 s before going true. When the", + " signal going into the instruction goes from true to false, the output", + " signal goes false immediately. The timer is reset every time the input", + " goes false; the input must stay true for 1000 consecutive milliseconds", + " before the output will go true. The delay is configurable.", + "", + " The `Tname' variable counts up from zero in units of scan times. The", + " TON instruction outputs true when the counter variable is greater", + " than or equal to the given delay. It is possible to manipulate the", + " counter variable elsewhere, for example with a MOV instruction.", + "", + "", + "> TURN-OFF DELAY Tdoff ", + " -[TOF 1.000 s]-", + "", + " When the signal going into the instruction goes from true to false,", + " the output signal stays true for 1.000 s before going false. When", + " the signal going into the instruction goes from false to true,", + " the output signal goes true immediately. The timer is reset every", + " time the input goes false; the input must stay false for 1000", + " consecutive milliseconds before the output will go false. The delay", + " is configurable.", + "", + " The `Tname' variable counts up from zero in units of scan times. The", + " TON instruction outputs true when the counter variable is greater", + " than or equal to the given delay. It is possible to manipulate the", + " counter variable elsewhere, for example with a MOV instruction.", + "", + "", + "> RETENTIVE TIMER Trto ", + " -[RTO 1.000 s]-", + "", + " This instruction keeps track of how long its input has been true. If", + " its input has been true for at least 1.000 s, then the output is", + " true. Otherwise the output is false. The input need not have been", + " true for 1000 consecutive milliseconds; if the input goes true", + " for 0.6 s, then false for 2.0 s, and then true for 0.4 s, then the", + " output will go true. After the output goes true it will stay true", + " even after the input goes false, as long as the input has been true", + " for longer than 1.000 s. This timer must therefore be reset manually,", + " using the reset instruction.", + "", + " The `Tname' variable counts up from zero in units of scan times. The", + " TON instruction outputs true when the counter variable is greater", + " than or equal to the given delay. It is possible to manipulate the", + " counter variable elsewhere, for example with a MOV instruction.", + "", + "", + "> RESET Trto Citems", + " ----{RES}---- ----{RES}----", + "", + " This instruction resets a timer or a counter. TON and TOF timers are", + " automatically reset when their input goes false or true, so RES is", + " not required for these timers. RTO timers and CTU/CTD counters are", + " not reset automatically, so they must be reset by hand using a RES", + " instruction. When the input is true, the counter or timer is reset;", + " when the input is false, no action is taken. This instruction must", + " be the rightmost instruction in its rung.", + "", + "", + "> ONE-SHOT RISING _", + " --[OSR_/ ]--", + "", + " This instruction normally outputs false. If the instruction's input", + " is true during this scan and it was false during the previous scan", + " then the output is true. It therefore generates a pulse one scan", + " wide on each rising edge of its input signal. This instruction is", + " useful if you want to trigger events off the rising edge of a signal.", + "", + "", + "> ONE-SHOT FALLING _", + " --[OSF \\_]--", + "", + " This instruction normally outputs false. If the instruction's input", + " is false during this scan and it was true during the previous scan", + " then the output is true. It therefore generates a pulse one scan", + " wide on each falling edge of its input signal. This instruction is", + " useful if you want to trigger events off the falling edge of a signal.", + "", + "", + "> SHORT CIRCUIT, OPEN CIRCUIT", + " ----+----+---- ----+ +----", + "", + " The output condition of a short-circuit is always equal to its", + " input condition. The output condition of an open-circuit is always", + " false. These are mostly useful for debugging.", + "", + "", + "> MASTER CONTROL RELAY", + " -{MASTER RLY}-", + "", + " By default, the rung-in condition of every rung is true. If a master", + " control relay instruction is executed with a rung-in condition of", + " false, then the rung-in condition for all following rungs becomes", + " false. This will continue until the next master control relay", + " instruction is reached (regardless of the rung-in condition of that", + " instruction). These instructions must therefore be used in pairs:", + " one to (maybe conditionally) start the possibly-disabled section,", + " and one to end it.", + "", + "", + "> MOVE {destvar := } {Tret := }", + " -{ 123 MOV}- -{ srcvar MOV}-", + "", + " When the input to this instruction is true, it sets the given", + " destination variable equal to the given source variable or", + " constant. When the input to this instruction is false nothing", + " happens. You can assign to any variable with the move instruction;", + " this includes timer and counter state variables, which can be", + " distinguished by the leading `T' or `C'. For example, an instruction", + " moving 0 into `Tretentive' is equivalent to a reset (RES) instruction", + " for that timer. This instruction must be the rightmost instruction", + " in its rung.", + "", + "", + "> ARITHMETIC OPERATION {ADD kay :=} {SUB Ccnt :=}", + " -{ 'a' + 10 }- -{ Ccnt - 10 }-", + "", + "> {MUL dest :=} {DIV dv := }", + " -{ var * -990 }- -{ dv / -10000}-", + "", + " When the input to this instruction is true, it sets the given", + " destination variable equal to the given expression. The operands", + " can be either variables (including timer and counter variables)", + " or constants. These instructions use 16 bit signed math. Remember", + " that the result is evaluated every cycle when the input condition", + " true. If you are incrementing or decrementing a variable (i.e. if", + " the destination variable is also one of the operands) then you", + " probably don't want that; typically you would use a one-shot so that", + " it is evaluated only on the rising or falling edge of the input", + " condition. Divide truncates; 8 / 3 = 2. This instruction must be", + " the rightmost instruction in its rung.", + "", + "", + "> COMPARE [var ==] [var >] [1 >=]", + " -[ var2 ]- -[ 1 ]- -[ Ton]-", + "", + "> [var /=] [-4 < ] [1 <=]", + " -[ var2 ]- -[ vartwo]- -[ Cup]-", + "", + " If the input to this instruction is false then the output is false. If", + " the input is true then the output is true if and only if the given", + " condition is true. This instruction can be used to compare (equals,", + " is greater than, is greater than or equal to, does not equal,", + " is less than, is less than or equal to) a variable to a variable,", + " or to compare a variable to a 16-bit signed constant.", + "", + "", + "> COUNTER Cname Cname", + " --[CTU >=5]-- --[CTD >=5]--", + "", + " A counter increments (CTU, count up) or decrements (CTD, count", + " down) the associated count on every rising edge of the rung input", + " condition (i.e. what the rung input condition goes from false to", + " true). The output condition from the counter is true if the counter", + " variable is greater than or equal to 5, and false otherwise. The", + " rung output condition may be true even if the input condition is", + " false; it only depends on the counter variable. You can have CTU", + " and CTD instructions with the same name, in order to increment and", + " decrement the same counter. The RES instruction can reset a counter,", + " or you can perform general variable operations on the count variable.", + "", + "", + "> CIRCULAR COUNTER Cname", + " --{CTC 0:7}--", + "", + " A circular counter works like a normal CTU counter, except that", + " after reaching its upper limit, it resets its counter variable", + " back to 0. For example, the counter shown above would count 0, 1,", + " 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2,.... This is useful in", + " combination with conditional statements on the variable `Cname';", + " you can use this like a sequencer. CTC counters clock on the rising", + " edge of the rung input condition condition. This instruction must", + " be the rightmost instruction in its rung.", + "", + "", + "> SHIFT REGISTER {SHIFT REG }", + " -{ reg0..3 }-", + "", + " A shift register is associated with a set of variables. For example,", + " this shift register is associated with the variables `reg0', `reg1',", + " `reg2', and `reg3'. The input to the shift register is `reg0'. On", + " every rising edge of the rung-in condition, the shift register will", + " shift right. That means that it assigns `reg3 := reg2', `reg2 :=", + " reg1'. and `reg1 := reg0'. `reg0' is left unchanged. A large shift", + " register can easily consume a lot of memory. This instruction must", + " be the rightmost instruction in its rung.", + "", + "", + "> LOOK-UP TABLE {dest := }", + " -{ LUT[i] }-", + "", + " A look-up table is an ordered set of n values. When the rung-in", + " condition is true, the integer variable `dest' is set equal to the", + " entry in the lookup table corresponding to the integer variable", + " `i'. The index starts from zero, so `i' must be between 0 and", + " (n-1). The behaviour of this instruction is not defined if the", + " index is outside this range. This instruction must be the rightmost", + " instruction in its rung.", + "", + "", + "> PIECEWISE LINEAR TABLE {yvar := }", + " -{ PWL[xvar] }-", + "", + " This is a good way to approximate a complicated function or", + " curve. It might, for example, be useful if you are trying to apply", + " a calibration curve to convert a raw output voltage from a sensor", + " into more convenient units.", + "", + " Assume that you are trying to approximate a function that converts", + " an integer input variable, x, to an integer output variable, y. You", + " know the function at several points; for example, you might know that", + "", + " f(0) = 2", + " f(5) = 10", + " f(10) = 50", + " f(100) = 100", + "", + " This means that the points", + "", + " (x0, y0) = ( 0, 2)", + " (x1, y1) = ( 5, 10)", + " (x2, y2) = ( 10, 50)", + " (x3, y3) = (100, 100)", + "", + " lie on that curve. You can enter those 4 points into a table", + " associated with the piecewise linear instruction. The piecewise linear", + " instruction will look at the value of xvar, and set the value of", + " yvar. It will set yvar in such a way that the piecewise linear curve", + " will pass through all of the points that you give it; for example,", + " if you set xvar = 10, then the instruction will set yvar = 50.", + "", + " If you give the instruction a value of xvar that lies between two", + " of the values of x for which you have given it points, then the", + " instruction will set yvar so that (xvar, yvar) lies on the straight", + " line connecting those two points in the table. For example, xvar =", + " 55 gives an output of yvar = 75. (The two points in the table are", + " (10, 50) and (100, 100). 55 is half-way between 10 and 100, and 75", + " is half-way between 50 and 100, so (55, 75) lies on the line that", + " connects those two points.)", + "", + " The points must be specified in ascending order by x coordinate. It", + " may not be possible to perform mathematical operations required for", + " certain look-up tables using 16-bit integer math; if this is the", + " case, then LDmicro will warn you. For example, this look up table", + " will produce an error:", + "", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (300, 300)", + "", + " You can fix these errors by making the distance between points in", + " the table smaller. For example, this table is equivalent to the one", + " given above, and it does not produce an error:", + "", + " (x0, y0) = ( 0, 0)", + " (x1, y1) = (150, 150)", + " (x2, y2) = (300, 300)", + "", + " It should hardly ever be necessary to use more than five or six", + " points. Adding more points makes your code larger and slower to", + " execute. The behaviour if you pass a value of `xvar' greater than", + " the greatest x coordinate in the table or less than the smallest x", + " coordinate in the table is undefined. This instruction must be the", + " rightmost instruction in its rung.", + "", + "", + "> A/D CONVERTER READ Aname", + " --{READ ADC}--", + "", + " LDmicro can generate code to use the A/D converters built in to", + " certain microcontrollers. If the input condition to this instruction", + " is true, then a single sample from the A/D converter is acquired and", + " stored in the variable `Aname'. This variable can subsequently be", + " manipulated with general variable operations (less than, greater than,", + " arithmetic, and so on). Assign a pin to the `Axxx' variable in the", + " same way that you would assign a pin to a digital input or output,", + " by double-clicking it in the list at the bottom of the screen. If", + " the input condition to this rung is false then the variable `Aname'", + " is left unchanged.", + "", + " For all currently-supported devices, 0 volts input corresponds to", + " an ADC reading of 0, and an input equal to Vdd (the supply voltage)", + " corresponds to an ADC reading of 1023. If you are using an AVR, then", + " connect AREF to Vdd. You can use arithmetic operations to scale the", + " reading to more convenient units afterwards, but remember that you", + " are using integer math. In general not all pins will be available", + " for use with the A/D converter. The software will not allow you to", + " assign non-A/D pins to an analog input. This instruction must be", + " the rightmost instruction in its rung.", + "", + "", + "> SET PWM DUTY CYCLE duty_cycle", + " -{PWM 32.8 kHz}-", + "", + " LDmicro can generate code to use the PWM peripheral built in to", + " certain microcontrollers. If the input condition to this instruction", + " is true, then the duty cycle of the PWM peripheral is set to the", + " value of the variable duty_cycle. The duty cycle must be a number", + " between 0 and 100; 0 corresponds to always low, and 100 corresponds to", + " always high. (If you are familiar with how the PWM peripheral works,", + " then notice that that means that LDmicro automatically scales the", + " duty cycle variable from percent to PWM clock periods.)", + "", + " You can specify the target PWM frequency, in Hz. The frequency that", + " you specify might not be exactly achievable, depending on how it", + " divides into the microcontroller's clock frequency. LDmicro will", + " choose the closest achievable frequency; if the error is large then", + " it will warn you. Faster speeds may sacrifice resolution.", + "", + " This instruction must be the rightmost instruction in its rung.", + " The ladder logic runtime consumes one timer to measure the cycle", + " time. That means that PWM is only available on microcontrollers", + " with at least two suitable timers. PWM uses pin CCP2 (not CCP1)", + " on PIC16 chips and OC2 (not OC1A) on AVRs.", + "", + "", + "> MAKE PERSISTENT saved_var", + " --{PERSIST}--", + "", + " When the rung-in condition of this instruction is true, it causes the", + " specified integer variable to be automatically saved to EEPROM. That", + " means that its value will persist, even when the micro loses", + " power. There is no need to explicitly save the variable to EEPROM;", + " that will happen automatically, whenever the variable changes. The", + " variable is automatically loaded from EEPROM after power-on reset. If", + " a variable that changes frequently is made persistent, then the", + " EEPROM in your micro may wear out very quickly, because it is only", + " good for a limited (~100 000) number of writes. When the rung-in", + " condition is false, nothing happens. This instruction must be the", + " rightmost instruction in its rung.", + "", + "", + "> UART (SERIAL) RECEIVE var", + " --{UART RECV}--", + "", + " LDmicro can generate code to use the UART built in to certain", + " microcontrollers. On AVRs with multiple UARTs only UART1 (not", + " UART0) is supported. Configure the baud rate using Settings -> MCU", + " Parameters. Certain baud rates may not be achievable with certain", + " crystal frequencies; LDmicro will warn you if this is the case.", + "", + " If the input condition to this instruction is false, then nothing", + " happens. If the input condition is true then this instruction tries", + " to receive a single character from the UART. If no character is read", + " then the output condition is false. If a character is read then its", + " ASCII value is stored in `var', and the output condition is true", + " for a single PLC cycle.", + "", + "", + "> UART (SERIAL) SEND var", + " --{UART SEND}--", + "", + " LDmicro can generate code to use the UARTs built in to certain", + " microcontrollers. On AVRS with multiple UARTs only UART1 (not", + " UART0) is supported. Configure the baud rate using Settings -> MCU", + " Parameters. Certain baud rates may not be achievable with certain", + " crystal frequencies; LDmicro will warn you if this is the case.", + "", + " If the input condition to this instruction is false, then nothing", + " happens. If the input condition is true then this instruction writes", + " a single character to the UART. The ASCII value of the character to", + " send must previously have been stored in `var'. The output condition", + " of the rung is true if the UART is busy (currently transmitting a", + " character), and false otherwise.", + "", + " Remember that characters take some time to transmit. Check the output", + " condition of this instruction to ensure that the first character has", + " been transmitted before trying to send a second character, or use", + " a timer to insert a delay between characters. You must only bring", + " the input condition true (try to send a character) when the output", + " condition is false (UART is not busy).", + "", + " Investigate the formatted string instruction (next) before using this", + " instruction. The formatted string instruction is much easier to use,", + " and it is almost certainly capable of doing what you want.", + "", + "", + "> FORMATTED STRING OVER UART var", + " -{\"Pressure: \\3\\r\\n\"}-", + "", + " LDmicro can generate code to use the UARTs built in to certain", + " microcontrollers. On AVRS with multiple UARTs only UART1 (not", + " UART0) is supported. Configure the baud rate using Settings -> MCU", + " Parameters. Certain baud rates may not be achievable with certain", + " crystal frequencies; LDmicro will warn you if this is the case.", + "", + " When the rung-in condition for this instruction goes from false to", + " true, it starts to send an entire string over the serial port. If", + " the string contains the special sequence `\\3', then that sequence", + " will be replaced with the value of `var', which is automatically", + " converted into a string. The variable will be formatted to take", + " exactly 3 characters; for example, if `var' is equal to 35, then", + " the exact string printed will be `Pressure: 35\\r\\n' (note the extra", + " space). If instead `var' were equal to 1432, then the behaviour would", + " be undefined, because 1432 has more than three digits. In that case", + " it would be necessary to use `\\4' instead.", + "", + " If the variable might be negative, then use `\\-3d' (or `\\-4d'", + " etc.) instead. That will cause LDmicro to print a leading space for", + " positive numbers, and a leading minus sign for negative numbers.", + "", + " If multiple formatted string instructions are energized at once", + " (or if one is energized before another completes), or if these", + " instructions are intermixed with the UART TX instructions, then the", + " behaviour is undefined.", + "", + " It is also possible to use this instruction to output a fixed string,", + " without interpolating an integer variable's value into the text that", + " is sent over serial. In that case simply do not include the special", + " escape sequence.", + "", + " Use `\\\\' for a literal backslash. In addition to the escape sequence", + " for interpolating an integer variable, the following control", + " characters are available:", + " * \\r -- carriage return", + " * \\n -- newline", + " * \\f -- formfeed", + " * \\b -- backspace", + " * \\xAB -- character with ASCII value 0xAB (hex)", + "", + " The rung-out condition of this instruction is true while it is", + " transmitting data, else false. This instruction consumes a very", + " large amount of program memory, so it should be used sparingly. The", + " present implementation is not efficient, but a better one will", + " require modifications to all the back-ends.", + "", + "", + "A NOTE ON USING MATH", + "====================", + "", + "Remember that LDmicro performs only 16-bit integer math. That means", + "that the final result of any calculation that you perform must be an", + "integer between -32768 and 32767. It also mean that the intermediate", + "results of your calculation must all be within that range.", + "", + "For example, let us say that you wanted to calculate y = (1/x)*1200,", + "where x is between 1 and 20. Then y goes between 1200 and 60, which", + "fits into a 16-bit integer, so it is at least in theory possible to", + "perform the calculation. There are two ways that you might code this:", + "you can perform the reciprocal, and then multiply:", + "", + " || {DIV temp :=} ||", + " ||---------{ 1 / x }----------||", + " || ||", + " || {MUL y := } ||", + " ||----------{ temp * 1200}----------||", + " || ||", + "", + "Or you could just do the division directly, in a single step:", + "", + " || {DIV y :=} ||", + " ||-----------{ 1200 / x }-----------||", + "", + "Mathematically, these two are equivalent; but if you try them, then you", + "will find that the first one gives an incorrect result of y = 0. That", + "is because the variable `temp' underflows. For example, when x = 3,", + "(1 / x) = 0.333, but that is not an integer; the division operation", + "approximates this as temp = 0. Then y = temp * 1200 = 0. In the second", + "case there is no intermediate result to underflow, so everything works.", + "", + "If you are seeing problems with your math, then check intermediate", + "results for underflow (or overflow, which `wraps around'; for example,", + "32767 + 1 = -32768). When possible, choose units that put values in", + "a range of -100 to 100.", + "", + "When you need to scale a variable by some factor, do it using a multiply", + "and a divide. For example, to scale y = 1.8*x, calculate y = (9/5)*x", + "(which is the same, since 1.8 = 9/5), and code this as y = (9*x)/5,", + "performing the multiplication first:", + "", + " || {MUL temp :=} ||", + " ||---------{ x * 9 }----------||", + " || ||", + " || {DIV y :=} ||", + " ||-----------{ temp / 5 }-----------||", + "", + "This works for all x < (32767 / 9), or x < 3640. For larger values of x,", + "the variable `temp' would overflow. There is a similar lower limit on x.", + "", + "", + "CODING STYLE", + "============", + "", + "I allow multiple coils in parallel in a single rung. This means that", + "you can do things like this:", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || Xb Yb ||", + " ||-------] [------+-------( )-------||", + " || | ||", + " || | Yc ||", + " || +-------( )-------||", + " || ||", + "", + "Instead of this:", + "", + " || Xa Ya ||", + " 1 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yb ||", + " 2 ||-------] [--------------( )-------||", + " || ||", + " || ||", + " || ||", + " || ||", + " || Xb Yc ||", + " 3 ||-------] [--------------( )-------||", + " || ||", + "", + "This means that in theory you could write any program as one giant rung,", + "and there is no need to use multiple rungs at all. In practice that", + "would be a bad idea, because as rungs become more complex they become", + "more difficult to edit without deleting and redrawing a lot of logic.", + "", + "Still, it is often a good idea to group related logic together as a single", + "rung. This generates nearly identical code to if you made separate rungs,", + "but it shows that they are related when you look at them on the ladder", + "diagram.", + "", + " * * *", + "", + "In general, it is considered poor form to write code in such a way that", + "its output depends on the order of the rungs. For example, this code", + "isn't very good if both Xa and Xb might ever be true:", + "", + " || Xa {v := } ||", + " 1 ||-------] [--------{ 12 MOV}--||", + " || ||", + " || Xb {v := } ||", + " ||-------] [--------{ 23 MOV}--||", + " || ||", + " || ||", + " || ||", + " || ||", + " || [v >] Yc ||", + " 2 ||------[ 15]-------------( )-------||", + " || ||", + "", + "I will break this rule if in doing so I can make a piece of code", + "significantly more compact, though. For example, here is how I would", + "convert a 4-bit binary quantity on Xb3:0 into an integer:", + "", + " || {v := } ||", + " 3 ||-----------------------------------{ 0 MOV}--||", + " || ||", + " || Xb0 {ADD v :=} ||", + " ||-------] [------------------{ v + 1 }-----------||", + " || ||", + " || Xb1 {ADD v :=} ||", + " ||-------] [------------------{ v + 2 }-----------||", + " || ||", + " || Xb2 {ADD v :=} ||", + " ||-------] [------------------{ v + 4 }-----------||", + " || ||", + " || Xb3 {ADD v :=} ||", + " ||-------] [------------------{ v + 8 }-----------||", + " || ||", + "", + "If the MOV statement were moved to the bottom of the rung instead of the", + "top, then the value of v when it is read elsewhere in the program would", + "be 0. The output of this code therefore depends on the order in which", + "the instructions are evaluated. Considering how cumbersome it would be", + "to code this any other way, I accept that.", + "", + "", + "BUGS", + "====", + "", + "LDmicro does not generate very efficient code; it is slow to execute, and", + "wasteful of flash and RAM. In spite of this, a mid-sized PIC or AVR can", + "do everything that a small PLC can, so this does not bother me very much.", + "", + "The maximum length of variable names is highly limited. This is so that", + "they fit nicely onto the ladder diagram, so I don't see a good solution", + "to that.", + "", + "If your program is too big for the time, program memory, or data memory", + "constraints of the device that you have chosen then you probably won't", + "get an error. It will just screw up somewhere.", + "", + "Careless programming in the file load/save routines probably makes it", + "possible to crash or execute arbitrary code given a corrupt or malicious", + ".ld file.", + "", + "Please report additional bugs or feature requests to the author.", + "", + "Thanks to:", + " * Marcelo Solano, for reporting a UI bug under Win98", + " * Serge V. Polubarjev, for not only noticing that RA3:0 on the", + " PIC16F628 didn't work but also telling me how to fix it", + " * Maxim Ibragimov, for reporting and diagnosing major problems", + " with the till-then-untested ATmega16 and ATmega162 targets", + " * Bill Kishonti, for reporting that the simulator crashed when the", + " ladder logic program divided by zero", + " * Mohamed Tayae, for reporting that persistent variables were broken", + " on the PIC16F628", + " * David Rothwell, for reporting several user interface bugs and a", + " problem with the \"Export as Text\" function", + "", + "", + "COPYING, AND DISCLAIMER", + "=======================", + "", + "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE", + "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE", + "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION", + "OF LDMICRO OR CODE GENERATED BY LDMICRO.", + "", + "This program is free software: you can redistribute it and/or modify it", + "under the terms of the GNU General Public License as published by the", + "Free Software Foundation, either version 3 of the License, or (at your", + "option) any later version.", + "", + "This program is distributed in the hope that it will be useful, but", + "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY", + "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License", + "for more details.", + "", + "You should have received a copy of the GNU General Public License along", + "with this program. If not, see .", + "", + "", + "Jonathan Westhues", + "", + "Rijswijk -- Dec 2004", + "Waterloo ON -- Jun, Jul 2005", + "Cambridge MA -- Sep, Dec 2005", + " Feb, Mar 2006", + " Feb 2007", + "Seattle WA -- Feb 2009", + "", + "Email: user jwesthues, at host cq.cx", + "", + "", + NULL +}; +#endif + -- cgit