Forum: Mikrocontroller und Digitale Elektronik Manchester mit AVRGCC


von MdeWendt (Gast)


Lesenswert?

Hallo,

um Daten über Funk zu übertragen muss ich Manchester verwenden 
(Gleichspannungsfreiheit). Ich habe erst direkt versucht das Funkmodul 
an die RS232 des Atmel anzuklemmen, damit ist die Übertragung aber sehr 
sehr schlecht und man riet mir unbedingt Manchester zu nehemen. Jetzt 
meine Frage:

hat schon mal jemand Manchester unter AVRGCC implementiert und kann mir 
einige Tipps bzw Quellcode zu Verfügung stellen?

Martin

von Günter König (Gast)


Lesenswert?

Hi Martin,

was ist "Manchester"??

Günter

von XCyber (Gast)


Lesenswert?

fundstück aus dem web, hoffe es hilft dir.
lG
XCyber

Manchester encoding in
general is a scheme where each transmitted data bit is followed by its
complement, so that there is no net DC level. The effect is that the
longest "run-of-identical-bits" is two: there are never more than two 
ones
or two zeros transmitted in a row, no matter what data is sent.

"Real" Manchester encoding uses hardware to split each bit transmission
time into two phases, and complements the second phase.

But, you can certainly send "almost Manchester" encoded data by encoding
each byte as two bytes, with each data bit followed by its complement.
(Clearly, this cuts the effective data rate in half!) The UART will add 
the
standard start and stop bits to each byte, but the resulting bit stream
still has only two-bit long runs, since there is a one bit run at each 
end
of the encoded data. (However, you can not delay between bytes in a 
packet,
as the idle time between bytes is not balanced)

This scheme is useful with some low cost digital radios which use 
"on-off"
keying rather than FSK or another more complex scheme (see, for example,
http://www.linxtechnologies.com>; and <http://www.rfm.com). The receivers 
in such systems
use the average received signal level to set the threshold between a one
and a zero. Thus, Manchester encoded data will bias the system to the
optimum threshold.

Essentially, if you consider every other bit to be the "data", only the
nybbles 0x5, 0x6, 0x9, and 0xA have the pattern of "data bit followed by
its complement", so all your data gets encoded into combinations of 
these
nybbles. Each two bits becomes four:
  orig data   (bit cpl  bit cpl)  hex nybble
     00    ==>   0 1  0 1           = 5
     01    ==>   0 1  1 0           = 6
     10    ==>   1 0  0 1           = 9
     11    ==>   1 0  1 0           = A

So, you need software routine which takes a byte, and returns two bytes
encoded such that each bit from the original byte is followed by its
complement. Then, send these two bytes out with the standard UART.


If you encode all the bits in order, as follows
(~x represents complement of bit x)

    orig. data         ms encoded             ls encoded
7 6 5 4 3 2 1 0 ==> 7 ~7 6 ~6 5 ~5 4 ~4   3 ~3 2 ~2 1 ~1 0 ~0

then you are in for a bunch of shifting and bit diddling for each data 
byte.

Better is to encode alternate bits in each byte, so you can process four
bits at a time, and just shift, mask, complement, and then or the bits
together to get each encoded byte. For example, encode the odd bits in 
the
ms byte, and the even bits in the ls:

    orig. data         ms encoded              ls encoded
7 6 5 4 3 2 1 0 ==> 7 ~7 5 ~5 3 ~3 1 ~1     ~6 6 ~4 4 ~2 2 ~0 0

For example, to encode the odd bits, take the original data, copy and
complement it, and then AND each with 0xAA to clear the even bits. Shift
the complement right 1 spot, and OR with the original.

This lets you encode (at the transmitter) and decode (at the receiver) 
each
data byte relatively quickly. ("Quickly enough" depends on your baud 
rate,
crystal, other cpu tasks, etc. We use a fairly pokey 4800 baud, and thus
have no trouble keeping up with the data with a 3.6864 MHz 8031.)

It is possible to use tables to encode/decode, with the usual size/speed
trade-off. But, for my compiler, the "C" table lookup is not any faster
than the assembly shift and mask, so I use math rather than the table.

Here is sample C code:

typedef unsigned char uchar;    /* to avoid typing "unsigned" all the 
time */
typedef unsigned short ushort;
enum {false, true};             /* for bit flags */

extern bit manErrFlg;   /* set this flag if an invalid byte is received 
*/
/* NOTE: For example only. You decide how to signal a receive error */

/* Manchester encode byte c as two bytes: Odd bits in MS byte, Even in 
LS */
ushort manEncode(uchar c)
{
    uchar ms, ls;

    ms = (c & 0xAA) | ((~c & 0xAA)>>1);     /* encode odd bits w/ their
cpls */
    ls = (c & 0x55) | ((~c & 0x55)<<1);     /* now even bits */
    return ((ushort)ms << 8) | ls;          /* build two bytes into a 
short */
}

/* decode odd bits from MS byte, even bits from LS byte. If mc is not */
/* valid (bits don't match complements) then set manErrFlg and return 0 
*/
uchar manDecode(ushort mc)
{
    uchar ms, ls;

    ms = (uchar)(mc >> 8);      /* get ms byte from short */
    if ( (ms & 0xAA) ^ ((~ms & 0x55) << 1) )
    {
        manErrFlg = true;   /* odd bits != complement of their 
complements */
        return 0;           /* so flag the error and punt */
    }
    else
        ms &= 0xAA;         /* otherwise, valid data, so just clear cpls 
*/

    ls = (uchar)mc;         /* now test even bits... */
    if ( (ls & 0x55) ^ ((~ls & 0xAA)>>1) )
    {
        manErrFlg = true;
        return 0;
    }
    else
        ls &= 0x55;         /* valid, so clear complements */

    manErrFlg = false;
    return ms | ls;         /* OR original odd and even bits back 
together */
}

von Ingo B. (Gast)


Lesenswert?

Hi Martin:

Manchestercode ist ein selbsttaktender Code. Jedes Bit wird durch eine 
Pegeländerung (Flanke) dargestellt.
Der Code hat keinen Gleichstromanteil, benötigt aber die doppelte 
Bandbreite (wegen Pegeländerung).

Manchester (oder auch Biphase-L) ändert den Pegel in der
Mitte des Bitintervalls und zwar fallend für Bitwert 1
und steigend für Bitwert 0.

Bis dann,
Ingo.

von H. Howey (Gast)


Lesenswert?

Hallo...
Schau dir mal die Application Note 410 von Atmel an. Es geht um einen 
RC5 Infrarot Empfänger. Dort ist wird der Manchester Code benutzt und 
erklärt.
Gruß
Holger

von Günter König (Gast)


Lesenswert?

Dank euch,

und als Modulationsart wird FSK oder PSK (und mögliche Abarten) benutzt?

Gruß,
Günter

von H. Howey (Gast)


Lesenswert?

Hallo...
Ich denke das der Aufwand für FSK mit Manchester Code etwas hoch ist. 
Bei PSK wird der Sender ja nur einfach Ein- bzw. Ausgeschaltet. Du 
brauchst dann den Code nur in kleine Zeitabschnitte zerlegen. Das ich 
ist z.B. bei der AM410 die Hälfte einer "0" bzw "1" = 889µs .
Gruß
Holger

von Henning (Gast)


Lesenswert?

In der Elektronikzeitschrift EAM 01/2002 ist ein Programm (für 
Telemetrie)dokumentiert, allerdings für einen PIC 16F84. Ich denke, daß 
man das Programm für einen AVR leicht umändern kann.

von Günter König (Gast)


Lesenswert?

Hi Holger,

wird bei PSK nicht ein Phasensprung erzeugt wenn der Pegel von L nach H 
wechselt?

Gruß,
Günter

von H. Howey (Gast)


Lesenswert?

Hallo...
Im Zusammenhang mit dem Manchester Code, nein, da ist kein Phasensprung 
zwischen L und H.
Gruß
Holger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.