Ein LDmicro Tutorial

(translated from the English original; thanks to Heinz Ullrich Noell)

In diesem Tutorial (Selbstlerneinheit) möchte ich Ihnen zeigen, wie man ein einfaches Programm mit LDmicro schreibt. Ich gehe davon aus, dass Sie schon vorher Programme in Kontaktplan (ladder logic) geschrieben haben, und dass Sie schon über ein Grundwissen von Mikrokontrollern verfügen, aber dass Sie LDmicro selbst noch nie verwendet haben. Falls Sie über keine oder nur geringe Kenntnisse von Kontaktplan- Programmierung (ladder logic) oder speicherprogrammierbaren Steuerungen verfügen, dann könnte Ihnen das folgende Tutorial behilflich sein the plcs.net tutorial .

Unsere Schaltung wird einen Taster und eine LED haben. Beim Anlauf bleibt die LED ausgeschaltet. Wenn Sie den Taster einmal drücken, wird die LED dauernd eingeschaltet. Wenn Sie das zweite Mal auf den Taster drücken, so wird diese blinken. Beim dritten Tasterdruck wird sie wieder ausgeschaltet. Bei den folgenden Tastendrücken, wird sich der Ablauf wiederholen.

Die Auswahl des Mikrokontrollers und der Schaltplan

Wir werden einen PIC16F876 verwenden, der bei "Digikey" oder jedem anderen Online-Lieferanten leicht zu erhalten ist. Dieser wird in verschiedenen Gehäusen hergestellt, ich wählte das DIP-Gehäuse.

Das ist unser Schaltplan:

Der Mikrokontroller (IC1) hat die Teilenummer PIC16F876-20I/SP-ND bei Digikey. Fast jeder dreipolige Resonator (U1) wird es tun; sie können es mit einem 535-9356-ND oder einem X909-ND versuchen.

Das Einzige, was Sie verwirren könnte ist, dass der Taster mit Vdd verbunden ist und auf Masse gezogen ist. Bei der TTL-Technik war dies von Bedeutung. Nicht aber bei moderner CMOS-Technik, und ich finde, dass eine Aktiv-High Anordnung weniger durcheinander bringt, als die traditionelle Aktiv-Low Schaltung.

Auch wählte ich einen Keramikresonator mit internen Kondensatoren = U1, anstatt eines Quarzes mit zwei Kondensatoren, welcher ebenso gut funktionieren würde und auch genauer wäre. Aber doch ein wenig teurer wäre, und Sie würden auch mehr Bauteile benötigen.

Sie können diese Schaltung auf vielerlei Art zusammenbauen. Ich habe diese auf ein Steckbrett montiert und sie sah dann, wie folgt aus:

(Die Widerstandswerte in der Abbildung haben nicht exakt die Werte, wie im Schaltbild, aber keiner von diesen ist kritisch.)

Das KOP-(Ladder) Diagramm für das Programm

Zunächst benötigen wir einen Oszillator, um das Blinksignal für die LED zu erzeugen. Dafür gibt eine standadisierte Art in KOP (ladder logic):

         ||      Rosc            Tosc_on         Tosc_off           Rosc       ||
1 ||-------] [--------[TON 250.0 ms]---[TOF 250.0 ms]---------(/)-------||

Dieser Oszillator blinkt mit 1/((250+250) ms), oder 2 Hz, oder zweimal pro Sekunde. Die Einschaltdauer beträgt 50%—250 ms ein, dann 250 ms aus. Mit diesem Netzwerk können Sie jedwede Art von Oszillator bilden, welchen Zeitintervall oder welche Einschaltdauer Sie auch immer benötigen. Somit ist es sinnvoll, sich dieses Netzwerk zu merken.

Beachten Sie auch, dass wir einen Merker (‘Rfoo’, internes Relais) zur Verwendung gewählt haben, anstatt einen E/A PIN anzuschließen (‘Yfoo’ or ‘Xfoo’). Dies ist sinnvoll, denn es gibt keinen besonderen Grund dieses Signal an einen Ausgang zu legen. LDmicro weist dem Merker (internes Relais) automatisch einen Speicherplatz zu.

Unser Programm wird drei Zustände haben: Aus, ständig an und Blinken. Das Programm sollte seinen Zustand bei jeder aufsteigenden Flanke des Tastersignals ändern. Das stellt einen guten Anwendungsfall für einen 'zirkulierenden Zähler'dar. Wir legen fest, dass der 'Zählerstand 0' gleich 'aus', der 'Zählerstand 1' gleich 'dauernd an' und der 'Zählerstand 2' gleich 'blinken' ist. Der Zähler zählt 0, 1, 2, 0, 1, 2, ..., wenn wir also für die Eingangsbedingung des Zählers den Taster vorgeben, dann solte alles, wie gewünscht, funktionieren:

         ||     Xbutton                                            Cstate      ||
2 ||-------] [---------------------------------------------{CTC 0:2}----||

Nun bleibt nur noch übrig, den Programmzustand anzuwenden, um den Status der LED festzugen. Dies können wir in folgender Weise tun:

         ||   [Cstate ==]                                           Yled       ||
3 ||---[ 1 ]-------------------+------------------------( )-------||
|| | ||
|| [Cstate ==] Rosc | ||
||---[ 2 ]----------] [------+ ||

Es sollte einfach sein, sich selbst davon zu überzeugen, dass dies genau das ist, was wir erreichen wollen. Wenn das Programm im Zustand 1 ist, dann schaltet die Anweisung ‘Cstate == 1’ die LED, wie gewünscht ein. Im Programmzustand 2 schaltet die Anweisung ‘Cstate == 2’ ebenfalls ein, aber nur wenn ‘Rosc’ auch wahr ist; dies bedeutet, dass die LED, wie vorgesehen, blinken wird. Schließlich im Programmzustand 0, ist keine von den beiden Anweisungen erfüllt, somit ist es unmöglich, dass die LED jemals eingeschaltet sein könnte.

Das KOP (Ladder) Diagramm eingeben

Jetzt haben wir unsre Schaltung (Programm) entwickelt und können diese(s) in LDmicro eingeben. Beim Start von LDmicro, sehen Sie ein leeres Netzwerk:

Wir wollen jetzt das erste Netzwerk der obigen Auflistung eingeben. Mit der Spule wollen wir beginnen, somit wählen Sie die 'Anweisung -> Einfügen Spule'. Das erzeugt eine Spule, die mit 'Ynew' benannt ist. Dies ist das, was wir erreichen wollten, außer dass der Name falsch ist und diese Spule negiert sein sollte. Doppelklicken Sie auf die Spule; dies wird ein Dialogfenster hervorbringen, welches wir, wie folgt, ausfüllen:

Jetzt können wir den Rest des Netzwerks auf die gleiche Weise einfügen. Klicken Sie auf die linke Seite der Spule, dass der Cursor senkrecht erscheint und sich links von der Spule befindet. Jetzt wählen Sie Anweisung 'Anweisung -> Einfügen TON (Anzugsverzögerung)'. Doppelklicken sie nochmal, diesmal auf den Timer TOF, um diesen zu umbennen und um den Zeitintervall einzustellen. Fügen Sie den Timer TOF und die Kontakte auf die gleiche Weise hinzu.

Jetzt wollen wir das zweite Netzwerk eingeben; wählen Sie 'Bearbeiten -> Netzwerk Einfügen Danach' Dann klicken Sie auf das zweite Netzwerk, um den Cursor dorthin zu bewegen.

Das zweite Netzwerk ist einfach: Sie brauchen nur die beiden Anweisungen in der richtigen Reihenfolge einzusetzen, indem Sie den Cursor dorthin setzen, wo Sie einfügen möchten und dann wählen Sie 'Anweisung -> Einfügen .....' Denken Sie daran dem Kontakt (‘XTaster’) einen Namen zuzuweisen und den dazugehörigen oberen Grenzwert des Zählers einzustellen. Danach wählen Sie nochmal 'Bearbeiten -> Netzwerk Einfügen Danach'. Ihr Programm sollte dann so aussehen:

Das dritte Netzwerk ist ein wenig kniffliger, weil es eine parallele Verzweigung hat. Dies bedeutet, dass Sie über die Reihenfolge der Anweisungseingaben nachdenken müssen. Geben Sie zunächst die Spule ein und benennen Sie diese um:

Geben Sie jetzt links von der Spule, wie gewohnt, die erste 'Vergleich auf Gleichheit' - Anweisung ein mit dem korrekten Variablennamen und -wert. Nachdem Sie das getan haben, fügen Sie den parallelen Zweig ein. Dies können Sie erreichen, indem Sie auf die Unterkante des 'Vergleichers auf Gleichheit' klicken; der Cursor erscheint dann horizontal unterhalb dieser Anweisung:

Wählen Sie jetzt 'Anweisung -> EQU (Vergleich auf gleich)'. Da sich Ihr Cursor unter der 'Vergleich auf gleich' -Anweisung befindet, so wird die neue gleichgeartete auch unterhalb der ersten parallel eingefügt. Diese müssen Sie, wie gewohnt, umbenennen. Um das Netzwerk fertigzustellen, müssen Sie den 'Rosc' -Kontakt rechts von dem zweiten 'Vergleicher auf Gleichheit' -Anweisung einfügen. Um dies zu erreichen, klicken Sie auf die rechte Seite der vorgenannten zweiten 'Gleich-Anweisung':

An diesem Punkt wählen Sie 'Anweisung -> Spule einfügen; der Kontakt wird dann in Reihe mit der zweiten 'Gleich-Anweisung' eingefügt, so wie dies benötigt wird. Nun müssen Sie diese nur noch umbenennen und damit sind wir fertig:

Die Programm-Simulation

Jetzt sind wir bereit unsre Schaltung zu simulieren. Wählen Sie 'Simulieren -> Simulationsbetrieb'. Die Darstellung auf dem Bildschirm ändert sich jetzt; der KOP (ladder)-Plan erscheint nun grösstenteils in grau, aber Sie werden im Moment sonst keine Veränderungen wahrnehmen. Das ist so, weil die SPS noch nicht im zyklischen (Zyklus) Umlauf ist. Um den Zyklus zu starten, wählen Sie 'Simulieren -> Start Echtzeit-Simulation'. Jetzt können Sie sehen, wie die Sache abläuft: Der Oszillator funktioniert offentsichtlich, aber die LED 'Yled' ist noch aus. Dies ist so, weil der Taster noch nicht betätigt wurde. Um das Drücken des Tasters zu simulieren, doppelklicken Sie auf den Text 'Xbutton' in der Liste auf dem unteren Teil der Maske. Auf diese Weise haben Sie den Taster auf 'high' gesetzt; dies fände in der Wirklichkeit so statt: Man drückt auf den Taster, lässt diesen aber nicht los.

Sie können erkennen, dass das Programm funktioniert: Der 'Cstate' des Zählers ist jetzt gleich 1, was dem 'dauernd an' -Zustand entspricht, so wie wir das erreichen wollten. Der LED-Ausgang ist 'high', das können Sie in der Liste (unten in der Maske) erkennen, weil ihm der Wert 1 zugeordnet ist. Auch erscheint die 'Yled' - Spule jetzt rot in unsrem Plan. Doppelklicken Sie nun nochmal auf den Text 'Xbutton', dies simuliert das Loslassen von diesem. Wenn Sie dann abermals auf den vorg. Text doppelklicken, so simuliert dies ein erneutes Tasten. Die LED wird jetzt, wie vorgesehen, blinken. Wenn Sie jetzt noch ein drittes Tastendrücken simulieren, so wird der Ausgang (LED) dauerhaft ausgeschaltet.

Die IHEX-Datei kompilieren

So, jetzt sind wir ziemlich sicher, dass unser Programm funktioniert. Wenn wir an diesem Punkt angelangt sind, können wir den eigentlichen (wirklichen) Code erzeugen und diesen mit dem Mikrokontroller ausprobieren. Verlassen als erstes Sie den Simulationsbetrieb, indem Sie 'Simulieren -> Simulationsbetrieb' wählen oder die Escape-Taste drücken.

Als nächsten Schritt müssen wir den Mikroprozessor aussuchen. Wir haben uns schon vorher für den PIC16F876 entschieden; wählen Sie somit 'Voreinstellungen -> Mikroprozessor ->Microchip PIC16F876 28-PDIP oder 28-SOIC '. Wir müssen LDmicro auch mitteilen, welchen Quarztyp wir verwenden und welche Zykluszeit eingestellt ist. Wählen Sie 'Einstellungen -> Prozessor-Parameter' und setzen 20 MHz ein. Die voreingestellete Zykluszeit können Sie belassen, weil diese für gewöhnlich einen guten Wert darstellt.

Jetzt können wir die Pins für unsre Ein- und Ausgänge festlegen. Doppelklicken Sie auf 'Xbutton' in der unteren Liste und wählen den Pin 14 des PICs, dieser entspricht dem RC3 des Mikroprozessors. (Normalerweise gibt es keinen Grund für Sie, darauf zu achten, welchen Port sie verwenden; blicken Sie lediglich auf die Pin-Nummer.)

Klicken Sie auf 'OK' und wiederholen den Vorgang für 'Yled', welche auf Pin 15 festgelegt ist, wie im Schaltplan ersichtlich. Die weiteren Elemente in der Liste sind interne Variablen und Bits im Speicher, somit besteht keine Notwendigkeit denjenigen Pins zuzuweisen. LDmicro vergibt Speicherplätze für diese beim Kompilieren.

Damit sind wir jetzt so weit, das Kompilieren vorzunehmen. Wählen Sie 'Kompilieren -> Kompilieren' und geben Sie an, wo Sie die IHEX-Datei speichern möchten. Mit welchem, Ihnen zur Verfügung stehenden, PIC-Programmer auch immer, können Sie Ihr Programm in den Kontroller laden. Somit sind Sie jetzt bereit, dieses Programm zu testen.

Dies beendet mein Tutorial. Es ist natürlich möglich, viel komplexere Programme zu schreiben, als das vorliegende. Ein so einfaches Programm verwendet nur einen ganz kleinen Bruchteil Ihres Programmspeichers. Auch gibt es noch genügend Platz für viele weitere logische Netzwerke. LDmicro bietet auch spezielle fachliche Anweisungen für Arithmetik, analoge (A/D) Eingänge, PWM und sogar eine Textausgabe für ein zeichenbezogenes LCD-Display. Für weitere Einzelheiten, ziehen Sie das Handbuch zu Rate.

Zwar kann ich keine Notwendigkeit erkennen, aber Sie können download the tutorial program , bereits fertig programmiert.