Forum: Compiler & IDEs Brauche Hilfestellung bei log und avr-gcc


von Cyblord -. (cyblord)


Lesenswert?

Hallo Leute,
ich bin gerade dabei einen Höhensensor für Modellfugzeuge zu bauen. 
Dafür möchte ich den Bosch BMP085 als Drucksensor nehmen. Nun gehts mir 
natürlich nicht um die absolute Höhe, sondern um die Höhendifferenz in 
Metern zwischen Referenzluftdruck P0 (in Pascal) welcher beim Power-On 
gespeichert wird und einem Luftdruck P.

Habe aus den Artikeln zur Barometrischen Höhe usw. die Funktion genommen 
und nach H aufgeglöst, da bekomme ich folgende Formel:

Alternativ:

Nun knallt mir allerdings avr-gcc wegen der log Funktion entspannte 5kb 
in den Flash.

Nun 2 Fragen:

1.) Stimmen die Formeln da überhaupt?
2.) Weiß jemand eine Möglichkeit das ganze umzuschreiben, so dass keine 
Funktionen verwendet werden müssen welche den Code derart blähen. Bin 
leider nicht Mathe Profi genug um hier groß zu optimieren.

gruß cyblord

von Oliver (Gast)


Lesenswert?

cyblord ---- schrieb:
> Nun knallt mir allerdings avr-gcc wegen der log Funktion entspannte 5kb
> in den Flash.

Na und?

Oliver

von goldeneyes1987 (Gast)


Lesenswert?

Evtl hilft dieser Link:
http://www-spof.gsfc.nasa.gov/stargaze/Slog4.htm

Gruß
GoldenEyes

von Klaus W. (mfgkw)


Lesenswert?

Eine ganz defätistische Frage: brauchst du überhaupt einen Logarithmus?
Bei den Höhendifferenzen eines Modellflugzeugs kann man vielleicht auch 
linear rechnen?

Und noch eine: Geht es nicht auch mit Festkommezahlen und einer Tabelle 
zum Linearen Interpolieren?
Das wäre wesentlich kleiner und schneller.

von Oliver (Gast)


Lesenswert?

Ich komme da nicht auf 5kb.

Der tescode:
1
int main(void)
2
{  
3
  volatile double p = 100.0;
4
  double p0 = 12.0;
5
6
   volatile double h = -7990.0 *log10(p/p0);
7
}

erzeugt 2,6kb - mit -OS, aber ohne Mathelib. Mit Mathelib (die man immer 
dazulinken sollte) sind es 1,4kB.

Oliver

von Klaus W. (mfgkw)


Lesenswert?

Vielleicht hat er noch printf() dabei :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Vielleicht hat er noch printf() dabei :-)

Für die Ausgabe auf dem Banner, welches das Flugzeug hinter sich 
herzieht? ;-)

von klausr (Gast)


Lesenswert?

Hm, du könntest dir eine LUT (Lookup table) machen. p0/p1 dürfte so im 
Bereich von 0.8 bis 1.2 liegen. Wenn du dann alle 0.01 einen Wert in 16 
bit Festkomma speicherst, belegt diese LUT 80 Bytes. Zur Not kann man 
dann noch zwischen den einzelenen Werten linear interpolieren. Die Frage 
ist halt, welche Genauigkeit du brauchst.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Nun knallt mir allerdings avr-gcc wegen der log Funktion entspannte 5kb
> in den Flash.

Wolltest du dir was berechnen lassen, oder mit dem popeligsten ATtiny
daherkommen?  Letzteres spart dir vielleicht einen Euro oder zwei,
auf Kosten von endlosen Stunden, die du einen eigentlich simplen
Algorithmus auf irgendwas anderes umbauen darfst (Lookup-Tabellen,
irgendeine Approximation, was auch immer), um das anschließend zu
debuggen und in der Gültigkeit für deine Anwendung zu verifizieren.
Am Ende zeigt sich vielleicht beim Flug, dass trotzdem nur Mist
rauskommt, weil du irgendwas übersehen hast.

Der Vorteil des log10 aus der Mathebibliothek ist demgegenüber
einfach mal, dass es ein "known to be good"-Algorithmus ist, und
wenn deine Formel stimmt, du das einfach so einsetzen kannst und
für ein paar Kilobyte Flash diesen Tagesordnungspunkt abhaken kannst,
um zum nächsten überzugehen.

Musst du halt selbst wissen, was dir wichtig ist.  Selbstgebrautes
Bier mag gut schmecken, und sicher kann man (im Vergleich zu den
Kommerziellen) dabei auch viel improvisieren.  Wenn's mir aber nicht
auf den Spaß beim Brauen ankommt, sondern ich nur ein Bier trinken
will, dann kauf' ich mir 'ne Flasche.

von Cyblord -. (cyblord)


Lesenswert?

Vielen Dank für den vielen Input!!!
Ich benutze natürlich kein printf, aber danke der Nachfrage ;-)

> erzeugt 2,6kb - mit -OS, aber ohne Mathelib. Mit Mathelib (die man immer
> dazulinken sollte) sind es 1,4kB.

Ich werde mir das mit der Mathelib mal angucken. Habe bisher nichts 
extra dazugelinkt.


> Eine ganz defätistische Frage: brauchst du überhaupt einen Logarithmus?
> Bei den Höhendifferenzen eines Modellflugzeugs kann man vielleicht auch
> linear rechnen?

Das hab ich mir auch überlegt, irgendwo auf Wiki steht was von einer  > 
Höhendifferenz von 8,4m / hPa. Natürlich nur bei x Grad auf Meereshöhe 
und wenn Weihnachten auf Ostern fällt. Das könnte man ja linear rechnen. 
Aber ich will nicht mehr Ungeauigkeit als nötig ohne Not reinbringen.


> Wolltest du dir was berechnen lassen, oder mit dem popeligsten ATtiny
> daherkommen?

Eigentlich ist ein tiny45 angedacht, da ich davon einigen Stangen in 
SOIC Gehäuse habe und der Sensor ja klein werden muss. Natürlich kann 
ich auch einen tiny85 nehmen, aber das Ding muss ja auch noch andere 
Sachen machen als einen log berechenen.

Aber es stimmt schon, wegen ein paar kb mehr lohnt sich vielleicht ein 
großer Aufwand nicht.

Zur Genauigkeit: Der verwendete Sensor hat ein Rauschen von 0,25m. Eine 
Gesamtgenauigkeit im Bereich von +-2m hatte ich mir mal so als Ziel 
gesetzt.

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.