www.mikrocontroller.net

Forum: Compiler & IDEs probleme mir float + display + Mega8


Autor: Sebastian Albrecht (xxlxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe an einem Mega8 ein Display und Ds1820 Sensoren.
Ich wollte eine Ausgabe auf dem Display mit einem Komma (Punkt) machen.
leider ohne Erfolg.
Also habe ich mir eine kleine Testroutine aufgebaut:

char *output;
output = "";
float fo3= 123.123;
sprintf (output,"%3.3f",(double)fo3);
lcd_string( output );

auf dem display erscheint ein "?" Fragezeichen.

wo liegt der fehler?

grüße Sebastian
(GCC Anfänger)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
add linker options -Wl,-u,vfprintf -lprintf_flt

Peter

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sebastian Albrecht (xxlxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo das geht auch mit den Linker Optionen nicht.

Ausgabe auf dem Dispaly "???"

die display ausgabe ist sonst ok. ich kann sonst alles ausgeben. Nur 
halt  sowas wie hier im Code nicht.

Code
#include "main.h"
#include "avr/io.h"
#include "util/delay.h"

int main( void )
{
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5


init_timer();
lcd_init();
sei();
char *output;
output = "";
float fl1= 123.123;
sprintf (output,"%3.3f",(double)fl1);
lcd_string( output );
lcd_string( " das geht " );
}

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

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal der komplette Prozess, wie man ihm im AVR-Studio macht. Ev. 
hast du irgendwo einen Fehler gemacht

http://www.mikrocontroller.net/articles/FAQ#Aktivi...

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Albrecht schrieb:
> Hallo das geht auch mit den Linker Optionen nicht.
>
> Ausgabe auf dem Dispaly "???"
>
> die display ausgabe ist sonst ok. ich kann sonst alles ausgeben.

Aber nur zufällig :-)


> char *output;
> output = "";
> float fl1= 123.123;
> sprintf (output,"%3.3f",(double)fl1);

Das kracht gewaltig.
Leider allerdings zu leise als das du es hören würdest.

Du hast keinen Speicher reserviert, in den du schreiben dürftest.

  char output[20];

Autor: Sebastian Albrecht (xxlxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also

"Aktivieren der Floating Point Version von sprintf beim WinAVR mit 
AVR-Studio" --> Erledigt hatte ich auch schon so.

dann den code geändert :
#include "main.h"
#include "avr/io.h"
#include "util/delay.h"

int main( void )
{
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5


  init_timer();
  lcd_init();
  sei();
  char output[20];
  float fl1= 123.123;
  sprintf (output,"%3.3f",(double)fl1);
  lcd_string( output );
  lcd_string( " das geht " );
}

aber immer noch "?"  liegts am ATMega8 ?

meine Uraufgabe ist ja eigentlich 377/16 zu rechnen. geht das auch 
anders ??? Mit Komaausgabe ?

grüße Sebastian

nachtrag EDIT : ich habe mal noch weniger code draus gemacht aber immer 
noch "?"
#include "main.h"
#include "avr/io.h"
#include "util/delay.h"

int main( void )
{
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5

  lcd_init();
  char output[20];
  sprintf (output,"%3.3f",(double)123.5);
  lcd_string( output );
  lcd_string( " das geht " );
}

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Albrecht schrieb:

> aber immer noch "?"  liegts am ATMega8 ?

Nein.
Es liegt an deiner Konfiguration.
In der ist die Unterstützung für floating Point bei printf nicht 
aktiviert.
Definitiv!

Autor: Michael M. (technikus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Albrecht schrieb:
> meine Uraufgabe ist ja eigentlich 377/16 zu rechnen. geht das auch
> anders ??? Mit Komaausgabe ?

sprintf mit floating point ist ein ziemlicher Speicherfresser auf dem 
AVR. Schau dir mal dtostrf an, das wandelt auch Fließkommazahlen in 
ASCII-Text und ist nicht so speicherintensiv. Trotzdem funktioniert 
sprintf natürlich, wenn man alles richtig macht.

#include "main.h"
#include "avr/io.h"
#include "util/delay.h"

Keine Ahnung, was in main.h drinsteht. Aber ich vermisse hier ein 
#include <stdio.h>, in dem sprintf definiert ist. Bekommst Du da keine 
Warnung vom Compiler? Außerdem schreibt man die Dateien im 
Standardincludeverzeichnis in spitze Klammern.

Servus
Michael

Autor: Sebastian Albrecht (xxlxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut das du so hartnäckig bist ( Karl heinz Buchegger)  ...
fehler gefunden und geändert. hatte die eintragung unter All Files und 
nicht unter Linker Optiones gemacht. DANKE !

<stdio.h> steht in der Main.h

ich habe dem code nur sehr gekürzt das programm ist viiiiiel länger. Der 
rest läuft gut aber die ausgabe klappt halt nicht.

so jetzt habe ich alles richtig denke ich und immer noch "?"
Build started 3.3.2010 at 15:16:32
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT lcd-routines.o -MF dep/lcd-routines.o.d  -c  ../lcd-routines.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Main.o -MF dep/Main.o.d  -c  ../Main.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 1WIRE.o -MF dep/1WIRE.o.d  -c  ../1WIRE.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT TIMEBASE.o -MF dep/TIMEBASE.o.d  -c  ../TIMEBASE.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT TEMPMEAS.o -MF dep/TEMPMEAS.o.d  -c  ../TEMPMEAS.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT DELAY.o -MF dep/DELAY.o.d  -c  ../DELAY.c
avr-gcc -mmcu=atmega8 -Wl,-u,vfprintf -Wl,-Map=LCD+DS1820.map lcd-routines.o Main.o 1WIRE.o TIMEBASE.o TEMPMEAS.o DELAY.o    -lc -lm -lobjc -lprintf_flt -lprintf_min -lscanf_flt -lscanf_min  -o LCD+DS1820.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  LCD+DS1820.elf LCD+DS1820.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex LCD+DS1820.elf LCD+DS1820.eep || exit 0
avr-objdump -h -S LCD+DS1820.elf > LCD+DS1820.lss

AVR Memory Usage
----------------
Device: atmega8

Program:    3836 bytes (46.8% Full)
(.text + .data + .bootloader)

Data:         84 bytes (8.2% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...


Autor: Sebastian Albrecht (xxlxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der TIP dtostrf war echt klasse, Funzt super !!!
es kann so einfach sein ...

grüße und Danke
Sebastian
#include "main.h"
#include "avr/io.h"
#include "util/delay.h"

int main( void )
{
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5

  lcd_init();
  char output[20];
  dtostrf ((double)123.4,3,2,output);
  lcd_string( output );
}

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.