SX-PX Mini-Zentrale


Die Erweiterung meiner Mini-Zentrale auf "Fahrbetrieb" ist mit einem kleinen Umbau der
Hardware leicht machbar.

Die letzte SX-Buchse, X6 ist sehr einfach mit ein paar "Kratzereien" von X5 zu trennen.
Der 20 Volt Stift ist auf der Bestückungsseite verbunden. Stört aber nicht, weil auf der
PX-Buchse Stift 3 "NC not connected" ist.

Stift 2     ist auch beim PX-Bus GND Potential,
Stift 1     bringt das TTL- Signal für P0,
Stift 4     für P1,
Stift 5     ist  das Ein-Aus-Signal für den Fahrstrom-Booster .

Mit drei Leitungen ist die Änderung erledigt:

P0    Mega8    PORTB,     PB3, Pin17    ->    DIN Buchse Stift 1
P1    Mega8    PORTB,     PB4, Pin18    ->    DIN Buchse Stift 4
EN   Mega8    PORTB,     PB5, Pin19    ->    DIN Buchse Stift 5

Software Erweiterung:

Auch dieser Aufwand eigentlich minimal minimal, weil die Daten auf dem SX- und dem PX-Bus
identisch sind und zeitgleich erzeugt werden.
Der wesentliche Unterschied zwischen den beiden Signalen ist die Codierung und die Tatsache,
dass der PX-Bus unidirektional ist, d.h. Rückschreiben ist nicht möglich.

Wie beim Programmiermodul gelernt und beschrieben wechselt für log Hi das Potential der Gleisspannung
bei log Lo hat der nachfolgende Impuls die gleiche Polarität, wobei auch die Trennimpulse, log Hi,
miteinbezogen werden.

Während der Taktzeit von 10 Mikrosekunden sind beide Gleise auf dem Potential der "Blauen Klemme",
d.h. beide Ansteuersignale sind auf Lo-Pegel.

Zu Beginn des Taktsignals sind einige Befehle eingefügt:

;*     Ende 40 uSek, Takt Starten mit Leitung auf LO, 10uSek setzen                                  **
;*     Während dem Taktsignal sind beide Gleisansteuerungen P0 und P1 auf log Lo    **

bcl:
    cbi PORTD,5     ; Takt auf Lo

    in r15,PINB     ; alten Zustand P0, P1 retten
    cbi PORTB,3     ; PX P0
    cbi PORTB,4     ; PX P1
    lsl r1          ; akt. Datenleitungszustand retten

    ldi r16,246 ; 10 µS Hi 246
    out TCNT0,r16

Das Register "r1" ist ein Schieberegister das die Abfrage der vorausgegangenen Bit ermöglicht. Die
realisierte Logik kommt aber ohne dies Information aus und bezieht den Status aus den "gemerkten"
Steuersignalen selbst, sodass auch die Abfrage der Datenleitung hinreichend wäre.

Um das Timing der PX-Signale möglichst genau zu haben, werden am Ende der Taktzeit von 10 USek.
nach der SX-Taktleitung die PX-Signale erzeugt und der Timer mit 40 Mikrosekunden gestartet


;* Interruptservice für 8-Bit-Timer, Takterzeugung **
;*********************************************************************
;* Timer 0 erzeugt beide Zeiten 10 uS Takt und 40 uS Datenzeit

TIM_0OVF:
    sbic PIND,5         ; Taktende an PORTD Bit5, Pin 9
    rjmp bcl            ; Ende 40 uSek -> Takt beginnen


;* Ende 10uSek -> Taktleitung auf Hi , Daten bearbeiten

    sbi PORTD,5         ; Sig auf Hi, am Ende des Taktimpulses
    ldi r16,216         ; 40 µS Hi 216
    out TCNT0,r16

;* PX_Bus Steuerleitungen schalten **

;* Wenn Datenleitung auf log Hi gewechselt hat, ODER
;* wenn Datenleitung auf log Hi bleibt,
;* dann wird P0 und P1 getoggelt.
;* Wenn Datenleitung log Lo ist, dann wird der alte Zustand
;* wieder hergestellt.

    mov r16,r15         ; alten Zustand PORTB holen
    andi r16,0b00011000 ; nur P0 und P1 gilt
    tst r16
    brne px_normal
    sbi PORTB,3         ; Bei Start P0 ein
    rjmp px_ex
px_normal:
    sbrc r1,0           ; Datenleitung neu Lo ?
    rjmp px_toggle      ; nein, Polaritätswechsel nötig
    mov r16,r15
    out PORTB,r16
    rjmp px_ex
px_toggle:
    sbrc r16,3         ; Wenn P0 Lo war
    rjmp px_p0hi
    cbi PORTB,4        ; P1 Lo
    sbi PORTB,3        ; P0 Hi
    rjmp px_ex
px_p0hi:
    cbi PORTB,3        ; P0 Lo
    sbi PORTB,4        ; P1 Hi


;** Schreibleitung und Datenleitung vergleichen, Datenbit richten

Nach der Aufbereitung der Datenleitung wird der Neu Zustand in r1 abgespeichert:

neudat:
    sbis PIND,4
    reti          ; Datenleitung Lo, fertig
    ldi r16,1
    or r1,r16     ; Datenleitung Hi ins Schieberegister
    reti          ; neue Datenleitung fertig



Steuerkanal der Zentrale auf Adresse 127:

Dies Adresse kann nicht auf dem SX-Bus liegen, der nur bis Adresse 111 definiert ist.
Die Steuersoftware kann aber auf der seriellen Schnittstelle Werte bis 255 ausgeben.
Unter Beachtung der Konvention , dass das Bit 7 (128) zur Übertragung des Lese- bzw.
Schreibkommandos dient, kann dies bis zur Adresse 127 verwendet werden.
Deshalb ist die Daten-Empfangsroutine um die Abfrage des Adresswertes 127 erweitert.
Das Enable-Port-Bit und das Datenbyte des Zustandskanals 109 werden direkt verändert.

zenadr:
    cpi r24,127             ; Direkt-Adresse der Zentrale ist 127
    brne nix_zent
    sbrs r13,7              ; Steuerbit für die Gleisspannung
    rjmp gl_aussch          ; Einschalten wenn Bit 7 in 127 Hi ist
    sbi PORTB,5             ; PX-Enable EIN

    lds r24,$6D             ; 0x60 + 13. = 0x6D -> Datenbyte der
                            ; Adresse 109 ist 13. Byte nach RamDat
    ori r24,128             ; Gleis ist Eingeschaltet
    sts $6D,r24             ; zurückschreiben
    rjmp nix_zent
gl_aussch:
    cbi PORTB,5             ; PX_Enable AUS
    lds r24,$6D             ; Datenbyte der Adresse 109
    andi r24,0b01111111     ; Gleis ist Ausgeschaltet
    sts $6D,r24

nix_zent:


Erprobung:

Für den Funktionstest habe ich den PX-Booster von Uwe Magnus aufgebaut und verwendet. Die
Platine hat er rasch geliefert, bestücken, einschalten, funktioniert. Ein durchdachtes Design !

Als PC-Programm habe ich ein meinen XP-Mini-Monitor verwendet, der im ersten Byte 128+127
und im zweiten 128 (Bit 7) zum Einschalten sendet. Der Ausschaltbefehl sendet im zweiten Byte 0.
Freundlicherweise hat der Magnus-Booster eine LED zur Anzeige des Enable-Signales.

Meinem Besetztmelder hat das Timing nicht so gut bekommen:

 

Vom Taktende dauert es etwa 4 Mikrosekunden bis die Gleisspannung "Strom erzeugen" kann. Der
Stromtest im Besetztmelder kam "zu früh". Eine Wait-Loop mit ca.100 Prozessortakten = 12 uSek. hat
Abhilfe geschaffen. Mit der Trix CC2000 war das nicht notwendig.
Und schon kann ich meine Testlok per Software oder Trix-Control.Handy via SX_PX_Zentrale fahren und sie
kann auch den Gleisabschnitt an Bit 0 des Melders "besetzen".

Ein paar Verfeinerungen der Software in der Zentrale werde ich noch einbauen müssen, damit die Rück-
meldung über den SX-Bus klappt und sie auch den Nothalt vom Handy versteht.

SX_PX_Zentrale.asm
SX_PX_Zentrale.hex

Jonathan Bohmer, im November 2008