www.mikrocontroller.net

Forum: Compiler & IDEs timer1 Wert in ms umrechnen


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.