PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitmessung mit Timer



spaceduck
30.03.2006, 10: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, 12: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, 12: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, 16: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, 17: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).