Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Markus
Anmeldungsdatum: 16.09.2004 Beiträge: 104 Wohnort: Wien
|
Verfasst am: 08.04.2005, 09:32 Titel: Nur eine kleine "Zeit"-Frage |
|
|
Wenn ich euch mal kurz belästigen darf:
ta = TIMER
DO: LOOP UNTIL INKEY$ = CHR$(27)
PRINT using "###.## Sekunden";TIMER-ta
Stimmt bei dieser Ausgabe die KOMMA-Angabe bei den Sekunden? Wenigstens auf Zehntel? Oder muß ich da irgendetwas mit 55 ms-Ticks herumrechnen?
Gruß
Markus |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 08.04.2005, 10:04 Titel: |
|
|
Hallo
Ja, das stimmt. Die Ausgabe erfolgt direkt in Sekunden. Eine Zehntel ist aber bei diesem Verfahren das äusserste an Genauigkeit. Darum reicht auch eine Nachkommastelle. Wenn du mehrere Timerschritte hintereinander anzeigen lässt, kannst du sehen wie sie immer um ca. 0,055 grösser werden.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Markus
Anmeldungsdatum: 16.09.2004 Beiträge: 104 Wohnort: Wien
|
Verfasst am: 08.04.2005, 10:19 Titel: |
|
|
Aha. Danke vielmals!
Beste Grüße
Markus |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 10.04.2005, 14:19 Titel: |
|
|
Hallo
@dreael:
In dem von dir oben angegebenen Artikel geht es um ja darum, dass eine Messung der Differenzen zwischen aufeinanderfolgender TIMER-Werten schwankende Ergebnisse bringt. Das beruht soweit ich das verstanden habe, ja nur auf Rundungsfehlern bei der Umrechnung des 16-Bit-Binärwertes in eine dezimale Gleitkommazahl. Dein Beispiel dazu sieht so aus:
Code: | t! = TIMER
WHILE INKEY$ = ""
t2! = TIMER
IF t2! <> t! THEN
PRINT t2! - t!
t! = TIMER
END IF
WEND |
Zur Lösung schlägst du dann einen digitalen Tiefpassfilter vor.
Nun könnte man doch auch entweder die Dezimalzahl in eine binäre zurückverwandeln, das letzte Digit runden und damit den Fehler wieder herausrechenen. Oder - da man ja die Taktrate kennt - noch einfacher die Differenz zwischen zwei Schritten einfach in "Normschritte" mit einer Dauer von 0,0549254 Sekunden umwandeln. Ich stelle mir das so vor:
Code: | s! = .0549254
t! = TIMER
WHILE INKEY$ = ""
t2! = TIMER
d! = t2! - t!
IF d! > 0 THEN
d! = CINT(d! / s!) * s!
PRINT d!
t! = t2!
END IF
WEND |
Wenn man das noch mit dem verbindet, was ich hier:
http://forum.qbasic.at/viewtopic.php?t=834
geschrieben habe, könnte man die Genauigkeit sogar noch steigern, indem man entweder das Highbyte des PIT mit auswertet, und/oder den TIMER schneller laufen lässt, z.B. wie dort ebenfalls beschrieben mit 1kHz statt der standardmässigen 18,2Hz. Was hälst du davon?
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 10.04.2005, 17:25 Titel: |
|
|
Kleiner Nachtrag. Ich habe mir mal erlaubt, dreaels Beispielprogramm animdemo.bas in meinem Sinne etwas umzuschreiben. Ich finde, es läuft auch ohne Dämpfung mindestens genauso "butterweich".
http://www.skilltronics.de/runterlader/ANIMDEM2.BAS
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|