Forum: Mikrocontroller und Digitale Elektronik Datenstrom einlesen


von Tim O. (Gast)


Lesenswert?

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
warte:
2
  sbic  PINA,  0
3
  rjmp  warte
4
5
  clc
6
  sbic  PINA,  1
7
  sec

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

von ,,,, (Gast)


Lesenswert?

Bewundernswert, dass man sich um 3:59 Uhr über solche Sachen Gedanken
machen kann.

von Tim O. (Gast)


Lesenswert?

Man stelle sich vor, um diese Zeit arbeiten Leute ;)

Für die Interessierten, die nicht um 04:01 nur dumme Kommentare auf
Lager haben:
Ich dachte mir gerade als Work-Around gedacht, das ich wie oben auf
die falling edge warte, mein bit auslese und dann einfach warte, bis
da ne rising edge stattfindet.. bis die wieder abfällt, bin ich ja
längst wieder am Anfang der Schleife.. irgendwie unsauber, aber
es scheint nun zu funktionieren.. wenn man die Bitmuster aufm Papier
umrechnet, kommt das raus, was vom Computer codiert wurde ..

Gibt's dennoch Anregungen, das Problem "eleganter" zu lösen?

Gruss,
Tim

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was spricht dagegen, die Taktleitung als Interrupt zu verwenden und bei
jedem Interrupt die Datenleitung einmal einzulesen?

In der Interrupt-Routine wird als erstes das Carrier-Detect-Signal
ausgewertet; ist es inaktiv, wird die Interrupt-Routine wieder
verlassen.
Dann wird der Bitzähler mit der Maximalanzahl verglichen - ist sie
erreicht, wird die Interrupt-Routine wieder verlassen, andernfalls wird
das gelesene Bit gespeichert, der Bitzähler erhöht und die
Interrupt-Routine zum allerletzten Male verlassen.

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.