Hallo Martin,

mit den Tastsensoren ist jetzt erst mal alles ok.
diese Geistertasten 1er, 2er, etc. beim Drücken von anderen Tasten kriegt man weg, indem man die PollSwitch() Funktion mehrmals hintereinander aufruft (bis zu 8x sollte reichen) dann wertet man erst das Ergebnis aus.
Hintergrund ist der Kondensator C7 der erst komplett entladen werden muß, das passiert durch den Aufruf der PollSwitch() Funktion.

Falls jetzt bei K1 immer noch nicht 32 als Wert angezeigt wird, kann man die asuro.c anpassen indem man wie schon mal hier beschrieben in der Funktion PollSwitch() die letzte Zeile anpaßt.

zunächst ändern wir die unnötige Floating Point Operation
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
in eine Integer Operation.

return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
dann kann man den Wert 61L in 63L oder 65L ändern. Einfach ausprobieren, bei welchem Wert K1=32 liefert. Die anderen Tasten natürlich auch die richtigen Werte.

Das beim Selbsttest die Back LEDs manchmal mitleuchten, bzw. ein Motor mitdreht ist normal. Macht mein Asuro auch so. Liegt wahrscheinlich an vorher genannten Problem mit der PollSwitch() Funktion.

Das Problem mit dem linken Motor deutet auf einen Fehler in der Motoransteuerung. Die Transistoren T1..T4 und die Dioden D1..D4 sind dafür zuständig. Vielleicht eine Diode falsch gepolt.
Zu allem Unglück gibt es 2 verschiedene Transitortypen, die nicht vertauscht werden dürfen. T1 und T2 sind andere Typen als T3 und T4.
Die Beschriftung der Transistoren ist leider auch nicht so gut erkennbar.
Ansonsten wieder auf Schlüsse prüfen. Bei Rückwärtsfahrt ist, glaube ich, T3 und T2 aktiv.

Zu guter letzt das Programm:

Code:
#include "asuro.h"

int main(void)
{
  unsigned char taste;
   
  Init();
  while(1)
  {
    PollSwitch();   /* mehrmals abfragen, um C7 zu entladen */
    PollSwitch();
    PollSwitch();
    PollSwitch();
    PollSwitch();
    PollSwitch();
    PollSwitch();
    taste = PollSwitch();
    if(taste == 0)         /* keine Taste */
    {
      MotorDir(FWD,FWD);
      MotorSpeed(150,150); /* vorwaerts fahren */
    }
    else                   /* irgendeine Taste gedrueckt */
    {
      MotorSpeed(0,0);     /* anhalten */
      MotorDir(RWD,RWD);
      MotorSpeed(150,150); /* rückwaerts fahren */
      Sleep (36);                 /* 1 Sek. warten */
      /* todo: leichte Kurve fahren, 
          damit man nicht gleich wieder anstoesst. 
      */
      MotorSpeed(0,0);     /* anhalten */
    }
  }
}
Odometrie ist hier noch nicht nötig.

Gruß Peter