Einstieg
Die hier hinterlegten
Informationen wenden sich an Leser, die ein eigenes Gerät über
den SX Bus betreiben / entwickeln wollen.
Bei mir war das die Entwicklung einer
Paternoster - Steuerung, siehe
hier.
Der SX Bus wurde in Bezug auf die Hardware und die Schnittstelle
zur Anschaltung von Geräten in einem eigenen Register (links)
beschrieben, ebenso das SX Bus Protokoll.
In diesem Abschnitt wird die SX Bus
Schnittstelle und ihre Handhabung aus Sicht der µ Processor
Software (Firmware) dargestellt, so wie sie bei mir zur
Anwendung kommt.
Ich setze den µ Processor PIC 18F4550
von Microchip und die Sprache C ein.
Hinweis
Die folgende Darstellung erhebt keinen Anspruch auf
Vollständigkeit, sie zeigt nur einen prinzipiellen Lösungsweg
auf.
Aufgabenstellung und Kommunikation
Zur Steuerung des Paternosters durch
das Modellbahn - Steuerungsprogramm TrainController (TC)* müssen folgende Informationen ausgetauscht werden ...
über den SX Bus direkt
- Paternoster - Gondelnummer (SOLL)
diese Nummer gibt an, welche Gondel an die
Gleisschnittstelle Paternoster / Anlage (Einfahrt /
Ausfahrt) positioniert werden soll
- Paternoster - Gondelnummer (IST)
diese Nummer gibt an, welche Gondel derzeit an der
Gleisschnittstelle positioniert ist
- Paternoster-Grundzustand
- Paternoster-Betriebszustand
und über einen Besetztmelder
- Belegungszustand des Gondelgleises; 2
Gleise pro Gondel
- Zustand von Brems- sowie Halte-
Melder pro Gleis; 2 Gleise pro Gondel
Jede Gondelnummer wird binär in 4 Bits
codiert übertragen.
Insgesamt können so 16 Gondeln adressiert werden.
Benötigt ein Nutzer mehr Gondeln, so kann er
durch Modifikation der Schnittstelle und Erweiterung der
Bitanzahl auch diese adressieren,
Insgesamt wird ein Byte für die
Kommunikationsrichtung TC* > Zentrale > Paternoster
benötigt und ein Byte für die Gegenrichtung.
Damit werden im SX Bus 2 Adressen verwendet.
Prinzip des Datenaustausches
Grundsatz
Das Taktsignal (T0) des SX
Busses muß auf einen Processor - Eingang (Input Port) gelegt werden, der als
Interrupt eingesetzt werden kann.
Bei jeder steigenden Flanke des Taktsignals löst der Processor
einen SW Interrupt (Unterbrechung) aus und es wird die
angegebene Interrupt - Routine gestartet.
Die Dateninformation wird über die Leitung
T1 von der Zentrale übermittelt; dieses ist im Processor ein
Input Port.
Daten zur Zentrale werden über die Leitung
D übertragen.
Wegen des Signalzustands HIGH oder LOW benötigt der Processor 2
Output Ports (siehe HW Schnittstelle).
Grundsätzlich muß während der Dauer des
Taktsignals (high Anteil, 40 µs) die Leitung T1 gelesen oder
einer der Output Ports bis zum Takt-Ende gesetzt werden.
Initialisierung
Da in der Taktzeit auch
Vergleichsoperationen ausgeführt werden müssen, sind in dieser
Phase Vorkehrungen zu treffen, u.a.
- Ermittlung der BasisAdressen und der
Gerätepositionen im Paket /Block)
für die 2 dezimal gespeicherten Adressen
Speichern der invertierten BasisAdressen und die zugehörige
Geräteposition als laufendes Bit (PositionsBit) in dem Paket
(Block);
2 BasisAdressen -- 2 "PositionBits" -- 2 Übertragungsrichtungen
setzen.
- Bestimmung und Speicherung der
Übertragungsrichtung pro Adresse
- Vorbelegung der SYNC Speicherbits mit
111, damit später die Übertragung von 000 erkannt werden
kann.
- Bitzähler auf 0 setzen
- Speicherplatz (Bits) für die zu
ermittelnde BasisAdresse auf 1111 setzen (diese Adresse
kommt bei meinem Paternoster nicht vor)
- Speicherplatz für 8 Bits
(Datenübernahme) auf 00000000 setzen
- Speicherplatz 1 und 2 für 8 Bits
(Datenübergabe) auf 00000000 setzen
- Interrupt freischalten
1. Aufgabe -- Ermittlung des SYNC Signals
(000)
Takt
Bitzähler um 1 erhöhen.
Lesen des Signalpegels (high = 1 oder low = 0) an der SX Bus
Leitung T1.
Speichern des Daten - Bits (SYNC Bits) 1 oder 0.
Ist der Bitzähler = 3; alle 3 Bits bewerten. Wenn alle 000,
dann wurde SYNC erkannt; wenn nicht alles löschen und neu
beginnen.
2. Aufgabe -- Ermittlung der Basisadresse
Takt
Bitzähler um 1 erhöhen.
Mit Bitzähler >= 4 und <= 6 wird ein Trennbit, dann das
Gleissignal-Bit und wieder ein Trennbit gesendet. Diese können
ignoriert werden.
Mit Bitzähler = 7 wird das höchstwertigste Adress-Bit (B3) von
der BasisAdresse gesendet, was abzuspeichern ist.
Mit Bitzähler = 8 wird das Adress-Bit (B2) von der BasisAdresse
gesendet, was abzuspeichern ist.
Mit Bitzähler = 9 wird das Trennbit von der BasisAdresse
gesendet, was zu ignorieren ist.
Mit Bitzähler = 10 wird das höchstwertigste Adress-Bit (B1) von
der BasisAdresse gesendet, was abzuspeichern ist.
Mit Bitzähler = 11 wird das Adress-Bit (B0) von der BasisAdresse
gesendet, was abzuspeichern ist.
Ist der Bitzähler = 11; alle 4 Bits der BasisAdresse
(invertiert) mit den 2 abgespeicherten, invertierten
BasisAdressen des Paternosters vergleichen.
Besteht mit keiner der 2 gespeicherten
BasisAdressen eine Übereinkunft, dann sind die gespeicherten
SYNC Speicherbits auf 111 zu setzen und die ermittelte
BasisAdresse auf 1111 (diese Adresse kommt bei meinem
Paternoster nicht vor); ferner ist der Bitzähler = 0 zu setzen.
3. Aufgabe -- Behandlung der Informations - Daten
Es besteht mit einer der gespeicherten Paternoster BasisAdressen
Übereinstimmung.
Aus der Adresse und damit aus der BasisAdresse läßt sich
ableiten um welche Gruppe von Informationsdaten es sich handelt
und wie die Übertragungsrichtung ist.
Ferner ist die Positionsnummer für diese Adresse bekannt, was
einer bestimmten Bitposition und damit einem Bitzählerstand
(PositionsBit) entspricht.
Speicherplatz 1 und 2 für 8 Bits
(Datenübergabe) wurde im Rahmen der Gondelpositionierung mit
Informationen gefüllt.
Takt
Bitzähler um 1 erhöhen.
Bitzähler = 12 über die Adresse die Übertragungsrichtung
übernehmen sowie das zugehörige PositionsBit.
--Takt
Bitzähler um 1 erhöhen.
Mit Bitzähler < PositionsBit -- keine Datenkommunikation.
Mit Bitzähler >= PositionsBit und Bitzähler
<= PositionsBit + 10 Bits Datenkommunikation für
die Geräte-Daten (Paternoster-Daten) ausführen ....
- Datenübernahme von TC (Daten einlesen)
Portzustand von Leitung T1 abfragen und in den Speicherplatz
für Datenübernahme eintragen ..
> mit PositionsBit auf D0
> mit PositionsBit + 1 auf D1
> mit PositionsBit + 3 auf D2
> mit PositionsBit + 4 auf D3
> mit PositionsBit + 6 auf D4
> mit PositionsBit + 7 auf D5
> mit PositionsBit + 9 auf D6
> mit PositionsBit + 10 auf D7
Mit Bitzähler =
PositionsBit + 11 Bits den Interrupt ausschalten
und mit der Bearbeitung der Daten (Gondelpositionierung)
beginnen.
Sind neue Daten gleich den vorherigen
Daten; keine weiteren Aktionen notwendig. ---
Interrupt nach der Bearbeitung wieder einschalten und alles
zurück setzen (Initiierung).
- Datenübergabe an TC (Daten schreiben)
-- dies ist nur notwendig, wenn sich die
zu übermittelnden Daten gegenüber den früher versandten
geändert haben --
> mit PositionsBit --- Zustand (high,
low) von Bit 0 des Speichers für Datenübergabe abfragen und
entsprechend einen der beiden Ports für die Leitung D (für
D0) setzen
> mit PositionsBit + 1 --- Zustand (high, low) von Bit 1 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D1) setzen
> mit PositionsBit + 3 --- Zustand (high, low) von Bit 2 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D2) setzen
> mit PositionsBit + 4 --- Zustand (high, low) von Bit 3 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D3) setzen
> mit PositionsBit + 6 --- Zustand (high, low) von Bit 4 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D4) setzen
> mit PositionsBit + 7 --- Zustand (high, low) von Bit 5 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D5) setzen
> mit PositionsBit + 9 --- Zustand (high, low) von Bit 6 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D6) setzen
> mit PositionsBit + 10 --- Zustand (high, low) von Bit 7 des
Speichers für Datenübergabe abfragen und entsprechend einen
der beiden Ports für die Leitung D (für D7) setzen
Mit Bitzähler = PositionsBit + 11
Bits alles zurück setzen (Initiierung).
Initiierung
des Datenaustausches durch den Paternoster
Um eine störungsfreie
Steuerung des Paternosters zu erreichen, muß die Interrupt -
Routine des Processors während dieser Zeit ausgeschaltet
werden.
In dieser Zeit werden auch von TC*
keine neuen Daten benötigt.
Sollen aber in diesem Prozeßabschnitt
Daten an TC* übertragen werden, dann ist die
Interrupt - Routine für diese Zeitdauer wieder zu
aktivieren.
Die Kommunikation selbst läuft nach der obigen Darstellung
ab.
SX Bus
Nutzdatendefinition (Belegung des Bytes)

für die Auslegung der Paternostersteuerung.
Übertragungsrichtung TC* >
Paternoster
D0 : Paternoster Nr Bit 0
D1 : Paternoster Nr Bit 1
D2 : Paternoster Nr Bit 2
D3 : Paternoster Nr Bit 3
D4 : frei
D5 : frei
D6 : frei
D7 : Bit für den Start des Paternosters (Startsignal)
Übertragungsrichtung Paternoster
> TC*
D0 : Paternoster Nr Bit 0
D1 : Paternoster Nr Bit 1
D2 : Paternoster Nr Bit 2
D3 : Paternoster Nr Bit 3
D4 : Paternostergrundzustand (ein, aus)
D5 : NOTHALT (aus / ein)
D6 : Betriebszustand (Ruhe, Bewegung)
D7 : frei
Vollduplexverhalten
des SX Busses


Timing des SX Busses
(Lesen + Schreiben von Bits)
Programmierung der
SX Bus Schnittstelle
Die Programmierung der SX Bus
Kommunikationsschnittstelle stellt eine große Herausforderung
dar, insbesondere dann, wenn diese in C auf einem µProcessor
installiert wird.
Ich habe von der Fa. Microchip den
Processor PIC18f4550 eingesetzt.
Um die notwendige interne Taktfrequenz zu
erreichen habe ich einen externen 20 MHz Quarz verwendet. Ein
interner Teiler teilt die Frequenz auf 4 MHz hinunter. In einem
weiteren Schritt wird diese "feste Eingangsfreuenz"
intern auf 96 MHz
angehoben und anschließend intern mit einem Teiler auf 48 MHz
reduziert.
Hinweis:
Ich hatte zuerst versucht mit 20 MHz (Taktfrequenz) auszukommen, was aber bei
der Sprache C zu langsam war. Assembler ist mir nicht so
vertraut.
Da die interne Taktferquenz auf 4 MHz festgelegt ist, kann auch
ein anderer externer Quarz eingesetzt werden. Es ist dabei die
interne Teilerabstimmung zu beachten.
Die Bereitstellung von 48 MHz beruht auf der Möglichkeit mit dem
Processor einen USB Anschluß zu betreiben.
Der Abtastzeitpunkt TA liegt etwa bei 30 -
35 µs nach der fallenden Flanke des Taktsignals.
Dies bedeutet, das vor diesem Zeitpunkt
die Pegel (Ports) für das Überschreiben eines Bit-Zustandes
gesetzt sein müssen.
Die Ermittlung und Aufbereitung des nächsten "zu sendenden Bits"
muß im davor liegenden Takt erfolgen.
Beim "Empfang" eines Bits (Bitzustand) muß
die Auswertung, z.B. auf Sync; Basisadresse (BA) nach dem
Abfragezeitpunkt in den restlichen µs erfolgen.
Bei den Daten erfolgt dort die Abspeicherung der Bits in einem
Byte.
In der Taktzeit eines Trennbits können
weitere Operationen (Auswertungen)" untergebracht" werden.