Hallo
Habe mal ein Programm versucht zu erstellen,
Macht aber nicht das was es soll.
Um Hilfe wird gebetten.
Die Funktion GoTurnKreisCode:/* Programm zum Kreisbogenfahren mit Radiusvorgabe Radius geteilt durch neun ergibt zu fahrende Strecke. Danach um 5° Grad drehen und wieder Radius/9 = Strecke fahren. Mit einer Geschwindigkeit von 150 noch fest vorgegeben. */ #include <asuro.h> int main(void) { Init(); EncoderInit(); StatusLED(GREEN); // (distance,degree,speed) //SerPrint ("Drehe um 85°\r"); GoTurnKreis ( 360, 180, 150); // Drehe um 5° while (1) {} return 0; }
istHabe die Funktion GoTurnKreis in asuro.hCode:#include "asuro.h" #include "myasuro.h" void GoTurnKreis ( // Funktion soll einen Keisbogen fahen, indem um 5° drehen und Distance/9 fahren (wegen 10° schritten) int distance, // Radius int degree, // Winkel um 10 20 bis 360° drehen int speed) // Geschwindigkeit { unsigned long enc_countdistance; // Vorgabewert der Ticks abhaengig von distance unsigned long enc_countdegree; // Vorgabewert der Ticks abhaengig von degree int tot_countdistance = 0; // ist Ticks linker Odometer abhaengig von distance int tot_countdegree = 0; // ist Ticks linker Odometer abhaengig von degree int diff = 0; // differenc Linker - Rechter Odometer int l_speed = speed, r_speed = speed; // Geschwindigkeit Linker Motor und Rechter Motor int i; // Laufvariable i fuer Winkel / 10 mal durchlaufen int zyklus=degree/10; // int drehdegree = 5; // Drehen um 5° Grad /* calculate tics from mm */ enc_countdistance = abs (distance) * 10000L; // Vorzeischenlos um 10000 multiplizieren wegen berechnung in int als long enc_countdistance /= MY_GO_ENC_COUNT_VALUE; // Korektur Werte meines Asuro enc_countdistance /= 9L; // durch 9 wegen Kreisbogen /* calculate tics from degree */ enc_countdegree = abs (drehdegree) * MY_TURN_ENC_COUNT_VALUE; // um rechnen in Ticks enc_countdegree /= 360L; /* stop the motors until the direction is set */ // MotorSpeed (0, 0); // Motoren stehen for (i = 0; i < zyklus; i++) // Anzahl der Bewegungen degree durch 10 nur 10fache Werte vorgeben { //############### Asuro Radius /9 Strecke fahren ###################### StatusLED(GREEN); l_speed = speed; r_speed = speed; if (distance < 0) // Fahrtrichtung bestimmen { MotorDir (RWD, RWD); // negative distance Rueckwaerts } else { MotorDir (FWD, FWD); // positive distance Vorwaerts } /* reset encoder */ EncoderSet (0, 0); // Vorgabewerte fuer Odometer /* now start the machine */ MotorSpeed (l_speed, r_speed); // Motoren laufen mit Geschwindigkeit while (tot_countdistance < enc_countdistance) // enc_count ist vorgabewert entweder Distance oder degree nicht beides { tot_countdistance += encoder [LEFT]; // Linkes Odometer wird gezaehlt diff = encoder [LEFT] - encoder [RIGHT]; // zur Geschwindigkeitsregelierung if (diff > 0) { /* Left faster than right */ if ((l_speed > speed) || (r_speed > 244)) { l_speed -= 10; } else { r_speed += 10; } } if (diff < 0) { /* Right faster than left */ if ((r_speed > speed) || (l_speed > 244)) { r_speed -= 10; } else { l_speed += 10; } } /* reset encoder */ EncoderSet (0, 0); MotorSpeed (l_speed, r_speed); // Geschwindigkeit setzen einstellen Msleep (1); } //############### Asuro um 5° drehen in Uhrzeigersinn und gegen Uhrzeigersinn ###################### //StatusLED (RED); l_speed = speed; r_speed = speed; if (degree < 0) // Drehrichtung bestimmen fuer 5° Grad { MotorDir (RWD, FWD); // wenn negativer Winkel gegen Uhrzeiger } else { MotorDir (FWD, RWD); // wenn positiver Winkel im Uhrzeiger } /* reset encoder */ EncoderSet (0, 0); // Vorgabewerte fuer Odometer /* now start the machine */ MotorSpeed (l_speed, r_speed); // Motoren laufen mit Geschwindigkeit while (tot_countdegree < enc_countdegree) // enc_count ist vorgabewert entweder Distance oder degree nicht beides { tot_countdegree += encoder [LEFT]; // Linkes Odometer wird gezaehlt diff = encoder [LEFT] - encoder [RIGHT]; // zur Geschwindigkeitsregelierung if (diff > 0) { /* Left faster than right */ if ((l_speed > speed) || (r_speed > 244)) { l_speed -= 10; } else { r_speed += 10; } } if (diff < 0) { /* Right faster than left */ if ((r_speed > speed) || (l_speed > 244)) { r_speed -= 10; } else { l_speed += 10; } } /* reset encoder */ EncoderSet (0, 0); MotorSpeed (l_speed, r_speed); Msleep (1); } tot_countdistance = 0; // ist Ticks linker Odometer abhaengig von distance wird auf Null gesetzt fuer necksten Lauf tot_countdegree = 0; // ist Ticks linker Odometer abhaengig von degree diff = 0; // differenc Linker - Rechter Odometer } /* stop the motors until the direction is set */ MotorSpeed (0, 0); // Motoren stehen MotorDir (BREAK, BREAK); Msleep (200); }
eingebunden.Code:void GoTurnKreis(int distance, int degree, int speed);
im makefile auch
mit make-lib.bat die libasuro.a neu erstelltCode:############################################################################### # Makefile for the project AsuroLib ############################################################################### ## General Flags PROJECT = AsuroLib MCU = atmega8 TARGET = AsuroLib.elf CC = avr-gcc.exe AR = avr-ar OBJDUMP = avr-objdump ## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU) ## Compile options common for all C compilation units. CFLAGS = $(COMMON) CFLAGS += -Wall -gdwarf-2 -Os -I./inc CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d ## Assembly specific flags ASMFLAGS = $(COMMON) ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 ## Linker flags LDFLAGS = $(COMMON) LDFLAGS += ## Intel Hex file production flags HEX_FLASH_FLAGS = -R .eeprom HEX_EEPROM_FLAGS = -j .eeprom HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 ## Objects that must be built in order to link OBJECTS = globals.o adc.o encoder.o encoder_low.o i2c.o leds.o lcd.o\ motor.o motor_low.o print.o printf.o rc5.o sound.o switches.o\ time.o uart.o version.o encoderTest.o ## Objects explicitly added by the user LINKONLYOBJECTS = # Define directories, if needed. Geaendert auf C:/WinAVR-20071221 am 230208 DIRAVR = C:/WinAVR-20071221 #DIRAVR = C:/WinAVR #DIRAVR = /usr/local/avr DIRAVRBIN = $(DIRAVR)/bin DIRAVRUTILS = $(DIRAVR)/utils/bin DIRINC = $(DIRAVR)/avr/include DIRLIB = $(DIRAVR)/avr/lib LIB = asuro LIBFILE = lib$(LIB).a HEADER = asuro.h ## Build all: $(LIBFILE) rm -rf *.o *~ %.o: %.c $(CC) $(INCLUDES) $(CFLAGS) -c $< $(LIBFILE): $(OBJECTS) $(AR) cru $(LIBFILE) $(OBJECTS) ## Clean target clean: rm -rf *.o *~ $(LIBFILE) rm -rf *.lst *.map $(EXTRA_CLEAN_FILES) rm -rf dep/*.d install: cp $(LIBFILE) $(DIRLIB)/$(LIBFILE) cp inc/$(HEADER) $(DIRINC)/$(HEADER) lst: $(OBJECTS:%.o=%.lst) %.lst: %.o $(OBJDUMP) -h -S $< > $@ ## Other dependencies -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
Aber das drei Beinige Monster macht nicht was es soll!
Gruß
Juelicher






Zitieren

Lesezeichen