PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierproblem beim Asuro



2stoned
12.07.2007, 17:37
Hallo alle zusammen.....

habe ein kleines Problem mit dem Programm von meinem Asuro, aber vill könnt ihr mir ja weiter helfen.

So sieht das Programm aus.....



#include "asuro.h"

int DriveCircle( int angel, unsigned char Dir)
{ Encoder_Init(0,0);


int segments_left;
int segments_right;
unsigned char MotorDr_Left = FWD;
unsigned char MotorDr_Right = RWD;
int MotorSpdLeft = 120;
int MotorSpdRight = 120;



if (angel == 45)
{
segments_left = 13;
segments_right = 13;
}
else if (angel == 90)
{
segments_left = 27;
segments_right = 27;
}
else if (angel == 180)
{
segments_left = 53;
segments_right = 53;
}
else if (angel == 360)
{
segments_left = 107;
segments_right = 107;
}
else
{
StatusLED(RED); // Statusleuchtdiode Rot schalten
}



Encoder_Set(0,0);



if(Dir == RIGHT)
{
MotorDr_Left = FWD;
MotorDr_Right = RWD;
}



if(Dir == LEFT)
{
MotorDr_Left = RWD;
MotorDr_Right = FWD;
}

while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
{
MotorDir(MotorDr_Left,MotorDr_Right);
MotorSpeed(MotorSpdLeft,MotorSpdRight);

if(encoder[LEFT] >= segments_left)
{
MotorSpdLeft = 160;
}

if(encoder[RIGHT] >= segments_right)
{
MotorSpdRight = 160;
}

if(encoder[LEFT]&&encoder[RIGHT] >= segments_left)
{
MotorSpeed(BREAK, BREAK);
Msleep(300);
MotorSpeed(0,0); // Kollision! Sofort anhalten
}


}
return 0;

}


int DriveLength( int length, unsigned char MotorDr, int MotorSpd)
{
Encoder_Init();
int diff;
float cycles;
int segments_left;
int segments_right;
int MotorSpdLeft = MotorSpd;
int MotorSpdRight = MotorSpd;
unsigned char schalter;

cycles = length / 12,2; // Umdrehungen des linken Reifens = zu fahrende Strecke links / Reifen-Umfangs (Umfang = 12,2 cm !!!)
segments_left = cycles * 40; // Anzahl der zu fahrenden Segmente = Umdrehungen * Anzahl der Segmente pro Umdrehung (40)
segments_right = cycles * 40;
Encoder_Set(0,0);

while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
{
MotorDir(MotorDr,MotorDr);
MotorSpeed(MotorSpdLeft,MotorSpdRight);
schalter = PollSwitch();
PrintInt(schalter);

if(( schalter > 0)&&(MotorDr == FWD))
{
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(300);

return encoder[LEFT];
}

diff = encoder[LEFT]-encoder[RIGHT];

if ((diff > 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdRight = MotorSpdRight + (MotorSpdRight / 100 * 2.5);
MotorSpdLeft = MotorSpd;
}
else if ((diff < 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdLeft = MotorSpdLeft + (MotorSpdLeft / 100 * 2.5);
MotorSpdRight = MotorSpd;
}
else if ((diff == 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdLeft = MotorSpd;
MotorSpdRight = MotorSpd;
}

if(encoder[LEFT] >= segments_left)
{
MotorSpdLeft = 0;
}

if(encoder[RIGHT] >= segments_right)
{
MotorSpdRight = 0;
}


}
MotorSpeed(0,0);




return encoder[LEFT];
}



int main(void)
{
Init();

StatusLED(GREEN);
int blink = 0;
float cycles;
int way = 0;
int segments;
unsigned char endschalt;


while(way < 1000)
{

segments = DriveLength(100, FWD, 120);
cycles = segments / 40;
way = way + (cycles * 12.2);


endschalt = PollSwitch();
PrintInt(endschalt);

if (( endschalt == 2)||( endschalt == 16)||( endschalt == 18 ))
{
DriveLength(10, RWD, 120);
DriveCircle(90, RIGHT);
}
else if ( endschalt == 32)
{
DriveCircle(45, RIGHT);
}
else if ( endschalt == 1)
{
DriveCircle(45, LEFT);
}



}




while(1)
{
if (blink == 0)
{
blink = 1;
StatusLED(OFF);
Msleep(300);
}
else if(blink == 1)
{
blink = 0;
StatusLED(GREEN);
Msleep(300);
}
}



return 0;
}


Folgende Fehler treten auf:



C:\WinAVR\Asuro\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 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.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `DriveCircle':
test.c:4: warning: implicit declaration of function `Encoder_Init'
test.c:43: warning: implicit declaration of function `Encoder_Set'
test.c:61: error: `encoder' undeclared (first use in this function)
test.c:61: error: (Each undeclared identifier is reported only once
test.c:61: error: for each function it appears in.)
test.c:61: error: `LEFT' undeclared (first use in this function)
test.c:61: error: `RIGHT' undeclared (first use in this function)
test.c:79: warning: implicit declaration of function `Msleep'
test.c: In function `DriveLength':
test.c:106: error: `encoder' undeclared (first use in this function)
test.c:106: error: `LEFT' undeclared (first use in this function)
test.c:106: error: `RIGHT' undeclared (first use in this function)
test.c:111: warning: implicit declaration of function `PrintInt'
test.c: In function `main':
test.c:188: error: `RIGHT' undeclared (first use in this function)
test.c:196: error: `LEFT' undeclared (first use in this function)
make: *** [test.o] Error 1

> Process Exit Code: 2


Wäre echt cool wenn ihr mir bei meinem Problem helfen könntet....

Gruß
2stoned

radbruch
12.07.2007, 17:48
Hallo 2stoned

erstmal herzlich willkommen im RN-Forum. Da hast du ja gleich zu Beginn eine harte Nuss zum Knacken vorgelegt. Bitte verwende die code-Tags, vor allem wenn das Programm so umfangreich ist. (Du kannst übrigends deinen Beitrag noch editieren und das nachholen.)

Bevor ich mich in die tiefen deines Codes stürze, ein kleine Frage vorweg:

Welche Version von asuro.h verwendest du denn? Soweit ich beim Überfliegen deines Programm sehe, verwendest du die erweiterten Funktionen die nur bei den neueren Versionen verfügbar sind.

Gruß

mic

2stoned
12.07.2007, 17:52
Das müsste glaub ich 2.10 sein.....

Hab von dem C++ nich so die Ahnung....das Programm hab ich mir aus verschiedenen Beispielen zusammengebastelt.

Vill hilft es wenn ich mal schreibe was das Programm bewirken sollte.....

Gruß
2stoned

radbruch
12.07.2007, 18:05
Hallo

Die Version steht irgendwo oben in der Datei, aber 2.1 ist sicher zu alt. Aktuell ist zur Zeit Version 2.7, aber die kann ich nicht empfehlen, weil ich sie nicht verwende. Version 2.6 dürfte auch ok sein, die kann man u.a. hier downloaden:

http://sourceforge.net/project/showfiles.php?group_id=155217

Da ich aber in meinen Programmen diese Funktionen nicht verwende, muss dich nach dem Komplilieren einer unterstützen, der sich damit auskennt.

Woher hast du das Programm eigentlich? Wenn du nicht so die Ahnung hast, vielleicht kannst du uns die Quellen nennen von denen du die Einzelteile zusammenkopiert hast. Hast du die Teile eigentlich schon getestet oder ist das der erste Versuch?

Gruß

mic

2stoned
12.07.2007, 18:08
Das is der erste Versuch....

Hab den Asuro erst seit Samstag.

Wie funktioniert das eigentlich das meine texte in nem separaten Kasten stehen, damit nich so viel Platz verbraten wird?

Gruß
2stoned

radbruch
12.07.2007, 18:26
Nochmal hallo


Hab den Asuro erst seit Samstag.
Ach so, dann würde ich an deiner Stelle das Programm erstmal ganz hinten in die Schublade legen und versuchen, die StatusLED zum Leuchten zu bringen. Vielleicht in verschiedenen Farben? Das meiste was du dazu wissen must, steht in der Dokumentation des asuros. Dann ein bisschen Motoren drehen lassen und schrittweise anspruchsvollere Dinge programmieren. Einen Linienfolger oder ein Nikolaushäuschen (meins fehlt ja immer noch, aber man kommt eben zu nichts) zum Beispiel. Alles weitere kommt dann von alleine...

Bitte nicht falsch verstehen, aber auch "alte asuro-Hasen" hätten vermutlich Probleme, dir das Riesenprogramm oben zu erklären.

Zu den Boxen:

Über dem Eingabefeld sind verschiedene Symbole mit denen du deine Beiträge formatieren kannst, die wichtigsten sind wohl code, quote, img und url. Entweder vor und nach dem Text auf das entsprechende Symbol klicken (dann werden [starttag] und [/endetag] erzeugt), oder den gewünschten Text markieren und dann auf das Symbol klicken. Mit [Vorschau] kannst du dann prüfen, ob alles so aussieht wie es soll.

Gruß

mic

Sternthaler
12.07.2007, 23:49
Nikolaushäuschen (meins fehlt ja immer noch, aber man kommt eben zu nichts)
Laß dir Zeit, bei mir hat es auch über ein halbes Jahr gedauert :cheesy:

Sternthaler
13.07.2007, 00:44
Wenn ich den Code von 2stoned kopiere, dann fällt mir als erstes auf, daß ein Leerzeichen vor dem ---#include "asuro.h"--- in der Kopi steht.

@2stoned Ist das Leerzeichen tatsächlich in dem Source?

Wenn das aber kein Problem macht (die angegebenen Fehler deuten nicht darauf), liegt es wieder einmal an der benutzten LIB.

Wenn man mal alle Fehler zusammenzieht, bleibt folgendes übrig:

warning: implicit declaration of function `Encoder_Init'
warning: implicit declaration of function `Encoder_Set'
warning: implicit declaration of function `Msleep'
error: `encoder' undeclared (first use in this function)
error: `LEFT' undeclared (first use in this function)
error: `RIGHT' undeclared (first use in this function)

Was mir auffällt ist, dass dies NUR Funktionen, bzw. Defines, aus der hier im Forum 'erzeugten' LIB sind. Es ist keine Funktion dabei, die auch schon beim Asuro mitgeliefert wurde. Z.B.:

Init();
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
StatusLED(GREEN);

@2stoned Kannst du bitte einmal die Datei Makefile aus dem im Fehleroutput angegeben Pfad "C:\WinAVR\Asuro\FirstTry" hier als [ code ] eintragen.

Alleine der Pfadname bringt mich auf den Gedanken, dass du einiges von der Asuro-CD kopiert hast (da gibt es nämlich das Verzeichnis FirstTry) und dann in diesem Verzeichnis dein eigenes test.c mit dem oben angegeben Code 'gefüllt' hast.
Das wäre komplett falsch, da auf der Asuro-CD NICHT die LIB ist, von der du bestimmt schon so viel im Forum gelesen hast.

@2stoned Hast du so gearbeitet? Wenn ja, müssen wir dir noch die Lib erklären und dich da unterstützen.

radbruch
13.07.2007, 06:01
Hallo

Ich kann das Programm zwar nicht kompilieren, war aber so frei mal ein paar Stellen zu kommentieren. Ist noch nicht vollständig, aber ich muss zur Arbeit:


#include "asuro.h"

int DriveCircle( int angel, unsigned char Dir)
{ Encoder_Init(0,0);


int segments_left;
int segments_right;
unsigned char MotorDr_Left = FWD;
unsigned char MotorDr_Right = RWD;
int MotorSpdLeft = 120;
int MotorSpdRight = 120;



if (angel == 45)
{
segments_left = 13;
segments_right = 13;
}
else if (angel == 90)
{
segments_left = 27;
segments_right = 27;
}
else if (angel == 180)
{
segments_left = 53;
segments_right = 53;
}
else if (angel == 360)
{
segments_left = 107;
segments_right = 107;
}
else
{
StatusLED(RED); // Statusleuchtdiode Rot schalten
}



Encoder_Set(0,0);



if(Dir == RIGHT)
{
MotorDr_Left = FWD;
MotorDr_Right = RWD;
}



if(Dir == LEFT)
{
MotorDr_Left = RWD;
MotorDr_Right = FWD;
}

while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
{
MotorDir(MotorDr_Left,MotorDr_Right);
MotorSpeed(MotorSpdLeft,MotorSpdRight);

if(encoder[LEFT] >= segments_left)
{
MotorSpdLeft = 160;
}

if(encoder[RIGHT] >= segments_right)
{
MotorSpdRight = 160;
}

if(encoder[LEFT]&&encoder[RIGHT] >= segments_left)
{
MotorSpeed(BREAK, BREAK);
Msleep(300);
MotorSpeed(0,0); // Kollision! Sofort anhalten
}


}
return 0;

}


int DriveLength( int length, unsigned char MotorDr, int MotorSpd)
{
Encoder_Init();
int diff;
float cycles;
int segments_left;
int segments_right;
int MotorSpdLeft = MotorSpd;
int MotorSpdRight = MotorSpd;
unsigned char schalter;

// In der folgenden Rechnung waehre es guenstiger erst zu multiplizieren
// und dann die Division durchzufuehren um den Rundungsfehler der Division
// nicht noch zu multiplizieren.
// Wenn die Werte um den Faktor 10 vergroeßert werden, kann man auch
// auf float verzichten:
// segments_left = segments_right = lenght*40/12.2 bzw. lenght*400/122

cycles = length / 12,2; // Umdrehungen des linken Reifens = zu fahrende Strecke links / Reifen-Umfangs (Umfang = 12,2 cm !!!)
segments_left = cycles * 40; // Anzahl der zu fahrenden Segmente = Umdrehungen * Anzahl der Segmente pro Umdrehung (40)
segments_right = cycles * 40;
Encoder_Set(0,0);

// Besser auf die Summe der Werte beider Seiten pruefen. Wenn eine Seite trotz
// Regelung hinterherhinkt, faehrt der asuro sonst weiter bis die langsame Seite
// auch den Wert erreicht hat:
// while ((encoder[LEFT]+encoder[RIGHT]) < ((segments_left+segments_right))

while((encoder[LEFT]+ < segments_left)||(encoder[RIGHT] < segments_right))
{
MotorDir(MotorDr,MotorDr);
MotorSpeed(MotorSpdLeft,MotorSpdRight);
schalter = PollSwitch(); // PollSwitch() ohne Mehrfachabfragen !!!
PrintInt(schalter); // funktioniert in den wenigsten Faellen !!!

if(( schalter > 0)&&(MotorDr == FWD))
{
MotorSpeed(0,0);
MotorDir(BREAK,BREAK);
Msleep(300);

return encoder[LEFT];
}

diff = encoder[LEFT]-encoder[RIGHT];

// Auch hier koennte man die Rechnug umstellen um die Rundungsfehler durch die
// Integerrechnung zu minimieren:
// (MotorSpdRight * 25 / 1000) bzw. (MotorSpdLeft * 25 / 1000)
// Ein "unsigned int" waere guenstiger, weil die Speeds nie negativ werden
// Und auch wieder bei der Gesamtstrecke auf Summe beider Seiten pruefen

if ((diff > 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdRight = MotorSpdRight + (MotorSpdRight / 100 * 2.5);
MotorSpdLeft = MotorSpd;
}
else if ((diff < 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdLeft = MotorSpdLeft + (MotorSpdLeft / 100 * 2.5);
MotorSpdRight = MotorSpd;
}
else if ((diff == 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
{
MotorSpdLeft = MotorSpd;
MotorSpdRight = MotorSpd;
}

// Wenn die schnellere Seite stoppt, dreht der asuro beim Anhalten, wenn die andere Seite alleine weiterfaehrt
if(encoder[LEFT] >= segments_left)
{
MotorSpdLeft = 0;
}

if(encoder[RIGHT] >= segments_right)
{
MotorSpdRight = 0;
}


}
MotorSpeed(0,0);




return encoder[LEFT];
}



int main(void)
{
Init();

StatusLED(GREEN); // die ist immer gruen nach dem Init();
int blink = 0;
float cycles;
int way = 0;
int segments;
unsigned char endschalt;


while(way < 1000)
{

segments = DriveLength(100, FWD, 120);
cycles = segments / 40;
way = way + (cycles * 12.2);


endschalt = PollSwitch(); // PollSwitch() ohne Mehrfachabfragen !!!
PrintInt(endschalt); // funktioniert in den wenigsten Faellen !!!

if (( endschalt == 2)||( endschalt == 16)||( endschalt == 18 ))
{
DriveLength(10, RWD, 120);
DriveCircle(90, RIGHT);
}
else if ( endschalt == 32)
{
DriveCircle(45, RIGHT);
}
else if ( endschalt == 1)
{
DriveCircle(45, LEFT);
}



}




while(1)
{
if (blink == 0)
{
blink = 1;
StatusLED(OFF);
Msleep(300);
}
else if(blink == 1) // wenn nicht 0, dann muss es 1 sein
{
blink = 0;
StatusLED(GREEN);
Msleep(300);
}
}



return 0;
}
Vielleicht hilft es euch weiter.

Viel Glück heute am 13.

Gruß

mic

2stoned
13.07.2007, 10:55
Hallo

Nein ich habe die test.c nicht abgeändert....habe eine neue test.c geschrieben.

Kann ich dem Asuro denn irgendwie die Befehle erklären damit er weiß was ich von ihm will?? Oder is das nicht möglich??

Gruß
2stoned

2stoned
13.07.2007, 12:54
Meinste die hier?


# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al.
# Released to the Public Domain
# Please read the make user manual!
#
#
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
# 4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".
#


# MCU name
MCU = atmega8

# Output format. (can be srec, ihex, binary)
FORMAT = ihex

# Target file name (without extension).
TARGET = test

# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c

# If there is more than one source file, append them above, or adjust and
# uncomment the following:
SRC += asuro.c

# You can also wrap lines by appending a backslash to the end of the line:
#SRC += baz.c \
#xyzzy.c



# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =




# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-ahlms=$(<:.c=.lst)



# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-ahlms=$(<:.S=.lst),-gstabs



# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref



# Additional libraries
#
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
#
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
#
# -lm = math library
LDFLAGS += -lm



# ---------------------------------------------------------------------------

# Define directories, if needed.
DIRAVR = c:/winavr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib


# Define programs and commands.
SHELL = sh

CC = avr-gcc

OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size

REMOVE = rm -f
COPY = cp

HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf

FINISH = echo Errors: none
BEGIN = echo -------- begin --------
END = echo -------- end --------




# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)

# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)



# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss sizeafter finished end


# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@$(BEGIN)

finished:
@$(FINISH)

end:
@$(END)


# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE);fi

sizeafter:
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE);fi



# Display compiler version information.
gccversion :
$(CC) --version




# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000


coff: $(TARGET).elf
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof

# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@

# Create extended listing file from ELF output file.
%.lss: %.elf
$(OBJDUMP) -h -S $< > $@



# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)


# Compile: create object files from C source files.
%.o : %.c
$(CC) -c $(ALL_CFLAGS) $< -o $@


# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
%.o : %.S
$(CC) -c $(ALL_ASFLAGS) $< -o $@






# Target: clean project.
clean: begin clean_list finished end

clean_list :
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)


# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@


# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)



# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program

damaltor
13.07.2007, 16:04
das machst du dich schon indem du ihn programmierst.

ich denke, radbruch hat recht: wenn du klein anfängst, aber deine programm selbst schreibt (in der anleitung sind tolole programme zum abtippen...) dann lernst du auf jeden fall mehr als wenn du großen umfangreichen code aus dem netz kopierst, den du nicht verstehst, und dann auf unsere hinweise hin fehler korrigierst, von denen du nicht weist warum sie da sind oder was sie bedeuten. ist nicht böse gemeint, aber weist du wirklich was das programm da oben macht (also schritt für schritt, nicht das endergebnos? weisst du was alle befehle bedeuten?

wenn du erstmal etwas rumspielen willst, dann hol die ein paar hex-äfiles (zum beispiel von hier: http://home.planet.nl/~winko001/Asuro/Software/AsuSfwPagFrm.htm ) und spiele damit rum. und dann versuche, diene eigene kreativität walten zu lassen...

2stoned
13.07.2007, 16:13
Auf so was kann ich verzichten....hab nich umsonst mit so nem Programm angefangen.

Soll ich dir mal erklären was der mit dem Programm macht? Vill
merkst du ja dann das ich versteh was da drin passiert....oder gemacht wird.

Diese Mini-Programme sind absoluter Mist....der Asuro soll was machen un nich dumm rum blinken...dafür is der nich geholt worden!

Sternthaler
13.07.2007, 19:38
@2stoned
Ist egal, ob geändert, oder neu editiert. Solange die Datei test.c in dem FirstTry-Verzeichnis liegt und dort mit 'make all' übersetzt wird, scheint der Rest im Verzeichnis das Grundgerüst von der Asuro-CD zu sein.

@2stoned
Ja, es ist die Datei (Makefile) die ich meinte.
Genau hier liegt tatsächlich das Problem. Es ist auf alle Fälle kein Makefile mit dem die Forum-LIB 'eingebunden' wird.
Somit erklärt das tatsächlich warum nur die Funktionen/Defines aus der Forum-LIB als Fehler bzw. als nicht zu finden angemeckert werden.

OK, du must erst noch die Forum-LIB aus neue Asuro Lib V2.70 (Release Candidate 3) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26594) (im ersten Eintrag unter http://sourceforge.net/projects/asuro zu finden) holen, installieren und dich mit eventuell auftretenden Installationsproblemen beschäftigen. (Dazu gibt es im Forum einige Einträge, oder mal die Doku (ist in dem oben angegeben Thread, und in dem dort zu findenden Download) sehr genau lesen. m.a.r.v.i.n hat sich sehr, sehr viel Mühe mit der Doku zur Installation gemacht.)
Nimm auf alle Fälle die Version mit rc3. Am einfachsten ist die Setup-Datei.

Erst danach kannst du überhaupt daran denken an deinem Programm weiterzumachen.
Hier ist es auf alle Fälle zu empfehlen, dass du DEIN Projekt (FirstTry) in den durch die Installation der Forum-Lib angelegtem Unterverzeichnis examples neu anlegst. (Eigenes neues Verzeichnis machen)
Kopiere NUR deine Datei test.c in dieses neue Verzeichnis.
Kopiere ein Makefile aus dem examples-Vereichnis in dieses neue Verzeichnis.
Dann dort 'make all' bzw. 'make clean' aufrufen.

Warum unter examples arbeiten?
In den Makefile's ist ein kleiner Bock, so dass sie eine bestimmte Verzeichnis-Struktur erwarten. Mach es einfach so.


Sonst kann ich nur sagen: Ruhe bewahren und mal in ein Sonnenstudio gehen (Urlaub tut's auch). Das Wetter zerrt etwas an den Nerven.

@damaltor
Stark, dass man Einträge schließen kann. Will ich auch können ;-)

2stoned
14.07.2007, 02:30
@Sternthaler
Vielen Dank für deine Hilfe....allerdings scheint immer noch ein Problem vorhanden zu sein.



C:\ASURO_SRC\AsuroLib\examples\FirstTry>make all
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 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.

avr-gcc -mmcu=atmega8 -I. -g -Os -I../../lib/inc -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm -lasuro
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\bin\ld.exe: cannot find -lasuro
make: *** [test.elf] Error 1

> Process Exit Code: 2

Fehlt vill noch eine Datei? Oder muss ich noch irgendwas umstellen?

Gruß
2stoned

radbruch
14.07.2007, 09:28
Hallo


Diese Mini-Programme sind absoluter Mist
Ich finde diese Codeschnippsel klasse, weil sehr lehrreich. Sie zeigen, wie man ohne asuro.h die einzelnen Funktionen des asuros nutzt.


Kann ich dem Asuro denn irgendwie die Befehle erklären damit er weiß was ich von ihm will?
Klar kann man das, man nennt es "programmieren". Deine Ansprüche übersteigen die Kentnisse, die ich mir mit einfachen Programmen, wie z.b blinkenden Lämpchen, erworben habe. Aber genau dafür hatte ich mir meinen asuro damals geholt (besser: schenken lassen) und ich finde, er hat seinen Job sehr gut erledigt. Aber meine Ansprüche waren auch eher gering, weil ich zuvor weder AVRs noch C kannte.

Für richtig tolle Programme solltest du aber unbedingt die von Sternthaler empfohlene (und mitentwickelte) 2.7er Library installieren. Damit kannst du die Möglichkeiten des asuros bequem nutzen ohne wirklich zu wissen, wie es funktioniert.

Viel Spass noch mit deinem asuro

mic

Sternthaler
14.07.2007, 12:13
@2stoned
sieht ja schon recht gut aus.
Jetzt wird es aber wohl Zeit mal nachzufragen was du denn gemacht hast. Hast du die Forum-LIB von sourceforge geholt? Setup- oder ZIP-Version?

Du scheinst auf alle Fälle eine asuro.h aus der Forum-Lib zu haben. Sieht man daran, dass die Wanings und Fehler zu den monierten Funktionen/Defines weg sind.
Der Text "cannot find -lasuro" in deinem Fehleroutput sagt nun folgendes:
Beim Linken im Makefile wird die Library (-l) asuro gesucht aber nicht gefunden. (Das sieht nach dem Makefile aus der Forums-LIB aus. Ist gut so.)
Bei einer Lib ist die Namensgebung 'irgendwie' komisch.
Angegeben wird asuro, aber gesucht (als Datei) wird libasuro.a
Diese Datei wird von m.a.r.v.i.n über sourceforge gleich mitgeliefert, oder eben durch ein make-lib.bat erzeugt und 'eigendlich' an die richtige Stelle kopiert.
Wo ist die richtige Stelle? In dem Verzeichnis, in dem dein WinAVR installiert ist.
Bei mir nennt sich das Verzeichnis: C:\...\...\AVR-Win\avr\lib
Bei dir (sieht man auch im Fehleroutput): C:\WinAVR\avr\lib
Achtung Es gibt unter WinAVR (beim mir AVR-Win) auch direkt ein lib-Verzeichnis. Nein, nein: libasuro.a muss in's avr\lib-Verzeichnis.
Solltest auch gleich nachsehen, ob asuro.h im Verzeichnis C:\WinAVR\avr\include ist.

Das kopieren geht auch mit dem Makefile aus der installierten Forum-LIB, aber nur wenn die dortige Angabe "DIRAVR = l:/winavr" auf dein C:\WinAVR-Verzeichnis angepasst ist. (Nimm tatsächlich den / und nicht Win-typischen \. m.a.r.v.i.n. weist da irgendwo drauf hin)


@radbruch
Danke für die Blumen (LIB-mitentwicklung) Ist nicht ganz so dolle bisher. Habe mich 'nur' um die Doku der Lib-Sourcen gekümmert. Beispiele und dortige Doku, Gesamt-Lib und trennen in einzelne Dateien haben wir m.a.r.v.i.n zu verdanken.

P.S.: Wenn die Forum-LIB selber übersetzt wird, besteht die Möglichkeit in der dort vorhandenen Datei myasuro.h die typischen, eigenen Werte für Taster, Odometrie, Go und Turn zu ändern und zu nutzen.
Das geht aber nur, wenn die Lib dann neu übersetzt wird und in die richtigen Verzeichnisse kopiert wird.
Reklame: Im Beitrag ASURO emittelt Werte für Lib V2.70 myasuro.h selber (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31073) gibt es ein Programm damit der Asuro diese Werte (fast) selbst ermitteln kann.

2stoned
14.07.2007, 12:28
@Sternthaler
Vielen vielen Dank....

Es hat alles funktioniert. Werde es jetz gleich auf den Asuro übertragen und ausprobieren ob das Programm auch so funktioniert wie ich es mir vorgestellt hatte.

Nochmal Danke für deine tolle Hilfe.... :D

Gruß
2stoned

Sternthaler
14.07.2007, 13:03
Freut mich, gern geschehen.

damaltor
16.07.2007, 18:29
klar sind diese codeschnipsel nichts besonderes. aber sie sind gut zum lernen. und dadurch, dass man einen code aus dem netz hlt, den man überhaupt nicht kapiert, lernt man nix.

wenn man allerdinsg 2-3 mal solche codeschnipsel bearbeitet hat, oder angepasst, odr evtl auch das neue eigene programm darauf aufbaut, dann kann man deutlich mehr erreichen.