Archiv verlassen und diese Seite im Standarddesign anzeigen : fehler in einfachem fahrprogramm und ich finde ihn nicht :(
carlitoco
07.01.2008, 11:01
In dem Programm stimmt noch was nicht, make all gibt mir folgendes aus:
RP6Base_hinundher.c: In function 'Batt':
RP6Base_hinundher.c:33: error: expected '(' before '{' token
RP6Base_hinundher.c:80: warning: 'main' is normally a non-static function
RP6Base_hinundher.c:92:3: warning: no newline at end of file
RP6Base_hinundher.c:92: error: expected declaration or statement at end of input
make: *** [RP6Base_hinundher.o] Fehler 1
// Cruise Behaviour:
#include "RP6RobotBaseLib.h"
#define IDLE 0
#define TURN_SPEED 50
#define MOVE_SPEED 100
#define MOVE_FORWARDS 1
void behaviour_cruise(void)
{
uint8_t turn_direction = LEFT;
{
setLEDs(0b100100);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
}
// akku_load:
void Batt(void)
{
setStopwatch1(400);
{
while
{
startStopwatch1();
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: Voll");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
{
setLEDs(0b001001);
writeString_P("\nADC Akku: >9V");
}
else if(adcBat < 901 && adcBat > 800)
{
writeString_P("\nADC Akku: >8V");
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
else if(adcBat < 801 && adcBat > 700)
{
setLEDs(0b000001);
writeString_P("\nADC Akku: >7V");
}
else if(adcBat < 701 && adcBat > 590)
{
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
writeString_P("\nADC Akku: Leer");
}
else if(adcBat < 591 && adcBat > 500)
{
writeString_P("\nADC Akku: Laden!");
powerOFF();
}
setStopwatch1(0);
}
}
int main (void)
{
initRobotBase();
startStopwatch1();
powerON();
while(true)
{
task_RP6System();
Batt();
behaviour_cruise();
}
return 0;
}
bei deinem ersten "while" fehlt ne schließende Klammer:
setStopwatch1(0);
}
} // das hat gefehlt!
}
und das "while" bräuchte wohl noch ne Bedingung
void Batt(void)
{
setStopwatch1(400);
{
while // while WAS??? da fehlt ne Bedingung.
{
startStopwatch1();
if(getStopwatch1() > 300)
{ ....
nutze ein
void main(void) // statt int main(void)
das ist bei microcontrollern so, da die mit dem Hauptprogramm keinen (ERROR-) Wert zurückliefern (macht Windoof ja auch nicht, wenn es abstürtzt oder beendet wird, welches Programm sollte denn damit dann was machen, es läuft ja keins mehr...)
Ach ja, das "return 0" könntest du dir auch sparen, da ja nix zurückgegeben wird, da es ne "void"-Funktion ist. (es sei denn, dein compiler mault dann. "make-all" => du nutzt WinAVR? dann kannste es, wie ich auch, weglassen)
carlitoco
07.01.2008, 13:09
also zu
while habe ich (true) gesetzt, die anderen korrekturen auch gemacht...
da gibt mir der compiler das aus:
RP6Base_hinundher.c: In function 'Batt':
RP6Base_hinundher.c:81: warning: return type of 'main' is not 'int'
RP6Base_hinundher.c:81: warning: 'main' is normally a non-static function
RP6Base_hinundher.c: In function 'main':
RP6Base_hinundher.c:93: warning: 'return' with a value, in function returning void
RP6Base_hinundher.c: In function 'Batt':
RP6Base_hinundher.c:94: error: expected declaration or statement at end of input
RP6Base_hinundher.c:30: warning: unused variable 'ubat'
make: *** [RP6Base_hinundher.o] Fehler 1
compille unter linux ... funktioniert an sich auch .. bloß irgendwas ist in meinem prog nicht richtig und ich bin dem fehler noch nicht auf der schliche....
Trotzdem danke erstmal!
rp6flash
07.01.2008, 13:20
auf den ersten blick find ich in der zeile 94 auch nix besonderes. ich zitiere:
startStopwatch1();
die zeile hab ich mir von oben geholt: vielleicht ist es jetz ne andere.
poste doch mal den aktuellen code!! ](*,) ](*,)
gruß!
carlitoco
07.01.2008, 13:35
hier ...
// Cruise Behaviour:
#include "RP6RobotBaseLib.h"
#define IDLE 0
#define TURN_SPEED 50
#define MOVE_SPEED 100
#define MOVE_FORWARDS 1
void behaviour_cruise(void)
{
uint8_t turn_direction = LEFT;
{
setLEDs(0b100100);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
}
// akku_load:
void Batt(void)
{
setStopwatch1(400);
uint16_t ubat = adcBat;
{
while (true)
{
startStopwatch1();
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: Voll");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
{
setLEDs(0b001001);
writeString_P("\nADC Akku: >9V");
}
else if(adcBat < 901 && adcBat > 800)
{
writeString_P("\nADC Akku: >8V");
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
else if(adcBat < 801 && adcBat > 700)
{
setLEDs(0b000001);
writeString_P("\nADC Akku: >7V");
}
else if(adcBat < 701 && adcBat > 590)
{
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
writeString_P("\nADC Akku: Leer");
}
else if(adcBat < 591 && adcBat > 500)
{
writeString_P("\nADC Akku: Laden!");
powerOFF();
}
setStopwatch1(0);
}
}
}
int main (void)
{
initRobotBase();
startStopwatch1();
powerON();
while(true)
{
task_ADC();
task_RP6System();
Batt();
behaviour_cruise();
}
return 0;
}
carlitoco
07.01.2008, 13:43
6Base_hinundher.o.d RP6Base_hinundher.c -o RP6Base_hinundher.o
RP6Base_hinundher.c: In function 'Batt':
RP6Base_hinundher.c:81: warning: 'main' is normally a non-static function
RP6Base_hinundher.c:94: error: expected declaration or statement at end of input
RP6Base_hinundher.c:30: warning: unused variable 'ubat'
make: *** [RP6Base_hinundher.o] Fehler 1
das der errorr dazu!
purebasic
07.01.2008, 13:45
....compille unter linux ...
kein wunder, unter linux-doof läuft nicht alles.
bei windows bis du besser dran.
blenderkid
07.01.2008, 13:47
Du hast bei "void behaviour_cruise(void)" eine Klammer zu wenig oder zu viel. Mach mal die zweite Klammer auf weg.
blenderkid
07.01.2008, 13:48
purebasic... :-( Das liegt aber nicht an LINUX ^^
carlitoco
07.01.2008, 13:57
ne definitv nicht ander progs gehen für den RP6 ja auch ;(
ok ich habe es ... also das mit de rklammer war nicht schlecht blenderkid ... bei void batt war auch eine zuviel ...
da hhabe ich das
uint16_t ubat = adcBat;
{
koplett weg genommen ... also kopileren kanner jetzt :)
Hi,
in "void behaviour_cruise(void)" ist die geschweifte Klammer vor setLEDs zuviel.
Zusaetzlich ist in "void Batt(void)" die Klammer vor der while-Schleife zuviel. (Falls ich mich nicht verzaehlt habe ...)
Ich wuerde dringend empfehlen einen Editor zu verwenden der es erlaubt die Klammerung zu "ueberwachen" (einfaerben, springen, etc.). Ein defensiverer Programmierstil kann auch helfen (d.h. bei Beginn einer Anweisung, welche Klammerung benoetigt, diese SOFORT zu setzen - oeffnende und schliessende, dann vergisst man auch keine) ;-)
HTH
Kay
carlitoco
07.01.2008, 14:02
bloß zeigt er jetzt entweder den batt status an oder er fährt, je nach dem was ich in main zuerst ablaufen lasse :) -echt cool haha weiß da jemand was ?
blenderkid
07.01.2008, 14:18
kannst du vielleicht den jetzt richtigen Code hochladen.
carlitoco
07.01.2008, 14:22
klar
// Cruise Behaviour:
#include "RP6RobotBaseLib.h"
#define IDLE 0
#define TURN_SPEED 50
#define MOVE_SPEED 100
#define MOVE_FORWARDS 1
void behaviour_cruise(void)
{
uint8_t turn_direction = LEFT;
setLEDs(0b100100);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
}
// akku_load:
void Batt(void)
{
setStopwatch1(400);
while (true)
{
startStopwatch1();
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: Voll");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
{
setLEDs(0b001001);
writeString_P("\nADC Akku: >9V");
}
else if(adcBat < 901 && adcBat > 800)
{
writeString_P("\nADC Akku: >8V");
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
else if(adcBat < 801 && adcBat > 700)
{
setLEDs(0b000001);
writeString_P("\nADC Akku: >7V");
}
else if(adcBat < 701 && adcBat > 590)
{
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
writeString_P("\nADC Akku: Leer");
}
else if(adcBat < 591 && adcBat > 500)
{
writeString_P("\nADC Akku: Laden!");
powerOFF();
}
setStopwatch1(0);
}
}
}
int main (void)
{
initRobotBase();
startStopwatch1();
powerON();
while(true)
{
task_ADC();
Batt();
behaviour_cruise();
task_RP6System();
behaviour_cruise();
}
return 0;
}
blenderkid
07.01.2008, 14:28
du sagst im Batt() "while(True)", also ist eine endlose Schleife.
mach einfach das "while(True)" und die dazugehöringen Klammern weg.
und mach uas dem "BLOCKING" eine "0"
blenderkid
07.01.2008, 14:34
Also:
// Cruise Behaviour:
#include "RP6RobotBaseLib.h"
#define IDLE 0
#define TURN_SPEED 50
#define MOVE_SPEED 100
#define MOVE_FORWARDS 1
void behaviour_cruise(void)
{
uint8_t turn_direction = LEFT;
setLEDs(0b100100);
move(MOVE_SPEED, FWD, DIST_MM(2000), 0);
rotate(TURN_SPEED, turn_direction, 102, 0);
move(MOVE_SPEED, FWD, DIST_MM(100),0);
rotate(TURN_SPEED, turn_direction, 102, 0);
move(MOVE_SPEED, FWD, DIST_MM(2000),0);
rotate(TURN_SPEED, RIGHT, 102, 0);
move(MOVE_SPEED, FWD, DIST_MM(100), 0);
rotate(TURN_SPEED, RIGHT, 102, 0);
}
// akku_load:
void Batt(void)
{
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: Voll");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
{
setLEDs(0b001001);
writeString_P("\nADC Akku: >9V");
}
else if(adcBat < 901 && adcBat > 800)
{
writeString_P("\nADC Akku: >8V");
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
else if(adcBat < 801 && adcBat > 700)
{
setLEDs(0b000001);
writeString_P("\nADC Akku: >7V");
}
else if(adcBat < 701 && adcBat > 590)
{
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
writeString_P("\nADC Akku: Leer");
}
else if(adcBat < 591 && adcBat > 500)
{
writeString_P("\nADC Akku: Laden!");
powerOFF();
}
setStopwatch1(0);
}
}
int main (void)
{
initRobotBase();
powerON();
startStopwatch1();
while(true)
{
task_ADC();
Batt();
behaviour_cruise();
task_RP6System();
behaviour_cruise();
}
return 0;
}
das "startStopwatch1()" startest du in der main und das BLOCKING ausschalten, das setStopwatch(400); muss weg das hat keinen Sinn.
Das "while(True)" muss auch weg, sonst ist es endlose.
Code nicht getestet.
MfG blenderkid
[/code]
carlitoco
07.01.2008, 14:59
ja das merkt man ... also wenn ich alle Blockings weg mache dreht ersich im kreis, zeigt aber auch die batt an...
@KayH zu viele klammern schaden nicht, nur dann wenn man die übersicht verliehrt *grins* - mein bluefish zeigt leider keine klammerhilfe an... aber schaue mal ob es das programmers notepad nicht auch für linux gibt ...
blenderkid
07.01.2008, 15:06
hol dir "gvim" mit "apt-get install"
blenderkid
07.01.2008, 15:07
...also wenn ich alle Blockings weg mache dreht ersich im kreis, zeigt aber auch die batt an...
soll er nicht genau das machen ?
carlitoco
07.01.2008, 15:24
nee er soll 2m vor, links im 90° winkel rotieren, 10cm vor wieder links im 90° winkel drehen und anschließend wieder 2m vor, dann 90° nach rechts rotieren 10cm vor 90° nach rechts rotieren und dann von forne...
ist das aus dem code nicht ersichtlich ?
carlitoco
07.01.2008, 16:09
SO GEHTS :)
// Cruise Behaviour:
#include "RP6RobotBaseLib.h"
#define IDLE 0
#define TURN_SPEED 60
#define MOVE_SPEED 100
#define MOVE_FORWARDS 1
void behaviour_cruise(void)
{
uint8_t turn_direction = LEFT;
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, turn_direction, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(2000), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
move(MOVE_SPEED, FWD, DIST_MM(100), BLOCKING);
rotate(TURN_SPEED, RIGHT, 102, BLOCKING);
}
// akku_load:
void Batt(void)
{
setStopwatch1(400);
startStopwatch1();
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: Voll");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
{
setLEDs(0b001001);
writeString_P("\nADC Akku: >9V");
}
else if(adcBat < 901 && adcBat > 800)
{
writeString_P("\nADC Akku: >8V");
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
else if(adcBat < 801 && adcBat > 700)
{
setLEDs(0b000001);
writeString_P("\nADC Akku: >7V");
}
else if(adcBat < 701 && adcBat > 590)
{
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
writeString_P("\nADC Akku: Leer");
}
else if(adcBat < 591 && adcBat > 500)
{
writeString_P("\nADC Akku: Laden!");
powerOFF();
}
setStopwatch1(0);
}
}
int main (void)
{
initRobotBase();
startStopwatch1();
powerON();
while(true)
{
task_ADC();
Batt();
behaviour_cruise();
task_RP6System();
behaviour_cruise();
}
return 0;
}
carlitoco
07.01.2008, 16:11
so jetzt müssen da noch bumper und IR dazu, dann habe ich mienen staubwischer :)
carlitoco
07.01.2008, 16:29
wie mache ich das er dann bei bumperaktivität sein fahrprogramm unterbricht ... klar es gibt unzählige beispiele ... aber so einfach findi hc das noch nicht ...
Danke erstmal für die Hilfe von vorhin!
das geht am einfachsten mit ifs:
if(bumper nicht gedrückt)
{
// hier dein Programmteil
}
else
{
// die Bumperauswertung
}
NACHTEIL: der fährt dann erstmal 2m, oder eben 2cm an die wand und dann x sec gegen die wand, bis er es merkt
Bessere und schonenedere Variante:
mit Zähler und while-schleife
// benötigt Variable zaehler (für 2m fahren wird die wohl seeeehr hoch gezählt, mach also am besten long int oder mehr)
void main(void)
{
// initialisierungscode usw.
zaehler=0;
// Motoren an
while((zaehler < wasweißichwieviel) && (kein Bumper gedrückt))
{
zaehler++ ;
// wenn zaehler für die Zeitverzögerung nicht ausreicht,
// nochmal so ne "while"-schleife (MIT "&&(Bumper.... )" )
// evtl Batteriestand ausgeben
}
// Motoren aus
if(BumperX gedrükt) // auswertung für Bumper X
{
// deine Reaktion
{
// Auswertung der anderen Bumper
// dann dasselbe noch mit den anderen wende- und vorwärtsbewegungen
// NICHT VERGESSEN: zaehler nach jeder while-schleife wieder auf 0 setzen, aber NIE in einer while-schleife
}
setze für "(keine) Bumper gedrückt" eben den passenden Ausdruck ein (also z.B. "if(PIND & (1 << PD5))" )
und für "wasweißichwieviel" eben den Maximalwert, bis zu dem dein Robby die Variable "zaehler" zählen soll (die ist für die Zeitverzögerung zuständig)
EDIT: dann brauchst du deine stopwatch auch nicht mehr.
habs auch nochn bissle lesbarer gemacht
blenderkid
07.01.2008, 17:37
wofür ist eigentlich dein "setStopwatch1(400);" in Batt() ?
carlitoco
07.01.2008, 17:56
das ist ein fetzten unwissen heit ;)
blenderkid
07.01.2008, 18:02
Du hast unten in der Funktion Batt ein setStopwatch1(0);
Das wird doch am Anfang der Funktion eh wieder auf 400 gesetzt,
wiso machst du nicht das setStopwatch1(0) zu setStopwatch1(400) und machst dann oben die Zeile weg ?
Sparst du dir eine ( verwirrende ) Zeile Code.
blenderkid
07.01.2008, 18:12
Zu dem Fahren:
Du kannst ja machen, dass er solange geradeaus fährt bis er auf eine Wand trifft oder mleft_dist oder mright_dist = 2m oder 2cm ist. Wenn mleft_dist oder mright_dist =2m oder 2cm ist musst du sie natürlich wider auf Null stellen.
Dann hört er direkt auf zu fahren wenn er vor eine Wand trifft.
MfG blenderkid
blenderkid
07.01.2008, 18:14
mleft_dist bzw mright_dist misst die Strecke die der RP6 seit dem Programmstart gefahren ist.
carlitoco
07.01.2008, 18:20
ok ... "meißel"
ich werd mich mal dran setzen ... hoffe das klappt :)
ja das mit der stopwatch war dann klar ...
Danke, werd heute aber nicht mehr all zu viel schaffen ...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.