Man könnte das Thema auch über eine Polygon-Funktion mit ganz vielen Vertices angehen. Ich habe mal etwas entwickelt:
Code:
#include "myasuro.h" /* #define MY_GO_CORRECTIVE_ACTION 3 */
#include "asuro.h"

void GoP (int distance,int speed)
{
  uint32_t enc_count;
  int tot_count = 0;
  int diff = 0;
  int l_speed = speed, r_speed = speed;

  // calculation tics/mm
  enc_count=abs(distance)*10000L;
  enc_count/=MY_GO_ENC_COUNT_VALUE;
  EncoderSet(0,0); // reset encoder

  MotorSpeed(l_speed,r_speed);
  if (distance<0) MotorDir(RWD,RWD);
  else MotorDir(FWD,FWD);

  while (tot_count<enc_count)
  {
    tot_count += encoder[RIGHT]; //im Original LEFT ehenkes
    diff = encoder[LEFT] - encoder[RIGHT];
    if (diff > 0)
    { //Left faster than right
      if ((l_speed > speed) || (r_speed > 244)) l_speed -= MY_GO_CORRECTIVE_ACTION;
      else r_speed += MY_GO_CORRECTIVE_ACTION;
    }
    if (diff < 0)
    { //Right faster than left
      if ((r_speed > speed) || (l_speed > 244)) r_speed -= MY_GO_CORRECTIVE_ACTION;
      else l_speed += MY_GO_CORRECTIVE_ACTION;
    }
    EncoderSet(0,0); // reset encoder
    MotorSpeed(l_speed,r_speed);
  }
}

void TurnP (int degree,int speed)
{
  long enc_count;
  enc_count=abs(degree)*MY_TURN_ENC_COUNT_VALUE;
  enc_count /= 360L;

  int tot_count = 0;
  int diff = 0;
  int l_speed = speed, r_speed = speed;

  EncoderSet(0,0);    // reset encoder

  MotorSpeed(l_speed,r_speed);
  if (degree<0) MotorDir(RWD,FWD);
  else MotorDir(FWD,RWD);

  while (tot_count<enc_count)
  {
    tot_count += encoder[LEFT];
    diff = encoder[LEFT] - encoder[RIGHT];
    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;
    }
    EncoderSet(0,0);    // reset encoder
    MotorSpeed(l_speed,r_speed);
  }
}



void RegularPolygon (int NumberVertices, int LengthSide, int speed, int direction)
{
  int i;
  for(i=0;i<NumberVertices;++i)
  {
    GoP (LengthSide,speed);
    if (direction==RIGHT)
		TurnP ( 360L/NumberVertices,speed);
	else
		TurnP (-360L/NumberVertices,speed);
  }
  MotorSpeed(0,0);
}

int main(void)
{
  Init();
  EncoderInit(); 
  StatusLED (YELLOW);
 
  RegularPolygon(6,150,175,LEFT);
   
  StatusLED (GREEN); 
 
  while (1);
  return 0;
}