PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Am Abgrund umkehren



julli1202
09.03.2012, 18:46
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:

#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 -.-

radbruch
09.03.2012, 19:35
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.

julli1202
09.03.2012, 20:29
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 ^^


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 =)

oderlachs
09.03.2012, 21:03
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

radbruch
09.03.2012, 21:03
Ungetesteter Vorschlag:


#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;
}

julli1202
09.03.2012, 22:58
Danke
funktioniert wunderbar =)

Ich schätze mal das mit dem fehlenden Init(); war nen test =P

LG Juli

radbruch
09.03.2012, 23:06
Ups, ne, das war kein Test. Das hab ich irgendwie rausoptimiert. Sorry :)