LabVIEWForum.de - FPGA 32bit Timer Überlauf

LabVIEWForum.de

Normale Version: FPGA 32bit Timer Überlauf
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!

Ich nutze den internen Timer in µs, um in bestimmten Abständen bzw. mit einer bestimmten Frequenz Impulse abzugeben.

Ein Problem ergibt sich, wenn der interne Timer überläuft. Dann gibt der FPGA ganz kurz ganz viele Impulse ab und macht dann eine kurze Pause um dann normal weiter zu machen.

Ich haben schon versucht mir einen eigenen Timer zu bauen, indem ich in eine 64bit Variable im µs Takt hochzähle und diese benutze.
Hat aber nicht funtkioniert.

Hat jmd. eine Idee, was ich machen könnte?

Danke schon mal

Grüße


P.

.vi Version 8.5
den ueberlauf koenntest du durch einen einfachen is less than herausfinden und entsprechend code ausfuehren der den richtigen wert berechnet.

Wenn 'tick count 2' kleiner als 'tick count 2 ALT' ist, dann
4294967295 - 'tick count 2 ALT' + 'tick count 2'
Ich würde die Schleife mit einem µs-Timer versehen und den LoopCount ( inkrementiert per Schieberegister ) bei Pulsabgabe zurücksetzen. Der kumulierte Timerwert wird ja so wie es aussieht nicht benötigt.
' schrieb:Ich würde die Schleife mit einem µs-Timer versehen und den LoopCount ( inkrementiert per Schieberegister ) bei Pulsabgabe zurücksetzen. Der kumulierte Timerwert wird ja so wie es aussieht nicht benötigt.

Hallo!

Ein µs-Timer ist ja drin. Nur das der eben nach 2^32 µs (ca. 71 min.) überläuft und damit nicht mehr taugt.

Ich erkenne ja, wenn der Überlauf stattfinden muss, da ich die Periodendauer aufs Schieberegister drauf addiere. Ich versuche jetzt dann mal ein Flag zu setzen und das wieder zu entfernen wenn dann Counter2 wieder < Counter1.
Gepulst werden darf nur, wenn Counter2 >= Counter1 (Counter1 = Counter1 alt + Periodendauer) AND Flag NOT TRUE.

Mal sehen, ob das klappt.

Hatte auch schon überlegt, dass ja durch die Frequenz/Periodendauer die Zeit exakt vorgegeben ist und ich dann einfach nach dem Puls eine entsprechende Pause dran hänge. Nur, wenn ich hier durch die Laufzeit des FPGA jedesmal ein paar Ticks Abweichung habe, dann summieren sich die auf über die Anzahl der Durchläufe.
Oder kann man den Zeitaufwand des FPGA einfach exakt berechnen?
Dann müsste ich den wieder abziehen.

Durch den Vergleich der Counter synchronisiert sich das ganze immer wieder automatisch und die Frequenz kann so eingehalten werden und es verschiebt sich nichts klamm heimlich.

Grüße

P.
' schrieb:Ich erkenne ja, wenn der Überlauf stattfinden muss, da ich die Periodendauer aufs Schieberegister drauf addiere. Ich versuche jetzt dann mal ein Flag zu setzen und das wieder zu entfernen wenn dann Counter2 wieder < Counter1.
Gepulst werden darf nur, wenn Counter2 >= Counter1 (Counter1 = Counter1 alt + Periodendauer) AND Flag NOT TRUE.

Mal sehen, ob das klappt.

Klappt leider so nicht!

Erkennt jmd. nen Fehler?

Grüße

P.
Hier im Anhang hab ich dir ein SubVi erstellt, das dir einen 64bit Counter erstellt.
Das macht übrigens genau das, was dir Thomas oben schon vorgeschlagen hat. Sobald dein Counter kleiner ist, als der Vorwert zählt es die 32bit dazu.

Allerdings drängt sich mir die Frage auf, warum du nicht einfach die Schleifendauer über die Looptimer Funktion einfach auf den gewünschten DeltaWert stellst. Wenn ich dein Blockdiagramm recht entziffere willst du ja eigentlich nur eine bestimmte Zeit zwischen zwei Druchläufen warten. Das geht doch so viel einfacher / übersichtlicher / logischer / ...

Grüße

[attachment=19531]Lv85_img
' schrieb:Allerdings drängt sich mir die Frage auf, warum du nicht einfach die Schleifendauer über die Looptimer Funktion einfach auf den gewünschten DeltaWert stellst. Wenn ich dein Blockdiagramm recht entziffere willst du ja eigentlich nur eine bestimmte Zeit zwischen zwei Druchläufen warten. Das geht doch so viel einfacher / übersichtlicher / logischer / ...

Grüße

[attachment=47472:64bit_counter.vi]Lv85_img

Vielen Dank für den Tipp!

Den Looptimer kannte ich noch garnicht!

So funktionierts super.

Grüße
' schrieb:den ueberlauf koenntest du durch einen einfachen is less than herausfinden und entsprechend code ausfuehren der den richtigen wert berechnet.

Wenn 'tick count 2' kleiner als 'tick count 2 ALT' ist, dann
4294967295 - 'tick count 2 ALT' + 'tick count 2'

Das sollte so bei Unsigned Integer Arithmetik nicht mal nötig sein. Wenn nur die Differenz zwischen zwei Werten interessant ist kann man einfach beide Unsigned Werte voneinander abziehen und bekommt den richtigen Wert als Differenz auch bei Überlauf. Das geht natürlich nur wenn ein Interval nie länger als das Zählerintervall dauert aber das ist hier wohl nicht das Problem.

Sache ist es dann ganz einfach meist um das Problem so anzupassen, dass die Differenz zwischen den zwei Intervallen als Eingangsvariable verwendet werden kann und nicht irgendetwas anders.

Rolf Kalbermatter
Referenz-URLs