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!
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)
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.