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