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


von Sebastian A. (xxlxx)


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)

von Peter D. (peda)


Lesenswert?

add linker options -Wl,-u,vfprintf -lprintf_flt

Peter

von ... (Gast)


Lesenswert?


von Sebastian A. (xxlxx)


Angehängte Dateien:

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
1
#include "main.h"
2
#include "avr/io.h"
3
#include "util/delay.h"
4
5
int main( void )
6
{
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_RS        PD4
10
#define LCD_EN        PD5
11
12
13
init_timer();
14
lcd_init();
15
sei();
16
char *output;
17
output = "";
18
float fl1= 123.123;
19
sprintf (output,"%3.3f",(double)fl1);
20
lcd_string( output );
21
lcd_string( " das geht " );
22
}

von Karl H. (kbuchegg)


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#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

von Karl H. (kbuchegg)


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];

von Sebastian A. (xxlxx)


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 :
1
#include "main.h"
2
#include "avr/io.h"
3
#include "util/delay.h"
4
5
int main( void )
6
{
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_RS        PD4
10
#define LCD_EN        PD5
11
12
13
  init_timer();
14
  lcd_init();
15
  sei();
16
  char output[20];
17
  float fl1= 123.123;
18
  sprintf (output,"%3.3f",(double)fl1);
19
  lcd_string( output );
20
  lcd_string( " das geht " );
21
}

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 "?"
1
#include "main.h"
2
#include "avr/io.h"
3
#include "util/delay.h"
4
5
int main( void )
6
{
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_RS        PD4
10
#define LCD_EN        PD5
11
12
  lcd_init();
13
  char output[20];
14
  sprintf (output,"%3.3f",(double)123.5);
15
  lcd_string( output );
16
  lcd_string( " das geht " );
17
}

von Karl H. (kbuchegg)


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!

von Michael M. (technikus)


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

von Sebastian A. (xxlxx)


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 "?"
1
Build started 3.3.2010 at 15:16:32
2
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
3
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
4
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
5
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
6
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
7
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
8
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
9
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  LCD+DS1820.elf LCD+DS1820.hex
10
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
11
avr-objdump -h -S LCD+DS1820.elf > LCD+DS1820.lss
12
13
AVR Memory Usage
14
----------------
15
Device: atmega8
16
17
Program:    3836 bytes (46.8% Full)
18
(.text + .data + .bootloader)
19
20
Data:         84 bytes (8.2% Full)
21
(.data + .bss + .noinit)
22
23
24
Build succeeded with 0 Warnings...

von Sebastian A. (xxlxx)


Lesenswert?

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

grüße und Danke
Sebastian
1
#include "main.h"
2
#include "avr/io.h"
3
#include "util/delay.h"
4
5
int main( void )
6
{
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_RS        PD4
10
#define LCD_EN        PD5
11
12
  lcd_init();
13
  char output[20];
14
  dtostrf ((double)123.4,3,2,output);
15
  lcd_string( output );
16
}

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.