Hallo,
ja ich denke auch, dass ich eine Manchester Codierung benötige. Die Manchestercodierung eines Bytes an sich ist auch kein Problem, da habe ich schon etwas gefunden, das Problem was ich habe ist, wie soll ich dieses Byte dann an den Transmitter schicken?
Über UART gehts ja leider schlecht, da mir ja dieser durch die Start und Stoppbits die Codierung wieder unbrauchbar macht.
Und vor allem, wie kann ich die gesendeten Bytes dann empfangen?
Ich dachte vorher nur mit dem PC, aber das wird wohl nicht möglich sein, da muss wohl auch ein kleiner µC her, der mir das ganze dekodiert und dann via UART an den PC schickt.
Hier die Routine für die Manchester Kodierung bzw. Dekodierung:
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 */
}
Lesezeichen