INT TO DOUBLE funktioniert nicht

OP #1287647
Lesenswert?
• ▲
▼
Hallo Leute

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

4

5
  solldrehzahl = 123;
6
  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 ...
1
  int16_t solldrehzahl;
2
  double drehz_takt;
3

4

5
  solldrehzahl = 123;
6
  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
#1287673
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
Gast #1287690
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.
1
Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den
2
Linkerschalter -lm angeben.
Wo muss ich dieses einschalten?
1
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.
1
drehz_takt = (double)(solldrehzahl) / 10.0;
funktioniert auch nicht.


mfg Edmu
#1287694
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?
#1287768
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.
#1287882
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?
#1287905
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
1
drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<
funktioniert vermutlich deshalb, weil der Wert schon zur Compilezeit 
berechnet wird.

Gruß
Roland
#1287926
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.