Hallo
So scheint es halbwegs zu funktionieren. Allerdings dürften ein paar Segmentwechsel verlorengehen, weil wir die Seiten nacheinander prüfen(f-Schleife):
Code:
#include "asuro.h" // Konfigurationsdateien laden
/* Funktionen definieren */
/* Geradeausfahren */
void GeradeAus(void)
{
unsigned char e,f,i,j; // Zähler
unsigned int OdoData[2]; // Array für Odo Werte
unsigned int save[5]; // Zwischenspeicher für Odo Wertereihe
unsigned int wahr[2]; // Zähler
unsigned int richtung[2]; // letze Flanke auf- oder absteigend?
static unsigned int spd0=170; // Geschwindigkeit
static unsigned int spd1=170; // Geschwindigkeit
unsigned int n[2]; // Zähler
for(e=0; e<10; e++) // Anzahl der Messungen die durchgeführt werden
{
for(f=0; f<2; f++) // Messung für links/rechts
{
wahr[f]=0; // Löschen nicht vergessen
for(i=0; i<5; i++) // Fünf mal messen pro Variable
{
OdometrieData(OdoData);
save[i]=OdoData[f];
if(i==4) // Wenn Array voll: Checken ob Ab oder Auf
{
for(j=0; j<4; j++)
{
if(richtung[f] && (save[i]<save[i+1])) // Werte aufsteigend?
{
wahr[f]++;
}
else if(!richtung[f] && (save[i]>save[i+1])) // Werte Abfallend?
{
wahr[f]++;
} // if richtung
} //j
} // if i==4
} //i
if(wahr[f]==5) // richtungwechsel fand statt wenn alle Werte auf/absteigend!
{
n[f]++;
richtung[f]=!richtung[f]; //letzte Werterichtung merken
}
} //f
} //e
if (n[0] == n[1]) // bei Zählergleichstand
{
spd0=spd1=170; // starten wir neu
n[0]=n[1]=0;
}
else if(n[0]<n[1]) // gleiches Spiel wie immer!
{
if(spd0<255)
{
spd0++;
}
else if(spd1>1) // aber nun vorsichtshalber mit Begrenzung
{
spd1--;
}
} else
{
if(spd1<255)
{
spd1++;
}
else if(spd0>1)
{
spd0--;
}
}
MotorDir(FWD,FWD);
MotorSpeed(spd0,spd1);
}
/* Beginn des Hauptprogramms */
int main (void){
Init(); //Prozessor initialisieren
while(1) // Endlosschleife
{
GeradeAus();
}
/* Schluss ! */
return 0;
}
Die Warnungen sind nun auch weg, die Indexe waren char, unsigned char war richtig.
Gruß und gute Nacht
mic
Lesezeichen