probleme mir float + display + Mega8

OP #1618529
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)
OP #1619532
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
}
Angehängte Dateien:
#1619549
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];
OP #1619565
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
}
#1619606
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
OP #1619628
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...
OP #1619645
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren