-         

Ergebnis 1 bis 5 von 5

Thema: Zeitmessung mit Timer

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2005
    Beiträge
    25

    Zeitmessung mit Timer

    Anzeige

    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...

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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.
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.02.2005
    Ort
    Erfurt
    Alter
    52
    Beiträge
    134
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2005
    Beiträge
    25
    Hallo SprinterSB,

    nach Deiner Rechnung hab ich jetzt mal n einfaches Programm geschrieben

    -->

    Code:
    $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!

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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).
    Disclaimer: none. Sue me.

Berechtigungen

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