Forum: Mikrocontroller und Digitale Elektronik wurzelberechnung und potenzrechnen im assembler


von Alex B. (beeker)


Lesenswert?


Hallo zusammen
ich tüftel gerade daran wie ich die AVR controller dazu überredet kriege 
mir eine 5,255 wurzel auszurechnen oder mir einen wert zu potenzieren 
mit 0.19029
komme da irgendwie nicht so ganz weider.
bin dankbar für jede hilfe

von Hauke Radtki (Gast)


Lesenswert?

Das Simpelste wird wohl eine Tabelle im Flash sein ...

von Karl heinz B. (kbucheg)


Lesenswert?

Ich denke der Weg führt über Logarithmen. Frag mich
aber jetzt nicht wie man in Assembler einen log
macht.

  b      ( ln a * ln b )
 a   = e

Für ln bzw. e-Funktion sollte sich doch was finden lassen.

von Wiesi (Gast)


Lesenswert?

Das einfachste wird sein, den Ausdruck x^0.19029 in eine passende 
taylorreihe zu entwickeln.

   Wiesi

von Thomas (Gast)


Lesenswert?

Eine entsprechende Logarithmentabelle im Flash ablegen, und dann alles 
über Logarithmus rechnen.

von Wiesi (Gast)


Lesenswert?

Alex müsste mal sagen, welchen wertebereich er hat bzw. wie genau das 
werden soll.

Sonst kann mann da nicht allzu viele Aussagen darüber machen.
(Außer - nimm eine mathe-lib)

   Wiesi

von Wiesi (Gast)


Lesenswert?

@ Alex Black

Ich hab mal eine Implementierung in C gemacht (ohne Tabellen, Ergebnis 
stimmt auf so 4 bis 6 Nachkommastellen).

Die Genauigkeit wirst du aber für den AVR runterschrauben mussen,
sonst rechnet der recht lang (oder muss es eh nicht schnell sein?).

Floating point wird aber noch immer vorausgesetzt.

Falls du noch daran interessiert bist, könnt' ichs mal posten.


   Wiesi

von ... (Gast)


Lesenswert?

Ich denke mal der Weg führt über eine Reihe Multiplikationen und 
Additionen, frag mich aber nicht, wie man das in einem AVR macht.

von holzi (Gast)


Lesenswert?

Zuerst muesste bekannt sein was fuer eine Genauigkeit auf welchem 
Wetebereich benoetigt wird. Dann kann man Speicherplatz gegen 
Geschwindigkeit ausspielen, indem man Tabellen und Operationen 
kombiniert. Eine kleine  Untersuchung wird zeigen wievielten Grades ein 
Polynom sein muss um die Genauigkeit zu erreichen.  Allenfalls ist eine 
Tabelle mit einigen Weten besser. Imterpolieren kann man auch wieder 
linear, oder mit Spline.

holzi

von Alex B. (beeker)


Lesenswert?

Nun estmal danke für die rege beteiligung
Ich will mich da mal präzisieren
ich wil mir nen höhenwarner bauen (bin falschirmspringer)der bei einer 
gewissen höhe anfängt zu piepsen, damit ich bescheid weiß das ich mich 
mal langsam bereit machen sollte zu ziehen. das problem mit tabellen ist 
(habe ich schon angedacht) sie sind statisch und der druck kann sich wie 
bekannt wetterbedingt im tagesverlauf ändern.
dh habe ziehe ich die direkte berechnung vor und in assembler da mir auf 
der berufsschule beigebracht wurde assembler ist schneller als 
hochsprachen.
dh es kommt nicht auf nachkommastellen an sondern auf schnelligkeit.
aus diesem grunde dachte ich mir das so:
vor jedem sprung gerät einschalten es wird der aktuelle druck gemessen
bei 4000m steige ich aus und ab da an muss der controller nun aus 
druckdifferenz die höhe ermitteln und bei 1500m dem piepser anwerfen
so habe ich mir das gedacht

von Alex B. (beeker)


Lesenswert?

muss noch dazu sagen das ich nicht den höheren bildungsweg besritten 
habe ich kenne mich nicht mit logarithmen und e-funktionen aus. habe 
zwar von gehört aber bei nachfrage war immer der selbe satz zu hören von 
den Lehrern braucht ihr nicht ............ ich lese mich da mal ein mhh 
Danke

von Matthias (Gast)


Lesenswert?

Es stimmt schon das Assembler schneller ist als Hochsprachen, aber ich 
denke bei 16MHz sollte es auch in C schnell genug sein. Es gibt in 
math.h
die funktion:double exp (double __x) und double log (double __x)
und dann einfach so wie Karl heinz es gemeint hatte.

  b      ( ln a * ln b )
 a   = e

P.S. was hast du für einen Höhensensor? und sollte nicht auch die 
Temperautr einen Einfluss haben?

von Wiesi (Gast)


Lesenswert?

Assemblercode ist nur dann schneller als C-Code, wenn man wirklich gut 
ASM kann. Meist optimieren die Compiler den Code (im Schnitt) genauso 
schnell wie ein durchschnittlicher ASM programmierer.

(Ohne jetzt wieder die Diskussion ASM vs C lostreten zu wollen, aber am
sinnvollsten ist immer eine Mischung, sofern man weiß, was man tut.)

Die Mathemathikroutinen die der Compiler einbindet sind sowieso meist 
handoptimiert.


   Wiesi

von Unbekannter (Gast)


Lesenswert?

> berufsschule beigebracht wurde assembler ist schneller als hochsprachen.

Naja, wie in Berufsschulen so üblich, der vermittelte Stoff ist im 
Schnitt 20 Jahre veraltet.

Diese Aussage stimmt nämlich nur noch sehr beschränkt. Heutige, moderne 
Compiler, besonders auf leistungsstarken Prozessoren, erzeugen in den 
allermeisten Fällen deutlich schnelleren Code als ein Mensch der direkt 
in Assembler programmiert.

Für Deinen Fall wäre das beste, das einfach in C zu programmieren. Da 
kannst Du dann Deine Formel einfach im Source-Code reintippen und gut 
ist.

http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html

von Karl H. (kbuchegg)


Lesenswert?

> assembler ist schneller als hochsprachen.
> dh es kommt nicht auf nachkommastellen an sondern auf schnelligkeit.

Aber nur dann wenn es einen Unterschied macht ob die Warnung
eine Millisekunde früher oder später kommt. In Deinem Fall
dürfte das überhaupt keinen Unterschied machen. So schnell
kannst du sowieso nicht reagieren :-)

von Karl H. (kbuchegg)


Lesenswert?

Wenn du das dann in C machst, dann heist die Funktion pow()

Eine Wurzel ist dann: potenzieren mit dem Kehrwert.
Eine Quadratwurzel (*) aus x wäre also: pow( x, 1.0 / 2.0 )
Die 5.244 Wurzel ist dann:  pow( x, 1.0 / 5.244 );

(*) Der Vollständigkeit halber: Quadratwurzeln braucht man
häufiger. Dafür gibt es eine eigene Funktion: sqrt()

von Mario (Gast)


Lesenswert?

Hallo Alex,

für Deinen Anwendungsfall kannst Du die vereinfachte barometrische 
Höhenformel nehmen (e-Funktion). Die komplizierte ICAO 
Standard-Atmosphäre erfordert eine sehr genaue Wurzel-Berechnung um 
genau zu sein (zumindest 5 kommastellen).

Gruß
Mario

von Unbekannter (Gast)


Lesenswert?

> vor jedem sprung gerät einschalten es wird der aktuelle druck
> gemessen bei 4000m steige ich aus und ab da an muss der controller
> nun aus druckdifferenz die höhe ermitteln und bei 1500m dem piepser
> anwerfen so habe ich mir das gedacht

Hmm, muss das dann überhaupt so kompliziert sein?

Kannst Du nicht einfach die Faustformel 1 Hekto-Pascal = 8 Meter 
verwenden?

Also:

1.) Am Boden Tastendruck abwarten und dann Druck speichern.
2.) Sobald der Druck um 200 hPa (1600m) seit Tastendruck angestiegen
    ist, schaltet sich das Gerät automatisch scharf.
3.) Sobald die Differenz zwischen aktuellem Druck und gespeichertem
    Druck kleiner als 188 hPa (1500m) wird, Piepser einschalten.

Mehr brauchst Du doch nicht, oder?

von Unbekannter (Gast)


Lesenswert?

Achja, der Druck sinkt natürlich beim steigen und wird wieder größer 
beim fallen. Aber sinngemäß sollte meine Idee klar sein.

Wie konnte ich das nur verwechseln?

von Alex B. (beeker)


Lesenswert?

>Kannst Du nicht einfach die Faustformel 1 Hekto-Pascal = 8 Meter
>verwenden?

Mh das wäre ne möglichkeit, versuche ich die mal ist unkompliziert und 
auch klangschön. wenn sie annäherungsweise das gewünschte ergebniss 
ausspuckt bin ich zufrieden

Zur frage mit welchem drucksensor ich arbeite, kann mich noch nicht 
entscheiden zwischen den barometermodulen von intersema (MS5540)und den 
motorola mpx4100. wobei ich mir erst mal das programm schreibe und dann 
den sensor aussuche
weiß ist nicht unbedingt ein guter weg habe aber momentan nicht die 
mittel um  mir exemplahre zu kaufen und meinen cheff sehe ich erst 
nächstes jahr wieder dann kann ich ihn fragen ob er diese als sampels 
bestellen kann ( bin knauserich geworden )

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.