Manchester-Code

(Firma: Promaxx.net)
Wozu immer diese Manchester-Code-Fragen ?
Funkübertragung ?

Das habe ich mit einfacher Software gelöst. Wichtig ist nur der häufige 
Bitwechsel. Aus jedem Bit erzeuge ich einfach 2. Aus 0 wird 01 aus 1 
wird 10. Damit gibt es genug Wechsel. Die Start- und Stopbits stören 
auch nicht so sehr.
Gast
>Wozu immer diese Manchester-Code-Fragen

Nicht unbedingt Funk... Als kleines Beispiel: Profibus PA übertragung 
wird mit Manchester-Code gemacht. Also nicht immer die einfachste 
Antworten sind die richtigen...
(Firma: Promaxx.net)
Manchester setzt jedes Bit in eine 2-Bit-Folge um.
Werden Bei Eurem Protokoll auch die Start- und Stopbits nach Manchester 
codiert ?
Man könnte dann ja ein einfaches Hardware-XOR einfügen, daß mit einem 
High-Low-Signal in der Frequenz des Schrittaktes versorgt wird, um den 
Manschester-Code zu erzeugen.
Gast
Manchester ist tatsächlich eine XOR-Verknüpfung.
Daten und Clock werden dabei zusammen übertragen.
       1 0 1 0 0 1 0 1 1
Daten --__--____--__----
Clock -_-_-_-_-_-_-_-_-_
M     _--__--_-__--__-_-

Die Datenrate ist die Halbe Clockrate.
Durch den Wechsel wird eine Gleichspannung verhindert.

Es gibt auch gedrehten Manchester (!M)

Gruß Hans
Gast
>Mehr input!

Also ich möchte die Daten aus einem Multimeter auswerten. Das Messgerät 
sendet 14 Byte es werde 8 Datenbits und ein Stopbit gesendet die 
Übertragungs rate ist 2400.
Gast
Ich hätte da noch eine Frage wen mit einem Stopbit gearbeitet wird 
bedeutet das denn das nach 8bit immer eine " 1 " kommt oder wie kann ich 
mir das vorstellen.
@hans (Gast)

>Manchester ist tatsächlich eine XOR-Verknüpfung.

Ein landläufiger Irrtum bzw. Vereinfachung.
Das klappt nämlich nur, wenn der Takt saubere 50% Tastverhältnis hat. 
Und wenn sich, vor allem bei höheren Datenraten, keine bösen 
Verzögerungen einschleichen, dann gibts bisweilen Glitches.
Sauber wird das nur, wenn man von vorn herein das mit dem doppelten Takt 
beteibt und die Manchesterdaten generiert.
Warum wohl hatten die 10 Mbit Ethernetkarten einen 20 MHz Quarz?!!

>Daten und Clock werden dabei zusammen übertragen.

Quasi.

>Die Datenrate ist die Halbe Clockrate.

Das ist auch wieder so ein halbgarer Satz.
Die Baudrate ist bei Manchester doppelt so hoch wie die Datenrate.

MFG
Falk


@ marc (Gast)

>Also ich möchte die Daten aus einem Multimeter auswerten. Das Messgerät
>sendet 14 Byte es werde 8 Datenbits und ein Stopbit gesendet die
>Übertragungs rate ist 2400.

Und was lässt dich gleuben, das hätte was mit Manchester zu tun? Das ist 
popeliges RS232.

http.//www.gidf.de

google rs232 messgerät

http://www.gerald-gradl.de/eprojects/multi/body_multi.html

MFG
Falk
Gast
>Und was lässt dich gleuben, das hätte was mit Manchester zu tun? Das ist
>popeliges RS232.

Ja und das möchte ich per Funk übertragen und dann auf einen MC geben.
Gast
>>Dann kauf dir ein Funkmodul mit RS232 Ein/Ausgang, das erledigt die
>>(Manchester)kodierung allein.

Kannst du mir auch eine Internet seite sagen auf der es das gibt.
Gast
oder du kannst dir etwas mit einem uC schreiben, jedoch vergiss nicht 
das Prelude, Sync sowie checksum und eventuell Hamming oder einen 
anderen
Bitfehlercode.

Manchester encoding:

ushort manchester_encode(uchar c) {
 uchar msb,lsb;
  msb = (c & 0xAA) | ((~c & 0xAA)>>1);
  lsb = (c & 0x55) | ((~c & 0x55)<<1);
  return ((ushort)msb << 8) | lss;
}

Manchester decoding:

ushort manchester_decode(ushort mc) { // return -1 on error;
 uchar msb,lsb;
  msb = (uchar)(mc >> 8);
  if ( (msb & 0xAA) ^ ((~msb & 0x55) << 1) ) then return -1;
  msb &= 0xAA;
  lsb = (uchar)mc;
  if ( (lsb & 0x55) ^ ((~ls & 0xAA)>>1) ) then return -1;
  lsb &= 0x55;
  return msb | lsb;
}
>> Manchester encoding:

Hallo Chris,

wenn ich den Code von Hand durchevaluiere, komme ich
auf eine "nicht standardkonforme Codierung":

>  msb = (c & 0xAA) | ((~c & 0xAA)>>1);
>  lsb = (c & 0x55) | ((~c & 0x55)<<1);
>  return ((ushort)msb << 8) | lsb; // lss corrected

Sei die Bitdarstellung von c

          c ::= (c7 c6 c5 c4 c3 c2 c1 c0)

und "/x" die Negation von x.

Also:

> msb = (c & 0xAA)

        (c7 0 c5 0 c3 0 c1 0)

> | ((~c & 0xAA)>>1);

     (/c7 0 /c5 0 /c3 0 /c1 0) >>1
    =(0 /c7 0 /c5 0 /c3 0 /c1)

-> msb = (c7 /c7 c5 /c5 c3 /c3 c1 /c1)

-x-x-x----------------------------

> lsb = (c & 0x55) |

        (0 c6 0 c4 0 c2 0 c0)

> ((~c & 0x55)<<1);

        (0 /c6 0 /c4 0 /c2 0 /c0) <<1
       =(/c6 0 /c4 0 /c2 0 /c0 0)
 lsb = (/c6 c6 /c4 c4 /c2 c2 /c0 c0)

returns: (c7 /c7 c5 /c5 c3 /c3 c1 /c1  /c6 c6 /c4 c4 /c2 c2 /c0 c0)

IMHO sollte der Ziel-Machesterrueckgabewert so aussehen:

(c7 /c7 c6 /c6 c5 /c5 c4 /c4  c3 /c3 c2 /c2 c1 /c1 c0 /c0)


Viele Gruesse,
Hans
Gast
Stimmt, das Beispiel stammt ursprünglich aus einer 
Fernsteuerungsapplication, da ist die Bitfolge nicht so wichtig, mein 
fehler, für point2point würde es trotzdem gehen, was ich auch gemacht 
habe.
Gast
Hallo zusammen...

Ich wollt mal nachfragen, ob mir jmd weiterhelfen kann.
Mein Anliegen: Ich möchte mit Hilfe eines PIC's die Eingangssignale 
mittels  Assemblerssprache so verarbeiten, dass ich am Ausgang ein 
Manchester codiertes Signal erhalte(sowhl codieren als auch decodieren).
Mir sind die technischen Hintergründe und sonstges soweit klar, nur habe 
ich ein Problem mit dem genauen Ablauf,d.h. die Daten aus dem 
Register(8/16 Bit) jeweils einzeln in 2Bit umzuwandeln und diese dann 
weiter an den Ausgang zu geben, so dass ein serieller Datenstrom 
entsteht.

Ich hoffe, es kann mir jmd etwas dazu sagen.

Guido
@ Guido (Gast)

>Mein Anliegen: Ich möchte mit Hilfe eines PIC's die Eingangssignale

http://www.apostroph.de/

>mittels  Assemblerssprache so verarbeiten, dass ich am Ausgang ein
>Manchester codiertes Signal erhalte(sowhl codieren als auch decodieren).

Ja was denn nun?

>Register(8/16 Bit) jeweils einzeln in 2Bit umzuwandeln und diese dann
>weiter an den Ausgang zu geben, so dass ein serieller Datenstrom
>entsteht.

Stichwort Bitmanipulstion und Schiebeoperation.

MfG
Falk
Gast
@Falk

Vielen Dank erstmal für die schnelle Antwort.

>Ja was denn nun?

War etwas unglücklich ausgedrückt von mir, meinte mit einen PIC will ich 
die Eingangssignale in den Manchester Code umwandeln und mit einem 
zweiten PIC das empfangene Machnester-Signal wieder decodieren.



Guido
Gast
@frank


Das Eingangssignal besteht aus einer binären Information, die mittels 
Programm(im PIC gespeichert) in einen Machnester Code umgewandelt werden 
soll...


Guido
@ Guido (Gast)

>@frank

Das bin zwar nicht ich, aber ich sag mal

>Das Eingangssignal besteht aus einer binären Information, die mittels
>Programm(im PIC gespeichert) in einen Machnester Code umgewandelt werden
>soll...

Na das ist doch fast zu einfach. Die Daten byteweise lesen, und für 
jedes Bit im Byte zwei Datenbits ausgeben.

Byteschleife
Byte lesen
Bitschleife
Bit #0 = 1?
wenn ja, 0 ausgeben, 1 Bitzeit warten, 1 ausgeben 1 Bitzeit warten
wenn nein, 1 ausgeben, 1 Bitzeit warten, 0 ausgeben 1 Bitzeit warten
Byte um 1 Bit nach rechts schieben
Ende Bitschleife
Ende Byteschleife

MFg
Falk
Gast
@falk (sorry, wenn ich den falschen Namen geschrieben hatte)


Also von dem Programm her ist es, wie du schon sagst, nicht so 
schwer.Ich habe nur bei der Ausführung ein paar Bedenken, d.h. wenn ich 
aus dem Informationsbyts ein Bit herausfiltere und es in 2 Byte 
umwandle, sollen diese beiden Bits ausgegeben werden. Aber so wie ich es 
bisher kennen gelernt habe, kann ich nicht nur 2 Bits allein ausgeben 
sondern 16 Bits (z.B. FFh).
Ich habe ja schon überlegt, dass im ersten Ausgabebyte alle Bits Null 
gesetzt werden und im zweiten Ausgabebyte alle Bits eins gesetzt werden, 
oder umgekehrt(je nachdem, ob eine binäre 1 oder 0 mittels Manchester 
Code dargestellt werden sollen). Somit hätte man ja auch die 2 Bits, 
halt nur in einer etwas verlängert sozusagen (hoffe, man kann meine 
Gedanken nachvollziehen). Desweiteren noch ein kleines gedankliches 
Problem. Wenn das erste Bit in den Manchester Code umgesetzt und 
ausgegeben wird, wird das nächste Bit in den Manchester Code umgesetzt. 
Bevor das zweite umgesetzte Bit ausgegeben wird , vergeht etwas Zeit . 
Wäre diese Zeit störend beim decodieren?


MFG

Guido
@ Guido (Gast)

>Also von dem Programm her ist es, wie du schon sagst, nicht so
>schwer.

Dafür tust du dich scheinbar umso schwerer.

>Ich habe nur bei der Ausführung ein paar Bedenken, d.h. wenn ich
>aus dem Informationsbyts ein Bit herausfiltere und es in 2 Byte
>umwandle,

2 Byte? Du meinst 2 Bit, oder?

> sollen diese beiden Bits ausgegeben werden.

Ja.

> Aber so wie ich es
>bisher kennen gelernt habe, kann ich nicht nur 2 Bits allein ausgeben
>sondern 16 Bits (z.B. FFh).

Was hast du denn kennengelernt? Man kann ein Bit problemlos auf ein 
IO-Pin ausgeben, siehe AVR-Tutorial: IO-Grundlagen.

>Ich habe ja schon überlegt, dass im ersten Ausgabebyte alle Bits Null
>gesetzt werden und im zweiten Ausgabebyte alle Bits eins gesetzt werden,
>oder umgekehrt(je nachdem, ob eine binäre 1 oder 0 mittels Manchester
>Code dargestellt werden sollen).

Kann man machen.

> Somit hätte man ja auch die 2 Bits,
>halt nur in einer etwas verlängert sozusagen (hoffe, man kann meine
>Gedanken nachvollziehen).

Es ist ziemlich schwer.

>Problem. Wenn das erste Bit in den Manchester Code umgesetzt und
>ausgegeben wird, wird das nächste Bit in den Manchester Code umgesetzt.

ja.

>Bevor das zweite umgesetzte Bit ausgegeben wird , vergeht etwas Zeit .
>Wäre diese Zeit störend beim decodieren?

Alles relativ. Wenn dein Bit 1s lang ist, und da ein paar Dutzend 
Mikrosekunden fehlen, spielt das keine Rolle. UNd gerade Manchester ist 
SEHR robust gegenüber Bitzeittolerenzen, wenn der Empfänger was taugt. 
Aber der fällt nciht vom Himmel.

Ich glaube du solltest dich erstmal mit einer UART-Übertragung befassen, 
dann vielleicht Soft-UART. Dir fehlen einige Grundlagen.

MFG
Falk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.