Forum: Mikrocontroller und Digitale Elektronik mspgcc pow()


von Msp 4. (msp430_crew)


Lesenswert?

Ich habe eine großes Problem beim Potenzieren mit dem mspgcc.
Wenn ich zB. b=pow(2.0,2.0) kompiliere, gibt es eine Fehleremldung:
"undefined reference to 'pow'"
Die math.h ist eingebunden.
Das koriose ist andere Funktion wie zB. abs() funktionieren ohne
weiteres.

Wer hat einen Rat?

MFG

von Joerg X. (Gast)


Lesenswert?

#include <math.h>
und -libm
pow() ist doch afaik 'ne Funktion aus der Mathe Lib.,

von Msp 4. (msp430_crew)


Lesenswert?

Joerg X. wrote:
> #include <math.h>
> und -libm
> pow() ist doch afaik 'ne Funktion aus der Mathe Lib.,

math.h ist includiert, s.o.!
Was ist -libm oder wo muss ich es einfügen? Beim Linker gibts 'nen 
Fehler!

von KoF (Gast)


Lesenswert?

Das ist eine lib ;-) die wird beim link-befehl angefügt
math.h sagt nur, das es sie gibt und libm ist ihre "heimat"

von Msp 4. (msp430_crew)


Lesenswert?

Wenn ich -libm beim Linker mit ranhänge gibts einen Fehler:

msp430-gcc -IC:/Programme/eclipse/eigene/Wetterstation 
-I"C:\Programme\mspgcc\msp430\include" -O0 -g3 -Wall -c 
-fmessage-length=0 -mmcu=msp430x149 -omain.o ../main.c
'Finished building: ../main.c'
make: msp430-gcc-libm: Command not found

von Joerg X. (Gast)


Lesenswert?


von Msp 4. (msp430_crew)


Lesenswert?

Hallo!

Das funktioniert leider nicht! Ich schaffe es auch nicht das "-lm" als 
letztes bei den Linker-Optionen anzuhängen! Wie geht das mit eclipse?

von Patti (Gast)


Lesenswert?

Hallo Peter,
hast du unter http://mspgcc.sourceforge.net/manual/ schon mal 
nachgeschaut?
Manchmal gibnt es hier auch hilfreiche Tipps.

Gruß Patti

von Joerg X. (Gast)


Lesenswert?

ohh! du kannst google doch bestimmt genauso gut benutzen wie ich ! und 
"msp-gcc eclipse" spuckt den MSP-GCC Artikel auf dieser Seite aus, und 
der hat diesen Link:
http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/#Id225664 weiter 
unten ist ein Screenshot von den Projekt-Einstellungen, da gibts auch 
den Punkt Linker.
 (Ich benutze keine MSPs und habe mich auch mit eclipse noch nicht so 
recht angefreundet, kann dir also nicht mehr so recht weiterhelfen außer 
in div. dokus nachzulessen, was du aber sicher auch kannst ;) )

von Msp 4. (msp430_crew)


Lesenswert?

Hallo Patti!
Diese Seite hab ich schon durchforstet....ohne Erfolg!

Hallo Joerg X.!
Klar kann ich mit google umgehen, doch diese Seite hilft überhaupt nicht 
weiter bei dem Problem!
Ich bin ja schon soweit gewesen das ich dem Linker die "-lm"-Option 
gegeben habe, aber ohne Erfolg!

von Patti (Gast)


Lesenswert?

Hi Leute,
ich benutze auch den msp430 GCC und Eclipse.
Ich habe mal kurz ausprobiert und bei mir gibt es auch Fehler-Meldungen 
wenn ich pow() benutze! Dabei ist die math.h includiert.
Also mich würde das jetzt auch interessieren!!!

Und in den Einstellung, bzw. im Netz was ich so schnell gefunden habe 
steht davon leider nichts drin!!!

Gruß Patti

von Joerg X. (Gast)


Lesenswert?

OK! mal anders herum gefragt: kann mal jemand in die "math.h" 
reinschauen, ob es überhaupt eine funktion pow() für den MSP-GCC gibt ? 
dann bräuchten wir nicht weiterzusuchen :-) und ich glaube nicht, dass 
diese Funktion soo anspruchsvoll ist, dass man sie nicht selber nach 
bauen könnte ;)

von Msp 4. (msp430_crew)


Angehängte Dateien:

Lesenswert?

Natürlich gibt es die, sie ist aber vollständig im Compiler 
integriert.....d.h. du kannst Sie dir nicht ansehen!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn man sich 
http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/screenshots/42.jpg 
ansieht, dann gibt es da unter "msp gcc linker" einen Menüpunkt 
"Libraries" ... was werden denn dort für Optionen angeboten?

von Msp 4. (msp430_crew)


Lesenswert?

Optionen gibts da keine, Du kannst nur Dateien einbinden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und ... was passiert, wenn Du dort libmath.a (oder wie sie nun im 
gegebenen Falle genau heißen mag) angibst?

von Msp 4. (msp430_crew)


Lesenswert?

Es kommt immer eine Fehlermeldung das er die Datei nicht finden 
kann....obwohl ich sie ja auswählen musste! Komisch!?

von Uhu U. (uhu)


Lesenswert?

Peter Brink wrote:
> Natürlich gibt es die, sie ist aber vollständig im Compiler
> integriert.....d.h. du kannst Sie dir nicht ansehen!

Na das wäre der erste C-Compiler, der pow() als Intrinsic implementiert 
hat...

Aber vielleicht kann man auch überprüfen, ob in der mathlib überhaupt 
eine pow()-Funktion vorhanden ist:

Wenn beim gcc ein Bibliotheksverwalter dabei ist - was ich stark annehme 
- dann lies mal die Beschreibung dazu. Üblicherweise verfügen 
Bibliothelsverwalter ('librarian') über eine Option zum Auflisten der in 
einer lib vorhandenen Module.

Ansonsten würde einfach mal nach dem Quelltext der Funktion googeln - 
die gibts 100% irgendwo.

von Msp 4. (msp430_crew)


Lesenswert?

@Uhu
Das bringt mich nicht weiter! Es gibt jedenfall keine Funktion in der 
man sieht wie in pow(x,y) potenziert wird!

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mal schätzen:

  pow(x,y):   exp(y*ln(x))

von Msp 4. (msp430_crew)


Lesenswert?

Uhu Uhuhu wrote:
> Peter Brink wrote:
> Aber vielleicht kann man auch überprüfen, ob in der mathlib überhaupt
> eine pow()-Funktion vorhanden ist:
>
> Wenn beim gcc ein Bibliotheksverwalter dabei ist - was ich stark annehme
> - dann lies mal die Beschreibung dazu. Üblicherweise verfügen
> Bibliothelsverwalter ('librarian') über eine Option zum Auflisten der in
> einer lib vorhandenen Module.
>
> Ansonsten würde einfach mal nach dem Quelltext der Funktion googeln -
> die gibts 100% irgendwo.

Was ist ein Bibliotheksverwalter???
Ich hab schon Stunden mit googeln verbracht bevor ich das Problem hier 
dargestellt habe! Aber anscheinend gibt es nicht soviele die sich mit 
dem MSPGCC befassen!

von Patti (Gast)


Lesenswert?

Bin leider nich mehr zu Hause,
um es auszuprobieren :-( aber beim AVR gab es auch mal so'n Post, dort 
hat der jenige das hier eingetragen:

#linker flags
LDFLAGS = -Wl,-Map=$(TRG).map,--cref -lm

siehe: Beitrag "POW funktioniert nicht"

Vielleicht bringt das die Sache weiter?

von Uhu U. (uhu)


Lesenswert?

> Was ist ein Bibliotheksverwalter???

Das ist das Teil, mit dem man aus einer Sammlung von compilierten 
Modulen eine Bibliothek zusammen baut, aus der der Linker sich dann 
später diejenigen Module herauspflücken kann, die offene Referenzen 
erfüllen.

Beispiel:

Dein Programm ruft atoi auf.
Der Comiler sieht im Headerfile, was atoi ist und erzeugt eine externe 
Referenz.

Nun startest Du den Linker, dessen Aufgabe es ist, aus den 
Standard-Bibliotheken und den vom Benutzer zusätzlich angegebenen 
diejenigen Module herauszupflücken, die externe Referenzen - wie die auf 
atoi - erfüllen.

Er sammelt die notwendigen Module zusammen und montiert daraus 
anschließend Dein lauffähiges Programm zusammen -- oder bricht mit 
Fehler ab, wenn irgendwelche Referenzen offen bleiben -- wie die auf 
pow() in Deinem Fall.


Mit einem Bibliotheksverwalter kann man sich eigene Bibliotheken bauen, 
bestehende analysieren, oder auch wieder in eine Sammlung von Modulen 
zerlegen.

Quellen für die gcc mathlib findest Du hier: 
http://www.radiks.net/~rhuebner/mathlib.html (Ich habe nach 'gcc 
mathlib' gegoogelt.)

von Msp 4. (msp430_crew)


Lesenswert?

Uhu Uhuhu wrote:
> Quellen für die gcc mathlib findest Du hier:
> http://www.radiks.net/~rhuebner/mathlib.html (Ich habe nach 'gcc
> mathlib' gegoogelt.)

Das bringt mich auch nicht weiter! Ich arbeite am MSP430 mit dem MSPGCC 
und unter dem Link gehts um "PalmPilot applications"!?

von Karl H. (kbuchegg)


Lesenswert?

> Das bringt mich auch nicht weiter! Ich arbeite am MSP430 mit dem MSPGCC
> und unter dem Link gehts um "PalmPilot applications"!?

Na und?
Der Link ist die Antwort auf die Frage

> Es gibt jedenfall keine Funktion in der
> man sieht wie in pow(x,y) potenziert wird!

Zip File geholt, ausgepackt und die pow Implementierung
rausgeholt.

Aber im Grunde hast du recht:
Beim gcc müsste eine libm dabei sein. Wenn alles
richtig installiert ist, dann müsste er die auch finden.

von Uhu U. (uhu)


Lesenswert?

Die Mathematik auf dem MSP430 funktioniert im Prinzip genauso, wie auf 
dem PalmPilot -- oder beschwerst Du Dich nur, weil Du hier keine fertige 
Lösung angeboten bekommst?

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

 o habe gerade die aktuellste Version des mspgcc installiert
 o 'pow(..)' ist in 'math.h' enthalten.
 o die 'libm.a' ist ebenfalls vorhanden

Du musst in dem Dialog im Bild oben vermutlich(tm) einfach nur unter 
'Libraries' ein "m" hinzufügen. Der Aufrufende Prozess wird dem Linker 
dann "-lm" mit auf den Weg geben.

Ich habe selber gerade kein eclipse installiert, deswegen kann ich das 
nicht wirklich nachgucken.

EDIT: 'Libraries' hinzugefügt ;-)

von Msp 4. (msp430_crew)


Lesenswert?

Patrick Dohmen wrote:
>  o habe gerade die aktuellste Version des mspgcc installiert
>  o 'pow(..)' ist in 'math.h' enthalten.
>  o die 'libm.a' ist ebenfalls vorhanden
>
> Du musst in dem Dialog im Bild oben vermutlich(tm) einfach nur unter
> 'Libraries' ein "m" hinzufügen. Der Aufrufende Prozess wird dem Linker
> dann "-lm" mit auf den Weg geben.

Jetzt hab ich schonmal das "-lm" als Linkeroption am Ende dabei! Danke!
Aber leider gehts immernoch nicht!
1
double a=0;
2
a=pow(2.0,2.0);

Fehlermeldung: undefined reference to 'pow'

von Msp 4. (msp430_crew)


Lesenswert?

Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur 
einen Wert gebe und meldet "zuwenig Argumente"!
Also muss er ja wissen das es pow() gibt oder sehe ich das falsch?

von Uhu U. (uhu)


Lesenswert?

> Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur
> einen Wert gebe und meldet "zuwenig Argumente"!

Wenn Du die math.h raus nimmst, erkennt er es nicht mehr... Siehe oben: 
'externe Referenz'.


Wenn ich den gcc für MSP430 portieren würde, würde ich mir überlegen, ob 
es überhaupt einen praktischen Sinn hat, pow() auf diesen Knirps zu 
bringen.

Welcher µC-Programmierer wird ensthaft pow(2.0, 2.0) aufrufen, um 2 hoch 
2 auszurechen?

Schon der Einsatz von float und double auf einem µC ist eher die 
Ausnahme und Betriebssysteme kommen fast immer ohne aus.

Das Problem ist wohl eher, daß man, bevor man auf dem µC was 
programmiert, sich überlegen sollte, was man will.

Wenn Du Dir ein neues Brotmesser gekauft hast, kommst Du doch sicherlich 
auch nicht auf die Idee, es an einem Felsbrocken auszuprobieren -- oder?

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Fehlermeldungen bitte immer per Copy & Paste Posten!
Die Fehlermeldung 'undefined reference to 'pow'' wird auch nicht vom 
Compiler, sondern vom Linker kommen. Daß die andere vom Compiler kommt, 
ist ja klar. Der kennt ja den Prototypen von pow aus der math.h.

Poste doch bitte mal den Compiler- und den Linkeraufruf aus der 
Kommandozeile (irgendwo gibts das auch in eclipse zu sehen).

von Msp 4. (msp430_crew)


Lesenswert?

Uhu Uhuhu wrote:
>> Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur
>> einen Wert gebe und meldet "zuwenig Argumente"!
>
> Wenn Du die math.h raus nimmst, erkennt er es nicht mehr... Siehe oben:
> 'externe Referenz'.

Wenn ich die math.h rausnehme dann kennt er pow() nicht mehr! 
Verständlich.


> Welcher µC-Programmierer wird ensthaft pow(2.0, 2.0) aufrufen, um 2 hoch
> 2 auszurechen?

2 hoch 2 ist doch nur ein Beispiel!

von Msp 4. (msp430_crew)


Lesenswert?

Patrick Dohmen wrote:
> Poste doch bitte mal den Compiler- und den Linkeraufruf aus der
> Kommandozeile (irgendwo gibts das auch in eclipse zu sehen).

**** Incremental build of configuration Debug for project test ****

make -k all
'Building file: ../test.c'
'Invoking: mspgcc GCC C Compiler'
msp430-gcc -I"C:\Programme\mspgcc\msp430\include" 
-I"C:\Programme\mspgcc\msp430\include\msp430" -O0 -g3 -Wall -c 
-fmessage-length=0 -mmcu=msp430x149 -otest.o ../test.c
'Finished building: ../test.c'
' '
'Building target: test'
'Invoking: mspgcc GCC C Linker'
msp430-gcc -mmcu=msp430x149 -otest  ./test.o   -lm
./test.o: In function `main':
/cygdrive/c/Programme/eclipse/eigene/test/Debug/../test.c:229: undefined 
reference to `pow'
make: *** [test] Error 1
make: Target `all' not remade because of errors.
Build complete for project test

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Naja, das geht zwar auch, aber ich hätte da jetzt ehrlich gesagt einen 
direkten Aufruf des 'msp430-ld' erwartet. Na gut, kannst Du den 
Parameter '-lm' in '-Wl,-Map=$(TRG).map,--cref -lm' ändern? Dann 
bekommst Du zusätzlich ein '.map-File' in dem Du das Speicherlayout noch 
einmal ansehen kannst.

von Msp 4. (msp430_crew)


Angehängte Dateien:

Lesenswert?

Was kann ich aus diesem Speicherlayout ersehen?

von Uhu U. (uhu)


Lesenswert?

@ Peter Brink:
> 2 hoch 2 ist doch nur ein Beispiel!

Das dachte ich mir. Trotzdem macht der Einsatz dieser Funktion auf dem 
MSP430 i.d.R. keinen Sinn, weil er einfach zu klein nund nicht 
leistungsfähig genug ist, als daß man damit praktisch was anfangen 
könnte.

Sieh Dir den Quelltext von __ieee754_pow(x,y) -- das wird garantiert ein 
ganz schöner Brocken. Und dann ist noch nicht eine Zeile Anwendung dabei 
und der Flash des MSP430 fast voll.

Ganz ernsthaft: Verrenn Dich nicht in solchen realitätsfremden Unsinn. 
Such Dir lieber ein einfaches Problem. Mach irgendwelche Berechnungen, 
die ohne Fließkommaarithmetik auskommen und taste Dich langsam an das 
mspgcc-System heran und lies die Manuals.

@ Patrick:
Die Memorymap bringt in diesem Fall nichts -- das Problem ist, daß pow() 
in der mathlib nicht vorhanden ist.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

An dem Dateinamen erkenne ich schonmal, daß '$(TRG)' nicht so gesetzt 
wird, wie das eigentlich gedacht war, sonst würde diese Datei nämlich 
nicht nur .map, sondern <name>.map heissen.

Darin enthalten sind informationen, welche Objekte wo wie viel Speicher 
belegen und welche Objektmodule eingebunden werden.

Ist die Fehlermeldung noch da?

von Msp 4. (msp430_crew)


Lesenswert?

Uhu Uhuhu wrote:
> Das dachte ich mir. Trotzdem macht der Einsatz dieser Funktion auf dem
> MSP430 i.d.R. keinen Sinn, weil er einfach zu klein nund nicht
> leistungsfähig genug ist, als daß man damit praktisch was anfangen
> könnte.
>
> Sieh Dir den Quelltext von __ieee754_pow(x,y) -- das wird garantiert ein
> ganz schöner Brocken. Und dann ist noch nicht eine Zeile Anwendung dabei
> und der Flash des MSP430 fast voll.

Der MSP430F149 hat 60K Flash.......und der soll dann voll sein?
Ich habe einen Sensor hier für den ich die Potenzberechnung brauche!

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Uhu Uhuhu wrote:

> @ Patrick:
> Die Memorymap bringt in diesem Fall nichts -- das Problem ist, daß pow()
> in der mathlib nicht vorhanden ist.

Nö, pow() ist vorhanden:
1
[16:04:06,81] $ msp430-ar -t libm.a
2
<snip>
3
sf_tanh.o
4
ef_exp.o
5
ef_pow.o
6
kf_cos.o
7
<snip>

Ausserdem ist in den Parametern, die (unter anderen) ich aufgelistet 
habe, die Option '-lm' korrekt für den Aufruf des Linker per *-gcc.

von Msp 4. (msp430_crew)


Lesenswert?

Patrick Dohmen wrote:
> An dem Dateinamen erkenne ich schonmal, daß '$(TRG)' nicht so gesetzt
> wird, wie das eigentlich gedacht war, sonst würde diese Datei nämlich
> nicht nur .map, sondern <name>.map heissen.
>
> Darin enthalten sind informationen, welche Objekte wo wie viel Speicher
> belegen und welche Objektmodule eingebunden werden.
>
> Ist die Fehlermeldung noch da?

Ja, die Fehlermeldung ist noch da!

von Uhu U. (uhu)


Lesenswert?

@ Patrick:

OK, wenn der Modul da ist, dann heißt die Funktion vielleicht nicht 
pow(), sondern irgendwie anders, z.B.

   double __ieee754_pow(double x, double y)

wie in der PalmPilot-Version. Kannst Du Dir irgendwie die von ef_pow.o 
exportierten Symbole ausgeben lassen? (Im Zweifelsfall kann man 
versuchen,
ef_pow.o in einen Editor zu laden und gucken, ob man Namen findet. 
Besser machts wahrscheinlich der Librarian -- s.o.)

Gibt es in der math.h vielleicht auch noch Deklarationen von anderen 
*pow*() - Funktionen?

@ Peter:

Mußt Du dafür tatsächlich double hoch double rechnen, oder würde auch 
double hoch int reichen?

Letzteres ist nämlich deutlich weniger aufwendig.

von Karl H. (kbuchegg)


Lesenswert?

> OK, wenn der Modul da ist, dann heißt die Funktion vielleicht
> nicht pow(), sondern irgendwie anders

Unwahrscheinlich.
pow ist eine Standardfunktion. Die muss pow heissen.

von Patti (Gast)


Lesenswert?

Hi Leute,
gibt es denn keine Lösung? Wer arbeitet den noch mit dem msp430 GCC 
Compiler und Eclipse? Es muss doch schon mal jemand mehr mit der math.h 
gemacht haben, sonst wäre ja der ganze Compiler, naja, sehr bescheiden.

Als wäre es nicht schon blöd genug ,dass man mit printf keine 
Floatzahlen ausgeben kann.

Warum wir der Compiler denn nich mehr gepusht??

Gruß Patti

von Uhu U. (uhu)


Lesenswert?

> Als wäre es nicht schon blöd genug ,dass man mit printf keine
> Floatzahlen ausgeben kann.

Das ist wohl weniger blöd, als pragmatisch -- wer braucht sowas?

Eine printf-Routine, die auch float kann, zieht den kompletten Code der 
Floatingpoint-Library mit herein -- auch wenn man sie nur ein einziges 
mal zur Ausgabe eines char benutzt.

Gewisse Dinge sind eben theroetisch denkbar, aber in der Praxis 
sinnlos...

von Patti (Gast)


Lesenswert?

@Peter
Und haben die Vorschläge funktioniert? Würde mich mal interessieren.

Gruß & nen schönen Feierabend.

von Msp 4. (msp430_crew)


Lesenswert?

Leider nicht!

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Puh, jetzt beiss' mir doch einen 'nen Hund!
1
[ 7:46:16,63] $ msp430-objdump -t libm.a
2
msp430-objdump -t libm.a
3
In archive libm.a:
4
5
<snip>
6
ef_pow.o:     file format elf32-msp430
7
8
SYMBOL TABLE:
9
00000000 l    d  .stabstr  00000000 .stabstr
10
00000084 g     F .text  00000006 powf
11
0000008a g     F .text  00000e5c __ieee754_powf
12
00000000         *UND*  00000000 __addsf3
13
00000000         *UND*  00000000 __subsf3
14
00000000         *UND*  00000000 __divsf3
15
00000000         *UND*  00000000 __mulsf3
16
00000000         *UND*  00000000 scalbnf
17
00000000         *UND*  00000000 __gtsf2
18
00000000         *UND*  00000000 __lesf2
19
00000000         *UND*  00000000 __floatsisf
20
00000000         *UND*  00000000 __ieee754_sqrtf
21
22
<snip>

'pow()' gibt es tatsächlich nicht in der libm.a, der Prototyp 
existiert aber trotzdem in 'math.h'. Das ist Kurios. Möglicherweise wird 
das gemacht, damit man keine eigenen Header für eine selbst 
implementierte Standardfunktion schreiben muss (WIMRE nannte sich sowas 
"stubs").

Was es aber dennoch gibt: 'powf(float, float)', evtl. reicht das ja auch 
aus.

von Msp 4. (msp430_crew)


Angehängte Dateien:

Lesenswert?

@Patrick Dohmen
Besten Dank nochmal. powf() funktioniert nach hinzufügen der 
Linkeroption siehe Bild.

Gruß Peter

von Christian R. (supachris)


Lesenswert?

Interessant wäre mal der FLASH- und RAM-Verbrauch sowie die 
Ausführungszeit für eine Potenzierung von 2 Float-Zahlen.....

Mit einer Reihenentwicklung oder LUT wäre man sicher um Welten 
schneller....

von Uhu U. (uhu)


Lesenswert?

Na dann ist das Mysterium ja gelöst...

Daß Headerfiles von Compilern, die in so vielen verschiedenen Umgebungen 
verwendet werden, wie gcc, auch Funktionsdeklarationen enthalten, die 
nicht in den zur Portierung gehörenden Bibliotheken enthalten sind, ist 
nichts ungewöhnliches.

Die Headerfiles werden nicht extra angepaßt - das würde den Aufwand, 
eine neue Compilerversion zu portieren einfach zu hoch treiben.


@Peter: Gehe ich recht in der Annahme, daß Dein Sensor kein float- oder 
double-Format liefert, sondern int-Werte?

Wenn er ganzzahlige Werte liefert - was die Regel ist -, dann solltest 
Du die nicht einfach nach Schema F in ein Fließkommaformat wandeln, um 
dann damit irgendwelche aus einem Lehrbuch oder Skript abgepfriemelten, 
aber nicht verstandenen Formeln zu füttern.

Man kann z.B. die Ergebnisse komplizierter Berechnungen (oder Teilen 
davon) in Tabellen packen und damit dann eine Näherungslösung 
entwickeln, deren Fehler unter einer vorgegebenen Schranke liegt.

Das setzt aber voraus, daß man die Aufgabenstellung sehr genau kennt und 
daß man die zugrundeliegende Mathematik verstanden hat.

Ein schönes Beispiel für diese Herangehensweise sind 
Funktionsgeneratoren, die einen µC benutzen, um mit Hilfe eines 
PWM-Ausganges und einer minimalen Peripherie-Elektronik die gewünschte 
Funktion zu synthetisieren.

In den Applikationsschriften zum MSP430 ist mindestens ein Beispiel 
dafür zu finden.

von Msp 4. (msp430_crew)


Lesenswert?

Uhu Uhuhu wrote:
> Wenn er ganzzahlige Werte liefert - was die Regel ist -, dann solltest
> Du die nicht einfach nach Schema F in ein Fließkommaformat wandeln, um
> dann damit irgendwelche aus einem Lehrbuch oder Skript abgepfriemelten,
> aber nicht verstandenen Formeln zu füttern.

Der Sensor den ich benutze liefert ganzzahlige Werte, aber um den 
tatsächlichen Messwert zu erhalten muss man e^(-5,5*Sensorwertwert) 
rechnen!
Eine Tabelle zu erstellen die eine gute Genauigkeit erreicht wäre meines 
Erachtens sehr aufwendig.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Warum das denn?
Lass' es Dir doch vom PC ausrechnen.

von Msp 4. (msp430_crew)


Lesenswert?

Patrick Dohmen wrote:
> Warum das denn?
> Lass' es Dir doch vom PC ausrechnen.

Ich benutze keinen PC für die Datenverarbeitung!

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Das hat ja auch keiner Vorgeschlagen, Du sollst Dir eine LUT 
(LookUpTable) mit angenäherten Werten auf dem PC erstellen, diese in 
Form eines Arrays in Dein Programm einbauen und anhand der Sensordaten 
den passenden Arrayindex bestimmen.

von Msp 4. (msp430_crew)


Lesenswert?

Patrick Dohmen wrote:
> Das hat ja auch keiner Vorgeschlagen, Du sollst Dir eine LUT
> (LookUpTable) mit angenäherten Werten auf dem PC erstellen, diese in
> Form eines Arrays in Dein Programm einbauen und anhand der Sensordaten
> den passenden Arrayindex bestimmen.

Achso, ich dachte Du meintest im Bezug auf die Messwertberechnung!
Ich habe 4 Variablen in meiner Berechnung und ich denke die LUT würde zu 
groß werden!

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Hmpf!
Ja, ich bezog mich auf die Messwertberechnung. Du sagst doch selber, 
daß:

  Messwert = e^(-5,5*Sensorwertwert)

Da Dein Sensor einen begrenzten Wertebereich haben wird, kann 'Messwert' 
maximal 'e^(-5,5*Sensorwertwert_max)' und minimal 
'e^(-5,5*Sensorwertwert_min)' werden. Jetzt entscheidest Du Dich noch 
für eine Auflösung innerhalb der Tabelle und schreibst diese in ein 
Array.

von Uhu U. (uhu)


Lesenswert?

Da mußt Du dann eben etwas Hirnschmalz investieren, um einen Weg zu 
finden, wie man die Tabelle auf eine erträgliche Größe bekommt.

Tipp:
Du mußt nicht für jeden Wert, den der Sensor melden kann, einen 
Tabelleneintrag machen, sondern nur für Stützpunkte, zwischen denen Du 
dann linear interpolieren kannst, um einen im betreffenden Intervall 
liegenden Meßwert umzurechen.

Aus dem zulässigen Fehler der Annäherung kann man die benötigten 
Stützpunkte berechen.

Wenn Du das geschickt anstellst, brauchst Du noch nichtmal 
float-Arithmetik.

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.