Bei der Manchester-Codierung wird jedes Datenbit während eines Taktes in zwei Hälften geteilt, wodurch der Leitungscode
gleichzeitig das Taktsignal erhält. Die fallende Flanke, bezogen auf eine volle Taktrate,
steht bei Carrera für die logische 1. Die ansteigende Flanke bei vollem Takt steht für die logische 0.
Die Information ist bei diesem Code also an die Signalflanken gebunden,
man spricht daher von einer digitalen Phasenmodulation (engl. Phase Shift Keying).
Abbildung 1
Der Carrera Manchester Code, Daten und Energie in einem Übertragungsmedium
Der Carrera Manchester Code weist ein paar Besonderheiten auf:
- Die Datenworte können unterschiedlich lang sein, die von der CU gesendeten Worte
sind 8,10 oder 13 Bit lang. Die von den Wagen an die CU gesendeten Datenworte
werden dabei zunächst ignoriert.
- Es gibt keine Stop- oder Fehlererkennungsbits
- Die Signalspannung wechselt nicht symmetrisch zwischen einem positiven und negativem
Spannungswert, sondern zwischen +14,8/18V und 0V. Damit bleibt im Signal ein Gleichspannungsanteil übrig,
über den die Wagen und Weichen mit der notwendigen Energie versorgt werden.
Daten und Energie werden also bei Carrera über dasselbe Medium übertragen.
Die gesendeten Worte können unterschiedlich lang sein, wobei das erste Bit als Startbit
immer eine Eins ist und damit keinen Informationsgehalt hat.
Die Taktrate beträgt bei Carrera 100 µs, das heißt alle 100 Microsekunden wird ein neues Bit erzeugt,
was einer Frequenz von 10 kHz entspricht. Der Arduino Uno ist aktuell mit 16 MHz getaktet, zwischen zwei
ankommenden Carrera Bits hat der Arduino also 1600 Taktzyklen Zeit, um andere Berechnungen auszuführen.
Das sollte mehr als ausreichend sein, um diverse Operationen im Processing Code auszuführen,
die Carrera Bits sind für den Arduino quasi wie Gleichstrom.
Abbildung 2
Die Sequenz der zehn gesendeten Datenworte, die zeitliche Abfolge der Sequenz ist für den
Algorithmus sehr wichtig.
Die Decodierung läuft wie folgt ab: Eine Interrupt Routine zur Decodierung der Bits wird bei jedem
Flankenwechsel aufgerufen. Genau dann, wenn der Zeitraum zwischen zwei Aufrufen eine Taktrate, also
100 µs lang ist, wurde ein Bit empfangen, ansonsten handelt es sich bei
dem Flankenwechsel um den Beginn eines neuen Wortes, den Wechsel zwischen zwei Bits oder
bei der CU um Bits, die an die CU gesendet werden. Der Level zum Zeitpunkt des Wechsels entscheidet,
ob eine logische Eins oder eine logische Null empfangen wurde. Ist der Level LOW, handelt es
sich um eine logische Eins. Die Bits werden der Reihe nach in einer zwei Byte langen Variablen gespeichert.
Liegt der letzte Wechsel mehr als 6000 ms zurück, beginnt ein neues Wort.
Abbildung 3
Der Programmablaufplan zur Dekodierung des Carrera Manchester Codes
Bei der Umsetzung des Programmablaufplans muss eine gewisse Fehlertoleranz eingebaut werden.
Alle gemessenen Zeiten zwischen 0,75 * Taktrate und 1,25 * Taktrate gelten als vollständiger
Takt. Die Grenze für ein neues Wort ergibt sich aus der minimalen Pause zwischen zwei Worten.
Alle 7,5 ms folgt ein neues Wort, davon wird die Dauer des längsten Datenwortes, des
Programmierdatenwortes mit 13 Bits abgezogen, das sind 13 * 100 µs = 1300 µs.
Zur Fehlertoleranz kann man wiederum einen Puffer von 10-25% einrechnen, das sind weitere 130-350 µs.
In der Praxis hat sich ein Wert von 6000 µs zur sicheren Erkennung eines neuen
Wortes bewährt. Der Processing Algorithmus der Interrupt Routine sieht damit wie
folgt aus.
void manchesterDecode(){ //////
currentMicros = micros(); // get current runtime
intervalMicros = currentMicros - previousMicros; // calculate interval
if (intervalMicros > 75 && intervalMicros < 125){ // is full clock pulse?
previousMicros = currentMicros; // synchronise
currentWord = currentWord << 1; // shift bits left
if ( digitalRead( dataPin ) == LOW ) // is pin level LOW?
bitSet( currentWord,0 ); // received digital 1
return; } // leave interrupt
if ( intervalMicros > 6000 ) { // is word rate?
Word = currentWord; // save bits for main loop
currentWord = 0; // reset bits
bitSet( currentWord,0 ); // first bit is always 1
wordChange = true; // indicate a new word
previousMicros = currentMicros; // synchronise
return; } // leave interrupt
} //////
Die an die CU gesendeten Bits ignoriert dieser Algorithmus. Die Bits würden 2300 µs
nach dem ersten Bit des letzten Wortes beginnen. Dieses Zeitintervall wird aktuell nicht
berücksichtigt, die Interrupt Routine reagiert nur auf die zwei Zeitintervalle
"voller Takt" und "neues Datenwort". Wer diese Datenworte mit auswerten möchte, muss
die Interrupt Routine um eine weitere if-Abfrage ergänzen.
Experimentierkasten
Alle Dateien für eigene Experimente zum Download auf einen Blick
- Definitionen zur Carrera Manchester Decodierung, Open Document Format, odg
- Definitionen zur Carrera Manchester Decodierung, Portable Document Format, pdf
- Programmablaufplan Carrera Manchester Decodierung, Open Document Format, odg
- Programmablaufplan Carrera Manchester Decodierung, Portable Document Format, pdf
Erstveröffentlichung: März 2013