ich benötige eine Möglichkeit, mit der ich ein genaues Timing im Bereich von 1 Millisekunde realisieren kann.
Ich dachte bis jetzt, mann könne das mit ElapsedMilliSeconds() machen, aber weit gefehlt.
Habe folgendes Programm zum Test erstellt:
Code: Alles auswählen
a = ElapsedMilliseconds()
Dim d$(100000)
For i = 1 To 100000
b = ElapsedMilliseconds()
d$(i) = Str(i) + ": "+ Str(b-a)
;Debug d$
Next i
For i = 1 To 100000
Debug d$(i)
Next i
End
Stattdessen wird immer wieder dieselbe Zeit neben den Zähler geschrieben, also zuerst mal eine Weile 0, dann eine Weile 15, dann eine Weile 31.
Ich dachte zunächst, dass das Ganze an meinem verhältnismäßig langsamen Rechner (Samsung NC10, CPU Atom N270, 1600 MHz) liegt.
Damit hängts aber nicht zusammen. Hab' das Ganze mal im Energiesparmodus bei 800 MHz probiert. Sieht dann jedoch genauso aus, nur dass er dann nur halb so viele Zähler mit 0, 15 usw. macht.
Nächster Versuch war mit 'nem viel schnelleren Rechner: Mein dienstlicher Lenovo ThinkPad T61 mit CPU irgendwas DualCore.
Resultat: Keine Änderung: Zählt auch eine Weile mit Zeit 0, dann Sprung auf 16, dann 31 ....
Wers ausprobieren will, der muss, abhängig von der CPU-Geschwindigkeit die Maximalanzahl der Durchläufe etwas anpassen. Beim NC10 reichen 10000 Durchläufe, beim T61 hab ichs mit 100000 probiert.
Hat vielleicht jemand von Euch einen Workaround für das beschriebene Problem????
Für die Frage, warum ich so ein genaues Timing brauche:
Hat mit MIDI zu tun. Hab' mir zum NC10 einen USB-Seriell-Adapter geholt und möchte den NC10 zwischen Masterkeyboard und SoundExpander (Für den Laien: externer Synthesizer) schalten, um Sequencing zu machen, und den MIDI-Datenstrom manipulieren zu können.
Ach ja, MIDI läuft mit PC-untypischen 31250 Bit/s. Werd' mir deshalb noch nen Adapter mit 'nem PIC bauen.
Ein NoteOn-Befehl braucht dabei 2 Byte. Mit den entsprechenden Start- und Stopp-Bits kommt man dann so roundabout auf 0,6 ms, deshalb die Genauigkeit.
gr33tz JayCool