Hi ehenkes!

... kannst Du dies bitte mal näher erläutern, ...
Gerne!
(zu meiner Frage #3!)
Die ISP (Interrupt Service Routine) SIGNAL (SIG_ADC) läuft im Hintergrund 'fleissig' weiter!
Zwischen der Abfrage des Wertes für "tot_count" in der Zeile "tot_count += encoder[LEFT];"
und dem Zurücksetzen der beiden (Array-)Variablen "encoder[0/1]" mit der Zeile "EncoderSet(0,0);"
vergeht einige Zeit, in der sich der Inhalt sowohl von "encoder[LEFT]" als auch von
"encoder[RIGHT]" verändert haben kann! Und das bemerkt unser Programm überhaupt nicht: Also
können doch einige Tic's verloren gehen.

Wenn aber die Variable "enc_count" anstatt mit "tot_count" mit "encoder[LEFT]" verglichen
würde, gehen KEINE Tic's verloren und wir sparen uns noch den (Assembler-)Code der Zeile "EncoderSet(0,0);" und last not least brauchen wir auch die Var. "int tot_count" nicht!

Code:
void Go (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[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);
    Msleep(1);
  }
  MotorDir(BREAK,BREAK);
  Msleep(200);
}
Gibt es auch 'ne Meinung/Antwort zu meiner Frage #2?

cu Helmut