Gast
#301403
Einen wunderschönen guten Morgen. Seit nunmehr drei Tagen versuche ich, ein Problem zu lösen, bin aber mittlerweile einigermassen verzweifelt, zumal ein ähnliches Projekt diese Probleme nicht brachte (dummerweise liegt das etwas länger zurück).. Zunächst zu meinem Versuchsaufbau: Ein Computer erzeugt per Soundkarte ein Datenpaket. Dieses ist ein FSK-Signal (0=1200 Hz, 1=1800 Hz) bei 1200 Bit/s, insgesamt übertrage ich 72 Bit nach einem vorgegebenen Schema (das ich ändern würde, wenn ich es könnte grummel). Dieses Datenpaket soll seinen Weg über einen Modemchip in einen Mikrocontroller finden. Der Modemchip liefert in Empfangsrichtung drei Signale an den Mikrocontroller: CD (carrier detect), RX SYNC (Takt, konstant bei 1200 Hz), RX DATA (das empfangene Datensignal, verzögert und auf den Takt syncronisiert). Nun sollte man meinen, nichts leichter als das.. .. man nutze die CD Leitung an einer Interruptleitung .. man lege RX SYNC auf einen Portpin (hier: PINA,0) .. man lege RX DATA auf einen anderen Portpin (hier: PINA,1) Wenn CD den Interrupt auslöst, hat man noch etwas Zeit, bis der Modemchip mir die Daten zum (RX SYNC) Takt liefert. Die Auslösung funktioniert auch. Auszug aus dem Datenblatt des Modemchips: "The optimum time to sample the CLOCKED DATA O/P is in the falling edge of RX SYNC O/P." (O/P = output pin)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Der oben genannte Codeauszug sollte nun, in einer (Bit-)Zählschleife angesiedelt, für jedes Bit das Carry setzen oder gelöscht lassen (im Zuge der INT-Routine wird das Carry dann natürlich gesichert, so dass am Ende der Zählschleife alle 72 Bit in Registern stehen. Danach werden sie über die UART ausgegeben (später sollen sie anders verarbeitet werden, aber eins nach dem anderen ...). Ich hoffe, das sich hier schon mein Denkfehler befindet, denn ich kann keinen anderen Grund mehr feststellen, warum ich erst, wenn ich die Zählschleife auf etwa 120 "Bit" erhöhe, nur noch logisch 0 von RX DATA erhalte (keine Daten am Eingang oder 1800 Hz (die ja nicht anliegen)).. eigentlich sollte dieser Zustand schon nach den 72 Bit eintreten. Ich vermute daher, das meine obige Routine eben nicht ein Bit pro Takt ausliest, sondern scheinbar ab und zu ein Bit zuviel (weil ich zu schnell abfrage?). Wenn ich per Tongenerator 1200 Hz erzeuge, sind alle Register mit 0b11111111 gefüllt, erzeuge ich 1800 Hz, sind es 0b00000000 - ganz wie zu erwarten ist. Erzeuge ich das Datenpaket, stehen Bitmuster drin, aber weder die Präambel noch die eigentlichen Daten sind korrekt auszulesen.. hier und da mal ein Bit weggestrichen könnte man aber durchaus das Signal erahnen. Viel Text für ein einfaches Problem, reduziert auf ein paar Zeilen dürfte das Problem also sein, das ich ein 1200 Hz Taktsignal habe, parallel dazu ein Datensignal, das ich auslesen will. Das Auslesen wird durch den IRQ ausgelöst, am Ende stehen 72 Bit in ihren Registern. Nur warum kriege ich das Signal nicht richtig ausgelesen? Gruss, Tim