Jipppiiii es geht!!!
Allerdings muss man den Zähler bisschen weiter hinter setzen, das konntest du aber nicht wissen, da die Drehung bis zum distance=0 geht...
Desweiteren muss man return 0 weglassen, da ja sonst die while-Schleife wieder von vorne beginnt. Also fügt man ein MotorDir(BREAK,BREAK) ein und ASURO bleibt genau nach einem Quadrat stehen.
Hier nochmal mein fertiger Code...
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
Init();
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
while (zaehler<4)
{
switch(distance) {
//Am Anfang der Strecke Vollgas
case 0:MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
//Am Ende langsamer werden...
case 215:speed=200;
break;
case 230:speed=150;
break;
//...und stehen bleiben
case 251:MotorDir(BREAK,BREAK);
//etwas warten, bis der Roboter wirklich steht
for (i=0; i<100; i++)
{
Sleep(255); }
//auf der Stelle nach links drehen
MotorDir(RWD,FWD);
speed=255;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
distance=252;
break;
case 282: speed=200;
break;
case 288: speed=150;
break;
case 292: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255); }
MotorDir(FWD,FWD);
speed=255;
distance=0;
//und noch vermeiden, dass die Verzögerung
//mehrmals aufgerufen wird
zaehler++;
break;
}
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
MotorDir(BREAK,BREAK);
}
Lesezeichen