mikrocontroller.net

Forum: Compiler & IDEs INT TO DOUBLE funktioniert nicht


Autor: Ed M. (edmu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

ich habe ein Problem mit der Umsetzung von Integer in Double.
Hier mein Code:
  int16_t solldrehzahl;
  double drehz_takt;


  solldrehzahl = 123;
  drehz_takt = solldrehzahl / 10.0;


Ich benutze AVR-Studio 4.12 und einen ATMega 162.
Der Fehler macht sich bemerkbar, dass die LED's am Controller nicht 
richtig
blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem 
funktioniert meine UART nicht mehr.

Ändere ich den Code in ...
  int16_t solldrehzahl;
  double drehz_takt;


  solldrehzahl = 123;
  drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<


... funtioniert alles wieder einwandfrei.

Wo ist das Problem bei der Umsetzung. Ich habe schon viele Foren 
durchgewühlt und bei Google geschnüffelt, habe dementsprechend auch was 
am Code verändert, aber ohne erfolg.
Zum Rechnen brauche ich aber Komma-Zahlen.

Danke

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Zum Rechnen brauche ich aber Komma-Zahlen.

Das bezweilfe ich.
Guck mal nach Festkommaarithmetik

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst die solldrehzahl explizit nach double casten
 drehz_takt = (double)(solldrehzahl) / 10.0;
... aber trotzdem würd ich nach Möglichkeit nicht mit Doubles (auch 
wenns bequem ist) rechnen sondern wie schon gesagt, mit 
Festkommaarithmetik

Gruß
Roland

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ed M. schrieb:
> blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem
> funktioniert meine UART nicht mehr.

Dann hast Du wohl zuviel SRAM verbraucht (Strings im SRAM?).

Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den 
Linkerschalter -lm angeben.

Außerdem, double kann der AVR-GCC nicht, er macht float daraus.


Peter

Autor: edmu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Antworten

Mein SRAM ist bei ca. 75%, zumindest wird das beim Übertragen mit 
PonyProg angezeigt.
Strings benötige ich nicht.
Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den
Linkerschalter -lm angeben.
Wo muss ich dieses einschalten?
Außerdem, double kann der AVR-GCC nicht, er macht float daraus.

Ich habe es auch schon mit FLOAT gemacht, hatte aber auch keinen erfolg.
drehz_takt = (double)(solldrehzahl) / 10.0;
funktioniert auch nicht.


mfg Edmu

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du musst die solldrehzahl explizit nach double casten
> drehz_takt = (double)(solldrehzahl) / 10.0;

Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste 
sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder 
entscheidet der sich bei C für den Typ des linken Operators?

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

Bewertung
0 lesenswert
nicht lesenswert
Kai Giebeler schrieb:
>>Du musst die solldrehzahl explizit nach double casten
>> drehz_takt = (double)(solldrehzahl) / 10.0;
>
> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
> entscheidet der sich bei C für den Typ des linken Operators?

Nein.
Der 'Tip' war einfach nur Quatsch.

Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder 
aber der TO hat einen anderen Bug im Programm, bei dem er sich den 
Speicher so zerschiesst, das sich das beschriebene Problem zeigt.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder
> aber der TO hat einen anderen Bug im Programm, bei dem er sich den
> Speicher so zerschiesst, das sich das beschriebene Problem zeigt.

Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edmu schrieb:

> Mein SRAM ist bei ca. 75%, zumindest wird das beim Übertragen mit
> PonyProg angezeigt.

Das glaube ich nicht, denn dazu müsste Ponyprog das Programm 
analysieren, was es nicht kann. Du meinst vermutlich den Flash.

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

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:

> Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?

Thread Opener

In deutschen Foren ist auch OP gebräuchlich: Originaler Poster

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Kai Giebeler schrieb:
>>>Du musst die solldrehzahl explizit nach double casten
>>> drehz_takt = (double)(solldrehzahl) / 10.0;
>>
>> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
>> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
>> entscheidet der sich bei C für den Typ des linken Operators?
>
> Nein.
> Der 'Tip' war einfach nur Quatsch.

Stimmt natürlich. 10.0 ist ja schon ein double (bzw. Float)
Was anderes wäre es, wenn man 2 Integer-Variablen dividiert. Hier ist 
der Cast nach double erforderlich (falls man nicht auf 
Festkommaarithmetik zurückgreift)

Also ich tipp auch darauf (nach nochmaligen Lesen des OP), dass die 
Floatlib den Speicher zumüllt. Ein
drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<
funktioniert vermutlich deshalb, weil der Wert schon zur Compilezeit 
berechnet wird.

Gruß
Roland

Autor: edmu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe mich jetzt doch dazu entschlossen, die festkommaarithmetik zu 
nehmen.

trotzdem vielen dank für eure hilfe

edmu

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Mark Brandis schrieb:
>
>> Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?
>
> Thread Opener
>
> In deutschen Foren ist auch OP gebräuchlich: Originaler Poster

Hm, www.acronymfinder.com meint dazu:

OP  Original Poster (internet newsgroups and message boards)

Scheint also nicht auf deutsche Foren beschränkt zu sein :-)

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.