Re: Neuanfang mit Station2 Kategorie: Programmierung (von m8_nix - 30.04.2007 17:18) | ||
Als Antwort auf Re: Neuanfang mit Station2 von André H. - 30.04.2007 0:26 | ||
| ||
> Hallo m8_nix, > > > ich sehe grade diese Funktion kann so nicht funtzen.... vielleicht liegt ja darin schon deine > > fragende Haltung begründet? > > Dadurch das sich im long-Format die Werte 105625 (10,5625°C) und 106 (10,6000°C) nicht Exponentiell > > von einander unterscheiden lassen (fehlende Nachkomma "Nullen") wird im vorliegendem Fall der letztere > > Wert "10,6°" tatsächlich niedrieger "angesehen" als der in wirklichkeit Niedrigere (10,5625°) > > Wie kommst Du denn darauf ? Das stimmt nämlich nicht. > Du wei�t schon, was ein Festkommainteger ist, oder? > Wenn mit ds1631.readl() ein Wert ausgelesen wird, hat dieser > immer vier Nachkommastellen. Keine mehr, und keine weniger. > Ein Festkommainteger ist nur eine Anwenderdefinitionen, bei der der Anwender selbst > wissen mu�, wo das Komma sitzt. > Es ist einfach eine Kommazahl, die um den Faktor 10, 100, 1000 usw. multipliziert wurde. > Im Fall readl() kann man die Einheit hundertstel Mikrograd nennen, > was vier Nachkommastellen entspricht. > Falls es den Wert 10,6000° beim DS1631 wirklich geben würde, ist das bestimmt > nicht der Rückgabe wert 106, sondern 106000 oder in Worten huntertundsechstausend. > Aber gehen wir von Werten aus, die vorkommen können. (vielfaches von 0,0625K) > Nehmen wir also die Temperaturen 10,5625°C und 10,6250°C an. > Als Festkommainteger sind das die Werte 105625 und 106250. > Wenn Du nun von den 106250 die 105625 abziehst, erhälst Du 625. > Und das sind 0,0625K. > > Also denke bitte nicht unnötig kompliziert. > Die Sache ist ganz einfach. > Darum habe ich bei der CC2 auch die Festkommainteger in Mode gebracht, da > diese meist einfacher handhabbar sind, als Float-Zahlen. > (Und deutlich weniger Rechenzeit benötigen) > > Allerdings hast Du mit einem recht. Deine Funktion kann nicht funktionieren: > long t1, t2; > float tdelta; > function build_diff() returns float; > { > t1=ds1631.readl(0); // 0=Adresse des ersten Sensors > t2=ds1631.readl(1); // 1=Adresse des zweiten Sensors > tdelta=t2-t1; > } > > Du hast ein Semicolon nach dem "returns float" in der Funktionsdefinition. > Das ist nicht zulässig. > Dann gibst Du keinen Wert in der Funktion zurück. > Somit ist der Rückgabewert immer 0. > Und dann mach es keinen Sinn die Differenz der Festkommaintegerwerte t1 und t2 > in einem Float zu speichern, da ein Festkommawert für einen Float keine Kommazahl darstellen. > Du müsstest Deine Funktion dann folgenderma�en umschreiben: > long t1, t2; > float tdelta; > function build_diff() returns float > { > t1=ds1631.readl(0); > t2=ds1631.readl(1); > tdelta=(t2-t1)*0.0001; // Festkommainteger mit 4 Nachkommastellen > // in Floatumrechnen > return tdelta; > } > > MfG André H. > Hallo, ich nehme alles zurück und behaupte das Gegenteil André. Tut mir leid für das unnötige Falschposting. Man sollte eben so spät Nachts nichts mehr posten Chris | ||
Antwort schreiben Antworten: |