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