www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bei der Berechnung von Kommazahlen "float" vermeiden


Autor: Stefan KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

Ich möchte gern eine Temperatur mit zwei Nachkommastellen anzeigen (in 
einem Display angesteuert von einem ATMega64).

Meine Temperatur ist zunächst ein Integer mit 256 Multipliziert, z.B. 
5158 für 20,15°C.

Wie kann ich die Nachkommastelle berechnen ohne den Datentypen float zu 
verwenden?
Die Berechnung 5158/256=20; auf Integer Ebene, und die Nachkommastelle?
Wird das Modulo berechnet?

Oder komme ich nicht drumherum?

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5158/256=20
256*20=5120
5158-5120=38
38*10=380

380/256=1
380-256=124
124*10=1240

1240/256=4
usw...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorkomma: 5158/256=20
Nachkomma: (5158&255)*100/256=14,84375 also 14
Das ergibt dann 20,14°C
Mann kann auch noch richtig runden:
Nachkomma: ((5158&255)*100+128)/256=15,34375 also 15

Autor: Stefan KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

Eine Frage nich.
Was soll das "&" bedeuten. Heißt das logische Verknüpfung?

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, das ist ein logisches UND, somit wird der Rest der sich nicht durch 
256 teilen lässt berechnet.

Autor: Walter Selg (waldo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde das ganze mit 100 multiplizieren und durch 256 dividieren:

5158*100/256 = 515800/256 = 2014,844

Wenn Du nun diese Zahl nach BCD wandelst hast Du 2 Nachkommastellen!

Das Ergebnis der Multiplikation ist eine 32Bit oder 24Bit Zahl. Du 
addierst 128 dazu um zu runden. Dann nimmst Du das Byte 1 und 2 und 
wandelst das nach BCD.

Das ganze geht gut in Assembler!

Waldo

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Meine Temperatur ist zunächst ein Integer mit 256 Multipliziert, z.B.
>5158 für 20,15°C.

Das sind doch beste Vorraussetzungen:
Also:
-highbyte von 5158 (20) auf die Anzeige schaffen,              20
-Punkt darstellen,                                             20,

-lowbyte von 5158 (38) mit 10 multiplizieren =>380,
-highbyte des Ergebnisses (01) zur Anzeige schaffen,           20,1

-lowbyte von 380 (124) mit 10 multiplizieren =>1240,
-highbyte des Ergebnisses (04) zu Anzeige schaffen,            20,14

-lowbyte von 1240 (216) mit 10 multiplizieren =>2160,
-highbyte des Ergebnisses (08) zu Anzeige schaffen,            20,148

-lowbyte von 2160 (112) mit 10 multiplizieren =>1120,
-highbyte des Ergebnisses (04) zu Anzeige schaffen,            20,1484
...
und so weiter, je nachdem, wieviel Stellen du willst...
(oder Abrruch bei Nullen im Lowbyte)

PS: 5158/256 = 20,1484...
Das Verwenden des HighBytes ersetzt! das /256 !
Einfacher bekommst dus nicht ;-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bob wrote:
> ja, das ist ein logisches UND,
Nein, es ist ein bitweises UND. Die Operation "x&255" ist eine andere 
Schreibweise für "x%256" (x modulo 256). Jeder anständige C-Compiler 
macht aber aus einem "%256" automatisch eine dem "&255" entsprechende 
Operation (bei 8-Bit-Rechnern bedeutet das einfach: "Nimm nur das 
Low-Byte für die anschließende Operation").

Generell gilt
x % 2^n = x & (2^n - 1)

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.