www.mikrocontroller.net

Forum: Compiler & IDEs ds18s20: Wie implementiert Ihr die Formel ?


Autor: Gast^2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte auf meinem Eigenbau-Wecker die Temperatur in Zehntel-Grad 
anzeigen. Dazu muss diese ( erg=lsb-0.25+((0x10-cnt_r)/0x10) ) Formel 
implementiert werden.

Wenn ich jedoch mit double loslege, dann fliegt mir der Flash um die 
Ohren, da der Controller schon ziemlich voll ist.

Welche Ideen gibts hier ?

Gruß

Andreas

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze mit Hundert (oder noch mehr) Multiplizieren und dann mit 
ganzen Zahlen rechnen. Ne Division durch 0x10 sollte doch das gleiche 
sein wie Division durch 16 (?). Dann entspricht das ganze einer 
Rechtverschiebung um 4. Vielleicht hilft dir das.

Steffen

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst obige Formel etwas umbauen um alles ganzzahlig in 1/16 Grad zu 
rechnen. Danach ganzzahlig mal 10 durch 16.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls Du es selber nicht hinbekommst....

Stichwort wäre dann: fixed point arithmetic, siehe Artikel
Festkommaarithmetik

Oder du bemühst die Forensuche, es gibt einige Threads zu dem Thema.

Oder die "Abschreiblösung" für den DS18S20:
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

900ss

Autor: Gast^2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi 900ss,

vielen Dank! Das ist de richtige Tipp ...

Gruß

Andreas

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast^2 wrote:
> vielen Dank! Das ist de richtige Tipp ...

Du meinst den Link zu AVRFreaks?
Hab ich befürchtet ;-) Damit lernst du es nicht. :-)

Gruß 900ss

Autor: Christian L. (lorio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. wrote:
> Zunächst obige Formel etwas umbauen um alles ganzzahlig in 1/16 Grad zu
> rechnen. Danach ganzzahlig mal 10 durch 16.

Alles ganzahlig, wie A. K. schon geschriben hat.

erg = Ergebnis der Wandlung
erg_10 = Ergebnis in 1/10 Grad

int16_t erg_10 = 0;
int16_t erg    = getWandlungsErgebnis();

erg_10 += (erg >> 3); 
erg_10 += (erg >> 1);


=> erg/8 + erg/2 = erg/8 + 4*erg/8 = 5/8 * erg = 10/16 * erg


Achtung: funktioniert nur mit Werten >= 0
Hoffe aber, dass du die Idee bekommen hast, das signed-Bit noch passend 
zu manipulieren ist aber auch kein Problem.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian L. wrote:
> => erg/8 + erg/2 = erg/8 + 4*erg/8 = 5/8 * erg = 10/16 * erg

Wenn du dir die Formel im Eingangspost mal genauer ansiehst, dann wirst 
du feststellen, dass deine Methode etwas übersieht und somit hier 
falsche Ergebnisse liefert.

900ss

Autor: Gast^2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend,

ich habe das jetzt so gelöst und erfolgreich getestet:

Eingabe
uint8_t -> msb, lsb, cnt_p_c, cnt_r,
uint16t -> erg
erg=msb; // baut 16-Bit-Zahl zusammen (9BIT Auflösung)
erg<<=8; //
erg|=lsb;//
erg>>=1; // eliminate bit0

//erg=lsb-0.25+((cnt_p_c-cnt_r)/cnt_p_c);
erg<<=4; // *16
erg-=4;  // -(4/16)
erg+=(cnt_p_c-cnt_r); // +(cnt_p_c-cnt_r)
erg*=10; // *10 gibt 1. Nachkommastelle, *100 gibt 1.+2. Nachkomaastelle
erg>>=4; // division /16
voila, erg enthält jetzt die Temp*10 bzw. *100

Gruß und Danke für die Tipps

Andreas

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.