• Hallo TT-Modellbahner, schön, dass du zu uns gefunden hast.
    Um alle Funktionen nutzen zu können, empfehlen wir dir, dich anzumelden. Denn vieles, was das Board zu bieten hat, ist ausschließlich angemeldeten Nutzern vorbehalten. Du benötigst nur eine gültige E-Mail-Adresse und schon kannst du dich registrieren.
    Deine Mailadresse wird für nichts Anderes verwendet als zur Kommunikation zwischen uns.
    Die Crew des TT-Boardes

Die Kommunikation

Wieder mal so ein eher technischer Artikel, also nur für diejenigen die sich für die Details in dem Bereich interessieren.

blinker.gif


Dieses Element muss ja irgendwie dazu überredet werden dass die Anzeige-LED blinken.

Wie ich schon geschrieben hatte sind die Elemente mit dem Raspberry ja über einen SPI Bus verbunden. Auf diesem erfolgt der Datenaustausch vom Master zu den einzelnen Slaves, die Antworten der Slaves können nur gesendet werden wenn der Master aktiv dazu auffordert. Wie im IT Bereich üblich erfolgt die Kommunikation byteweise, an dieser Stelle gibt es dann ein spezielles Protokoll aus Nachrichten die aus 1 oder 5 Bytes bestehen können.

Die allgemeine Syntax ist <Befehl> <AddrH> <AddrL> <Wert1> <Wert2> wobei bei manchen Befehlen sowohl Werte als auch Adressinformation entfallen.

Das erste Byte stellt den auszuführenden Befehl dar. Aktuell gibt es folgende Befehle:

Befehl-
Byte
Anzahl
Bytes
BefehlsinhaltDatenbytesRückgabe
0xC01PushVal - Setze den anzuzeigenden Wert und stelle diesen sofort auch darAdresse +
Werte
-
0xC11Push - Alle Anzeigeelemente zeigen das Bild zum letzten gesetzten Wert an; mit diesem Kommando kann ein
synchrones Umstellen von mehreren Elementen erreicht werden wenn das gewollt ist
--
0xC25BlinkAus - Blinktakt aus, alle Elemente stellen das zu Wert1 gehörige Bild dar --
0xC35BlinkEin - Blinktakt ein, alle Elemente stellen das zu Wert2 gehörige Bild dar
Mit diesen beiden Taktbefehlen wird das synchrone Blinken aller Elemente erreicht
--
0xC41Reset - Alle Werte auf Initialstatus--
0xC51SetVal - Setze den anzuzeigenden Wert, ohne diesen sofort auch darzustellen; das Anzeigebild wird dann mit Push aktiviert--
0xC85Status - Mit diesem Befehl wird der Status eines Elementes abgefragt (Taste gedrückt j/n)Adresse + LeerbytesStatuswert
0xC95Gruppenstatus - Mit diesem Befehl wird der Status einer Tastengruppe abgefragt (Tasten gedrückt j/n); da ja jeder Tastendruck nur ein Bit benötigt können hier 16 Tasten in einer aufsteigenden Adressenreihenfolge gemeinsam abgefragt werdenAdresse + LeerbytesStatuswert
0xD05GetAdresse - Mit diesem Befehl wird die Adresse eines Elementes abgefragt, Details weiter unten4 LeerbytesAdresse
0xD15SetAdresse - Mit diesem Befehl wird die Adresse eines Elementes gesetzt, Details weiter untenAdresse + Leerbytes-
0xD25AendAdresse - Adrese ändern, mit diesem Befehl wird die Adresse des angesprochenen Elementes auf eine neue Adresse geändertAdresse +
Neue Adresse
-
0xD35SetAdresse2 - Mit diesem Befehl wird die Adresse aller gesteckten Elementes abgefragt, Details weiter unten Leerbytes +
Neue Adresse
-
0XD45GetAdresse2 - Mit diesem Befehl wird die Adresse eines Elementes gesetzt, Details weiter unten LeerbytesAdresse
0xD55Identifikation - Das adressierte Element blinkt mit allem was es zu bieten hat Adresse +
Leerbytes
-
0xD65GetVersion - Abfrage der auf dem Element installierten SoftwareversionAdresse +
Leerbytes
Software-

Der Raspberry sendet die 1 oder 5 Bytes. In den Befehlsbytes sind immer die beiden höchstwertigen Bits gesetzt, das ist gleichzeitig auch die eindeutige Kennung für ein Befehlsbyte. In den Datenbytes dürfen dann die beiden höchstwertigen nicht beide gesetzt sein, d.h. es sind Werte von 0 bis 191 zulässig.
Dementsprechend können - rein theoretisch - 38884 Elemente adressiert werden, das sollte auch für den größtmöglichen Stelltisch reichen.

Die Daten legen bitweise fest welche LED am Element leuchten soll. Hat das jeweilige Element keine LED an der Position dann passiert halt nichts.

BitFunktion
0b10000000 (128)Der gelbe Gleisstreifen leuchtet
0b01000000 (64)Der rote Gleisstreifen leuchtet
0b00100000 (32)Der gelbe Gleisstreifen im Abzweig leuchtet (bei Weichen) oder
Zusatz-LED 5 leuchtet (gibt es noch kein Element)
0b00010000 (16)Der rote Gleisstreifen im Abzweig leuchtet (bei Weichen) oder
Zusatz-LED 4 leuchtet (im Signalfeld)
0b00001000 (8)Der Gleispunkt leuchten
0b00000100 (4)Zusatz-LED 3 leuchtet
0b00000010 (2)Zusatz-LED 2 leuchtet
0b00000001 (1)Zusatz-LED 1 leuchtet

Diese Werte können beliebig miteinander kombiniert werden mit der Ausnahme, dass gelber und roter Gleisstreifen nicht zusammen angesteuert werden können, aber dafür gibt es ja auch keine Notwendigkeit.

Der Wert1 legt fest welche Elemente leuchten wenn der Blinktakt ein ist (letzter gesendeter Befehl 0xC3), der Wert 2 legt fest welche Elemente leuchten wenn der Blinktakt aus ist (letzter gesendeter Befehl 0xC2). Damit kann das Blinken aller Anzeigeelemente realisiert werden (auch wenn das natürlich nicht für alle sinnvoll ist). Die Ansteuerungssoftware (dazu kommt später mehr) muss dann wissen welche Leuchten bei welchem Status (einer Fahrstraße, einer Weiche usw.) auf welchem Element angesteuert werden müssen. Das einzelne Element weiß nichts über Fahrstraßen, Signale oder was auch immer.

Einzige Ausnahme dabei ist das Zählerfeld, das bekommt direkt numerisch den anzuzeigenden Wert:

V097.jpg
v353.jpg


Links: PushVal 32 17 0 97, rechts PushVal 32 17 2 79; 32 17 ist die Adresse des Elements, 0 97 ist der Wert 97, 2 97 ist der Wert (2 * 128) + 97 = 353.

Alle Logik welche Fahrstrasse wie eingestellt wird, welches Signal und welche Weiche wann gestellt wird und alles andere ist in der Steuersoftware auf dem Raspberry. Die Elemente des Gleisbildpultes sind reine Anzeige und Eingabeelemente. Im Prinzip wie beim Vorbild, nur dass es eben kein Relaisraum sondern stattdessen ein Computer ist der mit den Tasten und Anzeigen interagiert.

Zum Abfragen der Tasten werden die Befehle 0xC8 und 0xC9 verwendet. In beiden Fällen antworten nur die über die Adresse angesprochenen Elemente, alle anderen bleiben stumm. Der Raspberry muss dann also die Antwort der jeweiligen Taste zuordnen. Die Antwortbytes 1 bis 3 sind immer 0, weil da keiner antwortet, denn erst nach dem Eintreffen des 3. Bytes ist ja über die Adresse klar wer gemeint ist.
Bei 0xC8 wird genau ein einzelnes Element abgefragt. Dieses sendet im 4. Byte den aktuellen Status seiner 7 Ausgänge (an denen die LED dran sind) und den Status seines Eingangs, also des angeschlossenen Tasters. Für die Abfrage eines Elementes ist 0xC8 gar nicht so sehr gedacht, sondern eher für die Abfrage eines I/O für Gleisbelegtmelder oder auch für die Abfrage eines Weichendecoders zur aktuellen Weichenstellung etc.
Bei 0xC9 wird eine Gruppe von Elementen abgefragt, und zwar alle 16 Elemente ab der (auf einen durch 16 teilbaren Wert abgerundeten) abgefragten Adresse. Das erste Element sendet seinen Status im ersten (niedrigstwertigen) Bit des 4. Antwortbytes, bis zum 8. Element im letzten (höchstwertigen) Bit des 4. Antwortbytes. Die Elemente 9 bis 16 senden analog im 4. Antwortbyte. Auf diese Weise können mit einem Pollzyklus 16 Tasten abgefragt werden.

Technisch passiert dass, indem jedes Element bei genau dem Bit was relevant ist den auf dem Element befindlichen Rückmeldetransistor durchsteuert, dieser also die DO Datenleitung auf Masse zieht, während alle anderen Elemente den Transistor nicht durchsteuern und damit keinen Einfluss auf die Kommunikation nehmen.

Insgesamt habe ich versucht, sowohl die Kommunikation mit den Einzelelementen als auch die Software auf den PIC der Einzelelemente so simpel wie möglich zu halten. Alle komplexeren Funktionen liegen in der Ansteuersoftware des Raspberry.

Die Kommunikation zu den externen Sensoren, Signalen und Servoansteuerungen wird auch nach diesem Schema aufgebaut. In dem Zusammenhang kommen wahrscheinlich noch ein paar Befehle und neue Attribute dazu. Allerdings kann der Teil gegebenenfalls auch auf dem Raspberry an andere Hardware angebunden werden.

Kommentare

Blogeintragsinformationen

Autor
SuperJo
Read time
5 min read
Aufrufe
1.307
Kommentare
1
Letztes Update

Weitere Einträge in Anlagenbau

Weitere Einträge von SuperJo

  • Die reale weite (Modellbahn-)Welt
    So ein Stellpult ist ja eine schöne Bastelei, aber das muss ja in der echten Welt auch irgendwas...
  • Die Elektrik
    Jetzt geht's dann mal ans Eingemachte, also ein bisschen konkreter in die technischen Details...
  • Das Pult im Überblick
    Heute geht es mal um das Pult im Gesamtaufbau und die momentan gegebenen Möglichkeiten. So sieht...
  • Die Basis
    Bis jetzt habe ich ja die Elemente im einzelnen vorgestellt. Jetzt geht es mal um die...
  • Elementübersicht
    Heute nun mal eine Übersicht, welche Elemente es - bis jetzt - gibt. An dieser Stelle geht es...

Diesen Eintrag teilen

Zurück
Oben