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);
}
Lesezeichen