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