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)
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 | }
|
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
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];
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 | }
|
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!
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
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... |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.