Zeitmessung in µC oder im PC

Gast #2528912
Hallo,

ich will einen Sensor auswerten, der mir, sobald Daten vom µController 
ausgelesen wurden und neue Daten zur Verfügung stehen, ein Interrupt an 
einen µController-Eingang sendet.

Jetzt will ich die Zeit zwischen zwei Messungen erfassen und auf dem PC 
mittels LabView eine Kennlinie aus den gemessenen Daten und der 
gemessenen Zeit darstellen.

Wenn ich die Zeit im µController messe, dann habe ich doch die 
tatsächliche verstrichene Zeit und in LabView hätte ich ja die 
Verzögerungen der Übertragungen einberechnet, oder?

Ist es sinnvoller die Zeiten mittels Input-Capture-Eingang und dem 
erzeugten Interrupt zu messen und diese dann seriell mit an den PC zu 
übertragen, oder nehme ich einfach den Zeitstempel von LabView??
Hängt davon ab, was du erreichen willst.

Überspitzt ausgedrückt:
Wenn du nur wissen willst, ob die Messung alle 15 Minuten oder jede 
Stunde fertig wird, nimm den PC, wenn du es auf die Nanosekunde genau 
brauchst, den µC.
Martin schrieb:
> und in LabView hätte ich ja die
> Verzögerungen der Übertragungen einberechnet, oder?

Plus die Zeit die Windows vertrödelt bis Labviwe mal wieder Rechenzeit 
kriegt
Plus die Zeit die Labview rumtrödelt bis es sich um die empfangenen 
Daten kümmert
Plus ....
Windows ist KEIN Echtzeitsystem
Serielle Übertragung über Interrupthandler liefern dier kein konstanten 
Zeitversatz

Wenn du die Zeit erfassen willst musst du das auf dem µC tun.
Gast
Die Zeitmessung realisiere ich nun über den µC. Jetzt wird die 
Zeitmessung in der Input-Capture-Interruptroutine durchgeführt und in 
meiner Hauptschleife mittels printf an den PC übertragen.

Das update der Daten vom Sensor erfolgt alle 417µs.

Verliere ich durch die printf-Verwendung zu viel Zeit? Gibt es eine 
bessere Möglichkeit als printf, oder ist der Zeitverlust kaum der Rede 
wert?
Martin schrieb:

> Verliere ich durch die printf-Verwendung zu viel Zeit? Gibt es eine
> bessere Möglichkeit als printf, oder ist der Zeitverlust kaum der Rede
> wert?

Natürlich verlierst du Zeit. Der Löwenanteil wird aber wahrscheinlich 
durch die Übertragung selbst verursacht. Die geht nun mal nicht in 
0-Zeit.
Martin schrieb:
> Verliere ich durch die printf-Verwendung zu viel Zeit? Gibt es eine
> bessere Möglichkeit als printf, oder ist der Zeitverlust kaum der Rede
> wert?

Du kannst die Zeit auch (hängt vom Rest des Protokolls ab) binär zum PC 
übertragen und dort konvertieren. Dort hast du alle Zeit der Welt und 
Rechenpower.
Senden über serielle Schittstelle am besten asynchron mit einem 
Ringpuffer und den Interrupts der seriellen Schnittstelle.
Gast
Habe das Ganze hinbekommen mit der Zeitmessung. Ich bekomme jetzt aber 
immer abwechselnd zwei verschiedene Zeitwerte: 1,66 und 1,24ms (die 
Zeiten wechseln sich zufällig ab - es ist kein System erkennbar).

Sollten die Zeitwerte nicht annähernd gleich sein? Bringt mir die 
Verbindung zum PC diese zwei unterschiedlichen Zeiten zwischen den 
Messungen?

Es sind drei Messwerte, die nacheinander abgefragt werden. Jeder 
Messwert wird nachdem er abgefragt wurde sofort mittels printf an den PC 
übertragen.

also nur nochmal zum Verständnis:

-> 1. Messwert von Sensor einlesen
-> Messwert mittels printf an PC
-> 2. Messwert von Sensor einlesen
-> Messwert mittels printf an PC
-> 3. Messwert von Sensor einlesen
-> Messwert mittels printf an PC

Erst wenn der 3. Messwert aus dem Register gelesen wurde werden die 
Messwerte aktualisiert und damit wird die Zeitmarke mittels ICP 
gespeichert und ebenfalls mit printf übertragen.

Ich benutze Ubuntu mit VirtualBox und in der VirtualBox ein Windows 7 
mit Terminalprogramm. Sollte ich für eine genauere Zeitmessung lieber 
direkt mit Windows 7 arbeiten? Oder lieber ein Terminalprogramm im 
Ubuntu nutzen?
Martin schrieb:

> Sollten die Zeitwerte nicht annähernd gleich sein? Bringt mir die
> Verbindung zum PC diese zwei unterschiedlichen Zeiten zwischen den
> Messungen?

Wenn du das µC Programm richtig geschrieben hast nicht.

Also überprüf mal deine Mess-Funktionalität im µC. Irgendwo da wirst du 
einen Denkfehler haben.
Gast
Achso noch eine Ergänzung:

Die Zeitwerte 1,66 und 1,24ms beziehen sich auf die Zeiten zwischen 
einer Messwert-Reihe

also

1.Messwert 2.Messwert 3.Messwert Zeit

1,24ms

1.Messwert 2.Messwert 3.Messwert Zeit

1,24ms

1.Messwert 2.Messwert 3.Messwert Zeit

1,24ms

1.Messwert 2.Messwert 3.Messwert Zeit

1,66ms

1.Messwert 2.Messwert 3.Messwert Zeit

1,66ms

1.Messwert 2.Messwert 3.Messwert Zeit

1,24ms

...
Gast
Martin schrieb:
> ..., es sollte schon genau sein:-)

Die Genauigkeit sagt nicht über die Anforderungen an den Jitter der 
Zeitnahme. Es kommt auch ganz entscheidend drauf an, wie lang deine zu 
messenden Intervalle sind. Wenn du es auf Nanosekunden genau wissen 
möchtest, kommst du wohl auch mit einem µC kaum hin und wirst 
zusätzliche Hardware bemühen müssen.

Martin schrieb:
> Habe das Ganze hinbekommen mit der Zeitmessung. Ich bekomme jetzt aber
> immer abwechselnd zwei verschiedene Zeitwerte: 1,66 und 1,24ms (die
> Zeiten wechseln sich zufällig ab - es ist kein System erkennbar).

Läuft's nun, oder nicht. Wenn nur die beiden Werte auftreten, hast du 
entweder einen Sensor, der nur diese beiden Intervalle liefert oder mit 
deiner Zeiterfassung stimmt irgendetwas nicht. Egal wie du das auf dem 
PC empfängst, sollten die Meßwerte nur von deinem Sensor abhängen ;-)
Gast
Martin schrieb:
> Die Zeitwerte 1,66 und 1,24ms beziehen sich auf die Zeiten zwischen
> einer Messwert-Reihe

Dann guck die mit dem Oszi deine Daten vom Sensor und die auf der 
seriellen Schnittstelle vom µC an. Vielleicht geht es per USB zum PC und 
da packt noch irgendjemand Pakete. Who knows?
Hi,

misst Du jetzt also die Zeiten mit dem PC? Es wurde doch gesagt daß Du 
das vergessen kannst.
Ich tippe mal, daß die Serielle Schnittstelle nur etwa alle 0,42ms 
gepollt wird und somit sind die Werte zufällig beim 3. oder 4. Polling 
da.
Über längere Zeit dürften die Zeiten gemittelt aber stimmen, wenn Du 
weißt, daß das regelmässig ist.

Gruß,
Norbert
Gast
[Problem gelöst]

> also nur nochmal zum Verständnis:

> -> 1. Messwert von Sensor einlesen
> -> Messwert mittels printf an PC
> -> 2. Messwert von Sensor einlesen
> -> Messwert mittels printf an PC
> -> 3. Messwert von Sensor einlesen
> -> Messwert mittels printf an PC

Ich habe das Programm jetzt nochmal umgeschrieben:

-> 1. Messwert von Sensor einlesen
-> speichern in tempX
-> 2. Messwert von Sensor einlesen
-> speichern in tempY
-> 3. Messwert von Sensor einlesen
-> speichern in tempZ
-> alle drei Messwerte + Zeit senden mittels printf

Jetzt habe ich konstant 1,47ms.

Danke an alle für eure Antworten und eure Mühe:-)

Gruß Martin

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.