Hallo
Habe mal ein Programm versucht zu erstellen,
Macht aber nicht das was es soll.
Um Hilfe wird gebetten.
Code:
/*
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;
}
Die Funktion GoTurnKreis
ist
Code:
#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);
}
Habe die Funktion GoTurnKreis in asuro.h
Code:
void GoTurnKreis(int distance, int degree, int speed);
eingebunden.
im makefile auch
Code:
###############################################################################
# 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/*)
mit make-lib.bat die libasuro.a neu erstellt
Aber das drei Beinige Monster macht nicht was es soll!
Gruß
Juelicher
Lesezeichen