Normalerweiße auf 3 Dateien verteilt, hier der Einfachheit halber in einer:
Code:#include "asuro.h" // Prototypen void Kollisionskontrolle (void); void Drehung (int Grad,unsigned char Geschwindigkeit); int main(void) { Init(); MotorDir(FWD,FWD); MotorSpeed(210,210); while(1) { Kollisionskontrolle (); Msleep(5); } return 0; } void Kollisionskontrolle (void) { char Zaehler = 0; // Zaehler für die Kontrolle der Taster int i; // Teste auf Kollision for (i=0; i<5; i++) { if (PollSwitch() != 0) Zaehler++; Msleep(1); } // Ist der Zahler größer als 1, so leigt eine Kollision vor // In diesem Fall muss anhand des Pollswitch-Wertes, der auf Zaehler übergeben wird // unterschieden werden wie zu reagieren ist. if (Zaehler > 1) { Zaehler = PollSwitch(); // Unterschiedliche Reaktionen // Stößt ganz links an - Asuro dreht 45° rechts if (Zaehler == 32) { // K1 gedrückt - 45° nach rechts Drehung(45, 150); } // Stößt ganz rechts an - Asuro dreht 45° nach links else if (Zaehler == 1) { // K6 gedrückt - 45° nach links Drehung(-45, 150); } // Stößt anders an - Asuro dreht 180° else { // 90° Drehung Drehung(180, 150); } } } void Drehung (int Grad,unsigned char Geschwindigkeit) { int Faktor = 4; unsigned char Left_Speed; unsigned char Right_Speed; // Ursprüngliche Geschwindigkeit übernehmen Left_Speed = OCR1A; Right_Speed = OCR1B; // Sicherheitshalber kurz zurücksetzen MotorDir(RWD,RWD); MotorSpeed(120,120); Msleep(200); MotorSpeed(0,0); // Unterscheide Links und Rechtsdrehung if (Grad >0) // Rechtsdrehung { MotorDir(FWD,RWD); MotorSpeed(Geschwindigkeit,-Geschwindigkeit); Msleep(Grad * Faktor); } else // Linksdrehung { MotorDir(RWD,FWD); MotorSpeed(-Geschwindigkeit,Geschwindigkeit); Msleep(-Grad * Faktor); } MotorDir(FWD,FWD); MotorSpeed(Left_Speed,Right_Speed); }







Zitieren

Lesezeichen