Forum: Mikrocontroller und Digitale Elektronik Manchester Dekodieren Probleme mit der Abfrage


von Hors Z. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche ein Manchester codiertes signal über den C1OUT Comparator 
zu dekodieren. Das Signal liegt sauber an nun bin ich dabei eine 
einleseroutine zu programmieren.



Ich habe das Problem das nicht alle Bitwechsel erkannt werden. Das erste 
Bit dient als Startbedienung. Der Timer3 erzeugt nur ein zeitfenster was 
mit der eigentlichen Funktion nichts zutun hat.

Beispiel: Es kommt ein Signal rein welches mit dem Osciloskop folgendes 
ist: 1 1111 1110 (Hex FE) jedoch wird es erkannt als 1 1110 0111 (Hex 
E7)der erste 1 jeweils dient als Startbit.

Habe bereits geringfügig den Timer 2 , welcher eine Periode lang warten 
soll geändert jedoch hilft das nicht viel.

Das signal hat eine Übertragungsrate von 1200Hz.

Ich programmiere in C und nutze MPLAB und den C18 Compiler für meinen 
PIC18F67J60

Bin für jede Anregung dankbar!

von Hors Z. (Gast)


Lesenswert?

Hier die Timer Konfiguration

//Timer2 Registers Prescaler= 1 - TMR2 PostScaler = 14 - PR2 = 119 - 
Freq = 1200.48 Hz - Period = 0.000833 seconds
  T2CON |= 104;        // bits 6-3 Post scaler 1:1 thru 1:16
  //T2CON.TMR2ON = 1;  // bit 2 turn timer2 on;
  T2CONbits.T2CKPS1 = 0; // bits 1-0  Prescaler Rate Select bits
  T2CONbits.T2CKPS0 = 0;
  PR2 = 119;         // PR2 (Timer2 Match value)

von kalle (Gast)


Lesenswert?

schau dir mal das rfid-beispiel an, die kommentare, state-maschine und 
das timing sind gut verständlich:
http://avr.myluna.de/doku.php?id=de:rfid.luna

von Alex (Gast)


Lesenswert?

Du musst die Bitsynchronisation hinbekommen! Nur bei einem 0-1 / 1-0 
Wechsel der Daten erhällst du nur Flanken in der Bitmitte.Darauf musst 
du warten & synchronisieren. Bei 0-0 / 1-1 Daten kannst du die 
Phasenlage nicht erkennen - Synchronisation unmöglich. Deshalb wäre es 
gut, deinen Daten ein Sync-Byte (xAA) voran zu stellen

von Hors Z. (Gast)


Lesenswert?

Ok Bitsynchronisation klingt sinnvoll. Habe es mal gegoogelt habe nur 
erklärungen dazu gefunden. Wie stelle ich so etwas an? Im Prinzip die 
Länge des 1. Bit messen und als Referenz für den Timer nehmen? Oder wie 
muss ich mir das vorstellen?

Danke schonmal für eure antworten.

von Ralph (Gast)


Lesenswert?

Naja Manchestercode heißt ja das der Takt mit dem Datensignal 
zusammengeführt ist.
Zum dekodieren musst du den Takt zurückgewinnen indem du die beiden 
Signale auftrennst.

Das erste Bit messen geht nur wenn du weißt ob das erste Bit eine"1" 
oder eine "0" ist. Ansonsten misst du den falschen wert.

Ich hab einen solchen Dekoder ebenfalls schon mal aufgebaut und es da 
etwas anders gemacht.
Mein Ansatz war:
Ich lege eine Array mit der Anzahl an Elementen die der maximalen Anzahl 
der Flanken entspricht.
Mit dem Timer messe ich die Zeit zwischen den Flanken und speichere 
diese Zeiten im Interrupt ins Array.
Wenn dann alle Flanken angekommen sind wird, in der Mainloop das Array 
ausgewertet. Aus den Zeiten im Array lässt sich der Takt raus rechnen 
und damit dann das Signal und Takt trennen.

von mira (Gast)


Lesenswert?

Ralph schrieb:
> Ich lege eine Array mit der Anzahl an Elementen die der maximalen Anzahl
> der Flanken entspricht.

ein Array ist auch eine einfache Möglichkeit (bei ausreichend 
Ressourcen). So sahen meine ersten versuche auch aus. Die im Beispiel 
auf der Luna-Webseite dargestellte Variante ist passend für den 
tiny2313. Auf Grund der recht ausführlichen Kommentare was da passiert, 
hatte ich es ursächlich verstanden.

Wichtig ist hierbei wohl das Timing-Window, wobei in meinen Tests dann 
sogar eine aktive drahtlose Übertragung geklappt hat. Bei einem 
Frequenzdrift ist die maximale Anzahl an gleichzeitig übertragenen Bits 
aber wohl begrenzt.

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.