PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler in WinAVR - Makefile?



Florian
11.03.2006, 17:14
Guten Abend allerseits!
Nun ja, ich bin gestern mit Hilfe des Asuros von Assembler auf C umgestiegen! ;o) *ASM-Fans verzeiht mir meinen Seitensprung*
Nun möchte ich nicht nur den Mega8 des Asuros programmieren, sondern auch meine eigenen Platinen, um den richtigen Einsatz zu testen.
Ich nehme an, dass ich die sog. Makefile des Asuros nicht weiter verwenden kann, da ich ja nicht nur den M8 und nicht z.B. den M16 programmieren könnte.
Ich arbeitete dann mit dem Einstiegs-Tutorial von http://www.kreatives-chaos.com/index.php?seite=avrgcc_pn und machte mir mit Mfile eine eigene Makefile für den ATMega8.
Ich machte mir einen neuen Ordner namens Test auf dem Desktop und schob die Makefile dort hinein.
Danach kopierte ich spasseshalber den Code von http://www.kreatives-chaos.com/index.php?seite=avr_b in das "Programmers Notepad" und speicherte die Datei unter test.c in dem Ordner ab.
Als ich dann das Programm compilierte ("[WinAVR] Make All") kam folgende Meldung:

> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.5
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `main.o', needed by `main.elf'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00

Könnt ihr vielleicht einem kleinen, dummen Assembler-Programmierer, der von WinAVR keine Ahnung hat, helfen!? *lol*

Pascal
11.03.2006, 17:19
Im makefile legt man ja auch den Namen der c-Dateien fest. Wenn deine c-DAtei test.c heißt, musst du das auch ins makefile schreiben. In diesem Fall war main.c eingestellt. Da du WinAVR verwendest, kannst du auch das Programm mfile verwenden, um deine makefiles zu erzeugen. Da kann man ganz gut die verschiedenen Einstellungen ändern.

Florian
11.03.2006, 17:32
Hallo Pascal!
Ich benutze bereits das Mfile-Programm! :o)
Jetzt scheint es zu funktionieren, Dankeschön!

Mich wundert nur eins:

> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.5
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o main.o
main.c:50:2: warning: no newline at end of file
main.c: In function `main':
main.c:10: warning: 'i' might be used uninitialized in this function

Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm

Creating load file for Flash: main.hex
avr-objcopy -O ihex -R .eeprom main.elf main.hex

Creating load file for EEPROM: main.eep
avr-objcopy -j .eeprom --set-section-flags .eeprom=alloc,load \
--change-section-lma .eeprom=0 -O ihex main.elf main.eep

Creating Extended Listing: main.lss
avr-objdump -h -S main.elf > main.lss

Creating Symbol Table: main.sym
avr-nm -n main.elf > main.sym

Size after:
AVR Memory Usage
----------------
Device: atmega8

Program: 144 bytes (1.8% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:01

Warum warnt mich der Compiler vor den rot markierten Dingen?
Vor allem der zweite Fehler, das soll das?
i ist doch vernünftig definiert worden!

Danke nochmal für die Hilfe! :o)

Viele Grüße
Florian

izaseba
11.03.2006, 17:37
Florian,
die erste Warnung ist wohl klar, oder ?
Mach mal Newline am ende und gut ist.
und für die zweite,postest Du am besten Dein Programm.

Gruß Sebastian

Florian
11.03.2006, 17:46
Hallo Sebastian!

die erste Warnung ist wohl klar, oder ?Warum braucht der Compiler denn eine Leerzeile? ;o)
Nagut, das ist jetzt geklärt!


und für die zweite,postest Du am besten Dein Programm.Das ist von http://www.kreatives-chaos.com/index.php?seite=avr_b .
Möchte der Compiler, dass ich dem Markierten (>>> unsigned char i; <<<) erst einen Wert zuweise, oder einfach nur, dass ich es hinter das Init(); stelle?


#include <avr/io.h>

#define SYSCLK 7372800

void init(void);
void delay_ms(unsigned int ms);

int main(void)
{
>>> unsigned char i; <<<

init();

// Endlosschleife
while (1)

{
PORTB = i;
i++;

delay_ms(1000);
}

return 0;
}

// Initialisierung
void init(void)
{
DDRB = 0xff; // PortB als Ausgang deklarieren
PORTB = 0x00; // Ports auf LOW schalten
}

// Delay Routine
void delay_ms(unsigned int ms)
{
unsigned int zaehler;

while (ms)
{
zaehler = SYSCLK / 5000;

while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}

tobimc
11.03.2006, 17:52
Hi Flori!

Da hast dir ja einen peniblen Compiler gefangen...

Die erste Warnung kannst du getrost übergehen, das ist nur Formsache.
(Diene Programme funzen auch ohne...)

Anscheinen will dein Compiler die Variable initialisiert haben. Das geht so:

unsigned char i = 0; oder unsigned char i = ""; kommt drauf an, ob der Compiler das mag oder nicht.

VLG Tobi

Florian
11.03.2006, 17:53
Hi Tobi!
Jetzt funktionierts! ;o)
Mal sehn, was ich als erstes programmiere ...

izaseba
11.03.2006, 17:54
Ist doch klar, du deklarierst i, i hat aber hier noch keinen Wert, ist nur deklariert, und ein paar Zeilen tiefer setzt Du PORTB auf "i" , klingelt's?
entweder weist Du i direkt einen Wert zu :
unsigned char i= 0;

später irgendwo im Programm
i= 0;

Gruß Sebastian

P.S. zu lange getippelt.....

Florian
11.03.2006, 17:56
Ok, Danke ... ;o)

super_castle
11.03.2006, 18:11
...Da hast dir ja einen peniblen Compiler gefangen...

das ist winavr-c.
die warnungen sind korrekt. wenn man genau liest, erkennt man das es warnungen sind , die den programmablauf zur hexdatei nicht unterbrechen und auch die hexdatei korrekt erstellen.
die warnungen sind gegen die vergesslichkeit der programmierer gemacht worden.
wenn man c proggen tut, darf man nicht mehr schludern wie in basic. hier wird eine korrekte, nicht eine pennible programmierweise verlangt, was auch sicherlich dazu beiträgt fehler besser zu lokalisieren und einen einwandfreine ablauf im avr-studio zu gewährleisten. winavr-c und avrstudio gehören zusammen wie mutter und kind.
die basicprogger tun sich sehr schwer mit c, weil jede kleine struktur ausgetüftelt werden muss. wer c kennt, weiss, das es ungefähr nur 30 grundbegriffe gibt und das andere sind eigentlich nur noch daraus erstellte routinen.

Lunarman
11.03.2006, 18:20
Hmm... wo er Recht hat hat er Recht. In Basom kann man viele Sachen auf vielen unterschiedlichen Wegen lösen - in C geht meistens nur eine Möglichkeit.

P.S.: man beachte das viele und meistens!

izaseba
11.03.2006, 18:34
In Basom kann man viele Sachen auf vielen unterschiedlichen Wegen lösen - in C geht meistens nur eine Möglichkeit.

Wie kommst Du jetzt auf Diesen Quatsch?

Gruß Sebastian

tobimc
12.03.2006, 10:57
Hi super_castle!

Ich weis dass C keine Fehler verzeiht. Ich Programmiere schließlich meine Windowsprogramme alle in C!
Die Warnung mit der nicht initialisierten Variable ist ja auch durchaus sinnvoll denn wenn man sie nicht initialisiert steht sie auf einem Zufallswert (sorgt manchmal für hochgradig lustige Fehler...)
ERGO halten wir fest, dass man Vriablen in C immer mit <typ> <Variablenname> = 0; , also direkt bei der Deklarierung initialisieren sollte.

(Meines Wissens hat C nur um die 20 Grundbegriffe...)

Mann kann in C genauso viel biegen wie in Basic auch.

VLG Tobi

Superhirn
18.03.2006, 19:21
Hi,
hab nen nützlichen tipp für asm-profis:
"schreibt einfach 'asm' an den anfang der zeile und ihr könnt asm-code schreiben", dann brauchst ja nicht mehr C lernen.

Aber ne frage: Warum bist auf C umgestiegen. ASM ist eh viel besser, da der code schneller ist, oder?

Florian
18.03.2006, 20:05
Hallo Superhirn!
So kann man es natürlich auch machen ... ;o)

Zu Deiner Frage:
Aber ne frage: Warum bist auf C umgestiegen. ASM ist eh viel besser, da der code schneller ist, oder?Ich arbeite jetzt schon nahezu 3 Jahre an meinem Jugend forscht-Projekt und ich komme nicht großartig voran.
Wenn man ganz pessimistisch sieht, dann habe ich dieses Mal meine letzte Chance, denn irgendwann kann ich nicht mehr bei dem Wettbewerb teilnehmen, weil ich dann zu alt bin.
Meine Zeitprobleme liegen zwar nicht nur an ASM, aber ein bischen Zeit kann ich sparen, wenn ich in C programmiere, es ist vom Schreibaufwand etwas kürzer und spart ein paar Gedanken.
Das reduziert zwar auf Dauer die Gehirnleistung(bzw. Masse), aber damit wollen wir uns ja nicht beschäftigen! *g*
Im Prinzip erhoffe ich mir durch C einfach nur ein schnelleres Vorankommen.
Da ich es derzeit jedoch noch nicht einmal schaffe meine Platinen zu ätzen, kann ich natürlich auch nicht mit dem Programmieren vorankommen! ;o)
Ich werde Assembler immernoch ab und zu mal ausbuddeln, wenn es um Effektivität geht, aber um die reinen Normal-Programme zu schreiben werde ich jetzt auf C zurückgreifen.

Ich denke man muss einfach aufhören auch bei Programmiersprachen immer nur schwarz und weiß zu denken, es gibt überall Vor- und Nachteile und man muss sich halt das kleinste Übel heraussuchen.

Viele Grüße
Florian

Superhirn
18.03.2006, 20:11
Was ist dieses JugendForscht Projekt? Wo schickst du es ein? Was ist das?
Ich kenn nur die JugendForscht Experimentierkästen.

Florian
18.03.2006, 20:16
Hallo Superhirn!

Ich kenn nur die JugendForscht Experimentierkästen.*rofl* Entschuldige bitte, ich konnte mir das Glucksen nicht verkneifen! ;o)
Jugend forscht ist ein bundesweiter Wettbewerb, der wohl berühmteste Wettbewerb in Deutschland!
www.jugend-forscht.de
Die Experimentierkästen sind glaube ich von Kosmos, oder?

Superhirn
18.03.2006, 20:24
Weiß nicht. JugendForscht steht immer auf den Kästen drauf. (nur als kleines logo)
Und ich komm aus Österreich.

Florian
18.03.2006, 20:31
Hallo Superhirn!
Soweit ich weiß unterstützt Kosmos die Stiftung Jugend forscht e.V., deswegen ist da vielleicht das Logo drauf ...

Und ich komm aus Österreich.Ich weiß nicht ganz genau, aber ich meine bei euch gibt's auch sowas wie Jugend forscht bzw. es gab glaube ich auch mal Teilnehmer aus Ö., aber ich kann mich auch täuschen!

Superhirn
18.03.2006, 21:10
Auf der Homepage steht leider dass nur Deutsche erlaubt sind. Kennt irgendwer was, was in Ö wie jugendforscht ist?
ich kenn in Ö ja nur die Robotchallenge und Austrobot(was aber relativ kompliziert ... ist)

Felix.
23.08.2006, 22:01
Tur mir leid dass ich das Thema aufwärme, wollte aber kein neues aufmachen. Ich habe ein ähnliches Problem mit Winavr und daher dacht ich es passt hier am besten rein. Ich bekomme auch eine fehlermeldung wie diese nur lautet diese etwas anders:> "make.exe" program
make.exe:
*** No rule to make target `program'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00

irgendetwas muss ich da doch bei den befehlen falsch gemacht haben, weil er program wohl als target ansieht oder? die frage ist nur was?habe nix gefunden
danke schonmal im vorraus

izaseba
23.08.2006, 22:23
Ich habe ein ähnliches Problem mit Winavr und daher dacht ich es passt hier am besten rein.

Das mag schon sein, aber die Infos, die Du gegeben hast sind nich gerade hilfreich.

Wie sieht Dein Programm aus? wie heißt es, wie sieht Makefile aus, lass Dir doch nicht alles aus der Nase ziehen...

Gruß Sebastian

Felix.
23.08.2006, 23:24
Oh tut mir leid. Also noch mal folgendes:
fehlermeldung steht oben.
programm ist ein beispielprogramm von kreatives chaos. genannt hab ich es test.c

makefile beinhaltet folgendes:
MCU = atmega8
FORMAT = ihex
TARGET = test
OBJDIR = obj
SRC = test.c
CPPSRC =
ASRC =
OPT = s
DEBUG = dwarf-2
EXTRAINCDIRS =
CSTANDARD = -std=gnu99
(hoffe da fehlt nix)

target musste ich von hand eintippen, da mfile die quelle nicht anerkannt hat. fehlermeldung lautet: oops, src not found.

erkennt jemand einen fehler?
danke schonmal für die mühe und entschuldigt die umstände die ich mache
edit: achja, test.c und makefile befinden sich natürlich im selben verzeichnis.