DCC-Dekoder - Sequenzer - Software
- Neben der direkten Ausgabe der jeweiligen Funktion kann der Dekoder auch in einen sog. Sequenzer-Mode geschaltet
werden. Dabei können komplexere Abläufe zu einem DCC Befehl zusammengefasst werden.
Funktionsweise
- Der Sequenzer funktioniert wie ein Reiterschaltwerk, also so wie eine mechanische Zeitschaltuhr, wo man
zu den gewünschten Zeitpunkten Reiter in eine Scheibe zum Markieren der Einschaltpunkte bzw. Ausschaltpunkte
einsteckt.
Die 'Reiter', welche hier verwendet werden, haben jedoch nicht nur die Eigenschaft EIN oder AUS, sondern bestehen aus einem Datenwort. Dieses enthält das Zielobjekt (also was der Reiter bewirken soll) und einem Parameter (der die Wirkgröße angibt). Zielobjekte können die Port, Servos, Motoren oder Sound sein.
Der zeitliche Abstand zum vorherigen Reiter wird mit einer Zeitvariablen eingestellt. Ein Reiter besteht somit immer aus zwei Datenworten: Zeit und Zielaktion.
Im Dekoder sind parallel mehrere (8) solcher Reiterschaltwerke enthalten, die jeweils mit einem DCC-Befehl gestartet werden. Es können mehrere Schaltwerke gleichzeitig aktiv sein.
Mit diesen Schaltwerken (=Sequenzer) lassen sich nun komplexe Szenen auf der Modellbahn leichter darstellen, wie z.B. eine Seilbahn, welche hin- und her fährt, eine Schranke, welche vorbildgerecht zuerst das Blinklicht einschaltet, dann bimmelt und dann den Schlagbaum absenkt. Zugleich wird der Stopmagnet für das Faller Carsystem betätigt. Wie das im Detail geht, ist im Anschluß an die Definition der Reiter in den Beispielen erläutert. Es gibt da unzählige Anwendungen, wie Karussellsteuerungen, Kranbewegungen oder sonstige animierte Objekte.
CV-Parameter für Sequenzer-Mode
- Jedem DCC Befehl ist eine Sequenz und ein Steuerparameter für diese Sequenz zugeordnet.
Der Steuerparameter definiert die Zeit, welche von Schritt zu Schritt vergeht; das ist also die lokale Geschwindigkeit
dieser Sequenz.
Die Sequenz selbst besteht dann aus bis zu 25 Reitern, wobei jeder Reiter aus zwei Datenwörtern (nämlich Zeit und
Zielaktion) besteht. Die
Wortbreite ist je ein Byte (CV).
Neben den direkten Zielaktionen gibt es auch 'Verwaltungsaktionen', die es z.B. erlauben, Sequenzen aneinander anzuhängen und/oder zu wiederholen. Damit lassen sich auch längere Sequenzen mit mehr als 25 Reitern erzeugen. Darüberhinaus ermöglichen Reiter für Eingabeaktionen die Abfrage von Endschaltkontakten oder Bedientastern.
Jede Sequenz hat eine vorgelagerte CV, welche die Untersetzung bezogen auf die echte Zeit angibt:
CV [Base] + 0: SLOW_DOWN
Mit dieser CV wird die Geschwindigkeit des Schaltwerkes eingestellt. Bei einer Einstellung von 1 schaltet das Schaltwerk alle 100ms einen Schritt weiter. (Voreinstellung: 10 (=Schaltgeschwindigkeit 1s))
In Summe besteht also ein Schaltwerk aus 51 CV und es sind 8 solcher Schaltwerk im Decoder vorhanden. Folgende Tabelle stellt das nochmal dar, wobei hier als CV Adresse nur der jeweilige Abstand (Offset) zum Beginn des Schaltwerkes angegeben ist.
| CV für ein Schaltwerk | ||||
|---|---|---|---|---|
| CV 0 | SLOW DOWN | |||
| CV 1 | ZEIT | CV 2 | AKTION | Reiter 1 |
| CV 3 | ZEIT | CV 4 | AKTION | Reiter 2 |
| CV 5 | ZEIT | CV 6 | AKTION | Reiter 3 |
| ... | ZEIT | ... | AKTION | Reiter 4-24 |
| CV 49 | ZEIT | CV 50 | AKTION | Reiter 25 |
Adresse(SLOW_DOWN) = [Base] + [Schaltwerk] * 51
Adresse(ZEIT) = [Base] + [Schaltwerk] * 51 - 1 + [Reiter] * 2
Adresse(AKTION) = [Base] + [Schaltwerk] * 51 + [Reiter] * 2
Definition der Reiter
- Die einzelnen Aktionen in einer Sequenz werden mit sogenannten Reitern definiert.
Ein Reiter besteht aus Zeitpunkt und Zielaktion samt zuhöriger Parameter.
Unbenutzte Reiter sind mit 0xFF 0xFF vorzubelegen.
Die Reiter sind wie folgt kodiert:
| Zeitpunkt | 8 Bit | Eingabe einer Zeit als Zahl bezogen auf die jeweils vorhergehende Aktion
in der Sequenz. Eine Zeit von 0 bedeutet als keine zeitliche Lücke zwischen
den Aktionen (wiewohl sie doch aus physikalischen Gründen
knapp nacheinander ausgeführt werden).
Die hier angegebene Zeit bedeutet die Zahl der Ticks, welche bis zur
nächsten Aktion vergehen. Der gültige Bereich beträgt 0 ... 250.
Die tatsächliche Wartezeit ergibt sich, wenn man dieses
Zahl mit der Geschwinidigkeit des Schaltwerkes multipliziert.
Damit lassen sich Zeiten von 100ms bis über 1,7h realisieren.
Zeitangaben über 250 sind reserviert und werden für die Steuerung des Schaltwerkes verwendet. (siehe unten) |
|---|---|---|
| Operation | 8 Bit | Das ist ein Bitfeld für verschiedenen Zielaktionen, diese sind zusammen mit ihren Parametern in der folgenden Tabelle erläutert. |
| Standard-Operationen | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wert (bin) | Zielaktion | Parameter | Kommentar | ||||||||||||
| 00aaaass | Ausgang schalten |
|
Der angegebene Ausgang wird in den gewünschten Zustand geschaltet. Bei Phase A wird mit der ON-Phase begonnen, bei Phase B wird mit der OFF-Phase begonnen. | ||||||||||||
| 01mdssss | Motor stellen |
|
Der Motor dreht mit der eingestellten Verzögerung auf die gewünschte Drehzahl, die internen Stufen sind feiner unterteilt als die Vorgabe hier. | ||||||||||||
| 100scccc | Servo bewegen |
|
Der Servo führt die angebenene Bewegung aus. | ||||||||||||
| 101***** | reserviert (vermutlich für Stepperansteuerung) | ||||||||||||||
| 110sssss | Sound abspielen |
|
Der Index 0 schaltet den Sound ab. | ||||||||||||
| 111***** | reserviert | ||||||||||||||
Wenn als Zeitangabe eine Zeit von 255 eingetragen wird, dann wird keine normale Operation ausgeführt, sondern eine System-Operation:
| System-Operationen | |||||
|---|---|---|---|---|---|
| Wert (bin) | Zielaktion | Parameter | Kommentar | ||
| 0000pppp | Eingang = 0 abfragen |
|
Die Sequenz wird angehalten, wenn der angegebene Eingang 0 ist, wird die Ausführung der Sequenz fortgesetzt. | ||
| 0001pppp | Eingang = 1 abfragen |
|
Die Sequenz wird angehalten, wenn der angegebene Eingang 1 ist, wird die Ausführung der Sequenz fortgesetzt. | ||
| 00100sss | Sequenzer starten |
|
Es kann auch die aktuelle Sequenz erneut gestartet werden. Dadurch wird diese wiederholt.
Dieser Befehl wird nur ausgeführt, wenn kein
Sequenz-Endetrigger vorliegt. Die aufrufende Sequenz wird nach Ausführung des Befehls beendet. Mit diesem Kommando lassen sich Sequenzen aneinander anfügen und damit auch längere Sequenzen erzeugen. Das Kommando ist unzulässig am Beginn einer Sequenz. | ||
| 00110sss | Sequenzer beenden |
|
Der zu beendenden Sequenz wird ein Endetrigger geschickt,
diese
führt fortan keine System-Befehle mehr aus (weder Inputabfragen, noch andere Startbefehle). Normale
Schaltbefehlen werden aber noch ausgeführt. Wenn die zu stoppende Sequenz bereits
auf ein Systemereignis wartet (z.B. Eingangsabfrage oder Nachrichtenabfrage), dann wird sie
durch den Endetrigger auch angehalten. Die aufrufende Sequenz wird nicht beendet. Dieses Kommando dient dazu, Endlosschleifen auch wieder abbrechen zu können. | ||
| 01010sss | Sequenzer Start unterbinden (*) |
|
Die angegebene Sequenz kann nicht parallel zur aktuellen Sequenz gestartet werden.
Dieses muß dann auch wieder freigegeben werden. Dieses Kommando dient dazu, problematische Kombinationen zu unterbinden. | ||
| 01011sss | Sequenzer Start freigeben (*) |
|
|||
| 01100nnn | Nachricht löschen |
|
|||
| 01101nnn | Nachricht setzen |
|
|||
| 01110nnn | Auf Nachricht warten |
|
Die Sequenz warten auf das Eintreffen der Nachricht Dieses Kommando dient zum Synchronisieren von Sequenzen. Wenn beim Aufruf dieser Operation bereits eine Nachricht vorliegt, so wird die Sequenz sofort fortgesetzt. Wenn keine Nachricht vorliegt, dann wartet die Sequenz. Wenn anschließend eine Nachricht eintrifft, dann arbeitet diese Sequenz weiter. Die eingetroffene Nachricht wird dabei nicht gelöscht. | ||
| 11111111 | Ende | - | Diese Sequenz ist zu Ende, es erfolgen keine weiteren Aktionen; d.h. nach einer Sequenz sind alle unbenutzten Reitereinträge auf 0xFF 0xFF zu stellen. | ||
Das Reiterschaltwerk enthält nur die Änderungen, die im Zeitablauf erfolgen. Zu Beginn einer Sequenz sind alle Aktionen in dem Zustand, wie sie von der letzten Aktion hinterlassen wurden. Will man einen bestimmten Startzustand erzwingen, so wird einfach zum Zeitpunkt 0 der gewünschte Startzustand der Aktion eingetragen.
Es dürfen zu einem Zeitpunkt auch mehrere Reiter eingetragen werden (d.h. das Zeitfeld ist dann 0), diese werden dann gleichzeitig ausgewertet.
(*) = noch nicht implementiert, hängt noch von möglichen Applikation ab.
Programmierhilfe
- Die Definition der Reiter und das Erstellen von Sequenzen ist mühsam, wenn man jeweils auf die
Bitdefinitionen zurückgreifen muß. Zur vereinfachten Eingabe gibt es folgende Hilfe:
- durch direkte serielle Verbindung mit dem Dekoder: auf den Erweiterungsstecker wird hierbei ein FTDI-USB-Kabel aufgesteckt, man kann dann direkt mit dem Dekoder kommunizieren. Das geht am schnellsten, weil der zeitraubende Umweg über das langsame DCC-Protokoll entfällt. (Dabei werden Kommandos des Host-API verwendet)
- mittels einer Zentrale: diese wird p50x-Befehlen angesprochen
- mittels TrainProgrammer (das ist ein kostenpflichtiges Programm von www.freiwald.com): damit ist das dann unabhängig von der verwendeten Zentrale. (Hinweis: das geht noch nicht, bis jetzt (Stand Feb.2010) ist das Interface von TP zu Applikationsprogrammen fehlerhaft)
Die einzelnen Reiter werden hier mit Hilfe eines Excel-Spreadsheets berechnet und an den Dekoder übertragen. Für die Übertragung sind 3 Wege möglich:
Die Eingabe erfolgt hier im Klartext (durch Auswahl mit der Maus) und die zugehörigen CV-Einstellungen werden von Excel errechnet. Verschieben von Reitern geht ganz einfach mit den Verschieben- / Kopieren-Funktionen von Excel. Auch die Errechnung der Zeit und Bestimmung der richtigen CV-Adresse geschieht automatisch.
Zum leichteren Test kann man den Dekoder auch direkt mit dem PC verbinden (über eine FTDI-RS232-TTL Kabel) und die Befehle für die Aktionen direkt eingeben. Auch die CVs lassen sich auf diesem Weg direkt und schnell schreiben.
Anwendungsbeispiele
- Beschrankter Bahnübergang
Betrachten wir als erstes Beispiel einen beschrankten Bahnübergang. Hier haben wir Blinklicht, Schranke, Warnglocke und den Stopmagnet für das Faller-Car System. Es seien folgende Befehlszuordnungen definiert:
Für das Schließen der Schranke würde das Reiterschaltwerk nun folgende Reiter erhalten:Ziel Verwendung Ausgang 0 Stopmagnet Ausgang 1 Blinklicht rechts Ausgang 2 Blinklicht links Sound Warnglocke Servo Schrankenbewegung
Für das Öffnen der Schranke würde das Reiterschaltwerk entsprechend folgende Reiter erhalten:Sequenz-Programmierung Zeitcode Command Kommentar 0 0b0000 0101 Ausgang 1 soll blinken, Phase A 0 0b0000 1010 Ausgang 2 soll blinken, Phase B (links/rechts im Gegentakt) 1 0b1100 0001 Sound abspielen, Track 1 = Warnglocke (in Schleife) 3 0b0000 0011 nach 3s Ausgang 0 einschalten, Stopmagnet für Faller Car einschalten 1 0b1000 0000 Servo 1, Kurve A, Schranke schließen 10 0b1100 0000 nach 10s Sound beenden, Warnglocke wieder aus 255 0b1111 1111 Sequenz-Ende Sequenz-Programmierung Zeitcode Command Kommentar 0 0b0000 0101 Ausgang 1 soll blinken, Phase A 0 0b0000 1010 Ausgang 2 soll blinken, Phase B (links/rechts im Gegentakt) 3 0b0000 0001 nach 3s Ausgang 0 einschalten, Stopmagnet für Faller Car einschalten 1 0b1000 0001 Servo 1, Kurve B, Schranke öffnen 10 0b0000 0100 nach 10s Ausgang 1 abschalten 0 0b0000 1000 auch Ausgang 2 abschalten 1 0b0000 0000 nach 1s Ausgang 0, Stopmagnet für Faller Car ausschalten 255 0b1111 1111 Sequenz-Ende - Pendelzugsteuerung
Das folgende Beispiel implementiert eine Pendelzugsteuerung, welche auf (lokalen) Tastendruck einen Umlauf startet. Hierzu sei folgende Portbelegung angenommen:Port Verwendung Input 0: Taster Input 1: Endeschalter links Input 2: Endeschalter rechts Sequenz-Programmierung Zeitcode Command Kommentar 255 0b0000 0000 Warte auf Tasteneingang = low 0 0b0100 0011 Motor links drehen langsam 3 0b0100 0111 nach 3s Motor links schneller 255 0b0000 0001 Warte auf Schaltkontakt links 0 0b0100 0000 Motor aus 2 0b0101 0011 Motor rechts drehen langsam, (mit Verzögerung, dadurch entsteht hier eine Pause) 3 0b0101 0111 nach 3s Motor rechts schneller 255 0b0000 0010 Warte auf Schaltkontakt rechts 0 0b0101 0000 Motor aus 2 0b0101 0000 Motor aus (nochmal, mit Verzögerung, dadurch entsteht hier eine Pause) 255 0b0010 0000 Starte die Sequenz 0 (Wiederholung)