Der Datenstrom im SX-Protokoll:
Darüber nachzudenken, warum Selectrix so ist wie es ist, lohnt nicht. Nützlich ist
aber, wenn man weiß,
wo sich welches Bit und welche Information versteckt.
Der Bit- und Datenstrom ist auf dem Sx-Bus und der Gleisspannung prinzipiell
gleich, ist aber hardwaremäßig
total unterschiedlich angelegt.
Auf dem 5-poligen SX-Bus Kabel gibt es mit TTL-Pegel eine Datenleitung auf
der die Informationen
von der Zentrale gesendet werden. (5-polige DIN-Buchse, Stift 4 Masse Stift 2,
Ausgangswiderstand 470 Ohm)
Adress- und Datenumfang:
Per Definition werden im Selectrix-System 112 Adressen mit jeweils 8 Bit Daten
"behandelt". D.h. in der
Zentrale wird das Abbild dieser 112 Adressen gespeichert, ggf. aktualisiert und
seriell in einer nicht ganz
trivialen Codierung seriell auf die Datenleitung gegeben. Dabei wird der
System-Takt, auch TTL-Pegel,
auf der Taktleitung mitgegeben. (Din-Buchse Stift1, Ausgangswiderstand 100 Ohm)
Das erleichtert die Synchronisation der
Busteilnehmer erheblich.
Der Datencodierung liegen Tripel-Bit's zu Grunde, die jeweils aus einem Trennbit
mit Hi-Pegel und 2 Datenbits
bestehen. Das bedeutet, dass es "niemals" in drei aufeinanderfolgenden Takten Lo-Pegel gibt. Die
Ausnahme bildet die Synchrongruppe, die genau diese Bitfolge hat.
Auf dem Bus werden die 112 Adressen in 16 Synchrongruppen geführt mit 7
Unteradressen, 8-Bit Daten als Inhalt.
Die Adressen über 100 sind für Loks und Decoder nicht zu verwenden, weil sie
bestimmten Systemfunktionen
dienen oder in Zukunft dienen sollen. Die Adresse 111 z.B. überträgt die
Multiplexadresse bzw. die Selectrix
System-Uhrzeit.
Adresse 106 dient in Verbindung mit den Adressen 104 und 105 zur Programmierung
von Busteilnehmern wie
Loks, Decoder und Besetztmelder. Leider habe ich noch keine vollständige und
aktuelle Dokumentation gefunden.
Die Decodierung:
Zur Decodierung in einem Mikroprozessor verwende ich folgendes Prinzip:
Die Taktleitung erzeugt mit der ansteigenden Flanke einen Interrupt.
In der Interruptservice Routine wird der jeweilige Logikpegel der Datenleitung
erfasst und in ein Bit-Schieberegister
eingetragen.
Die Länge des Schieberegisters ist 96 + 8 =104 Bit und wird mit 13 8-Bit
Registern realisiert.
Die ersten 12 Bit einer Synchrongruppe sind:
0 0 0 1 G 1 a3 a2 1 a1 a0 1
3 x 0 ist Synchronsignal
1 ist Trennbit
G Gleisbit 1 oder 0
1 ist Trennbit
a3 MSB der Gruppenadresse 1 oder 0
a2 Adressbit 2
1 oder 0
1 ist Trennbit
a1 Adressbit 1
1 oder 0
a0 LSB der Adresse 1 oder
0
1 Trennbit
Danach folgen die Daten von 7 Adressen = 56 Bit + 28
Trennbit = 84 Bit.
Die Adressen berechnen sich aus der Gruppenadresse und der DatenByteNummer in
der Synchrongruppe
Nach 16 Synchrongruppen sind alle 112 Adressen auf dem Bus.
Nach Selectrix-Definition ist das Taktsignal 10uSek Lo-Pegel und 40uSek Hi-Pegel
= 50usek pro Bit.
Pro Synchrongruppe 96 x 50uSek = 4,8 Millisekunden
Wiederholzeit bei kompletten Adressumfang 16 x 4,8 = 76,8 mSek, d.h. etwa 13 mal
pro Sekunde kann jeder
Busteilnehmer "Seine" Daten aus "Seiner" Adresse lesen.
Man erkennt aber auch, dass es nicht zwingend notwendig ist alle Adressen zu
bedienen, sondern dass lediglich
die Synchrongruppen komplett sein müssen. Auch die zeitliche Reihenfolge ist
unwichtig.
Schieberegisterinhalt mit einer kompletten Synchrongruppe:
s0 s0 s0
t1 gx
t1
a3 a2
t1
a1 a0
t1 d7 d6
t1
d5 d4 t1 d3 d2
t1 d1 d0
t1 d7 d6
t1 d5 d4
t1 d3 d2
|_ _ _ _ _ _ _ _ |_ _ _
_ _ _ _ _ |_ _ _ _ _ _
_ _ |_ _ _ _ _ _ _ _ |
r1
r2
r3
r4
t1 d1 d0
t1 d7 d6
t1 d5 d4
t1 d3 d2
t1 d1 d0
t1 d7 d6
t1 d5 d4
t1 d3 d2
|_ _ _ _ _ _ _ _ |_ _ _
_ _ _ _ _ |_ _ _ _ _ _
_ _ |
r5
r6
r7
t1 d1 d0
t1 d7 d6
t1 d5 d4
t1
d3 d2 t1 d1 d0
t1 d7 d6
t1 d5 d4
t1 d3 d2
|_ _ _ _ _ _ _ _ |_ _ _
_ _ _ _ _ |_ _ _ _ _ _
_ _ |
r8
r9
r10
t1 d1 d0
t1 d7 d6
t1 d5 d4
t1 d3 d2
t1 d1 d0
t1
|_ _ _ _ _ _ _ _ |_ _ _
_ _ _ _ _ |
r11
r12
s0 s0 s0
t1 gx
t1
a3 a2
_ _ _ _ _ _ _ _ |
r13
s0 s0 s0 = Synchronbit
3-mal Lo-Pegel, t1 = Trennbit
immer Hi-Pegel gx = Gleisbit
a3, a2, a1, a0 =
Adressbit's, D7 bis d0 Datenbit's.
Wenn die Synchrongruppe vollständig ist, d.h
kein Bit zuviel oder zu wenig und korrekt geschoben; ist der Synchronblock in r1
und
r13 fast identisch, fast, weil die Adressbits und das Gleisbit unterschiedlich
sein können und dürfen.
Die Vollständigkeitsprüfung kann mit den Bit's Nr. 7,6,5,4,und 3
durchgeführt werden, d.h. ohne gx, a3 und a2 muss der Inhalt = 0x14 sein.
Das Vorlaufregister ist r13, d.h. das aktuelle Datenbit wird nach LSL (LogicShiftLeft)
in Bit Nr. 0 übernommen und die Register mit
ROL (RotateLeft) in der Reihenfolge 12,11, 1 geschoben.
Die Daten der Unteradresse 0 folgen dem Synchron-Adressteil. Damit stehen die
Daten der Unteradressen 0 bis 6 so zur Bearbeitung:
UA0 Lo-Nibble r2 r3
UA1 r4
Hi-Nibble r5
UÁ2 Lo-Nibble r5 r6
UA3 r7
Hi-Nibble r8
UA4 Lo-Nibble r8 r9
UA5 r10
Hi-Nibble r11
UA6 Lo-Nibble r11 r12
Die Unteradressen einer Synchrongruppe sind die eigentlichen Busadressen und
unterscheiden sich um 16,
wobei die UA6 die niedrigste Adresse ist und UA0 die höchste.
Adressberechnung:
Zur Berechnung der Gruppenadresse und Unteradresse wird die Busadresse Modulo 16 dividiert.
Das ganzzahlige Ergebnis wird von der Basiszahl 6 subtrahiert und ist die
Unteradresse.
Der Rest wird von 15 subtrahiert (invertiert 4-Bit Nibble) und ist dann die
Synchrongruppen-Adresse.
Beispiele: Busadr. 25 25 % 16 = 1; 6 - 1 = UA5;
15 - Rest 9 = Gruppenadresse
GRU
6
00 00 % 16 = 0; 6 - 0 = UA6; 15 - Rest
0 = Gruppenadresse Gru 15
87 87 % 16 = 5; 6 - 5 = UA1;
15 - Rest 7 = Gruppenadresse Gru 08
Die Berechnung verdeutlicht, dass alle Busadressen, mit Rest 0 der Modulo-Division in Gruppe 15 gesendet werden.
Das sind die Adressen 00, 16, 32, 48, 64, 80, 96 in den Unteradressen 6 bis 0.
Die Adress-Struktur kann man auch so herleiten:
Die Busadresse ist in Binärdarstellung im Low Nibble die Gruppenadresse, die
nächsten 3 Bit im high Nibble
sind die Unteradresse. Eigentlich müsste sie "Oberadresse" heißen, denn es sind
ja die höherwertigen Stellen.
D. h. zu jedem Wert der "Ober-Unter-Adresse" gehören jeweils 16 Datenkanäle.
Aber der Erfinder hat sich zu
einer anderen Reihenfolge auf dem Bus entschlossen und verpackt nur 6
Datenkanäle in einer Synchrongruppe.
Die Kennung der Synchrongruppe sind dann die unteren 4 Bit der Busadresse, auf
dem Bus mit invertierter
Darstellung. Die Adressen der 6 Datenkanäle unterscheiden dann um jeweils um den
Wert 16 (siehe oben).
Adresse-Auslesen:
Die Gruppenadresse identifiziert die jeweilige Synchrongruppe. Die Adressbit a3,
a2 stehen im Lo-Nibble von r1,
a1 und a0 sind im Hi-Nibble von r2.
Daten-Auslesen:
Die 8-Bit Daten einer Busadresse sind in drei Nibble in zwei Registern abgelegt,
Die geradzahligen Unteradressen
00, 02, 04, 06 haben die Datenbit d7, d6, d5 im Lo-nibble von r2, r5, r8, r11,
die Bits d4, d3, d2, d1, d0 in r3, r6, r9, r12.
Die ungeraden Unteradressen
01, 03, 05 haben die Datenbit d7, d6, d5, d4, d3, d2 in r4, r7, r10, die Bits
d2, d1, d0 im Hi-Nibble von r5, r8, r11.
Softwarekonzept:
Wie immer, führen viele Wege nach Rom, und so gibt es auch für die
Selctrix-Bus-Decodierung diverse Lösungen.
Ich habe mich für diese Schieberegistermethode entschieden, weil sie die Chance
bietet das Datenpaket "Synchrongruppe
halbwegs, auf Vollständigkeit, und damit Gültigkeit, zu prüfen und fehlerhafte
zu verwerfen. Die nächste Chance auf eine
vollständige Gruppe kommt ja bereits nach knapp 80 Millisekunden. Die rasche,
zyklische Wiederkehr der Informationen
ist auch der Grund für die große Betriebssicherheit der Selctrix gesteuerten
Anlagen. Die systembedingte Verzögerungszeit
ist 2 Zyklen, also spätestens nach 160 Millisekunden wird jeder Befehl
ausgeführt, auch ein gutes Systemmerkmal
von Selectrix.
Im Schieberegister sind die Bitstellen fix zugeordnet und können deshalb mit
einfachen Bit-Befehlen extrahiert und
umsortiert werden.
Innerhalb der Taktzeit von 40 bzw. 50 uSekunden muss die Datenleitung abgefragt
werden, das Schieberegister
um 1 Bitstelle geschoben sein und die Gruppenadresse geprüft werden. Ist die
Gruppenadresse nicht die erwartete, wird
die Interruptserviceroutine beendet und auf den nächsten Takt gewartet.
Wenn die richtige Gruppenadresse festgestellt ist, erfolgt die
Vollständigkeitsprüfung. Bei Fehler, Interrupt-Ende,
Ansonsten beginnt die Auswertung die bei gesperrtem Taktinterrupt abläuft. Zeit
hat man nun genügend, denn frühestens
nach 70 Millisekunden kehrt diese Synchrongruppe wieder. Trickreiche,
geschwindigkeitsoptimierte Programmierung
ist also nicht notwendig.
Mit diesem Konzept sind Decoder für Schaltanlagen einfach zu realisieren, die
nicht über den Bus programmiert werden.
Meldebausteine und Bediengeräte wie Handregler verwenden zwar die gleiche
Decodierung, benötigen aber zusätzliche
Funktionen für die Rückmeldung auf der Schreibleitung. (DIN-Buchse Stift5,
Ausgangswiderstand 220 Ohm)
Die Übernahme von Programmierdaten erfordert weitere Kenntnisse des
Selectrix-Bus-Konzepts.
Das Duplex-Konzept:
Der bitsynchrone Duplexbetrieb wird durch eine simple Schaltung in der Zentrale
realisiert. Die Schreib- und Leseleitung
sind in der Zentrale mit einem 470Ohm Widerstand verbunden. Meldegeräte legen
ihre Information bitsynchron über
100 Ohm auf die Schreibleitung. Solange kein Meldegerät angeschlossen ist haben
Schreib- und Leseleitung das
gleiche Potential. Wenn aber das Meldegerät inverse Information ausgibt ergibt
sich das Potential der Schreibleitung
durch den Spannungsteiler 100 Ohm im Meldegerät und 470 Ohm in der Zentrale,
d.h. 4,1 V für "Melde HI" und
0,9 V für "Melde Lo". Die Vergleichsspannung in der Zentrale ist ca. 2,5 V,
sodass die Pegel sicher unterschieden werden.
Programmieren von Geräteparametern:
Das ist ein "besonderes" oder ein Kapitel "für sich". Mit der Programmierung von
modernen Lok-Decodern habe ich mich
noch nicht beschäftigt. Für Eigenbau-Schaltdecoder halte ich die Programmierung
der Parameter am Bus für nicht
notwendig oder wünschenswert. Diese Funktionalität benötigt einen Aufwand, der
sich nur bei kommerziellen Produkten
schlecht vermeiden lässt weil der Hersteller nicht weiß was der Kunde damit
vorhat, was bereits mit der Busadresse
beginnt. Für den Hobbyelektroniker, der das baut was er braucht, gelten andere
Voraussetzungen.
Allerdings bin ich am Überlegen ob ich für meine Servo-Weichendecoder nicht eine
weniger fehlerträchtige
Parametrisierung einbauen sollte. Das wird dann die "Second Generation",
vielleicht!
Steinhart, September 2008