mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 double in char um wandeln


Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich möchteeine double zahl auf einem lcd ausgeben. dazu wolte ich da
ganze in ein char um wandeln. aber da gehts los. weiß jemand, wie man
eine double in ein char bekommt?


Gruß

Rafael

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

Bewertung
0 lesenswert
nicht lesenswert
Gar nicht.
Weil ein einziger char nur ein einzelnes Zeichen aufnehmen
kann.
Aber du kannst ein char-Array benutzen um darin eine String-
Repräsentierung des double abzulegen.

  char Buffer[28];
  double d = 2.0;

  sprintf( Buffer, "%lf", d );

Je nach Compiler gibt es meist auch noch andere Funktionen
die meist dtoa() oder _dtoa() oder so ähnlich heissen.

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar, das mit den chars. hätte ich klarerausdrücken sollen. das man da
ein array benötigt war mir lar.

ich nutze iar, aber da habe ch leider noch keiner derartige fertige
funktion gefunden. atof und atoi gibts da, aber anscheinend nicht
umgekehrt.

in welcher form wird denn ein double gespeichert, vielleicht kann man
sich ja ne eigene funktion basteln.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@rafael

das double format ist ein floating-point format.
ne eigene funktion ist machbar (allerdings auch nur mit
float-funktionen, und die dauern naturgemäss recht lange)
sprintf ist (wie karl-heinz meinte) schon ne gute wahl. vor allem weil
man noch formatangaben (anzahl stellen/genauigkeit) machen kann

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi, das läuft auf IAR und MSP430F169 für LCD

#include <stdio.h>
void sendDouble(double a)
{
    int z,b;
    char txtDouble[33]="                                ";
  //sprintf (txtDouble,"%.2E",a);
  //sprintf (txtDouble,"%.3g %%",a);
  sprintf (txtDouble,"%.1f",a);
  for (z=0; z<=15;z++)
        {
           b=txtDouble[z];
           sendChar(b);
           if(b==0x00)z=15;
        }
}

void sendChar(char zeichen)
{
    P4OUT = zeichen;
    P5OUT=0x05;         // RS und E high, R/W low
    waitLCD(50);
    P5OUT&=~0x04;       // und jetzt auf low
}

viel Spass

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Marcel schon angedeutet hat, benötigst du die <stdio.h>. Da ist die
sprintf Funktion drin. Und die gibt es natürlich auch beim IAR
Compiler. Muss man halt nur einbinden.

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die frage ist nur wieviele stellen hinter dem komma du brauchst.
zunächst kannst du durch einen cast die stellen vor dem komma in eine
variable stelle

lPostDigits = (long)dDouble;

diese auf dem display darzustellen sollte kein problem sein.

nun extrahierst du die stellen hinter dem komma

dPastDigits = dDouble - (double)lPostDigits;

da du dir ja daüber bewust bist, wieviele stellen hinter dem komma
angezeigt werden sollen kanst du nun entsprechend multiplizieren

for ( i = 1; i < iNumDigits; i++)
  pot = pot * 10;

lPastDigits = (long)(dPastDigits * pot);

nu hast du wieder einen integer der relativ einfach darzustellen ist.

gruß
Tenner

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe mal die version von marcel versucht. leider stoße ich da
anscheinend an die grenze von meinem kostenlosen compiler. ich erhalte
immer folgende fehlermeldung, wenn ich sprintf verwende.

Fatal Error[e89]: Too much object code produced (more than 0x1000
bytes) for this package

so wie es scheint liegt das an der speicherbegrenzung des compilers
oder so.

mal sehen.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube in einer Version von IAR war diese Fehlermeldung ein Bug.
Welche Version benutzt du denn?
Wie groß ist denn der Code den du generierst (kann im Message Fenster
angezeigt werden)?

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lib ist halt zu groß für den kostenlosen Kompiler. Die Meldung
stimmt schon so. Der kann nur 4096 Byte Programmcode erzeugen.
Nimmste halt den GCC. In Verbindung mit Eclipse fast genauso
komfortabel wie IAR.

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann man sich denn die größe des erzeugten codes anzeigen lassen.

mit dem GCC hatten wir probleme. der erkennt die treiber für unseren
Jtag-usb adapter nicht. nix zu machen irgendwie.

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Größe zeigt er leider nur an, wenn es durch läuft. Wenn´s zu groß
ist, kommt vorher schon der Abbruch, und es wird nicht weiter
kompiliert.

Was für einen Debugger habt ihr denn? Also der USBFET von TI klappt
wunderbar.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal sprintf wieder raus und dann noch mal durchlaufen lassen und
Code größe anzeigen lassen (Tool->Options->Messages->Show.. ->
"All")(IAR 3.20).
Wenn er dann schon nahe bei 4k ist, kann es wirklich an der größe
liegen.

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

wenn ich das sprintf raus nehme und das ganze durchlaufen lasse,
erhalte ich folgendes.

 1 046 bytes of CODE  memory
 88 bytes of DATA  memory (+ 22 absolute )
 74 bytes of CONST memory


nimmt denn das sprintf so viel speicher in anspruch?

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wird leider ne ziemlich große lib dazu gelinkt. Beim GCC sind das
auch einige k gleich.

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muss ich dann doch wohl mal auf GCC umsteigen, obwohl ich den IAR
klasse finde.

Weiß jemand zufällig, was so eine Lizenz von IAr kostet oder ob es da
vielleicht so etwas wie eine Studenten-Version von gibt.

Grüße
Rafael

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine volle IAR Lizenz kostet knapp 3000&#8364; netto. Laut TI-Homepage
gewährt IAR Hochschulen und Studenten 80% Rabatt.

Aber GCC kann ich mittlerweile empfehlen. Mit Eclipse macht das richtig
Spaß und man hat noch paar mehr Möglichkeiten (SVN zum Beispiel)

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.