mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik wurzelberechnung und potenzrechnen im assembler


Autor: Alex Black (beeker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hauke Radtki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Simpelste wird wohl eine Tabelle im Flash sein ...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wiesi (Gast)
Datum:

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

   Wiesi

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine entsprechende Logarithmentabelle im Flash ablegen, und dann alles 
über Logarithmus rechnen.

Autor: Wiesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wiesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex Black (beeker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex Black (beeker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Wiesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex Black (beeker)
Datum:

Bewertung
0 lesenswert
nicht 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 )

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.