PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Errors im Quellcode



Kieselstein
15.05.2008, 20:31
Hallo Roboterfreaks O:)
Habe mir vor kurzem einen ASURO zugelegt und bin total gefesselt.
Heute hab ich mich daran gemacht meinen ersten Quellcode für den ASURO zu tippen. Es hagelte immer wieder Errors trotz! abspeicherns vor dem kompilieren! (Der Quellcode war 100% richtig und flashen funktionierte auch reibungslos)
Einmal hat es i-wie durch Zufall geklappt aber danach nie wieder -.-
Nach 4 stunden ausprobierens hab ich mich entschlossen hier mein prob zu posten.
Also hier mein Quellcode:


#include "asuro.h"

int main(void) {
Init()
MotorDir(FWD,FWD);
MotorSpeed(10,10);
while (1) {
if (PollSwitch()>0) {MotorDir(OFF,FWD);}
else {MotorDir(FWD,FWD);}
}
}

Ich hatte vor dass der ASURO gerade aus fährt bis er auf ein Hindernis prallt, dann sollte er sich nach links drehen und wieder gerade aus fahren.
Jedoch hagelt es immer wieder errors -.-
Hier sind sie:

C:\Programme\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:7: error: parse error before "while"
test.c:11:2: warning: no newline at end of file
make: *** [test.o] Error 1

> Process Exit Code: 2

Es kommen andauernd i-welche nervigen parse... fehler :'(

Könnt ihr mir vll helfen meinen ASURO zum fahren zu bringen?
DANKE an alle Antworten!

MFG Kieselstein

Arexx-Henk
15.05.2008, 20:46
Hallo,

test.c:7: error: parse error before "while"


Init() sollte Init(); sein



test.c:11:2: warning: no newline at end of file

kein fehler, wenn am ende vom Datei z.B. nur

}x

steht,
x = position deine Maus Cursor am ende vom Datei,
dann dort nur mal auf die Enter Taste drucken so dass ein 'newline' Karakter zugefugt wird am ende vom Datei und es so aussieht:

}
x


Gruss,

Henk

uwegw
15.05.2008, 21:07
Nach dem Init() fehlt ein Semikolon...

Grundsätzlich sollte man bei solchen Fehlermeldung von der beanstandeten Zeile aus nach oben hin alles noch mal genau durchgehen. In den allermeisten Fällen fehlt bloß ein Semikolon oder eine Klammer. Zu beachten ist, dass der Fehler durchaus mehrere Zeilen über der beanstandeten Stelle liegen kann.

Kieselstein
15.05.2008, 21:44
Hat tatsächlich nur an dem ";" hinter dem init gelegen :-D
Ich hatte eig gedacht ich hätte es auch mit semikolon ausprobiert und es habe nicht geklappt. Naja is ja jetzt auch egal!
und das mit dem

}
x

war am ende doch nicht mehr nötig weiß der geier warum^^

Danke nochmal!!

Kieselstein
16.05.2008, 16:45
Hallo Leute!
Ich habe nochmal eine Frage:
Wie kann man dies im Code realisieren?

[flash width=300 height=300 loop=false:711e5bd554]http://kieselstein.ki.funpic.de/asuro.swf[/flash:711e5bd554]

Klickt bei der Animation mit Rechtsklick auf abspielen!!

THX an alle Antworten!

radbruch
16.05.2008, 18:05
Hallo

Wenn du in der Forumsuche (https://www.roboternetz.de/phpBB2/search.php) "asuro AND kollision" (ohne ") eingibst kannst du dich ins Thema einlesen. Meist sind die Threads mit vielen Antworten die lehrreichsten...

Gruß

mic

Kieselstein
16.05.2008, 20:57
Danke für den Tipp leider hab ich nichts sinnvolles gefunden.
Ich probiere einfach selbst ein bisschen rum und wenns überhaupt nicht klappen sollte schreib ich einfach wieder hier ins Forum ;-)

MFG Kieselstein

(Vorschläge sind trotzdem noch willkommen O:) )

radbruch
16.05.2008, 21:58
Hallo


leider hab ich nichts sinnvolles gefunden
Oje. Na im Prinzip ist es einfach: Vorwärts fahren bis ein Taster gedückt wird (Achtung! PollSwitch() "lügt" häufig, vor allem wenn die Motoren laufen), dann kurze Zeit drehend rückwärts und anschliesend alles wieder von Vorne.

Anzumerken wäre noch, dass es der asuro nicht schafft innerhalb des Tastenhubs anzuhalten. Das bedeutet, er knallt immer voll gegen das Hinderniss. Deshalb sind die Taster als Kollisionserkennung die letzte Notbremse. Deutlich besser sind IR- oder Ultraschallabstandsmessungen.

Mein erster Versuch mit der Hindernisserkennung per Taster sah mal so aus:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=240995

Gruß

mic

Kieselstein
16.05.2008, 23:32
So hatte ich das auch gemacht jedoch ist dabei das Problem, dass der Befehl nur ausgeführt wird SOLANGE PollSwitch aktiviert ist.

So hat das bei mir ausgesehen:
--> ASURO fährt vorwärts
--> Hindernis also PollSwitch
--> ASURO fährt kurz zurück
--> PollSwitch nicht mehr aktiv also --> wieder gegen das Hindernis

Ich muss dem ASURO i-wie klar machen das der Befehl rückwärts zu fahren ausgeführt wird wenn PollSwitch gewirkt HAT und nicht nur wenn er gerade noch wirkt

Ich will bloß verstehen wie das realisierbar ist:

dann kurze Zeit drehend rückwärts und anschliesend alles wieder von Vorne.

Ich hoffe du verstehst mein Prob^^

MFG Kieselstein

radbruch
17.05.2008, 00:06
Sehe ich das richtig, dir fehlt die Verzögerung? Dann solltest du mal in der asuroanleitung unter Sleep() (Kapitel 9.2.5) nachschauen:


#include "asuro.h"

unsigned int i;

int main(void)
{
Init();
while(1)
{
if(PollSwitch() == 0)
{
StatusLED(RED);
}
else
{
StatusLED(YELLOW);
for(i=0; i<1000; i++) Sleep(72); // bei neueren Libs 36 für 1/1000sec
}
}
return(0);
}
Anstelle der StatusLED kommen dann die Motorfunktionen...

[Edit]
Weil ich heute unterwegs bin hier noch vorsorglich der Code mit sicherer Tastenabfrage:

#include "asuro.h"

unsigned int i;

int main(void)
{
Init();
while(1)
{
if(PINC & (1<<PC4)) // Tasteneingang direkt abfragen
{
StatusLED(RED);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
else
{
StatusLED(YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(0,150);
for(i=0; i<1000; i++) Sleep(72); // bei neueren Libs 36 für 1/1000sec
}
}
return(0);
}

Kieselstein
17.05.2008, 11:36
Cool danke ich glaube das ist die Lösung auf mein Problem O:)

Ich probiers gleich einmal aus 8)

MFG Kieselstein

Kieselstein
17.05.2008, 15:27
Oh man ich komme mir richtig bescheuert vor -.-
Ich habe die Verzögerung jetzt zwar hinbekommen jedoch macht der ASURO nicht das was ich will:


#include "asuro.h"

unsigned int i;

int main(void)
{
Init();
while(1)
{
if(PollSwitch() == 0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(150,150);
for(i=0; i<4000; i++) Sleep(72);
}
}
return(0);
}

Setzt man anstatt MotorDir und MotorSpeed wie oben bei dir StatusLED ein funktionierts, aber ansonsten i-wie nicht -.- Das ergibt für mich keinen Sinn aber es ist nunmal so^^

Der ASURO fährt gleich von anfang an rückwärts und hört dann nicht mehr auf, nicht einmal wenn PollSwitch aktiv ist -.-

Ich hab ALLES mögliche ausprobiert und nie hat es funktioniert ich weiß nich mehr weiter :'(

MFG Kieselstein

pinsel120866
17.05.2008, 16:05
Hi Kieselsteín,

das liegt wahrscheinlich daran, dass Pollswitch von Anfang an aktiv ist.

Ich empfehle die folgendes an Anfang einzufügen:

for(i=0;i<10;i++)
{
PollSwitch();
}
Damit ist sichergestellt dass alle Taster nicht logisch "gedrückt" sind.

Kieselstein
17.05.2008, 17:18
Danke für den Tipp!
Jedoch fährt mein ASURO jetzt nur noch geradeaus xD

Aber das Problem ist schon richtig. ASURO erkennt PollSwitch von Anfang an aktiv oder inaktiv an und entscheidet sich dann für einen Weg in der IF-Anweisung.

Ich hasse diese verdammte PollSwitch-Anweisung^^

MFG Kieselstein

hai1991
17.05.2008, 17:37
hallo kieselstein,

versuch doch mal das ergebnis von PollSwitch() in eine variable zu speichern und ein zweits mal auf zu rufen, um fehler zu vermeiden. etwa so:



do
{
t=PollSwitch();
}while(t != PollSwitch() );


durch den zwiemaligen aufruf werden fehler ausgefiltet

in deinem programm musst du natürlich danach auch mit t abfragen



if( t == 0) //...

Kieselstein
17.05.2008, 18:10
JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!
DANKE hai1991!!!!

nachdem ich heute bestimmt 5 stunden an meinem ASURO rumexperimentiert habe funktioniert es endlich durch deinen Vorschlag :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)

HIER DIE WUNDERBARE LÖSUNG:


#include "asuro.h"

unsigned int i;
unsigned int t;



int main(void)
{
Init();
while(1)
{
do {
t=PollSwitch();
if(t == 0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}

else
{MotorDir(BREAK,RWD);}
{MotorSpeed(150,150);}
{for(i=0; i<1500; i++) Sleep(72);}
}
while(t != PollSwitch() );
}
return 0;
}


Du glaubst gar nicht wie dankbar ich dir bin!

DANKE DANKE DANKE^^

hai1991
17.05.2008, 18:33
ich hätte es zwar etwas anders gedacht, aber wenn es so auch funktioniert ist es auch schon

mein vorschlag wäre so gewesen:


#include "asuro.h"

unsigned int i;
unsigned int t;



int main(void)
{
Init();
while(1)
{
do {
t=PollSwitch();
}while(t != PollSwitch() ); //diese schleife wird erst beendet, wenn PollSwitch zwei mal hinter einander den selben wert liefet
if(t == 0) //überprüfung ob ein taster gedrückt ist
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}

else
{MotorDir(BREAK,RWD);}
{MotorSpeed(150,150);}
{for(i=0; i<1500; i++) Sleep(72);}

}
return 0;
}


die do-while schleife habe ich eingebaut, weil PollSwitch() bei laufenden Motoren manchmal fehlerhafte ergebnisse liefert, diese sind aber selten zweimal hinter einander. daher braucht man nur zu warten bis man zwei mal den selben wert bekommt, und dann mit dem normalen programm fortsetzen

weiter hin noch viel spaß und erfolg beim experimentiern / spielen mit asuro