Timer und schleife zu langsam

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Timer und schleife zu langsam

    Hey Leute,

    bin grad dran für ne Carrera ProX nen Rundenzähler am PC zu programmieren...hierbei wird ja durch schließen der Löcher das Auto Codiert abfrage über Loch position. Ich hab mir jetzt auch ne Gabellichtschranke an meine Com Schnitstelle gehängt. Das funktioniert so weit auch... Wennn ich das Auto darüber schiebe werden alle 4 änderungen (hell --> dunkel....dunkel --> hell ... hell - dunkel... dunkel --> hell) erkannt. Ich speicher dann jedes mal mit My.computer.clock.TickCount die aktuelle Zeit. Damit könnte ich dann nacher alles errechen... wenn ich jetzt aber darüber fahre, dann werden entweder nicht alle übergänge erkannt, oder es wird als benötigte zeit von anfangdes keils bis zum ende des Keils 0ms ausgegeben. Ich habe es zuerst mit nem Timer gemacht, bei dem das Intervall auf 1ms gesetzt wure. Hier war die erkennung sehr schlecht. dann habe ich das ganze mit einer While schleife gemacht, und es lief schon besser (die übergänge wurden öffters erkannt) ...hoff das ist verständlich... wie kann ich jetzt noch genauer messen??


    M.f.G.: Flexy

    flexy1994 schrieb:

    Ich habe es zuerst mit nem Timer gemacht, bei dem das Intervall auf 1ms gesetzt wure.

    auflösung des Forms.Timer: rund 50-60 ms.
    System.Threading.Timer: rund 10-20 ms

    Alles was kleiner sein muss, geht nicht mehr mit Timer/Events, sondern nur noch mit Polling. ZUVERLÄSSIG aber nie, weil Windows kein Echtzeit-OS ist und bei .Net der Garbage Collector macht was er will ;)

    Wenn es nur darum geht, kleine Zeitabstände zu messen, dann nimm die Stopwatch Klasse. Die nutzt - wenn vorhanden - den HPT (High Performance Timer) - und misst bis auf 0.1 µs runter. Sollte zumindest im Bereich größer 1 µs genau ... vermutlich ;)
    Hallo flexy1994

    Du fragst bestimmt die Pins der Seriellen ab?
    Hast du einen USB to seriell dazwischen?
    Wenn es so ist kannst du auch mit Events der Seriellen arbeiten.
    Es bleibt aber nur eine Versuchslösung.
    Mit einen Controller die Lichtschranken abfragen und auswerten,dann zum PC schicken.
    ..das ist Zukunftsicher.

    Eine schnellere Abfrage wird vielleicht etwas verbessern,aber Bitwackeln ist sehr langsam.
    Gruss
    also das zeitmessen funktioniert problemlos...hier mal mein quellcode:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If Not SerialPort1.CDHolding And cdholding = 0 Then
    3. Timer1.Enabled = False
    4. timer.Reset()
    5. timer.Start()
    6. startcd1 = timer.Elapsed.TotalMilliseconds
    7. cdholding = 1
    8. While Not cdholding = 0
    9. If SerialPort1.CDHolding And cdholding = 1 Then
    10. cdholding = 2
    11. endcd1 = timer.Elapsed.TotalMilliseconds
    12. End If
    13. If Not SerialPort1.CDHolding And cdholding = 2 Then
    14. cdholding = 3
    15. startcd2 = timer.Elapsed.TotalMilliseconds
    16. End If
    17. If SerialPort1.CDHolding And cdholding = 3 Then
    18. cdholding = 0
    19. endcd2 = timer.Elapsed.TotalMilliseconds
    20. End If
    21. End While
    22. timer.Stop()
    23. Dim cdzeit1 As Integer = endcd1 - startcd1
    24. Dim cdzeit2 As Integer = endcd2 - startcd2
    25. Dim gesamtcd = endcd2 - startcd1
    26. MsgBox(gesamtcd)
    27. Timer1.Enabled = True
    28. End If
    29. End Sub


    hier hab ich den timer als Starter genommen wen das auto jetzt allerdings zu nem blöden zeitpunkt rüber fährt, dann erkennt er es nicht richtig
    was kann ich da noch ändern??

    flexy1994 schrieb:

    was kann ich da noch ändern??

    Sprak nix doitsch?

    Ich sag doch: Die (nutzbare) AUFLÖSUNG liegt BESTENFALLS bei 10-20 ms. Will man kürzere Abstände realisieren, geht's nur noch mit "polling". Also Endlosschleife, die fortwährend den Zustand von "irgendwas" überprüft. Auch da wird u.U. der Garbage Collector unschön dazwischen hauen. Auch die Verwendung von Events der seriellen Schnittstelle hilft einem nicht weiter, da Events halt auch nicht "sofort" passieren.

    Lösung: Wie von Fraju beschreiben: Low-Level Datenaufnahme per Microcomtroller o.ä. und dann die Daten an einen PC senden.
    Etwas genauer sollte die Antwort schon sein.

    z.B. Mit dem NE555 ein Monoflop aufbauen,welcher den kurzen Lichtschranken Impuls entprellt und verlängert.
    Dieser verlängerte Impuls kann dann mit Bitwackeln erfasst und ausgewertet werden.
    Eine genaue Zeitmessung ist aber trotzdem nur bedingt möglich.


    Eine Versuch wert ist es auch,einen alten Lappy bis W98, oder nur mit DOS, mit Q-Basic zu Nutzen.
    Werden genug noch entsorgt.

    Mit Dos und Q-Basic wird die Lichtschranke Abgefragt und ausgewertet.
    Die Auswertung wird über die Serielle zum VB.net Programm gesendet.

    Der Vorteil ist,man braucht sich nicht mit einem Controller zu beschäftigen.
    Der Lappi kann später durch einem Controller ersetzt werden.

    0,1 sec und kleiner kein Problem.
    So nutze ich teilweise alte Lappys noch heute.

    Gruße