PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Wichtig]Was ist falsch?



NicMaxFen
05.02.2012, 17:09
Könnt ihr mir helfen?
Ich hab den Asuro mal wieder ausgepackt und wollte malwieder ein Programm draufwerfen. Aber der sagt mir ein error! Hier mal das Programm:

[#include "asuro.h"
int main(void){
Init();
while(1){
do {
MotorSpeed(112,100);
MotorDir(RWD,RWD);
StatusLED(RED);
BackLED(ON,ON);
}
while (PollSwitch()==0);
{
else
MotorSpeed(112,100);
MotorDir(FWD,FWD);
StatusLED(GREEN);
FrontLED(ON);}
}
}


Und den error wenn ich "make" mache:

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:13: error: parse error before "else"
make: *** [test.o] Error 1

> Process Exit Code: 2]--> Gelöst

Bitte um schnelle Hilfe ist für meine Technik Fachinterne.

Thegon
05.02.2012, 17:14
Wer oder was sagt Error?
Der Compiler? Oder der Programmer? Oder der Asuro, wie auch immer?
Eine etwas genauere Fehlerbeschreibung könnte es einfacher machen, den Fehler zu erkennen ;-)

Mfg Thegon

NicMaxFen
05.02.2012, 17:18
habs editiert sag einfach wenn was fehlt

masasibe
05.02.2012, 17:37
Hallo NicMaxFen,
hab den Code gerade überflogen.
Bei der 2. While-Schleife hast du zuerst
einen Strichpunkt gemacht und dann eine
geschweifte Klammer auf, aber das While ist mit dem
Strichpunkt schon abgeschlossen, also lösche den Strichpunkt einmal
weg!
Außerdem fällt mir auf, dass vor dem Else gar kein if steht!

mfg masasibe

NicMaxFen
05.02.2012, 17:52
[WICHTIG] Ah ok ty und könnt ihr mir pls sagen wie ich das mach, das Der roboter mehr als 2 Befehle ausfürt:
z.B:
Er fäht nach vorne----> Stößt an----> Dreht sich---->Stößt wieder an----> Fährt rückwärts

Ich weis nicht wie ich das machen soll und find nichts . Ich weiß auch garnicht wie sowas aussieht
IIIIIIIIIIIIIII
IIIIIIIIIIIIIII
IIIIIIIIIIIIIII
VVVVVVVV
Bitte Hier beschäftigen

masasibe
05.02.2012, 18:40
Bitte keine solche Eile!

Du kannst das z.B. mit einer Wartefunktion der delay.h Bibliothek machen.
Wenn der Asuro vorne angestoßen ist, setzt du die Motoren so, dass der Asuro
die Kurve fährt und führst dann einen Wartebefehl aus. Du musst halt ausprobieren
wieviel Zeit dein Asuro braucht um sich so weit zu drehen wie du möchtest.
Nach dem Wartebefehl setzt du dann die Motoren wieder auf vorwärts oder rückwärts
oder wie du das halt möchtest usw.
Vorteil der Wartefunktion ist, dass man das sehr schnell und einfach programmieren kann.
Der Nachteil ist aber, dass der Asuro sich´, während der Wartebefehl ausgeführt wird,
um nichts anderes kümmern kann.


Die andere Möglichkeit wäre die Verwendung eines Timers. Ein Timer löst immer nach einer
gewissen Zeit eine bestimmte Routine die sogenannte Interrupt-Service Routine aus und so
könntest du auch den Asuro eine gewisse Zeit drehen und dann wieder vorwärts fahren lassen.
Über die genaue Verwendung eines Timers liefert dir Google die Antwort! ;-)

NicMaxFen
06.02.2012, 15:55
Muss ich für delay.h ihrgend eine Dati runterladen oder einfach nur einfugen: #include "delay.h" und dann wo ichs brauch
"void _delay_ms(double ms)"

masasibe
06.02.2012, 16:42
Das solle eigentlich auch ohne etwas herunterzuladen mit dem Befehl: #include <avr/delay.h> gehen,
aber probiere es doch einfach aus und schau, ob der Compiler
eine Fehlermeldung ausspuckt! ;-)

Das kannst du dir übrigens auch noch durchlesen:
http://www.rn-wissen.de/index.php/Warteschleife
Da geht es um Warteschleifen und wann sie vom Compiler wegoptimiert wird.
Ganz unten steht auch etwas über die delay.h

mfg masasibe

NicMaxFen
07.02.2012, 19:48
So ich hab mal des mit der delay.h und so probiert und der Compiler hat mir dann ein Error rausgegeben:

Programm:
#include "asuro.h"
#include <avr/delay.h>
int main(void){
Init();
while(1)
MotorSpeed(112,100);
MotorDir(FWD,FWD);
StatusLED(GREEN);
while (PollSwitch()==0){
_delay_ms(200);
MotorSpeed(112,0);
MotorDir(FWD,FWD);
StatusLED(YELLOW);
FrontLED(ON);
if (PollSwitch()>0){
_delay_ms(200);
MotorDir(RWD,RWD);
MotorSpeed(112,100);
StatusLED(RED);
BackLED(ON,ON);
FrontLED(ON);}
else
_delay_ms(200);
MotorDir(FWD,FWD);
MotorSpeed(112,0);
StatusLED(YELLOW);
FrontLED(ON);}
}


/edit: ok habs problem gelöst.
Könnte jeman trotzdem noch drüber schauen

/edit: mhmm er macht nur das was in dem Ersten befehl steht

ePyx
07.02.2012, 20:18
Probier mal #include <util/delay.h> dann wirds was. Btw. benutz mal die Code-Tags.

Außerdem fehlen noch geschweifte Klammern bei den if/else-Blöcken.


Bin in dem Ganzen noch unerfahren! Dann solltest du, wenn du es ernst meinst, dir die Tutorials anschauen.

NicMaxFen
07.02.2012, 21:08
So ich hab jetzt noch mal ein einfaches Geschrieben. aber er fängt immer schon im Glauen Bereic an:

#include "asuro.h"
int main(void){
Init();
MotorSpeed(112,100);
MotorDir(FWD,FWD);
StatusLED(GREEN);
if (PollSwitch()>0){
MotorSpeed(112,100);
MotorDir(RWD,FWD);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(RED);}
else {
MotorSpeed(100,0);
MotorDir(RWD,BREAK);
StatusLED(YELLOW);}
Sleep (255);
if (PollSwitch()>0){
MotorSpeed(112,100);
MotorDir(RWD,RWD);
StatusLED(RED);
BackLED(ON,ON);}
}

Valen
07.02.2012, 21:47
Nein, er fangt dort nicht an... das ist das Letzte was er macht. Jedenfalls, was du beobachten kann. Danach wartet er 255/72000 von einer Sekunde. Weil er vermutlich nicht gleich irgendwo anstoßt wird er die letzte Befehlen auch nicht machen. Was danach passiert ist unbekannt. Weil das Programm zu ende ist, aber die Mikrocontroller wird immer weiter seine Gehirn weiter durcharbeiten, eben wann das keine Code ist. Du sollst wirklich am ende eine Endlos-schleife einbauen, damit er keine Unsinn macht. Aber die Richtige Lösung ist das deine Code in ein Endlos-schleife gebunden ist. Weil er nun nur 2 mal die PollSwitch Test macht. Er soll das jedes Mal machen.

NicMaxFen
07.02.2012, 21:55
ok danke wie/wo soll ich dan teoretisch den Sleep einbauen damit der alles macht?

ePyx
07.02.2012, 21:57
Nee eine Endlosschleife. Ein Sleep ist nicht endlos.



while ( 1 ) {

DEIN CODE

}

masasibe
07.02.2012, 22:18
wie/wo soll ich dan teoretisch den Sleep einbauen damit der alles macht?
Was soll er denn genau machen?

Wenn dein Asuro sich immer umdrehen soll, wenn er vorne irgendwo anstößt, kannst du dein Programm so aufbauen:

Motoren einschalten -> Überprüfen, ob Asuro angestoßen ist

-> Wenn Asuro nicht angestoßen ist -> Wieder überprüfen (mit Endlosschleife)

-> Wenn Asuro angestoßen ist -> Drehung ausführen (Du schaltest die Motoren so, dass er sich dreht und lässt den Asuro dann mit dem Sleep-Befehl so lange nichts tun bis er sich weit genug gedreht hat) -> Motoren auf vorwärts stellen -> wieder bei Schritt 2 mit dem Überprüfen beginnen

Valen
07.02.2012, 22:34
ok danke wie/wo soll ich dan teoretisch den Sleep einbauen damit der alles macht?Alles machen ist ein bisschen viel für ein Atmega8 Roboter. ;)


Er fäht nach vorne----> Stößt an----> Dreht sich---->Stößt wieder an----> Fährt rückwärts Das folgende Programm macht das. Aber, ist das wirklich genau das verfahren was du möchtest? Nun wird er meistens nur 2 mal ein Anstoss erkennen, und danach Rückwärts fahren.


#include "asuro.h"

// "Er fäht nach vorne----> Stößt an----> Dreht sich---->Stößt wieder an----> Fährt rückwärts"

int main(void){

Init();


// " Er fäht nach vorne"

MotorSpeed(112,100);
MotorDir(FWD,FWD);
StatusLED(GREEN);



if (PollSwitch()>0) { // Stößt an----> Dreht sich
MotorSpeed(112,100);
MotorDir(RWD,FWD);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(RED);}

for(i=0;i<200;i++) Sleep(72); // Wartet 200 milisekunden weil es dreht.

// Keine ahnung was du mit das hier unter möchtest. Ist kein teil deine Aktion Beschreibung.
// Das wurde er machen wan kein Anstoss erkannt wird. Ist aber auch ein art von Drehung!

/* else {
MotorSpeed(100,0);
MotorDir(RWD,BREAK);
StatusLED(YELLOW);} */

// Obene else-Block ist aus-kommentiert.

if (PollSwitch()>0){ // Stößt wieder an----> Fährt rückwärts
MotorSpeed(112,100);
MotorDir(RWD,RWD);
StatusLED(RED);
BackLED(ON,ON);}

// Und nun für immer Rückwärts fahren????

while(1); // Ich gehe in Zen-zustand, für immer! Doch fahre auch noch Rückwärts

return 0; // Ende der Main-Funktion. Dieses Befehl soll niemals erreicht werden.
}

NicMaxFen
08.02.2012, 15:18
Ich danke ich probiere das dann mal aus und schau ml was raus kommt

NicMaxFen
08.02.2012, 18:10
Der Gibt mir jetzt ein error raus vllt muss ich noch irgend was einfügen:
Programm:



#include "asuro.h" // "Er fäht nach vorne----> Stößt an----> Dreht sich---->Stößt wieder an----> Fährt rückwärts"
int main(void){ Init(); // " Er fäht nach vorne"
MotorSpeed(112,100);
MotorDir(FWD,FWD);
StatusLED(GREEN);
if (PollSwitch()>0) { // Stößt an----> Dreht sich
MotorSpeed(112,100);
MotorDir(RWD,FWD);
BackLED(ON,ON);
FrontLED(ON);
StatusLED(RED);}
for(i=0;i<200;i++) Sleep(72);
if (PollSwitch()>0){
MotorSpeed(112,100);
MotorDir(RWD,RWD);
StatusLED(RED);
BackLED(ON,ON);}
while(1);
return 0; }


Errorcode:


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:13: error: `i' undeclared (first use in this function)
test.c:13: error: (Each undeclared identifier is reported only once
test.c:13: error: for each function it appears in.)
test.c:22: error: parse error at end of input
make: *** [test.o] Error 1

ePyx
08.02.2012, 18:12
Geh in Zeile 13 und guck was du da mit dem i machst. Tippfehler ? Sollte es nicht definiert sein ( Was ja in der Fehlerbeschreibung steht) dann definiere es vorher.

vor

for(i=0;i<200;i++) Sleep(72);

int i;

einfügen

NicMaxFen
08.02.2012, 18:20
Jetzt hab ich den Error weg und auch schon geflashed aber er fährt nur vorwärts und wenn ich denn Taster drücke machter er garnix

ePyx
08.02.2012, 18:24
Deine Abfrage vom Pollswitch ist auch an der falschen Stelle.



while ( 1 )
{
if (PollSwitch()>0)
{
MotorSpeed(112,100);
MotorDir(RWD,RWD);
StatusLED(RED);
BackLED(ON,ON);
}
}

NicMaxFen
08.02.2012, 18:25
Wenn ich dann in der if-Zeile die ">" ersetzte durch"==" dann dreht er sich für ne sek und fähr den letzten abschnit (also rückwährts)

/edit jetzt dreht er sich nur

ePyx
08.02.2012, 18:29
Naja dann brauchst du den Taster ja auch nicht drücken. Kenn die ASURO-Funktionen zwar nicht, aber PollSwitch ist sicherlich nur größer 0 wenn der Taster gedrückt wird.

NicMaxFen
08.02.2012, 18:30
wenn ich dann das von dir mach und die "> einsetzt, gehz wieder nur nach vorne!!

ePyx
08.02.2012, 18:32
Eventuell solltes du nach

BackLED(ON,ON);

Noch eine Warteschleife oder ein Sleep einbauen. Nur um zu vermeiden, dass er nicht genügend Zeit hat um es auszuführen.

NicMaxFen
08.02.2012, 18:33
Ok probiere ich mal und neben bei danke an alle die hier so freundlich sind und mir helfen (und anderen)

Valen
08.02.2012, 18:57
Geh in Zeile 13 und guck was du da mit dem i machst. Tippfehler ? Sollte es nicht definiert sein ( Was ja in der Fehlerbeschreibung steht) dann definiere es vorher.

vor

for(i=0;i<200;i++) Sleep(72);

int i;

einfügenOops, vergessen. :(

ePyx
08.02.2012, 19:25
Oops, vergessen. :(

Passiert halt im Eifer des Gefechtes, wenn man anderen helfen will. :D