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


von Rafael (Gast)


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

von Karl H. (kbuchegg)


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.

von Rafael (Gast)


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.

von TheMason (Gast)


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

von Marcel (Gast)


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

von Jörg S. (Gast)


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.

von Tenner (Gast)


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

von Rafael (Gast)


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.

von Jörg S. (Gast)


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)?

von SupaChris (Gast)


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.

von Rafael (Gast)


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.

von SupaChris (Gast)


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.

von Jörg S. (Gast)


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.

von Rafael (Gast)


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?

von SupaChris (Gast)


Lesenswert?

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

von Rafael (Gast)


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

von SupaChris (Gast)


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)

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
Noch kein Account? Hier anmelden.