Forum: Compiler & IDEs timer1 Wert in ms umrechnen


von chris (Gast)


Lesenswert?

Hallo,
ich habe da eine Frage zur Umrechnung von timerwerten in ms.
Diese ms Werte möchte ich dann gerne per uart übertragen.
Man könnte das ja z.B. so machen:

t[s]=((1/FCLK)*prescaler)*timerwert

mein Probem ist nur, das ich zur Umrechnung sehr hohe Werte habe 
(uint32_t) und diese auch noch multiplizeieren muß.

Gibt es da nicht einen eleganteren Weg?

Hier meine Vorrausseztungen:
a) Zeit messen
b) 0s-5s
c) prescaler=1024
d) clk = 8Mhz

vielen Dank

mfg chris

von Karl H. (kbuchegg)


Lesenswert?

Du könntest doch zunächst mal ein paar Konstante
ausrechnen

(1/FCLK)*prescaler

da mal einsetzen:

(1/8000000)*1024

gekürzt ergibt das

1 / 7812

wenn du nun 1/7812 * timerwert rechnest kriegst du
das Ergebnis in Sekunden, also als Kommazahl. Du willst
aber Millisekunden. Also kannst du gleich noch mal einen
Faktor von 1000 einbringen um den Schritt von Sekunden
zu Millisekunden zu machen.
Daraus ergibt sich, dass sich deine Berechnung vereinfacht
zu

  1 / 7.812 * timerwert

Jetzt musst du dich entscheiden: Wieviele Kommastellen
willst du bei der Übertragung der Millisekunden?
Sagen wir mal 3 Nachkommastellen reichen dir. D.h.
du möchtest das Ergebnis nicht in Millisekunden sondern
das Hundertfache davon. Ein Ergebnis von 1000 soll 1 Millisekunde
repräsentieren. Ein Ergebnis von 2587 wären dann 2.587
Millisekunden.

Für deine Formel bedeutet das einen zusätzlichen Faktor
von 1000:

  1000 * timerwert / 7.812

Der Wert 1000 / 7.812 ergibt ausgerechnet ziemlich genau 128
d.h deine Gleichung vereinfacht sich zu

   128 * timerwert

Das Ergebnis ist wie bereits gesagt das Tausendfache der
Millisekunden. d.h. alles was du tun musst, ist bei der
Ausgabe zwischen die Tausenderstelle und der Hunderterstelle
ein Dezimalkomma einschmuggeln und du kriegst die Ausgabe
in Millisekunden mit 3 Nachkommastellen.

von chris (Gast)


Lesenswert?

Hallo  Karl heinz,

vielen Dank für deine ausführliche Darstellung. Den gleichen Ansatz 
hatte ich auch schon, nur ich dachte, das man 1/7812 also gleich 1.28*e4 
nicht als Konstante eintragen kann. Dachte es geht nur Ganzzahlig.
Ich werde mit folgender Formel weitergehen, da ich nur ganze ms ohne 
Kommastellen brache...

t[ms]=(128*timerwert)/1000


vielen Dank Karl heinz

cu

chris

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.