www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Clock und Datenempfang synchronisieren


Autor: Prinzipal (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Prinzipal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Detlev T. (detlevt)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Prinzipal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.