www.mikrocontroller.net

Forum: Compiler & IDEs sprintf(my_str,".%f",Temp);


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

gleich vornweg - ich bin newbee im Bereich ARM und arbeite mich gerade
ein mit Hilfe des Buch "C Programming for Embedded Microcontrollers".
Ich nutze das Olimex-DevBoard At91SAM7x256 mit Eclipse und
Yagarto-Toolchain.

Er kompiliert zwar alles aber mein System gibt nichts aus und bleibt 
beim sprintf bzw DBGUTxMSG hängen
    float Rtemp, Temp;
    INIT_ADC();
    ADC5=0;
    for(i=0;i<128;i++)
    {
      ADC_CR = 0x00000002;        //Starten der Wandlung
      while(!(ADC_SR & 0x00000020));
      ADC5 += ADC_CDR5;
    }
    ADC5 /= 128;
    Rtemp = ( (1024-ADC5) * 1800 ) /ADC5;

    Temp = log(Rtemp/2595.2) / (-0.0431);

    sprintf(my_str,"Aktuelle Temp = %f", Temp);
    DBGUTxMsg(my_str);

Wenn ich den sprintf durch
sprintf(my_str,"Aktuelle Temp = 0,00");
ersetze, erhalte ich diesen String zurück.

Gruß Daniel

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
my_str ist wie deklariert?
Mathelibrary ist dazugelinkt?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
#inlude <math.h>
...
//globale Variablen
char my_str[40];
...


und wenn ich den sprintf durch folgendes ersetze
    i=13;              //unsigned int
    sprintf(my_str,"\r\n1: %u", i);

bleibt mein System nicht hängen.

sprintf hat ein Problem mit %f

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bleibt hängen
    Temp = 45;                      //float
    sprintf(my_str,"Aktuelle Temp = %f", Temp);
    DBGUTxMsg(my_str);


und das gibt "Mist" aus
    Temp = 45;                      //float
    sprintf(my_str,"Aktuelle Temp = %f", 10);
    DBGUTxMsg(my_str);
Ausgabe:
Aktuelle Temp = 189AA@=<><.@@A8=0                                          

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"%f" ist der Platzhalter für double.

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sprintf hat ein Problem mit %f
Die Ganzzahlversion von sprintf vielleicht. Die Fliesskommazahlversion 
von sprintf bestimmt nicht.

>> Mathelibrary ist dazugelinkt?

Die Fliesskommaversion von sprintf steckt in der Mathelibrary...

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mathelibrary ist dazugelinkt?
-lm dem Linker gesagt oder nur Header eingebuden?

>      ADC_CR = 0x00000002;        //Starten der Wandlung
>      while(!(ADC_SR & 0x00000020));
Warum denn so umständlich? 0x2 und 0x20 tun das selbe ;)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mathelibrary ist dazugelinkt?
steht im makefile
LDFLAGS_R+=-lm

und in der Makeausgabe:
make all 
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 Code/main.c -o main.o
arm-elf-gcc startup.o main.o dbgu.o syscalls.o -nostartfiles -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o Tempsens2.elf
arm-elf-objcopy --strip-debug --strip-unneeded Tempsens2.elf -O binary Tempsens2.bin

Bei
float Temp = 10.4;
zeigt er den Wert nicht korrekt an und bei
double Temp = 10.4;

bleibt mein µC an der Augabe hängen!!!

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    float Temp;
    double Rtemp;
    Temp = 10.4;
    sprintf(my_str,"\n\rTemp(float) = %f", Temp);
    DBGUTxMsg(my_str);
    Rtemp = 10.4;
    sprintf(my_str,"\n\rTemp(double) = %f", Rtemp);
    DBGUTxMsg(my_str);

Ergebnis
Temp(float) = -0.000ñ',                                                         
Temp(double) = -A;C>ABC<@@><C;BB@@;AB=?A@DB?D@AB<?BDC@@ACBD?BCA;>>BA=<=D=>B.>>>>>? 

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Temp(float) = -0.000ñ',
> Temp(double) = -A;C>ABC<@@><C;BB@@;AB=?A@DB?D

Sieht nach einem Stackoverflow aus. sprintf benötigt VIEL Stack!

Wieviel gibst du deinem Programm? Typischerweise wird das in dem 
Startfile definiert. Das heisst je nach Toolchain anders z.B. startup.s 
oder boot.s. Bei deiner Toolchain heisst es wohl Startup.S. Die 
entscheidende Konstante dürfte USR_Stack_Size sein.

Ggf kannst du den Stack während der Laufzeit überwachen:
http://www.embeddedrelated.com/groups/AT91SAM/show/1899.php

> arm-elf-gcc startup.o main.o dbgu.o syscalls.o -nostartfiles
                                                 ^^^^^^^^^^^^^
> -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o Tempsens2.elf

Und: Schau dir mal das Posting von Freddie Chopin an
http://www.codesourcery.com/archives/arm-gnu/msg03119.html

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.