LabVIEWForum.de
FPGA 32bit Timer Überlauf - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Module (/Forum-LabVIEW-Module)
+---- Forum: LabVIEW FPGA (/Forum-LabVIEW-FPGA)
+---- Thema: FPGA 32bit Timer Überlauf (/Thread-FPGA-32bit-Timer-Ueberlauf)



FPGA 32bit Timer Überlauf - Peyotito - 03.07.2009 13:48

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


FPGA 32bit Timer Überlauf - thomas.sandrisser - 04.07.2009 17:48

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'


FPGA 32bit Timer Überlauf - dlambert - 06.07.2009 13:04

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.


FPGA 32bit Timer Überlauf - Peyotito - 06.07.2009 13:55

' 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.


FPGA 32bit Timer Überlauf - Peyotito - 06.07.2009 15:24

' 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.


FPGA 32bit Timer Überlauf - Kvasir - 06.07.2009 16:11

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


FPGA 32bit Timer Überlauf - Peyotito - 17.07.2009 15:11

' 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


FPGA 32bit Timer Überlauf - rolfk - 22.07.2009 09:52

' 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