Hallo, ich will einen einen ATMega 2561 programmieren und habe folgende Frage: Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung einzusetzen? Oder muss man zuvor die Gleitkommazahl in einen ganzzahligen Integer verwandeln? #include <avr/interrupt.h> #include <avr/io.h> #include <stdbool.h> #include <util/delay.h> #include <math.h> int main (void) { volatile float Zahl = 1.2; while (1) { if (Zahl>=1.2) { p1_2++; } } return 0; } Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float Wert auszuführen, zickt mein AVR-Studio. Ebenso bei einer Typumwandlung á la " = (int)Zahl" Die "math.h" Bibliothek ist vorsichtshalber eingebunden..
:
Verschoben durch User
Kaih schrieb: > Hallo, > > ich will einen einen ATMega 2561 programmieren und habe folgende Frage: > Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung > einzusetzen? Natürlich. Einfach benutzen. > Oder muss man zuvor die Gleitkommazahl in einen > ganzzahligen Integer verwandeln? Nein > Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float > Wert auszuführen, zickt mein AVR-Studio. Was genau bedeutet "zickt mein AVR-Studio" > Die "math.h" Bibliothek ist vorsichtshalber eingebunden.. math.h ist ein Header File. Dessen Verwendung hat erst mal gar nichts damit zu tun, dass die Mathe-Bibliothek beim Linken mit eingelinkt wird. PS: Und was genau hat das ganze mit PC-Programmierung zu tun?
naja wird am PC programmiert. ne fehlermeldung poste ich jetzt aber nicht, sonst könnte ja noch wer draufkommen wo das Problem liegt!
(Nur damit da jetzt kein falschen Verdächtigungen aufkommen. Der letzte Kaih ist nicht der originale Kaih)
Ok, falscher Thread, sorry. Mein AVR Studio geht in den Disassembler rein wenn ich debugge. Zuvor sucht er noch 2 Ordner: siehe Anhang. Btw. dass ich p1.2 nicht deklariert habe ist nicht das problem ;-) (und natürlich schon geändert)
Hast Du die float-lib mit eingebunden? Ansonsten mal mit (Zahl-1.2)>=0 versuchen. Kann es sein, dass die While-Schleife nicht terminiert und ein Stack-Overflow auftritt (je nachdem wie Zahl manipululiert wird)?
Pete K. schrieb: > Kann es sein, dass die While-Schleife nicht terminiert und ein > Stack-Overflow auftritt (je nachdem wie Zahl manipululiert wird)? Eine Rekursion kann ich hier beim besten Willen nicht erkennen. Und natürlich terminiert die äußerste while-Scheife nicht, wie das so üblich ist bei uC Programmen...
Karl heinz Buchegger schrieb: >> ich will einen einen ATMega 2561 programmieren und habe folgende Frage: >> Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung >> einzusetzen? > > Natürlich. > Einfach benutzen. Wobei das Benutzen von Gleitkommazahlen im Falle des Gleichheitsoperators nicht danz unkritisch ist. Durch Rundungsfehler sind zwei Zahlen ungleich die mit dem gesunden Menschenverstand gleich sind. Insofern sollte man vor einem '=' Vergleich zweier Dezimalzahlen eine Rundung auf eine Schranke vornehmen ab der man die Zahlen logisch als übereinstimmend bewertet. Ansonsten kann man unliebsame Überraschungen erleben zumal durch das zur Rechnung benutzte duale Zahlensystem auch da Rundungsfehler auftreten wo man sie wegen unserer Fixierung auf das Dezimalsystem so gar nicht erwartet.
Auch ohne While-Schleife geht er in den Disassembler. #include <float.h> hat keinen Einfluss. Der Vorschlag (Zahl-1.2)>=0 will auch nicht :-/ Behandel ich die If-Bedingung mit ganzahligen Werten geht es..
Dein Problem hat erst mal nichts mit C an sich zu tun, sondern damit wie dein Compiler konfiguriert ist, mit welchen Einstellungen compiliert wird bzw. was alles zusammengelinkt wird. Um das Problem lösen zu können, muss man in den Project-Configurations suchen. Dort steckt die Lösung zu dem was du siehst und nicht im C-Source-Code.
Danke für den Tipp, er hat geholfen: Ich habe die "libc.a" unter Project -> Configuration Options -> Libraries hinzugefügt und es hat funktioniert. Es ist vielleicht eine dumme Frage, aber was ist das besondere an dieser Bibliothek?
> while (1) > { Das ist kein atomarer Zugriff, d.h. "Zahl" wird eventuell genau dann von Deinem Interrupthandler geändert, während der Vergleich noch nicht abgeschlossen ist. > if (Zahl>=1.2) > { > p1_2++; > } > } > Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float > Wert auszuführen, zickt mein AVR-Studio. ..der Code der im Posting fehlt. Ist "Zahl" nicht eher global deklariert?
Hmm Ich hätte jetzt eigentlich erwartet, dass die libm.a das Problem lösen wird. Denn die libc.a (die C-Runtime Library) wird normalerweise vom C-Linker sowieso immer mit dazugelinkt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.