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