www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 mspgcc Wurzel ziehen und Winkelfunktionen


Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salu zusammen

Ich arbeite mit einem MSP430F149 und dem mspgcc Compiler für Eclipse. 
Nun muss ich in einer Rechnung die Quadratwurzel ziehen. Geht das mit 
dem Befehl sqrt? Habe gehört dass es da zu Problemen kommen kann, oder 
mache ich mir da unnötige Gedanken? Weiter muss ich noch 
Winkelfunktionen ala sin, cos, asin, acos verwenden. Muss ich da was 
einbinden oder stehen mir die Funktionen einfach zur Verfügung? Hoffe 
nicht das ich das noch über Reihen realisieren muss. Wäre über eine 
Antwort dankbar

Merci im Voraus

Greets reflection

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <math.h>

Diese Headerdatei mal im Editor aufmachen und ansehen.

Eine Floating-Point-Emulation belegt viel Flash-ROM, Du wirst nicht mit 
jedem MSP430 nutzen können.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal bei IAR.com die Application Note bzgl. Wurzel an. Diese 
wirst Du sicher auch mit mspgcc nutzen können.

=> Es ist eine schöne kurze Wurzelfkt. mit hinreichender Genauigkeit.

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Apl.-Note

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten

Ich werde es einmal versuchen

Gruss reflection

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun folgendes versucht:

float acc_result = sqrt _PARAMS((acc_x * acc_x) + (acc_y * acc_y) + 
(acc_z * acc_z));

wollte es einmal mit der math.h lösen. Habe diese auch eingebunden, aber 
er bringt immer die Fehlermeldung: Undefined reference to 'sqrt'
Was mich ich denn nu wieder falsch. :o)

Gruss reflection

PS: Auch die sin Funktion kann ich nicht verwenden, erscheint die selbe 
Fehlermeldung beim Compilieren

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist die Funktion nicht implementiert, sonder nur der Funktionsrumpf 
in der Header-Datei. Die muss dann vom User selbst in geeigneter Weise 
bereitgestellt werden. ist genau wie bei printf(), da muss man putc() 
auch selber machen, der Compiler kann ja nicht wissen, wohin man die 
printf() Ausgabe haben will.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das ist eher unüblich. Linkst Du auch mit libm.a?

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rufus wrote: Nein, das ist eher unüblich. Linkst Du auch mit libm.a?

Sorry, traue mich fast nicht das zu sagen, aber ich weiss nicht was Du 
meinst. Bin noch rel. neu mit dem ganzen Thema. Wo sehe ich mit was ich 
linke, in den Project Options?

Greets

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit Floatingpoint-Arithmetik genutzt werden kann, muss die dafür 
zuständige Library zum Programm gelinkt werden (ganz schicke sagen "das 
Programm muss gegen die Library gelinkt werden").
In dieser Library ist der Code enthalten, der erforderlich ist, um 
Floating-Point-Arithmetik auszuführen, also auch der Code für die 
Grundrechenarten etc.
Und die Implementierung der Funktion sqrt gehört auch in diese Library.

Das Linken mit einer Library geschieht beim gcc mit der 
Kommandozeilenoption

  -l<libraryname>

Die Library heißt libm.a, allerdings ist sowohl das Präfix "lib" als 
auch die Dateinamenserweiterung ".a" wegzulassen, so daß die 
Kommandozeilenoption so aussieht:

  -lm

Viel Erfolg.

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst Du mit Kommandozeilenoption?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage meinst Du jetzt nicht ernst, oder?

Du verwendest einen Compiler. Das ist ein Programm, das aufgerufen wird, 
um irgendwelche Dinge zu tun. Und welche das sind, wird ihm mit 
Kommandozeilenargumenten/optionen mitgeteilt.

Und die stehen beispielsweise im Makefile.

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, wie gesagt, mir hat noch nie jemand etwas über uP erzählt. Habe ich 
mir selber irgendwie zusammengeschustert, anders kann man es nicht 
sagen. Ich habe was versucht aber jetzt geht gar nichts mehr :o( Er 
bringt nur noch einen Error, nämlich das er nichts macht... So long, 
wird wohl wieder ein riesen Akt werden. Also langsam frage ich mich ja 
schon. Kann doch nicht so schwer sein ein Tool zu entwickeln wo ich 
einfach eine Wurzel ziehen kann ohne tausend Sachen zu wissen. Langsam 
aber sicher denke ich, dass ich von uP's die Finger lasse und mich 
wieder der Analog Technik widme, da hab ich wenigstens einigermassen nen 
Plan.

Danke aber für Hilfe, auch wenn ichs nicht hin kriege

Greets

Autor: reflection (Gast)
Datum:
Angehängte Dateien:
  • preview image for 1.gif
    1.gif
    13,8 KB, 284 Downloads

Bewertung
0 lesenswert
nicht lesenswert
So, der Fehler ist raus. Ich habe einfach unter den Project Preferences 
beim ersten Fenster dort wo msp430-gcc steht noch ein -m angehängt. Der 
Fehler mit dem sqrt ist behoben, aber dafür habe ich 5 neue Errors.

Autor: Christian R. (supachris)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jo, Irrtum von mir, man muss dem Linker "nur" passend sagen, er soll die 
libm.a einbinden. Das ist über das Eclipse-Plugin ganz schön russisch 
gelöst, aber naja, Open-Source-Gefrickel eben.

Siehe Bild, so klappts bei mir dann mit sqrtf(..) kann ich Wurzel aus 
float ziehen. Frisst aber auch mal locker 3,5kByte ROM für eine einzige 
Wurzel :-/

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kommst du darauf, eine ominöse Option -m an den Compiler-Aufruf zu 
kleben? Wir haben doch die ganze Zeit vom Linker geschrieben. Dem musst 
du das -lm mitgeben. Siehe oben.
Mit -m beim Kompiler kommen bei mir natürlich auch massig unsinnge 
Fehler....

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salu zusammen

Sorry, aber wir haben wohl aneinander vorbeigeredet. Ich habs natürlich 
im Linker eingetragen. Das Problem war bei mir, dass er mir einen Fehler 
bringt mit sqrt. Wechsle ich den Befehl zu sqrtf funktioniert es. Ist 
sqrt nur für Integer zulässig?

Danke für die Hilfe, hats also doch noch geklappt :o) Tut mir echt leid 
für Euch, bin sonst schon der der sich einliest ect. aber im Moment 
fehlt mir die Zeit um lange zu probieren, auch wenn es interessant wäre.

Greets und hoffentlich bis "nicht" so bald, sonst gibts wieder Arbeit 
:o)

reflection

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte sqrt eine Funktion sein, die die Quadratwurzel eines 
double-Wertes berechnet? Und sqrtf die float-Variante?

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.