Carrera Manchester Decodier Algorithmus
Der Processing Sketch zur Decodierung der Carrera Manchester Bits mit dem Arduino


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).

Der Carrera Manchester Code
Abbildung 1
Der Carrera Manchester Code, Daten und Energie in einem Übertragungsmedium

Der Carrera Manchester Code weist ein paar Besonderheiten auf:


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.

Die Carrera Protokollsequenz
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.

Ablaufplan Carrera Manchester Decode
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

  1. Definitionen zur Carrera Manchester Decodierung, Open Document Format, odg
  2. Definitionen zur Carrera Manchester Decodierung, Portable Document Format, pdf
  3. Programmablaufplan Carrera Manchester Decodierung, Open Document Format, odg
  4. Programmablaufplan Carrera Manchester Decodierung, Portable Document Format, pdf


Erstveröffentlichung: März 2013

Home / Carrera-Hacks   -   CC BY-NC-SA   -   Impressum   -   Kontakt
Powered by: bluefisch, LibreOffice, and the gimp