-
Am Abgrund umkehren
Hallo liebe Community,
ich steh noch ziemlich am Anfang der C Programmierung...
Hab mich jetz mal an einem Programm versucht, dass ASURO solange geradeaus fahren lässt, bis der Untergrund um 20 dunkler wird, als der eingelesene Wert...
Dann soll er mit voller Kraft zurückfahren, ein stück nach Rechts drehen und dann wieder gerade aus.
Hier mal der Code:
Code:
#include "asuro.h"
int main(void)
{
FrontLED(ON); //Front LED an
unsigned int Data2;
LineData(Data2);
int STOP = Data2-20; //STOP wert Berechnen
while(1)
{
unsigned int lineData[2];
LineData(lineData);
while (((lineData[0] < STOP) && (lineData[1] < STOP)) || ((lineData[0]+lineData[1]) < (2*STOP))) //solange bis der eingelesene wert dunkler wird als STOP
{
MotorDir(FWD,FWD);
MotorSpeed(180,180);
BackLED(ON,ON);
}
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(ON,ON);
Msleep(5000);
MotorSpeed(180,0);
Msleep(2000);
MotorSpeed(0,0);
}
return 0;
}
Es lässt sich fehlerfrei kompolieren, jedoch tut asuro gar nichts, nichtmal die frontLED geht an?!
Kann sich das mal jemand anschauen?
Hab schon im forum gesucht, aber keine lösung im forum gefunden -.-
-
Hallo
Ich habe die "Fehlersuche" beim fehlenden Init() abgebrochen:
int main(void)
{
Init();
....
Gruß
mic
P.S.:
Also da möchte ich doch mal ein großes Lob aussprechen. Dein Startbeitrag ist ja wirklich vorbildlich:
- Info zur eigenen Befähigung
- Funktion des Programms
- Kompilierbarer Quellcode
- Beschreibung der erreichten Funktion
- Eigeninitiative bei der Suche nach einer Lösung
Leserlich formuliert und alles drin was man für eine vernünftige Antwort benötigt. Klasse, Glückwunsch, willkommen im RN-Forum.
-
Hallo
danke, schön zu hören :)
Dann darf ich eure Hilfe bestimmt noch einmal in anspruch nehmen =P
Hier mal der verbesserte Code. Btw. danke für den Init(); Hinweis ^^
Code:
include "asuro.h"
int main(void)
{
Init();
FrontLED(ON); //Front LED an
int Data2[2];
LineData(Data2); //STOP wert einlesen
int STOP = Data2 - 10; //STOP wert speichern und eine Toleranz von 10 abziehen
while(1)
{
unsigned int lineData[2];
LineData(lineData);
while (lineData[0] < STOP) //solange bis der eingelesene wert dunkler wird als STOP
{
MotorDir(FWD,FWD);
MotorSpeed(180,180);
BackLED(ON,ON);
}
MotorDir(RWD,RWD); //Zurück und nach rechts drehen
MotorSpeed(255,255);
Msleep(5000);
MotorSpeed(180,0);
Msleep(2000);
MotorSpeed(0,0);
}
return 0;
}
Er fährt jedoch nur geradeaus, ohne den Untergrund zu beachten.
Mein verdacht ist, dass irgendwas beim einlesen des STOP Wertes falsch läuft.. Ich weiß jedoch nicht was <.<
(btw. ich habe die bedingung für die while schleife mal vereinfacht, um dort einen Fehler auszuschließen.)
LG Juli =)
-
Ich habe es schnell mal überflogen , kann sein das ich mich täusche aber einmal "LineData" und dann "lineData" ..C macht schon einen Unterschied zwischen Line.. und line... ich meine lineData bei ..
LineData(lineData);
while (lineData[0] < STOP)...
Gerhard
-
Ungetesteter Vorschlag:
Code:
#include "asuro.h"
int main(void)
{
unsigned int lineData[2], STOP[2]; // Stopwert seitenabhängig verwalten
FrontLED(ON); // Front LED an
Sleep(10); // auch eine LED leuchtet nicht schlagartig
LineData(lineData); // Dummylesung, weil die erste Lesung meist fehlerhaft ist
LineData(lineData);
STOP[0] = lineData[0]-20; // STOP wert Berechnen (links)
STOP[1] = lineData[1]-20; // STOP wert Berechnen (rechts)
while(1)
{
MotorDir(FWD,FWD); // vorwärts cruisen...
MotorSpeed(180,180);
BackLED(ON,ON);
do
LineData(lineData);
while ((lineData[0] > STOP[0]) && (lineData[1] > STOP[1])); //solange bis der eingelesene wert dunkler wird als STOP
MotorDir(RWD,RWD); // zurücksetzen
MotorSpeed(255,255);
BackLED(OFF,OFF);
Msleep(5000);
MotorSpeed(180,0);
BackLED(OFF,ON);
Msleep(2000);
MotorSpeed(0,0);
}
return 0;
}
-
Danke
funktioniert wunderbar =)
Ich schätze mal das mit dem fehlenden Init(); war nen test =P
LG Juli
-
Ups, ne, das war kein Test. Das hab ich irgendwie rausoptimiert. Sorry :)