Dein Glück, dass ich gerade Langeweile hatte... da kam mir dein Problem gerade recht
Also, ich würde dir 3 Sachen raten:
1. Quelltext kommentieren.
Entgegen der landläufigen Meinung, man kommentiere nur für andere, ist es sehr hilfreich sich mit Kommentaren Notizen in den Quelltext zu schreiben. Wozu dient die Quellcodepassage? Erläuterungen etc...
2. In Funktionen denken
Programmteile, die wiederholt vorkommen, in Funktionen packen.
3. Sprechende Variablen
Variablen- und Funktionsnamen möglichst nach ihrer konkreten Anwendung benennen.
Das mag erstmal komisch klingen als Antwort auf dein konkretes Problem. Aber durch diese simplen 'Regeln' wird dein Quellcode sehr viel lesbarer und die Probleme werden sehr viel leichter erkennbar.
Ich hab deinen Code mal umgeschrieben, um am Beispiel zu zeigen, was ich meine:
Code:
#include "asuro.h"
// Ausgabe einer Integer-Variablen
void printInt(int wert) {
char text[6] = {0};
itoa(wert, text, 10);
SerWrite(text, strlen(text));
}
// Tastenabfrage mit Entprellung
// fragt Hindernistaster ab
unsigned char isHindernis() {
return PollSwitch() || PollSwitch() || PollSwitch();
}
// Richtungen definieren
enum Richtung {LINKS, RECHTS};
// Drehung um 90 Grad
void drehen(char richtung) {
if (richtung == LINKS) {
MotorDir(RWD, FWD);
}
else {
MotorDir(FWD, RWD);
}
MotorSpeed(120, 120);
for (i = 1; i < 120; i++) {Sleep(255);}
}
// kurzes Stück rückwärts fahren
void zuruecksetzen() {
MotorDir(RWD, RWD);
MotorSpeed(120, 120);
for (i = 1; i < 80; i++) {Sleep(255);}
}
void geradeausfahren() {
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
int main(void)
{
Init();
int gefahreneStrecke;
int i;
// Endlosschleife (loop)
while(1)
{
// Los gehts!
geradeausfahren();
// solange fahren, bis Hindernis detektiert
while (!isHindernis() ) { }
// Aha, ein Hindernis!
zuruecksetzen();
drehen(RECHTS);
geradeausfahren();
// solange fahren, bis Hindernis detektiert oder Mindestentfernung zurückgelegt
gefahreneStrecke = 0;
while (!isHindernis() && gefahreneStrecke <= 30) { gefahreneStrecke++; }
// Mindestentfernung zurückgelegt?
if (gefahreneStrecke > 30)
{
// loop neu starten
continue;
}
// Aha, rechts ist eine Wand!
zuruecksetzen();
drehen(LINKS); // 90° drehen
drehen(LINKS); // 90° drehen -> 180° gedreht
geradeausfahren();
// solange fahren, bis Hindernis detektiert oder Mindestentfernung zurückgelegt
gefahreneStrecke = 0;
while (!isHindernis() && gefahreneStrecke <= 30) { gefahreneStrecke++; }
// Mindestentfernung zurückgelegt?
if (gefahreneStrecke > 30)
{
// loop neu starten
continue;
}
// Aha, links ist auch eine Wand!
// Also Sackgasse gefunden
zuruecksetzen();
// drehen Richtung Ursprung
drehen(LINKS);
}
return 0;
}
Da ich kein Asuro besitze, kann ich den Code nicht testen, aber ich bin sicher, falls ich Fehler gemacht habe, wirst du sie leicht finden.
Lesezeichen