PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hindernisausweichprogramm-Asuro fährt nur rükwerz



Sebastian F.
01.11.2008, 12:24
Hallo leute,

ich habe ein Programm zum Hindernisausweichen geschriben. Dieses programm funktionirt aber nicht.
WARUM?
#include "asuro.h"

int main(void)
{

Init();
int zaeler;

StatusLED(YELLOW);
MotorDir(FWD,FWD);
while(1){

if (PollSwitch()>0) {
if (PollSwitch()>0){
MotorDir(RWD,RWD);
for (zaeler=0; zaeler<300; zaeler++) {
Sleep(255);}
for (zaeler=0; zaeler<30; zaeler++) {
FrontLED(ON);
MotorSpeed(140,140);
Sleep(250);}
MotorSpeed(0,0);
for (zaeler=0; zaeler<100; zaeler++) {
MotorDir(FWD,RWD);
MotorSpeed(250,250);
Sleep(250);}}}
else {FrontLED(OFF);}
else {MotorDir(FWD,FWD);
MotorSpeed(140,140);}
}
return 0;
}
:cry: :cry: ](*,)

zerush
01.11.2008, 14:33
Vielleicht solltest du etwas genauer beschreiben, was nicht funktioniert?
Kompiliert es nicht oder macht er nicht das, was du erwartest?

radbruch
01.11.2008, 14:41
Hallo,

willkommen im RN-Forum.

Irgendwie bist du über deine Klammern gestolpert, ich konnte dein Programm nicht fehlerfrei übersetzen:


avr-gcc -mmcu=atmega8 -Os -mno-interrupts -funsigned-char -funsigned-bitfields -Wall -Wstrict-prototypes -ggdb -c -DF_CPU=8000000UL -Wa,-acdhlmns=temp.lst temp.c -o temp.o
temp.c: In function `main':
temp.c:28: error: syntax error before "else"
temp.c: At top level:
temp.c:31: error: syntax error before "return"
make: *** [temp.o] Error 1
2

Nachdem ich deinen Code etwas umgestellt habe (ich finde das so übersichtlicher, aber jeder kann's machen wie er will!) funktioniert es fast:

#include "asuro.h"

int main(void)
{
Init();
int zaehler;

StatusLED(YELLOW);
MotorDir(FWD,FWD);
while(1)
{
if (PollSwitch()>0)
{
if (PollSwitch()>0)
{
StatusLED(YELLOW);
MotorDir(RWD,RWD);
for (zaehler=0; zaehler<300; zaehler++)
{
Sleep(255);
}
for (zaehler=0; zaehler<30; zaehler++)
{
FrontLED(ON);
MotorSpeed(140,140);
Sleep(250);
}
MotorSpeed(0,0);
for (zaehler=0; zaehler<100; zaehler++)
{
MotorDir(FWD,RWD);
MotorSpeed(250,250);
Sleep(250);
}
}
else
{
FrontLED(OFF);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(140,140);
}
}
return(0);
}

Da mein asuro zur Zeit keine Räder hat weiß ich allerdings nicht, ob er sich wie gewünscht bewegt. Das FrontLED(OFF) muss wohl in den else-Zweig der ersten if-Abfrage, sonst geht die LED nie mehr aus. (Außer man läßt den Taster genau nach dem ersten if los ;)

Die zusätzlichen StatusLED-Befehle dienen dem debuggen, damit man sieht, was er grad treibt.

Noch ein Tipp: Möglicherweise stört ein zu häufiges MotorSpeed(x,x); die PWM, deshalb sollte man solche Dinge:

for (zaehler=0; zaehler<100; zaehler++)
{
MotorDir(FWD,RWD);
MotorSpeed(250,250);
Sleep(250);
}

besser so formulieren:

MotorDir(FWD,RWD);
MotorSpeed(250,250);
for (zaehler=0; zaehler<100; zaehler++)
{
Sleep(250);
}


Gruß

mic

Sebastian F.
06.11.2008, 17:37
Danke jetzt funktionirz!