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??
Wenn du schon mal gesehen hast, wie Windows teilweise 10 bis 15 Sekunden
lang nicht bedienbar ist, weil es entschieden hat erst mal den
Hauptspeicher ein wenig aufzuräumen, dann erübrigt sich wohl die Frage.
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.
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.
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.
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
...
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 ;-)
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
[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