PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro - Anfängerschwierigkeiten in C-Programmierung



benibaerenstark
02.08.2005, 19:10
Hallo zusammen!

Ich habe den Asuro zusammengebaut und er funktioniert soweit hervorragend. Nun habe ich aber schwierigkeiten mit der Programmierung des Roboters. Ich versuchte mich an einer simplen Motorsteuerung, doch der compiler meldet duzende Fehler, wo ich einfach keine entdecken kann! Ich nehme an erfahrenen C-Programmieren müssen die Fehler sofort auffallen! Tausend Dank fürs durchsehen.

code und fehlerstatistik:



#include "asuro.h"

int main(void)
{
Init();

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);

while (PollSwitch()==0);//fahren bis kollision

{MotorSpeed(0,0); //bei kollision, motoren abstellen
StatusLED(YELLOW);//nachdenken was passiert ist:


unsigned char taste;
taste = PollSwitch();


if (taste == 32 or taste == 48) //links kollidiert
{MotorDir(BREAK,RWD);
MotorSpeed(0,120);
Sleep(36);} //sollte ca 0.5sec "Pause" sein

else if (taste == 16 or taste == 8 or taste == 4 or taste == 2 or taste == 18) //einige Frontalkollisionen
{MotorDir(RWD,RWD);
MotorSpeed(120,120);
Sleep(36);

MotorDir(RWD,FWD);
Sleep(18);}

else if (taste == 1 or taste == 3)//rechts kollidiert
{MotorDir(RWD,BREAK);
MotorSpeed(120,0);
Sleep(36);}


else//unbekanntes kollisionsmuster
{
while(1)
{StatusLED(RED);

BackLED(ON,OFF);
Sleep(100);
BackLED(OFF,ON);
Sleep(100);}
}
}
} //nach dem "Ausweichen" wieder fahren

return 0;

}


Fehlerstatistik:

test.c: In function `main':
test.c:22: error: parse error before "or"
test.c:27: error: parse error before "else"
test.c:35: error: parse error before "else"
test.c: At top level:
test.c:41: error: parse error before "else"
test.c:46: error: parse error before numeric constant
test.c:46: warning: type defaults to `int' in declaration of `BackLED'
test.c:46: warning: function declaration isn't a prototype
test.c:46: error: conflicting types for `BackLED'
asuro.h:61: error: previous declaration of `BackLED'
test.c:46: warning: data definition has no type or storage class
test.c:47: error: parse error before numeric constant
test.c:47: warning: type defaults to `int' in declaration of `Sleep'
test.c:47: warning: function declaration isn't a prototype
test.c:47: error: conflicting types for `Sleep'
asuro.h:91: error: previous declaration of `Sleep'
test.c:47: warning: data definition has no type or storage class
test.c:48: error: parse error before numeric constant
test.c:48: warning: type defaults to `int' in declaration of `BackLED'
test.c:48: warning: function declaration isn't a prototype
test.c:48: warning: data definition has no type or storage class
test.c:49: error: parse error before numeric constant
test.c:49: warning: type defaults to `int' in declaration of `Sleep'
test.c:49: warning: function declaration isn't a prototype
test.c:49: warning: data definition has no type or storage class
test.c:57:2: warning: no newline at end of file
MAKE.EXE: *** [test.o] Error 1

linux_80
02.08.2005, 19:27
Hallo,

schau ma mal ...

in C gibts kein or bei der If abfrage, das heisst da ||

in der Zeile:

while (PollSwitch()==0);//...
gehört normalerweise kein ; am schluss, sonst ist die Schleife hier gleich geschlossen.

benibaerenstark
02.08.2005, 19:37
vielen Dank für die schnelle Antwort!

jetzt erscheint noch die Fehlermeldung:
"MAKE.EXE: *** Warning: Clock skew detected. Your build may be incomplete."

dies: while (PollSwitch()==0);//.. ist absichtlich so; er ist in der schleife und macht die obigen befehle (fahren), solange keine kollision stattgefunden hat.

habe ich das mit Sleep(36); richtig verstanden? er sollte eine halbe sekunde die vorankommenden befehle ausführen!

grüsse beni

linux_80
02.08.2005, 20:17
Mach mal ein make clean dann wird das Verzeichnis wieder aufgeräumt. Geht beim ASURO-quelltext mit der Batchdatei Test-clean.bat

Bei dem while passt was trotzdem nicht, denn die folgende Zeile beginnt mit einer geschweiften Klammer, also sollte das ; da nicht hin !

Sleep macht garnix und das in einer dauer die vom Wert abhängt, den man übergeben hat.
Wenn vorher die Motoren eingeschaltet wurden, fährt der Asuro dann solange mit diesen Werten.
Der Wert den man bei Sleep angibt berechnet sich aber etwas komplizierter, siehe Beschreibung, die dabei ist.
Ich hab jetzt nicht nachgeschaut ob das mit den 0.5 sec hinkommt !

benibaerenstark
03.08.2005, 17:56
Dankeschön für eure Antworten!

doch ich bin schon wieder auf eine solche Anfänger-Schwierigkeit gestossen :oops:

wie muss ich folgenden Code umändern? geht dies elegant, oder muss ich daraus 6 case-Fälle machen? So wie es jetzt ist, gibt er mir einen Fehler aus!



case 16||8||4||2||18||12: //frontal kollidiert
MotorDir(FWD,RWD);
MotorSpeed(140,150);
Msleep(1000);
break;

vielen Dank für eure Mühe!!

Andun
03.08.2005, 18:18
also du willst dohc darauf testen, ob überhaupt einer angeschlagen hat, oder?

Dann teste doch einfach auf >0.

So long

Andun

SprinterSB
03.08.2005, 19:01
die Syntax von switch ist:


switch (GANZZAHL)
{
case WERT1:
...
case WERT2:
...
case WERT3:
...
default:
...
}

Die ... sind der Code, der jeweils ausgeführt werden soll.
Mit 'break' wird der switch verlassen.
Fehl das 'break', wird im nächsten case (oder default) weitergemach.
Ansonsten ist die Reihenfolge der cases, default egal.
Also:


unsigned char taste;

// fahren bis kollision
while (0 == (taster = PollSwitch()))
;

//bei kollision, motoren abstellen
MotorSpeed(0,0);

//nachdenken was passiert ist:
StatusLED(YELLOW);

switch (taste)
{
//links kollidiert
case 32:
case 48:
MotorDir(BREAK,RWD);
MotorSpeed(0,120);
//sollte ca 0.5sec "Pause" sein
Sleep(36);

break;

//einige Frontalkollisionen
case 2:
case 4:
case 8:
case 16:
case 18:
MotorDir(RWD,RWD);
MotorSpeed(120,120);
Sleep(36);

MotorDir(RWD,FWD);
Sleep(18);

break;

//rechts kollidiert
case 1:
case 3:
MotorDir(RWD,BREAK);
MotorSpeed(120,0);
Sleep(36);

break;

//unbekanntes kollisionsmuster
default:
while(1)
{
StatusLED(RED);

BackLED(ON,OFF);
Sleep(100);
BackLED(OFF,ON);
Sleep(100);
}
} // switch (taste)

benibaerenstark
03.08.2005, 19:03
aha! grosses Dankeschön!

INGatRexroth
27.11.2007, 16:48
ich habe dieses proramm in mein PN kopiert und nach dem obengennanten geändert, es zeigt mir keine fehler an, aber wenn ich das dann geflsaht habe und schalte meinen asuro ein leuchten nur die satusled und die backled rot auf und mehr nicht...
was mache ich falsche...

und enbenbei... ich habe null erfahrung in C, nur das bisschen, was bei dem asruo dabei ist und das bringt mir meiner meinung nach nciht viel, da dort keine komplexeren programme erklärt werden und in diesem blauen heft auch sachen stehen, die mir wenig sagen...

asuroer
27.11.2007, 17:43
hi

also dein fehler war, dass du in deinem programm Sleep(36); geschreiben hast.
Das ist aber keine halbe sekunde, sondern ca. 1/2 ms.

also müsstest du entweder Msleep(500);
oder eine schleife nehmen:
int a;
for( a = 0;a < 500;a++){
Sleep(72);//ca. eine ms
}



MfG

Jan

INGatRexroth
27.11.2007, 20:56
hab meinen Asuro jetzt wie folgt programmiert:
#include "asuro.h"


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

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);

while (PollSwitch()==0)//fahren bis kollision
{
MotorSpeed(0,0); //bei kollision, motoren abstellen
StatusLED(YELLOW);//nachdenken was passiert ist:

unsigned char taste;
taste = PollSwitch();

if (taste == 32 || taste == 48) //links kollidiert
{
MotorDir(BREAK,RWD);
MotorSpeed(0,120);
for(a=0;a<500;a++)
{Sleep(72);}//ca. eine ms
} //sollte ca 0.5sec "Pause" sein

else if (taste == 16 || taste == 8 || taste == 4 || taste == 2 || taste == 18) //einige Frontalkollisionen
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for(a=0;a<500;a++)
{Sleep(72);}

MotorDir(RWD,FWD);
for(a=0;a<500;a++)
{Sleep(72);}}

else if (taste == 1 || taste == 3)//rechts kollidiert
{
MotorDir(RWD,BREAK);
MotorSpeed(120,0);
for(a=0;a<500;a++)
{Sleep(72);}}


else//unbekanntes kollisionsmuster
{
while(1)
{StatusLED(RED);

BackLED(ON,OFF);
Sleep(100);
BackLED(OFF,ON);
for(a=0;a<500;a++)
{Sleep(72);}}
}
}
}//nach dem "Ausweichen" wieder fahren

return 0;

}
(alt+c)

wenn ich ichn jetzt einschalte leuchten wieder meine BackLED und meine StatusLED rot und mehr macht das gute stück dann nicht mehr...

asuroer
27.11.2007, 22:13
hi

du hast in die while schleife while (PollSwitch()==0)
du hättest aber schreiben müssen : while (PollSwitch()!=0)
denn nun hast du "befohlen", dass der asuro ausweicht, wenn kein schalter gedrückt ist.
Ich denke wenn du das änderst müsste es eig funktionieren.

MfG

Jan