-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Port.dll & High Resolution Timer machen Probleme

  1. #1

    Port.dll & High Resolution Timer machen Probleme

    Anzeige

    Ich schreibe gerade ein VB6 (Sorry )-Programm, dass die Signale einer Wählscheibe über den Com-Port einliest. Da die Abtastrate des Standard-Timers zu gering ist, bin ich auf einen High-Resolution-Timer umgestiegen. Der funktioniert auch prima, jedoch verweigert die Port.dll ohne Fehlermeldung ihren Dienst, sobald ich einen solchen Timer im Projekt initialisiere (seltsamerweise erst bei der kompilierten Exe - beim Testen funktioniert alles einwandfrei). Hat jemand eine Ahnung woran das liegt und/oder gibt es port.dll-Alternativen mit denen es klappen könnte?

    Gruß,
    Benedikt

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    22.11.2004
    Ort
    Luzern
    Alter
    30
    Beiträge
    80
    hallo bwirmer,
    ich habe zwar kein lösungsansatz für dich, aber ich habe ein ähnliches problem. Ich brauche auch in VB6 oder VB .NET einen Timer der schneller als 1ms eingestellt werden kann. Wie funktioniert das mit dem High-Resolution Timer, habe mich mal in der Hilfe versucht schlau zu machen, bin aber gescheitert.

    gruss commander7

  3. #3
    Zitat Zitat von commander7
    hallo bwirmer,
    Ich brauche auch in VB6 oder VB .NET einen Timer der schneller als 1ms eingestellt werden kann
    Das geht nicht, allerdings betrügt dich der normale VB-Timer. Er schafft nur ca. 50ms, auch wenn du 1ms eingibst. Der High Resolution Timer schafft hingegen echte 1ms Auflösung

    Am komfortabelsten ist der CCRP-Timer. Installiere ihn einfach nach Anleitung, füge deinem Projekt das Modul hinzu (Verweise...) und verwende ihn folgendermaßen:

    Code:
    private WithEvents Timer1 As ccrpTimer
    
    Private Sub Form_Load()
    Set Timer1 = New ccrpTimer
    With Timer1
          .EventType = TimerPeriodic ' Es gibt auch einmalige Aktionen und Countdown
          .Interval = 1
          .Stats.Frequency = 1 
          .Enabled = True
    End With
    End Sub
    
    Private Sub Timer1_Timer(ByVal Milliseconds As Long)
    'Hier kommen die Befehle rein!
    End Sub

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von just4fun
    Registriert seit
    06.09.2004
    Ort
    Hannover
    Alter
    46
    Beiträge
    314
    Zitat Zitat von bwirmer
    Am komfortabelsten ist der CCRP-Timer.
    Hi bwirmer,

    ich programmiere nicht in VB, sondern in C++ mit dem C++ - Builder 3.0 (alt, aber läuft).
    Kennst du zufällig auch einen High Resolution Timer für den Builder?
    Am liebsten natürlich als Package.

    Habe im Netz noch so keinen richtigen als Freeware gefunden.
    1 echte ms Auflösung reicht mir bereits.
    www.robotiklabor.de - Der Podcast rund um Robotikthemen
    www.direcs.de - Meine Robotik-Seite mit Videos, Fotos, Screenshots, Source-Codes und mehr.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Timer oder Zeitmessung?

    Code:
        class timer 
        { 
            public: 
                // Konstruktoren 
                timer (); 
    
                // Methoden 
                void start (); 
                long double stop (); 
                
                inline long double getlast () const; 
    
            private: 
                // Konstruktoren 
                timer (const timer&); 
    
                // Operatoren 
                timer& operator = (const timer&); 
    
                // Variablen 
                LARGE_INTEGER m_Timer; 
                long double m_Measurement; 
    
        }; 
    
    
        timer::timer () 
            : 
        m_Measurement(0) 
        { 
            m_Timer.QuadPart = 0; 
        } 
    
        void timer::start () 
        { 
            if(!QueryPerformanceCounter(&m_Timer)) 
                throw; 
        } 
    
        long double timer::stop () 
        { 
            LARGE_INTEGER EndTime; 
            if(!QueryPerformanceCounter(&EndTime)) 
                throw; 
    
            EndTime.QuadPart -= m_Timer.QuadPart; 
    
            LARGE_INTEGER Frequency; 
            QueryPerformanceFrequency(&Frequency); 
    
            m_Measurement = EndTime.QuadPart / static_cast<long double>(Frequency.QuadPart); 
    
            return(m_Measurement); 
        } 
    
        long double timer::getlast () const 
        { 
            return(m_Measurement); 
        }
    aus dem Cplusplus-Forum (http://www.c-plusplus.de/forum/index.php).

    Blackbird

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von just4fun
    Registriert seit
    06.09.2004
    Ort
    Hannover
    Alter
    46
    Beiträge
    314
    Zitat Zitat von Blackbird
    Timer oder Zeitmessung?[/code]
    aus dem Cplusplus-Forum (http://www.c-plusplus.de/forum/index.php).
    Einen Timer Suche ich.

    Ich möchte alle 1ms (oder länger) meinen Motor einen Schritt vorwärts steuern, und dabei noch ein paar kurze Sachen ausführen.
    Das ganze sollte daher idealerweise Event-gesteuert sein, so wie bei dem Standard-Timer (der ja aber nur echte 50 ms liefert).
    www.robotiklabor.de - Der Podcast rund um Robotikthemen
    www.direcs.de - Meine Robotik-Seite mit Videos, Fotos, Screenshots, Source-Codes und mehr.

  7. #7
    Habe mich mal umgeschaut und bin auf die inpout32.dll gestoßen und möchte diese in der Hoffnung, dass diese DLL mit HighResolutionTimern funktioniert, ausprobieren. Weiß jemand, wie man damit den Com-Port ansteuert? Ich habe bisher nur Anleitungen für den Parallelport gefunden.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    @just4fun,
    Versuch es mal mit dem Multimedia-Timer, der ist wirklich auf die Millisekunde genau:

    timeBeginPeriod
    timeEndPeriod
    timeGetDevCaps
    timeGetSystemTime
    timeGetTime
    timeKillEvent
    TimeProc
    timeSetEvent


    Alternativ kannst Du Dir aus dem High-Performance-Counter auch einen Timer bauen. Einfach in einem eigenen Thread warten, bis die Zeit um ist und eine Message senden oder einen Event setzen.

    Das ist aber nicht das Problem - das Problem wird sein, so zeitgenau aus dem PC/Notebook heraus etwas steuern zu können!
    Da hängen immer noch die Treiber für den Parallelport/Serialport mit den Geräte-Managern dazwischen.

    Blackbird

  9. #9
    Erfahrener Benutzer Begeisterter Techniker Avatar von just4fun
    Registriert seit
    06.09.2004
    Ort
    Hannover
    Alter
    46
    Beiträge
    314
    @Blackbird
    Zitat Zitat von Blackbird
    Das ist aber nicht das Problem - das Problem wird sein, so zeitgenau aus dem PC/Notebook heraus etwas steuern zu können!
    OK, werde ich mir mal anschauen.
    Danke!

    Ist mir natürlich klar, dass 1 ms echt sehr kurz ist.
    Aber es kommt mir weniger auf die Genauigkeit, als auf die hohe Geschwindigkeit an. Und selbst wenn die Hardware dahinter "nur" 10 ms schafft, ist dass immerhin schon 5x schneller, als der olle 50ms-Standard-Timer im CppBuilder.
    www.robotiklabor.de - Der Podcast rund um Robotikthemen
    www.direcs.de - Meine Robotik-Seite mit Videos, Fotos, Screenshots, Source-Codes und mehr.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Nochwas zum Knobeln

    Wenn man Impulse an der seriellen oder parallelen Schnittstelle ausgibt (also timergesteuert ein Pin ein- und ausschaltet), so kann der eine oder andere Impuls mal länger werden, wenn Windows gerade damit beschäftigt ist, den Screensaver zu aktivieren, die Netzwerkkarte zu aktivieren und und und...
    Das kann man eindämmen, wenn man die eigenen Prozesspriorität hochsetzt (z.B.: SetThreadPriority()) und/oder mit Critical Sections arbeitet (InitializeCriticalSection(), LeaveCriticalSection(), ...).

    Ein "Restrisiko" bleibt aber immer.

    Alternativ gibt es doch noch eine Möglichkeit, exakte, gleichbleibend genaue Impulse zu erzeugen, die NICHT von Windows ab und zu verlängert werden - allerdings ist da ein wenig Hardware erforderlich:

    Wenn man den Sende-Puffer der seriellen Schnittstelle groß genug macht und man den immer randvoll lädt, so kommen exakt im Takt der Baudrate die Bytes an TxD raus. Hier ein USART angeschlossen (z.B: HD6402, COM8017, ...) und man hat an jedem der 5 bis 8 Datenpins im Takt der Baudrate eine Änderung.
    Stellt man z.B.: folgende Parameter ein:
    9600,8P2 (12 Bits gesamt pro 'Byte')
    so ergibt das 1,250 ms / gesendeten Byte
    d.h.: wenn Du nur das Bit 1 benutzt, und folgende Bytes in den Sende-Puffer schreibst (Bitdarstellung, x ist beliebiges bit):
    xxxxxxx0, xxxxxxx1, xxxxxxx1, xxxxxxx0, xxxxxxx1, xxxxxxx1, xxxxxxx0
    so erscheint an Bit 1 des UARTS folgende Impulsfolge:
    1,25ms Low, 2,5ms High, 1,25ms Low, 2,5ms High, 1,25ms Low

    Die übrigen 7 Bit kann man auch noch benutzen.
    Mit anderen Baudraten ergeben sich auch andere Zeiten - z.B.: 115200,5N1 ergibt 60.7639 us/Byte. Das ist übrigens die Pulsbreite für das DCC-Format der Modelleisenbahn.

    Blackbird

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •