Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung mit Timer
spaceduck
30.03.2006, 11:37
Hallo zusammen,
folgendes Problem:
ich starte einen Timer und nach Zeit x stoppe ich Ihn. Wenn ich jetzt den Zählerstand ausgebe erhalte ich eine Zahl y (bei 8-Bit Timer zwischen 0 und 255)
Ich habe jetzt irgendwie einen blackout wie ich jetzt aus dieser Zahl die Zeit in sek. berechnen soll die zwischen dem Timer start und stop liegt. Klar die Quarzfrequenz und der Prescaler wirken da mit ein, aber wie? Wahrscheinlich ist mir die ganze Arbeitsweise noch nicht ganz klar.
Kann mir das mal jemand erklären? Wie komme ich jetzt zu der Zeit in sek?
Danke schon mal...
SprinterSB
30.03.2006, 13:35
x = y*PRESCALE / F_CPU
Wobei F_CPU die Taktfrequendz des µC in Hz ist.
Gibst du F_CPU in MHz an, dann ist
x = y*PRESCALE / F_CPU / 1000000
Timer-Überläufe sind dabei nicht berücksichtigt.
Bernhard.Erfurt
30.03.2006, 13:52
Ein Timer verändert seinen Timerwert, je nach dem, wie Du sein
Prescaler eingestellt hast.
BSP: 1MHz Takt und Prescaler = 1024
Also alle 1024 Takt, würde der Timerwert um eins erhöt.
Würde man dieses Ausrechnen, käme auf alle Fälle ein sehr ungerader Wert hierbei raus.
Desshalb haben doch die Uhrenquarze so seltsame Werte 32...
Um aber eine genaue Zeit zu ermitteln macht man gern folgendes:
Bei 1MHz-Takt und einem Vorteiler von 1024 wird ein
Timerwert voreingestellt, zB auf 125,
er wird dann automatisch hochgezählt
und wenn er "überläuft, dann weiss man,
dass eine 1000-tel sekunde vergangen ist ;)
Bernhard
spaceduck
30.03.2006, 17:50
Hallo SprinterSB,
nach Deiner Rechnung hab ich jetzt mal n einfaches Programm geschrieben
-->
$regfile = "m8def.dat"
$crystal = 16000000
Dim A As Long
Dim B As Integer
Dim C As Single
Enable Interrupts
Config Timer1 = Timer , Prescale = 8
Main:
Timer1 = 0
Start Timer1
Waitms 500
Stop Timer1
A = Timer1
Print A
B = A * 8
C = B / 16000000
Print C
End
Zwischen Start und Stop liegen 500ms. Als A erhalte ich 17276. Nach Deiner Formel ausgerechnet erhalte ich für C 0,000445958
Passt irgendwie nicht... Wo liegt mein Fehler? Bin noch am verzweifeln mit den Timern!
SprinterSB
30.03.2006, 18:20
Bei 16MHz und einem Prescaler von 8 macht das Kerlchen in 500ms 1000000 Inkremente, läuft also schlappe 15 mal über...
Wie gesagt, die Formel gilt wegen der Timerüberläufe nur modulo der Timerauflösung!
Die ohne weitere Vorkehrungen (Zählung der Überläufe) messbare Zeit ist also ca. 32 ms.
Nach exakten 500ms ist der Zählerstand
16960 = 1000000 modulo 65536 = 1000000 modulo 2^16.
16960 Inkremente entsprechen 0.00848 Sekunden, deine Zeit kommt wohl dadurch zustande, daß der Timer mindesten 16 mal überläuft (wegen der Langsamkeit von Bascom bze dessen Ungenauigkeit).
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.