Hallo InFaIN,
den vorgeschlagenen Ansatz von hai1991 kann ich nur unterstützen.
Hier ist mal eine formatierte Version. Es ist nichts geändert, sondern nur mal ordentlich eingerückt. Dann wird der Fehler auch sichtbar.
Code:
#include "asuro.h"
#define TRIGGERLEVEL 655
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
#define GESCHW 65
int main (void)
{
unsigned int z, ll, rr;
unsigned char taste1, taste2 ,taste3, taste4;
unsigned int data [2];
signed int status [2] = {0, 0};
signed int difference = 0;
int lData [2];
int i, donl, doffl, donr, doffr, l, r;
MotorDir (FWD, FWD);
Init ();
while (1)
{
taste4 = PollSwitch ();
taste2 = PollSwitch ();
taste1 = PollSwitch ();
taste3 = PollSwitch ();
if (taste1 &&
taste1 == taste2 &&
taste3 == taste4 &&
taste1 == taste3 &&
taste1 == taste4)
{
ll = 0;
rr = 0;
if (taste1 == 1)
{
//////////////////////////////////////////////
///// Kolision
//////////////////////////////////////////////
while (1)
{
taste4 = PollSwitch ();
taste2 = PollSwitch ();
taste1 = PollSwitch ();
taste3 = PollSwitch ();
if (taste1 &&
taste1 == taste2 &&
taste3 == taste4 &&
taste1 == taste3 &&
taste1 == taste4)
{
l = 0;
r = 0;
if (taste1 == 1) { l = 120; r = 0; }
if (taste1 == 2) { l = 0; r = 160; }
if (taste1 == 4) { l = 0; r = 120; }
if (taste1 == 8) { l = 120; r = 0; }
if (taste1 == 16) { l = 160; r = 0; }
if (taste1 == 32) { l = 0; r = 120; }
StatusLED (RED);
MotorDir (RWD, RWD);
MotorSpeed (l, r);
for (z = 0; z < 250; z++)
{
Sleep (255);
}
}
else
{
StatusLED (GREEN);
MotorDir (FWD, FWD);
MotorSpeed (120, 120);
}
taste2 = 0;
taste1 = 0;
}
return 0;
//////////////////////////////////////////////
///// Kolision
//////////////////////////////////////////////
}
if (taste1 == 2)
{
//////////////////////////////////////////////
///// Odometer
//////////////////////////////////////////////
while (1)
{
// 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++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if (status [0] == HIGH &&
data [0] < TRIGGERLEVEL - HYSTERESIS)
{
status [0] = LOW;
difference++;
}
// 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?ler
// den erlaubten Wertebereich verl?st
if (difference <- 255)
difference = -255;
if (difference > 255)
difference = 255;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED (status [0] + status [1] * 2);
// Zaeldifferenz passend auf die Motoren verteilen
if (difference > 0)
MotorSpeed (255 - difference - 50, 255 - 50);
else
MotorSpeed (255 - 50, 255 + difference - 50);
}
return 0;
//////////////////////////////////////////////
///// Odometer
//////////////////////////////////////////////
}
if (taste1 == 4)
{
//////////////////////////////////////////////
///// Linien
//////////////////////////////////////////////
while (1)
{
FrontLED (OFF); // Umgebungslicht filtern
Sleep (10); // kurz warten bis LED aus
LineData (lData); //
LineData (lData); //
doffl = lData [0]; //
doffr = lData [1]; //
FrontLED (ON); //
Sleep (10); // kurz warten bis LED an
LineData (lData); //
LineData (lData); //
donl = lData [0]; //
donr = lData [1]; //
l = donl - doffl; //
r = donr - doffr; // r und l sind nun die werte von T9 und
// T10 mit gefiltertem Umgebungslicht
i = (l + r) / 2;
if (l < r) // gegenlenken
{
MotorSpeed (GESCHW - i + 68, GESCHW + i);
}
else
{
MotorSpeed (GESCHW + i + 68, GESCHW - i);
}
}
return 0;
//////////////////////////////////////////////
///// linien
//////////////////////////////////////////////
}
if (taste1 == 8) { l = 120; r = 0; }
if (taste1 == 16) { l = 160; r = 0; }
if (taste1 == 32) { l = 0; r = 120; }
StatusLED (RED);
taste2 = 0;
taste1 = 0;
}
return 0;
}
}
Wird jetzt mal alles aus dem ersten if() in der while()-Schleife hinter dem Init() entfernt, bleibt nur noch folgendes übrig:
Code:
#include "asuro.h"
#define TRIGGERLEVEL 655
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
#define GESCHW 65
int main (void)
{
unsigned int z, ll, rr;
unsigned char taste1, taste2 ,taste3, taste4;
unsigned int data [2];
signed int status [2] = {0, 0};
signed int difference = 0;
int lData [2];
int i, donl, doffl, donr, doffr, l, r;
MotorDir (FWD, FWD);
Init ();
while (1)
{
taste4 = PollSwitch ();
taste2 = PollSwitch ();
taste1 = PollSwitch ();
taste3 = PollSwitch ();
if (taste1 &&
taste1 == taste2 &&
taste3 == taste4 &&
taste1 == taste3 &&
taste1 == taste4)
{
}
return 0;
}
}
Das geht zwar durch den Compiler, aber dieses Programm verläßt die main()-Funktion mehr oder weniger sofort nach dem einschalten wieder. Und das ist leider falsch.
Wenn alle 'return 0'-Zeilen entfernt werden sollte es auf alle Fälle schon mal besser gehen.
Wird der Asuro eingeschalte, sollte das 'Menü' aktiv sein:
- Taste1 = 1: Kollision
- Taste1 = 2: Odometer
- Taste1 = 4: Linien
- Taste1 = 8: Variablen l und r setzen, aber nichts weiteres.
- Taste1 = 16: Sollten hier Motorbewegungen angestoßen werden?
- Taste1 = 32: Es scheint dann ein MotorSpeed() zu fehlen
Ob die Funktionen bei Taste1 = 1, 2, 4 gehen weiss ich nicht.
Das formatieren kostet viel überflüßige Zeit, wenn man es nicht sofort macht.
Gruß Sternthaler
P.S.: Versuch einmal, ob der Asuro anders reagiert, wenn du sofort nach dem Einschalten einen der ersten 3 Taster drückst.
Dann sollte das 'Menü' ja schon ausgewählt werden. Aber ob dann nicht die 4-fach-Tastenabfrage blockiert?
Lesezeichen