Serielle Kommunikation zwischen PC und Mini-Zentrale.

Die Interfacefunktion in der Zentrale ist sehr einfach zu realisieren, weil man
den direkten Zugriff auf das Speicherabbild der SX-Daten hat.

Bei separaten Interfacebaugruppen ist der SX-Bus dazwischen und der Aufwand
ist erheblich größer.

Meine Mini-Zentrale basiert auf dem ATMega8 Mikroprozessor der eine USART
Schnittstelle beinhaltet. Voraussetzung ist, dass die Signale TXD und RXD im TTL-
Pegel vorliegen und ein wenig Code geschrieben wird.

Ich habe gelernt, dass "anständige" Interfaces die galvanische Trennung zwischen
PC und Modellbahnelektrik beinhalten. Die Notwendigkeit darf zumindest bezweifelt
werden.

Zur Pegelanpassung verwende ich einen TL082 mit Rückkopplung. Voraussetzung für die
galvanische Trennung ist der DC/DC-Wandler 5Volt auf +- 12 Volt. Leider kostet der Wandler
viermal so viel wie der Mikro (ca. € 6,50). Dafür sind die Optokoppler CNW136 von der
alten, billigen Sorte. Die drei 100nF C schaden auch nicht. Die Diode am Ok1 schützt
die Fotodiode vor unzulässiger Reversspg.

Der Aufbau dieser Schaltung auf der Lochrasterplatine grenzt an Strafarbeit, aber eine
gedruckte Schaltung zu spendieren, lässt der Altersgeiz nicht zu. Mit Sorgfalt gelingt es
sicher besser als hier zu sehen!
 


Die SUB-D9 Printbuchse muss zum Einbau in die 2.54mm Lochplatine "misshandelt"
werden, weil die Pins im Raster 1,25 mm sind. Deshalb vor dem Einbau Pin7 und Pin8
umbiegen und verlöten, die Pins 6 und 9 entfernen. Zwei 3,5mm Bohrungen und
der Einbau "geht so".


Zum Test der Hardware kann man NICHT die Leitungen TXD und RXD miteinander
verbinden, weil der Optokoppler-Transistor den Fotostrom nicht schalten kann.

Deshalb gibt es die (auskommentierten) Echozeilen im Programm!

Wer auf die galvanische Trennung verzichtet, nimmt z.B. einen MAX233, 1µF und ist
bedient. Zusammen € 2,50 und viel weniger löten!

Das Programm:

Nach SELECTRIX Definition werden zum Lesen und Schreiben eines SX-Datenbytes
jeweils 2 Zeichen gesendet.
Zeichen 1 ist die SX-Adressse, wobei zum Schreiben noch das Bit 7 (MSB) gesetzt ist.
Das sofort folgende 2. Zeichen ist zum Lesen irrelevant, gibt lediglich den Sende-
Zeitpunkt vor. Die max. Verzugszeit ist 5ms.
In Verbindung mit dem Schreibbefehl bringt das 2. Zeichen das Datenbyte.
Die Befehle folgen mit zeitlichem Abstand, z.B. 5mSek, aufeinander. Diese "Lücke"
wird zum Synchronisieren verwendet.

Ich verwende einen Zähler in der 50µSek Timerroutine. (exxx:) Die Zählroutine hat drei
Zustände:
1.    Zähler ist 0 und wartet auf Start.
2.    Zähler zählt im 50µSek. Takt
3.    Zähler hat seinen Maximalstand (50)

Beim Eintreffen eines Zeichens wird der Zählerstand geprüft:
1.    Wenn Zähler = 0 oder >40, dann Start Zähler und Zeichen als evt. Adresse speichern.
2.    Wenn Zähler < 40, dann haben wir soeben ein 2. Zeichen erhalten und die
        Bearbeitung des Befehls beginnt

Die Bearbeitung beginnt mit der Unterscheidung Lesen-Schreiben.
In beiden Fällen wird das Schreibbit MSB im Adressbyte gelöscht und der Adress-
bereich geprüft. Für Adressen > 111 gibt die Routine 00 zurück.

Gültige Adressen werden in Speicheradressen umgerechnet. Nach meiner Datenfeld-
ordnung brauche ich die Blockadresse : BlAdr = Feldende - SX-Adr % 16 x 16 +16.

Für die SX-Adresse 5 gilt z.B. : 5 % 16 = 0, Rest 5; 0 x 16 = 0; 0 + 16 = 16;
Innerhalb eines Blockes sind die SX-Adressen aufsteigend:
Deshalb: Blockadresse +16 - Restadressse.

Die Modulo-Division habe ich mit SWAP-Bytes und CLR Hi-Nibble realisiert.

Das Assembler Programm gibt es hier.  SX-Zentrale-2.asm


Steinhart, im Juni 2007