Forum: Mikrocontroller und Digitale Elektronik log() avr Problem


von Freshman (Gast)


Angehängte Dateien:

Lesenswert?

Frohe Weihnachten!

Ich habe einen ATMEGA64 und versuche eine log10(rsq) Funktion zu 
implementieren. rsq ist dabei ein double.

Leider bekomme ich immer die selbe Fehlermeldung:

siehe Anhang

als Libraries habe ich folgendes:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#include    "math.h"
#include    "cerebotII.h"

warum geht das nicht??????


HILFE!!!!!!!!!

von Oliver (Gast)


Lesenswert?

Fehler in Zeile 42...

Code posten, makefile posten.

Oliver

von Freshman (Gast)


Angehängte Dateien:

Lesenswert?

Makefile

von Sven P. (Gast)


Lesenswert?


von Oliver (Gast)


Lesenswert?

mathelib fehlt.

-lm

Oliver

von Freshman (Gast)


Lesenswert?

Aber ich hab doch die math.h dabei.

von Sven P. (Gast)


Lesenswert?

Du willst aber auch den Objektcode hinter der <math.h> haben.

von Freshman (Gast)


Lesenswert?

JA schon, ich dachte das habe ich.

Was muß ich dazuschreiben?

von Freshman (Gast)


Lesenswert?

Ich hab mathelib.h dazugefügt und ebekomme immer noch den selben Fehler.

War das falsch?

von Karl H. (kbuchegg)


Lesenswert?

Freshman schrieb:
> Ich hab mathelib.h dazugefügt und ebekomme immer noch den selben Fehler.
>
> War das falsch?

Dein Problem ist nicht irgendein Header File beim Compilieren
Dein Problem ist beim Linken die Mathebibliothek.
in die Linkerflags im Makefile muss noch ein -lm mit rein (siehe weiter 
oben angegebenen Link. Dort in der ersten Antwort die letzte Zeile. 
Schau dir an, wo dort -lm auftaucht)

Sieh es so:
Der math.h ist sowas wie ein Inhaltsverzeichnis der Funktionen die 
vorhanden sind. Aber ein Inhaltsverzeichnis sind nicht die eigentlichen 
Funktionen. Genausowenig wie du ein Buch benutzen kannst, von dem du nur 
das Inhaltsverzeichnis hast. Erst in der Mathe-Bibliothek, welche 
dazugelinkt werden muss, sind dann die Funktionen tatsächlich 
implementiert.

von Freshman (Gast)


Lesenswert?

Thank you!

I try it.

von Freshman (Gast)


Lesenswert?

Bin zu dumm dafür, ich kriegs nicht hin.

Eine Frage hätte ich noch, wenn ich das noch mit -lm verlinken muss, 
warum geht dann die SQRT() Funktion? Wenn ich math.h rausnehme geht die 
nicht mehr.

von Karl H. (kbuchegg)


Lesenswert?

Freshman schrieb:
> Bin zu dumm dafür, ich kriegs nicht hin.
>
> Eine Frage hätte ich noch, wenn ich das noch mit -lm verlinken muss,
> warum geht dann die SQRT() Funktion? Wenn ich math.h rausnehme geht die
> nicht mehr.

Was bedeutet in dem Zusammenhang 'geht'?

von Freshman (Gast)


Lesenswert?

Ich kann´s nicht mehr compilieren => ich bekomme einen Fehler für die 
SQRT Funktion.

von Karl H. (kbuchegg)


Lesenswert?

Freshman schrieb:
> Ich kann´s nicht mehr compilieren

Siehst du: Compilieren.

Wir reden hier aber gar nicht vom compilieren.
Wir reden vom Linken!

compilieren: Der Vorgang um aus einem *.c File ein File mit 
Maschinencode zu machen

linken: Mehrere Maschinencode Files, unter Umständen gemeinsam mit 
Bibliotheken, zum eigentlich ausführbaren Programm zusammenmontieren.


Und in deinem Makefile ist dieser Abschnitt
1
$(TARGET): $(OBJECTS)
2
   $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

dafür zuständig.
Und unter LIBS solltest du einfach nur die -lm eintragen. Wenn es noch 
keine Definition für LIBS gibt, dann musst du eben eine machen.
1
...
2
## Linker flags
3
LDFLAGS = $(COMMON)
4
LDFLAGS +=  -Wl,-Map=Random.map
5
6
## Additional libraries
7
LIBS = -lm
8
...

von Tim S. (maxxie)


Lesenswert?

Freshman schrieb:
> Ich kann´s nicht mehr compilieren => ich bekomme einen Fehler für die
> SQRT Funktion.

Versuch's mal mit der Schreibweise: sqrt
(Klein- und Großschreibung wird unterschieden)

von Feshman (Gast)


Lesenswert?

Danke für die ausführliche Erklärung. Wenn ich am Montag wieder in der 
Firma bin werde ich mich sofort über das Make File hermachen.

Frohe Weihnachten!!!

LG
Freshman

von Freshman (Gast)


Lesenswert?

Nein, auch wenn ich das Makefile verändere kann ich den log() nicht 
compilieren.

Wenn ich dem log eine bestimmte Zahl zuweise geht es.

tmp = 1;
tmp2 = log(tmp);

HILFE

von Klaus W. (mfgkw)


Lesenswert?

NÖ

Bei solchen Fehlerbeschreibungen wirst du nicht viel Hilfe bekommen.
Erstens ist das Forum nicht geeignet, jedem, der anfängt zu
programmieren, alle Grundlagen fünfmal zu erklären, die auch in
jedem Buch zu finden sind, und zweitens gehört zu einer Frage
automatisch auch, wie das nicht funktionierende Programm aussieht,
wie übersetzt wird und worin sich der Fehler äußert.

"Ich weiß nicht was kompilieren und linken ist, aber mein Programm
geht nicht" ist nicht sinnvoll, sondern Zeitverschwendung aller
Beteiligten.

von Freshman (Gast)


Lesenswert?

Schön, dass Du das so siehst.

Wenn es in einem Buch stehen würde, würde ich nicht danach fragen. Wenn 
ich eine Library einbinde von der ein Befehl (sqrt) funktiniert und der 
andere nicht (log) ist das für mich sehr eigenartig und sieht nicht nach 
einem einfachen Problem aus.

An das Forum wende ich mich nicht weil mir so langweilig ist oder weil 
ich Euch beschäftigen will sondern weil ich von Euch immer tolle Tips 
bekommen habe.

Ich bin mir sicher, dass es Bereiche gibt in denen Du dich nicht gut 
auskennst. Was würdest Du sagen, wenn Dir keiner hift sondern jeder sagt 
frag mich wenn du auf meinem Niveau bist. Nicht so toll oder?

Dennoch danke
Freshman

von Klaus W. (mfgkw)


Lesenswert?

Ich beschwere mich nicht, daß du mit dem log nicht klarkommst.
Aber wenn du nicht die Bedeutung von Headerdateien und
Objektbibliotheken kennst bzw. den Unterschied dazwischen,
hilft ein Buch, bevor man hier sich solche Grundlagen
erklären lassen muss.

Und zweitens sind deine Fehlerbeschreibungen einfach grottig!

> Nein, auch wenn ich das Makefile verändere kann ich den log() nicht
> compilieren.

Was hast du verändert? Wie sieht das makefile aus?
Was heißt "kann nicht kompilieren"?

Soll man das raten?
-> Zeitverschwendung!

Ich weiß z.B. anhand der ganzen bisherigen Beoträge nicht, ob
du den log10() selber neu schreiben willst (das wäre "implementieren"
nämlich) oder nur verwenden willst (was ich vermute).
Soll ich das raten?
-> Zeitverschwendung!

> Wenn ich dem log eine bestimmte Zahl zuweise geht es.
>
> tmp = 1;
> tmp2 = log(tmp);

Wo wird hier dem log eine Zahl zugewiesen?
Wenn es so geht, aber anders nicht: wie sieht das "anders" aus,
das nicht geht?
Wieder raten?
-> Zeitverschwendung!

Vorhin hieß es noch log10, jetzt log.
Was rufst du eigentlich auf?
Soll ich das auch raten?
-> Zeitverschwendung!

Es geht einfach nicht ohne den kompletten Quelltext, die
Information wie kompiliert wird (z.B. durch ein hier sichtbares
makefile) und einer vernünftigen Beschreibung, was dir nicht
gefällt bzw. was nicht geht.
Das könnte man eigentlich als bekannt voraussetzen, es wurde
dir hier auch schon gesagt und geholfen hat es nichts.
Also wird auch dieser Text wieder für die Katz sein.
-> Zeitverschwendung!

von Freshman (Gast)


Lesenswert?

Du weist schon, dass man ein Magengeschwür bekommen kann wenn man sich 
zu sehr aufregt.

SCHEIßEGAL ob ich log() oder log10() eingebe, es geht nicht. Aber kein 
Problem, halte Dich nicht damit auf.

Wobei, dein letzter Beitrag brachte mich sehr zum schmunzeln. Wie man 
sich so aufregen kann.

Weil Weihnachten ist :

Oh Du allwissender der Programierer, der Du noch nie Anfänger warst oder 
einen Fehler machen würdest. Ich bitte Dich vielmal um Verzeihung. Ich 
wollte nicht deine wertvolle Zeit verschwenden.

Ich wünsche Dir dennoch einen guten Rutsch in´s neue Jahr. Nimm das 
Leben nicht so schwer.

LG
Freshman

von Klaus W. (mfgkw)


Lesenswert?

Ich habe mich noch gar nicht aufgeregt, weiß daß ich alles
andere als allwissend bin.
Wenn ich mich aufrege, sieht das anders aus; und das wird in
einem Forum kaum vorkommen.

Ich wollte dir nur klarmachen, daß man so in einem Forum
keine Hilfe erwarten kann, nachdem die bisherigen Aufforderungen,
Quelltext und makefile zu zeigen nichts halfen (erst von Oliver,
dann kurz von mir und dann nochmal ausführlich von mir, Erfolg=0).
Sieh es als Hilfe zur Selbsthilfe, oder ignoriere es.

Nebenbei: ich habe in meinem Programm hier die Zeile:
1
  while( ( c = _getch())!='q' )
Du kannst mir bestimmt sagen, warum mein Garagentor klemmt?

von Freshman (Gast)


Lesenswert?

Hast Du es schon geölt? Kann auch an der Kälte liegen. Mein Garagentor 
will auch nicht wenn es kalt ist. Hast Du es aufgesperrt? ...

von Simon K. (simon) Benutzerseite


Lesenswert?

Freshman schrieb:
> Du weist schon, dass man ein Magengeschwür bekommen kann wenn man sich
> zu sehr aufregt.
>
> SCHEIßEGAL ob ich log() oder log10() eingebe, es geht nicht. Aber kein
> Problem, halte Dich nicht damit auf.

Haha!

[ ] Du hast Klaus Posting gelesen
[ ] Du hast Klaus Posting verstanden.

von Klaus W. (mfgkw)


Lesenswert?

Danke für den Tip.

Habe eben was dran gemacht, aber geht immer noch nicht :-)

von Freshman (Gast)


Lesenswert?

Keyboard nicht gefunden, bitte drücken sie ENTER

von Mork (Gast)


Lesenswert?

@Freshman
WAS GENAU GEHT NICHT??? Kommt eine Fehlermeldung vom Compiler? Wenn ja, 
WELCHE GENAU? Kommt eine Fehlermeldung vom Linker? Wenn ja, WELCHE 
GENAU? Oder klappt das Programm auf dem AVR selbst nicht? Wenn ja, WAS 
GENAU klappt nicht? wird ein falscher wrde berechnet? stürtz das 
Programm ab? ...?

Im ersten Postinig hast du es doch ansatzweise richtig gemacht und die 
Fehlermeldung angehängt. Das hättest du auch in späteren Postings machen 
können. Ein komplettes makefile wäre auch sinnvoll, weil man dort den 
genauen Aufruf des Kompiliers und Linkers rauslesen kann.

Machs Dir doch selbst nicht so schwer. Wir sind nicht die, das Problem 
mit dem log() haben, sondern Du. Mach Dir doch bitte wenigstens die 
Mühe, die paar Dateien anzuhängen.

von Karl H. (kbuchegg)


Lesenswert?

Freshman schrieb:

> Oh Du allwissender der Programierer, der Du noch nie Anfänger warst oder
> einen Fehler machen würdest.

Niemand hier ist allwissend.
Niemand hier ist zur Welt gekommen und hat das alles beherrscht.

Die meisten regulären Helfer hier waren zu einer Zeit Anfänger, als man 
von so etwas wie einem Internet oder einem weltweiten Forum noch nicht 
mal träumen konnte.

Was haben wir gemacht:
Wir haben uns auf den Hintern gesetzt und haben uns durchgebissen.
Wir haben gelernt. Wir haben Variationen ausprobiert. Wir haben 
Fehlermeldungen gelesen, Zig-mal, und uns gefragt was sie wohl bedeuten 
könnten. Wir haben aus den Fehlermeldungen Hypothesen abgeleitet und 
sukzessive eine nach der anderen ausgeschlossen bis die eine, die 
richtige, übrig blieb.

Das alles im stillen Kämmerlein oder mit einem Freund zusammen, der auch 
nicht mehr wusste als wir selber.

Unsere Informationsquellen waren Bibliotheken und Zeitschriften. Wir 
haben jedes Wort gelesen. Jedes Fitzelchen Papier. Mehrmals. Tauchte ein 
Problem auf und man hatte Glück, dann gab es im Fundus eine Zeitschrift 
mit einem Artikel, die ein ähnliches Problem beleuchtete. Daraus wurden 
dann Schlüsse gezogen. Oh, es war keineswegs so, dass von Anfang an 
alles Sinn machte. Vieles blieb unverständlich. Aber mit der Zeit fügte 
sich eines zum anderen und irgendwann passte wieder ein Puzzlestück zum 
Gesamtbild.

So haben wir gelernt. Über Jahre hinweg.

von Freshman (Gast)


Lesenswert?

Das makefile ist angehängt, die header auch. Was ich mit dem log mache 
steht auch dabei.

Kein Problem, ich hab das Programm einen Informatik Studenten gegeben. 
20EUR und er machts.

Vermutlich liegt der Fehler an meinem AVR Studio. Bei ihm geht alles.

Viel Spaß noch in Eurem stillen Kämmerchen.

LG
Freshman

von Klaus W. (mfgkw)


Lesenswert?

Bitteschön, und vielen Dank auch für das schöne makefile.
(In meiner Arroganz kann ich es nicht finden, aber egal.)
Hoffentlich hast du es dem Studenten wenigstens gegeben...

> Vermutlich liegt der Fehler an meinem AVR Studio. Bei ihm geht alles.

Vielleicht doch ein Fehler aus der Rubrik:
"User error - please replace user!"

von Freshman (Gast)


Lesenswert?

Ja, Arroganz kann den Blick trüben. Es ist im 3. Eintrag als Anhang.

Tut mir leid, dass Du das so siehst.

LG
Freshman

von J. K. (psoc)


Lesenswert?

Um das Ganze wieder gerade zu rücken.

Der Karl Heinz hat Dir einen Hinweis gegeben:

...
Dein Problem ist nicht irgendein Header File beim Compilieren
Dein Problem ist beim Linken die Mathebibliothek.
in die Linkerflags im Makefile muss noch ein -lm mit rein (siehe weiter
oben angegebenen Link. Dort in der ersten Antwort die letzte Zeile.
Schau dir an, wo dort -lm auftaucht)
...

Ich bin nicht von der AVR-Fraktion, aber durch nachdenken komme ich zu 
dem Schluss, dass diese Linker-Datei die einzelnen *.o (erzeugten 
Objektdateien) gerne einzeln aufführt. Da sehe ich dann in dem Beispiel 
bei der UART und Main jeweils ein "-lm". Auch sehe ich ein "-lm" am Ende 
der Zeile. Ich würde nun erst mal abklären, worum es eigentlich geht bei 
diesem "-lm"; was das macht. Probehalber kannst Du ja mal dieses "-lm" 
in gleicher Weise ausprobieren.

PSoC.

von Klaus W. (mfgkw)


Lesenswert?

Freshman schrieb:
> Ja, Arroganz kann den Blick trüben. Es ist im 3. Eintrag als Anhang.

So blind bin ich auch nicht.
Aber das war -wie du richtig bemerkst- im dritten Beitrag.

Später schreibst du, du hättest das makefile geändert.
Was hilft mir die alte Version?
Und was hilft mir das ohne die restlichen Quelltexte?
Oder ich ich bin wirklich zu doof, sie zu finden.

Ich kann es echt kaum glauben, daß jemand so beratungsresistent sein
kann.
Wie oft muß man dir noch sagen, daß dir niemand helfen kann, wenn du
nicht alle nötigen Informationen auf den Tisch legst?
Du lässt hier etliche Leute herumrätseln und verschwendest die
die Zeit von freiwilligen Helfern, ohne dein Problem vernünftig
zu beschreiben und ohne mal alle nötigen Dateien zu zeigen.
Und das, obwohl man dich hier schon mehrfach gebeten hat, mal
alles auf den Tisch zu legen, was relevant ist.

Mein Garagentor klemmt übrigens immer noch.
Es liegt daran, daß ein paar Kisten im Weg stehen; Danke für
die guten Tips.

>

>
> Tut mir leid, dass Du das so siehst.

Wie soll man es sonst sehen? Sollen wir bei dir vorbei fahren
und das vor Ort ansehen, damit du nichts posten musst?

>
> LG
> Freshman

Guten Rutsch!

(Mein Vorsatz fürs nächste Jahr:
keinem Gast mehr antworten, das hat sich nicht bewährt.)

von Freshman (Gast)


Lesenswert?

Du würdest zu mir kommen? cool.

von Simon K. (simon) Benutzerseite


Lesenswert?

Freshman schrieb:
> Du würdest zu mir kommen? cool.

Wenigstens postest du deine dämlichen Kommentare als Gast. Da hast du 
noch mal die Chance deinen Namen zu ändern und von Neuem zu starten, 
wenn du endlich eingesehen hast, dass es so nicht funktioniert.

Ansonsten tippe ich auch auf den Error mit der ID "Ten T" (ID10T).

von Freshman (Gast)


Lesenswert?

Interessant:
In der Medizin ist der Begriff „Idiot“ (bzw. Idiotie) als Bezeichnung 
für einen geistig behinderten Menschen mit einem Intelligenzquotienten 
unter 20 heute vollständig verschwunden.

Mit einem IQ unter 20 hätte ich Dein Zahlenspiel nicht verstenden. Warum 
sendest du etwas, was der Betreffende nicht lesen könnte. Denk darüber 
nach.

Das Problem wurde übrigens schon gelöst.

von Cyrex (Gast)


Lesenswert?

2 Dinge würde ich gerne dazu sagen.

1) Wenn Du nur angeben willst und das Problem doch nicht gelöst hast, 
hier die Lösung:

Du sagtest, Du verwendest AVR Studio,
Unter Project und dann Properties (oder Settings, ich erinnere mich 
nicht mehr so genau) kannst du unter Libraries die Libm.a dazugeben. 
Dann geht es. Ich hatte den selben Fehler.

2) Etwas nicht zu wissen ist kein Problem, etwas nicht zu können auch 
nicht, Du wirst es schon lernen aber überleg Dir was Du in ein Forum 
schreibst.

Greetings
Cyrex

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.