Forum: Compiler & IDEs ATmega16, WinAVR und float


von Thomas M (Gast)


Lesenswert?

Hi,

ich habe zum Testen des USART's von meinem Mega16 ein kleines
Programmchen geschrieben was auch funktioniert. Meine Frage ist ob
WinAVR, ich kann mir das eigentlich nicht vorstellen oder der Mega16,
den float Datentyp nicht unterstützt?

for(;;)
 {
  PORTA^=0xFF; //alles auf 1
  //value = 2.123 * i;
  value = 10 * i;
  i++;
  delay_ms(2000);
  sprintf(buffer," Der Wert ist %i ",value);
  //sprintf(buffer,"## Der Wert ist %2.2f",value);
  len = strlen(buffer);
  uart_send(buffer, len); //sende chararray mit x zeichen

 }

Der Programmauschnitt funktioniert mit den int - Werten aber nicht den

auskommentierten float Varablen. Ich bekomme keine Fehlermeldung beim
Compilieren und die Ausgabe funktioniert soweit aber an der Stelle wo
die Zahl ausgegeben werden sollte steht nur Misst. Mache ich etwas
falsch?

Danke!!!

von mthomas (Gast)


Lesenswert?

Floating point printf libs einbinden, vgl. Kommentare im WinAVR
Beispiel-makefile (PRINTF_LIB...). (die Foren-Suche haette geholfen).

von Thomas M (Gast)


Lesenswert?

Hi,

das ist meine Fehlermeldung des Compilers nach dem ich das Makefile
geändert habe:

avr-gcc -mmcu=atmega16        -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=test.o  -std=gnu99 test.o   --output
test.elf   RINTF_LIB =   -lm
avr-gcc: RINTF_LIB: No such file or directory

So habe ich das eingebunden, ich weiss sonst nicht wie ich das machen
soll:

# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $PRINTF_LIB = $(PRINTF_LIB_FLOAT)
$(SCANF_LIB)

Danke!!!
$(MATH_LIB)

von Chris (Gast)


Lesenswert?

Warum benutzt du nicht das Programm mfile, das bei WinAVR dabei ist?

Du scheinst nämlich das Makefile editieren zu wollen, ohne die
make-Anleitung jemals gesehen zu haben
(http://www.gnu.org/software/make/manual/html_chapter/make_toc.html).
Falls du nicht vorhast, sie zu wenigstens zu überfliegen, bist du mit
einem Programm wie mfile besser bedient.

> LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $PRINTF_LIB = $(PRINTF_LIB_FLOAT)
Das ist sinnlos. Zwei Zuweisungen in einer Zeile, das funktioniert
sicher nicht.
Lass die LDFLAGS, wie sie sind, und veränder nur die Variable
$PRINTF_LIB. Dann werden die Linker-Flags automatisch richtig befüllt.


btw:
> PORTA^=0xFF; //alles auf 1
Diese Zeile setzt bei PORTA nicht alles auf 1 (falls PORTA vorher
nicht 0 war). Richtig wäre eine simple Zuweisung:
PORTA = 0xFF; // alles auf 1

Dein Code entspricht:
PORTA = PORTA ^ 0xFF;
^ ist in C der Operator für bitweises XOR.

von Thomas M (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

irgendwie kriege ich das nicht hin mit dem Makefile. Bei dem Programm
Mfile finde ich keine Option in der ich etwas mit Floating - Point
einbenden kann. Wenn mir jemand helfen könnte währe das wirklich sehr
nett.

Danke!

von Malte (Gast)


Lesenswert?

Irgendwo gibt es dort eine Zeile mit "MATH_LIB = "
diese muss auf "MATH_LIB = -lm" gesetzt werden.

von Thomas M (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

mit diesem Makefile, das ich mit Mfile, erzeugt habe funktioniert meine
Ausgabe jetzt.

Vielen Dank!

von NEELAMEGAM.P (Gast)


Lesenswert?

Hi,

ich habe zum Testen des USART's von meinem Mega16 ein kleines
Programmchen geschrieben was auch funktioniert. Meine Frage ist ob
WinAVR, ich kann mir das eigentlich nicht vorstellen oder der Mega16,
den float Datentyp nicht unterstützt?

for(;;)
 {
  PORTA^=0xFF; //alles auf 1
  //value = 2.123 * i;
  value = 10 * i;
  i++;
  delay_ms(2000);
  sprintf(buffer," Der Wert ist %i ",value);
  //sprintf(buffer,"## Der Wert ist %2.2f",value);
  len = strlen(buffer);
  uart_send(buffer, len); //sende chararray mit x zeichen

 }

Der Programmauschnitt funktioniert mit den int - Werten aber nicht den

auskommentierten float Varablen. Ich bekomme keine Fehlermeldung beim
Compilieren und die Ausgabe funktioniert soweit aber an der Stelle wo
die Zahl ausgegeben werden sollte steht nur Misst. Mache ich etwas
falsch?

Danke!!!

Re: ATmega16, WinAVR und float  Beitrag melden
Autor: mthomas
Datum: 04.11.2004 20:05

------------------------------------------------------------------------ 
--------

Floating point printf libs einbinden, vgl. Kommentare im WinAVR
Beispiel-makefile (PRINTF_LIB...). (die Foren-Suche haette geholfen).

Re: ATmega16, WinAVR und float  Beitrag melden
Autor: Thomas M - Athomit-online.de
Datum: 04.11.2004 20:46

------------------------------------------------------------------------ 
--------

Hi,

das ist meine Fehlermeldung des Compilers nach dem ich das Makefile
geändert habe:

avr-gcc -mmcu=atmega16        -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=test.o  -std=gnu99 test.o   --output
test.elf   RINTF_LIB =   -lm
avr-gcc: RINTF_LIB: No such file or directory

So habe ich das eingebunden, ich weiss sonst nicht wie ich das machen
soll:

# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $PRINTF_LIB = $(PRINTF_LIB_FLOAT)
$(SCANF_LIB)

Danke!!!
$(MATH_LIB)

Re: ATmega16, WinAVR und float  Beitrag melden
Autor: Chris
Datum: 04.11.2004 21:27

------------------------------------------------------------------------ 
--------

Warum benutzt du nicht das Programm mfile, das bei WinAVR dabei ist?

Du scheinst nämlich das Makefile editieren zu wollen, ohne die
make-Anleitung jemals gesehen zu haben
(http://www.gnu.org/software/make/manual/html_chapter/make_toc.html).
Falls du nicht vorhast, sie zu wenigstens zu überfliegen, bist du mit
einem Programm wie mfile besser bedient.

> LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $PRINTF_LIB = $(PRINTF_LIB_FLOAT)
Das ist sinnlos. Zwei Zuweisungen in einer Zeile, das funktioniert
sicher nicht.
Lass die LDFLAGS, wie sie sind, und veränder nur die Variable
$PRINTF_LIB. Dann werden die Linker-Flags automatisch richtig befüllt.


btw:
> PORTA^=0xFF; //alles auf 1
Diese Zeile setzt bei PORTA nicht alles auf 1 (falls PORTA vorher
nicht 0 war). Richtig wäre eine simple Zuweisung:
PORTA = 0xFF; // alles auf 1

Dein Code entspricht:
PORTA = PORTA ^ 0xFF;
^ ist in C der Operator für bitweises XOR.

Re: ATmega16, WinAVR und float  Beitrag melden
Autor: Thomas M - Athomit-online.de
Datum: 05.11.2004 22:07
Dateianhang: Makefile (9.7kB, 23 Downloads)

------------------------------------------------------------------------ 
--------

Hi,

irgendwie kriege ich das nicht hin mit dem Makefile. Bei dem Programm
Mfile finde ich keine Option in der ich etwas mit Floating - Point
einbenden kann. Wenn mir jemand helfen könnte währe das wirklich sehr
nett.

Danke!

Re: ATmega16, WinAVR und float  Beitrag melden
Autor: Malte - m.marwedelonlinehome.de
Datum: 06.11.2004 12:02

von Fritz G. (fritzg)


Lesenswert?

# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

PRINTF_LIB = $(PRINTF_LIB_FLOAT)

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.