mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik astudio mit winavr float a = ?


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Wenn ich ein Float mit 0 initialisiere, egal mit welcher Zahl und es 
dann via

  sprintf(s,"a:%f\r\n");
  uputs(s);

ausgebe, dann sehe ich nur a:?

Wo ist mein Fehler?

Wenn ich eine ausgelagerte Funktion (vom timerinterrupt ausgeführt) 
aufrufe, die Zugriff auf ein Float-array haben soll(via pointer 
übergeben) dann bekomme ich sogar einen Reset!

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

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> sprintf(s,"a:%f\r\n");

und wo gibst du überhaupt die Variable aus?

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die variable gebe ich über die uart aus

an uputs() sollte dies erkennbar sein. Tausend Dank für die Info, dass 
ich sprintf erst floatingpoint-fähig machen muss. kann ich also davon 
ausgehen, dass meine berechnungen mit den floats funktioniert haben, 
dass wirklich nur die ausgabe via sprintf fehlerhaft war?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem umfangreichen Quelltext, den du hier gezeigt hast, nach zu schließen
sind deine Berechnungen perfekt.

Den perfekt berechneten Wert musst du aber auch noch an sprintf() 
übergeben.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
float temp;


temp =   (float)(adc/1024*5);
sprintf(s,"temp: %f\r\n",temp);
uputs(s);

erzeugt mir eine ausgabe von 0.000000 anstatt einen Wert anzuzeigen, ja, 
adc wird korrekt mit dem Wert angezeigt, wenn ich ihn ausgebe

warum bek. ich nur den Wert 0.0000 ist doch flasch!

Autor: G ast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil adc den Wert 0 hat.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> temp =   (float)(adc/1024*5);

ich denke mal das cast ist falsch

test mal mit (float)adc/1024*5;

woher kommt das *5?

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10bit auflösung, 5VDC Betriebsspannung

dann kommt noch ein Fatkor (analoge Sensorspannung linear)

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

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> float temp;
>
>
> temp =   (float)(adc/1024*5);

http://www.mikrocontroller.net/articles/FAQ#Datent...


> warum bek. ich nur den Wert 0.0000 ist doch flasch!

Weil du das so programmiert hast :-)
Programmiere es richtig, dann kommt auch "das richtige" raus.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich kenne ich mich ja mit datentypen und deren umwandlung aus. 
Warum jedoch die Klammern einen fehler verursachen, ist mir nicht klar

wenn ich schreibe             a = 6/7/8/9;
ist das genau das gleiche wie a = (6/7/8/9);

also müsste:

a = (float) 7/2;
a = (float)(7/2);

auch das gleiche sein..... Was habe ich falsch programmiert?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche es doch bitte mit einem C-Buch.
Stw. Operatoren und Reihenfolge der Auswertung.

Und lesbare Sätze würden auch weniger nerven.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> also müsste:
>
> a = (float) 7/2;
> a = (float)(7/2);
>
> auch das gleiche sein

Programmiersprache != Mathematik. Da gelten teilweise andere Gesetze.
Hast du denn den von Karl Heinz angegebenen Artikel

  http://www.mikrocontroller.net/articles/FAQ#Datent...

schon  gelesen?

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

Bewertung
0 lesenswert
nicht lesenswert
Du willst in deinem Buch einmal das Kapitel über "Operator Precedence" 
(Reihung von Operatoren) durcharbeiten.

a = (float)(7/2);


dividiere 7 durch 2. Das ergibt 3.
Wandle das Ergebnis (3) um in einen float
Weise die float 3.0 an a zu


a = (float) 7/2;

Nimm den Integer 7
Wandle ihn in einen float.  Das ergibt 7.0f

Dann dividieren diese 7.0f durch 2.

Da 7.0f ein float ist, wird auch der Integer 2 zu einem float 2.0f 
umgewandelt.

Die Division, die zur Ausführung kommt, lautet also: 7.0f / 2.0f
Und das ergibt 3.5

Weise diese 3.5 an a zu.


Sieht so aus, als ob du mit Datentypen und deren Umwandlung und vor 
allen Dingen wie Operationen ausgewählt werden bzw. wie sie binden, doch 
nicht so vertraut bist, wie du denkst.


Das eigentlich schockierende an der Sache:
Dieser Sachverhalt (und noch viele andere triviale Dinge, die jeden Tag 
hier immer wieder gefragt werden) finden sich in jedem noch so grindigen 
C-Buch. Wenn man also ein C-Buch durchgearbeitet hätte, würde sich diese 
Fragestellung erst gar nicht stellen, weil das Grundlagen sind. Die 
Übungen im entsprechenden Kapitel einmal durchgearbeitet und man 
vergisst das nie wieder.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solange sich hier immer wieder ein Trottel findet, der jede
Kleinigkeit jedem zehnmal erklärt, ist das doch bequemer. :-(

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: KHB: bitte nicht persönlich nehmen, das steht jetzt eher zufällig 
unter einem Beitrag von dir.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gelesen habe ich den angegebenen link. dort steht nichts von 
klammern, die die zu castenen Daten umgeben.... Wie ich meine Sätze 
lesbarer gestalten kann, weiß ich nicht. Ich denke, dass man mich hier 
sehrwohl verstehen kann.


Karl heinz Buchegger schrieb:
> dividiere 7 durch 2. Das ergibt 3.

Ich dachte, dass im Code ein float value entsteht. Und, dass dieser 
ausschließlich zu einem int wird, wenn ich das Ergebnis dieser 
Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist 
mir ja bewusst.

aber float a = (2/7) dass dann a = 3 sein soll.....

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so würde ich einfach schreiben float a = 7/(float)2

dann erhalte ich meinem float-wert...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> aber float a = (2/7) dass dann a = 3 sein soll.....

C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> Ich dachte, dass im Code ein float value entsteht. Und, dass dieser
> ausschließlich zu einem int wird, wenn ich das Ergebnis dieser
> Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist
> mir ja bewusst.

das wäre ja schlimm, wenn jeden int berechnung intern als float laufen 
würde. Jeder Progamm würde exterm verlangsamt besonders bei CPU ohne 
float Unterstützung

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

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> Ja gelesen habe ich den angegebenen link.

> Karl heinz Buchegger schrieb:
>> dividiere 7 durch 2. Das ergibt 3.
>
> Ich dachte, dass im Code ein float value entsteht.

Ich dachte, du hast den Link gelesen?

Was ist denn 7 (vom Datentyp her)
Was ist denn 3 (vom Datentyp her)

Welche Art der Division kommt daher zum Zug?

(Geh nochmal zum Link und lies den nächsten Abschnitt auch noch mit)

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

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> so würde ich einfach schreiben float a = 7/(float)2
>
> dann erhalte ich meinem float-wert...

Ich würde ganz einfach schreiben

  float a = 7.0 / 2.0;

Wozu einen Integer erst umständlich auf einen float casten, wenn ich 
dieselbe Zahl auch gleich als Floating Point Zahl schreiben kann?

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.