Forum: Mikrocontroller und Digitale Elektronik Clock und Datenempfang synchronisieren


von Prinzipal (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde!

Ich bekomme aus einer Schaltung die Clock- und die Datenleitung.
Beide Signale sind 32 Bit lang und werden synchron und parallel 
ausgegeben.
Diese 32 Bit Impulspakete trten ca alle 160ms auf. Die Pulsbreite ist 
nur 'wenige' µs breit.

Meine Frage: Wie muss im Prinzip die Empfangsroutine in der MCU aussehen 
damit die MCU immer auf die erste Flanke des ankommenden Clocksignals 
synchronisiert?


Viielen Dank für eure Antworten!

von Karl H. (kbuchegg)


Lesenswert?

Prinzipal schrieb:

> Meine Frage: Wie muss im Prinzip die Empfangsroutine in der MCU aussehen
> damit die MCU immer auf die erste Flanke des ankommenden Clocksignals
> synchronisiert?

So wie jede andere auch, die auf eine Flanke an einem Eingang pollt.

Ständiger Vergleich des aktuellen Pegels mit dem vorhergehenden Pegel. 
Sind die beiden unterschiedlich, dann ist die Flanke gekommen.

Oder aber über eine Interrupt Routine, die aufgrund der Flanke am SCK 
Eingang des µC angesprungen wird.

Du kannst aber auch dem Chip vorgeben, dass nicht er derjenige ist, der 
das SCK Signal generiert, sondern das er gefälligst auf deinen Clock 
hören soll, und damit löst sich dann das Problem ganz von alleine in 
Luft auf. Wenn du die Schaltung noch ändern kannst/darfst, 
selbstverständlich.

von Prinzipal (Gast)


Lesenswert?

Danke für die schnelle Antwort!

Ja, leider kann/darf ich die Schaltung nicht ändern, sondt hätte ich den 
Clock vorgegeben.

Mit Polling/Interrupt des Clocksignals hab ich noch Verständnissproblem.
Wenn ich z.B. auf die pos. Flanke teste, woher weiss ich, ob das der 
Anfang des Clocks ist, oder ob ich den Clock nicht mitten im 
32-Bit-Strom erfasst habe. Ich muss da doch die Zeit mitberücksichtigen. 
Oder denke ich zu kompliziert?

von Detlev T. (detlevt)


Lesenswert?

(Sofern vorhanden) würde ich hier die SPI-Hardware des µC verwenden - 
verbunden mit einem Time-Out (kann man mit einem Timer machen)

von Karl H. (kbuchegg)


Lesenswert?

Prinzipal schrieb:

> Mit Polling/Interrupt des Clocksignals hab ich noch Verständnissproblem.
> Wenn ich z.B. auf die pos. Flanke teste, woher weiss ich, ob das der
> Anfang des Clocks ist, oder ob ich den Clock nicht mitten im
> 32-Bit-Strom erfasst habe.


Du startest je selber die Funktionalität, durch Bedienen des Chip Select 
Signals.

Du ziehst Chip Select auf Low und dann kannst du schon anfangen auf die 
Flanke zu warten.

von Martin Fischer (Gast)


Lesenswert?

Hi, die Beschaltung die Du verwendest sendet kontinuierlich die 
Wandlungsergebnisse raus. Bevor das Ergebnis übertragen wird, ist der 
SCK auf "1". Also auf negative Flanke von SCK den Interrupt setzten, 
dann mit jeder folgenden positiven Flanke die Daten übernehmen. Die SPI 
Hardware ist vielleicht geeignet, aber üblicherweise nur 8Bit. Du mußt 
also die vier 8Bit Päckchen schnell genug abholen.

Der Trick besteht jetzt im richtigen Timing zwischen Freigeben/Sperren 
des Trigger Interrupts und der Verarbeitung der SPI Daten. Basis ist 
aber im Grunde die 32Bit SPI Übertragung. Da gibt's doch bestimmt was 
von Ratiopharm ;)

@Buchegger
CS ist fest auf low, damit ist eine aktive Steuerung nicht möglich.

von Detlev T. (detlevt)


Lesenswert?

@Martin Fischer
Wenn schon das Abholen der Bytes aus der SPI-Hardware Probleme bereiten 
sollte, wie sieht es da erst mit der Interrupt-Lösung aus? ;)

Auf einem 8-Bit AVR würde ich das so machen:

SPI-ISR liest Byte aus, speichert es in einem Array, setzt Flag, wenn 
vier erreicht sind, setzt TimerX auf null, löscht TimerX-Overflow-Flag 
und aktiviert TimerX-Overflow Interrupt (für Time-Out)

TimerX-Overflow-ISR schaltet SPI aus und wieder ein (initialisiert sie 
dadurch wieder), setzt den Zähler für das Array wieder auf null und 
deaktiviert sich selbst.

Die Hauptroutine muss zu Beginn die SPI-Schnittstelle konfigurieren und 
den SPI-Interrupt aktivieren. Ab da läuft alles im Hintergrund und man 
muss nur noch das Flag abfragen.

von Karl H. (kbuchegg)


Lesenswert?

Martin Fischer schrieb:

> @Buchegger
> CS ist fest auf low, damit ist eine aktive Steuerung nicht möglich.

Jetzt wo du es sagst:
Hab ich übersehen.
Wer macht denn aber auch sowas?

von Prinzipal (Gast)


Lesenswert?

Besten Dank für eure Hilfe!

Zuerst werde ich mal das Polling versuchen, sollte ich damit nicht 
zurecht kommen wird eine SPI-Lösung versucht.

Mercie vielmals
Prinzipal

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.