PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein erstes Programm



xMichiiix
03.10.2010, 10:57
Hallo,

ich bin neu hin und wollte mal fragen ob ihr mein selbst geschriebenes Programm mal durch schauen könnst ob es auch wirklich geht ^^


#include "RP6RobotBaseLib.h"

int main(void)
{
intRobotBase();
powerON();

moveAtSpeed(50,50)
getLeftSpeed(30,50)
getRightSpeed(50,30)
startStopwatch1();

while(true)
{
if(getStopwatch1() > 4000)
{
if(getDirection() == FWD)
changeDirection(LEFT);
else if(getDirection() == LEFT)
changeDirection(RIGHT);
else if(getDircetion() == RIGHT)
changeDirection(BWD);
setStopwatch1(0);
}
task_motionControl();
task_ADC();
}
returun 0;
}


und ich hätte da noch ein Problem. Und zwar schaut es wiefolgt aus:
ich habe den Demo ordner auf das laufwerk C:\ entpackt und jetz will ich mein neues programm complieren aber es kommt nur ein ordner names: .dep und da ist eine datei drin.
Auch wen ich in der make all.bat pause mache verstehe ich den fehler nicht

C:\RP6Examples_20080915\RP6BASE_EXAMPLES\RP6Base_M ove9_01>set LANG=C

C:\RP6Examples_20080915\RP6BASE_EXAMPLES\RP6Base_M ove9_01>make all

-------- begin --------
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
Copyright (C) 2006 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.


Compiling: RP6Base_Move9_01.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfiel
ds -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_Mov
e9_01.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gn
u99 -MD -MP -MF .dep/RP6Base_Move9_01.o.d RP6Base_Move9_01.c -o RP6Base_Move9_01
.o
RP6Base_Move9_01.c: In function 'main':
RP6Base_Move9_01.c:5: warning: implicit declaration of function 'intRobotBase'
RP6Base_Move9_01.c:9:20: error: macro "getLeftSpeed" passed 2 arguments, but tak
es just 0
RP6Base_Move9_01.c:9: error: expected ';' before 'getLeftSpeed'
RP6Base_Move9_01.c:10:21: error: macro "getRightSpeed" passed 2 arguments, but t
akes just 0
RP6Base_Move9_01.c:21: warning: implicit declaration of function 'getDircetion'
RP6Base_Move9_01.c:28: error: 'returun' undeclared (first use in this function)
RP6Base_Move9_01.c:28: error: (Each undeclared identifier is reported only once
RP6Base_Move9_01.c:28: error: for each function it appears in.)
RP6Base_Move9_01.c:28: error: expected ';' before numeric constant
RP6Base_Move9_01.c:29:2: warning: no newline at end of file
make: *** [RP6Base_Move9_01.o] Error 1

C:\RP6Examples_20080915\RP6BASE_EXAMPLES\RP6Base_M ove9_01>pause
Drücken Sie eine beliebige Taste . . .

könntet ihr mir vielleicht helfen?

MfG Michael K.

markusj
03.10.2010, 11:06
Hallo Michael,

RP6Base_Move9_01.c:5: warning: implicit declaration of function 'intRobotBase'
Soll die funktion vielleicht initRobotBase heißen? Der Compiler kennt nämlich (laut Meldung) keine intRobotBase

RP6Base_Move9_01.c:9:20: error: macro "getLeftSpeed" passed 2 arguments, but takes just 0
getLeftSpeed() erwartet scheinbar keine Parameter ...

RP6Base_Move9_01.c:21: warning: implicit declaration of function 'getDircetion'
Tippfehler, soll wohl getDirection lauten

RP6Base_Move9_01.c:28: error: 'returun' undeclared (first use in this function)
Tippfehler, sollte return heißen

mfG
Markus

xMichiiix
03.10.2010, 11:23
Ah danke aber was heißt das :
getLeftSpeed() erwartet scheinbar keine Parameter?

radbruch
03.10.2010, 11:25
Hallo

Auf die schnelle und ungetestet:


#include "RP6RobotBaseLib.h"

uint8_t Fahrtrichtung = FWD;

int main(void)
{
initRobotBase();
powerON();

changeDirection(Fahrtrichtung);
moveAtSpeed(50,50);
//getLeftSpeed(30,50)
//getRightSpeed(50,30)
startStopwatch1();

while(true)
{
if(getStopwatch1() > 4000)
{
setStopwatch1(0); // !!!
if(Fahrtrichtung == FWD) Fahrtrichtung = LEFT;
else if(Fahrtrichtung == LEFT) Fahrtrichtung = RIGHT;
else if(Fahrtrichtung == RIGHT) Fahrtrichtung = BWD;
else if(Fahrtrichtung == BWD) Fahrtrichtung = FWD;
changeDirection(Fahrtrichtung);
}
task_motionControl();
task_ADC();
}
return 0;
}

Gruß

mic

xMichiiix
03.10.2010, 11:31
radbruch könntest du vlt eine kurze erklärung dahinter schreiben wär nett

markusj
03.10.2010, 11:34
Ah danke aber was heißt das :
getLeftSpeed() erwartet scheinbar keine Parameter?
Du rufst das ganze so auf: getLeftSpeed(30,50)
Das sind also zwei Parameter (30 und 50). Der Compiler beschwert sich darüber dass getLeftSpeed aber exakt 0 Parameter erwartet, du also nichts reinstecken sollst.
Macht ja auch Sinn bei einer Funktion (eigentlich ist es ja ein Makro) die nur etwas zurückgeben soll (das gibt zumindest der Name vor)

mfG
Markus

xMichiiix
03.10.2010, 12:02
ah jetz gehts :))) danke

xMichiiix
03.10.2010, 13:34
hab noch eine frage: muss ich immer mein programm in die RP6Base_Move9_01_uncommented.c und in die RP6Base_Move9_01.c eintrangen ?

xMichiiix
03.10.2010, 14:42
#include "RP6RobotBaseLib.h"
#include "RP6ControlLib.h"

void runningLight(void)
{
static uint8_t runLight = 1;
static uint8_t dir;

if(getStopwatch4() > 100)
{
setLEDs(runLight);

if(dir == 0)
runLight <<= 1;
else
runLight >>= 1;

if(runLight > 7 )
dir = 1;
else if (runLight < 2 )
dir = 0;

setStopwatch4(0);
}
}

void takeABreakAfterSomeTime(void)
{
static uint8_t putScreenOnceOnly;

if(getStopwatch5() > 24000)
{
clearLCD();
startStopwatch3();
startStopwatch4();
setStopwatch5(0);
sound(160,20,20);
sound(220,40,0);
}
else if(getStopwatch5() > 22000)
{
if(!putScreenOnceOnly)
{
showScreenLCD("ok lass uns", "gehen!");
putScreenOnceOnly = 1;
}
}
else if(getStopwatch5() > 16000)
{
if(isStopwatch1Running())
{
stopStopwatch1();
stopStopwatch2();
showScreenLCD("ich moechte", "ein shirt brechen!");
putScreenOnceOnly = 0;
sound(220,40,20);
sound(160,40,0);
}
}
}


void bumpersStateChanged(void)
{
writeString_P("\nBumper Status hat sich geaendert:\n");
if(bumper_left)
writeString_P(" - Linker Bumper gedrueckt!\n");
else
writeString_P(" - Linker Bumper nicht gedrueckt.\n");
if(bumper_right)
writeString_P(" - Rechter Bumper gedrueckt!\n");
else
writeString_P(" - Rechter Bumper nicht gedrueckt.\n");
}

int main(void)
{
initRobotBase();
initRP6Control();
initLCD();
BUMPERS_setStateChangedHandler(bumpersStateChanged );
setLEDs(0b111111);
powerON();

moveAtSpeed(50,50);
//getLeftSpeed(50,30)
//getRightSpeed(30,50)
startStopwatch1();
startStopwatch2();
startStopwatch3();
startStopwatch4();
setLEDs(0b000000);

while(true)
{
if(getStopwatch1() > 4000)
{
move(60, FWD, DIST_MM(300), true); // 30cm Vorwärts fahren
rotate(30, LEFT, 180, true); // um 180° nach links drehen
move(60, FWD, DIST_MM(300), true); // 30cm Vorwärts fahren
rotate(30, LEFT, 90, true); // um 90° nach links drehen
move(60,FWD,DIST_MM(200), true);
rotate(30, RIGHT, 45, true);
setStopwatch1(0);
}
if(getStopwatch2() > 300)
{
writeString_P("\nADC Lichtsensor Links: ");
writeInteger(adcLSL, DEC);
writeString_P("\nADC Lichtsensor Rechts: ");
writeInteger(adcLSL, DEC);
writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat < 600)
writeString_P("Warnung! Akku ist bald leer!\n");
setStopwatch2(0);
}
if(getStopwatch3() > 300)
{
showScreenLCD("################", "################");
mSleep(1500);
showScreenLCD("Ich bin RP6 ein", "inilligenter Roboter");
mSleep(2500);
shwoScreenLCD("Dies war ein Test");
mSleep(5000);
setStopwatch3(0);
}
task_motionControl();
task_ADC();
task_Bumpers();
runLCDText();
runningLight();
}
return 0;
}

könnte mir einer sagen was an den programm falsch ist ? =(

radbruch
03.10.2010, 14:50
DAS geht gar nicht:

#include "RP6RobotBaseLib.h"
#include "RP6ControlLib.h"

Entweder ist das Programm für die RP6-Base oder für das M32. Beides gleichzeitig ist Unsinn.

xMichiiix
03.10.2010, 14:53
ah wieder einbischen was gelernt ;)

radbruch
03.10.2010, 15:12
Hallo

Wenn ich das richtig sehe hast gleich voll zugeschlagen und dir den RP6 mit M32 und dem LCD angeschafft. Das alles zusammen zu betreiben ist schon nicht ganz einfach und für Einsteiger schwer zu überblicken.

Der beste Einstieg sind wohl kleine Spielereien wie LEDs blinken lassen oder Sensoren einlesen und Werte zum Terminal (RP6Loader) senden. Basis können dabei die vielen mitgelieferten Beispiele sein die man variiert und kombiniert. Das intensive Studium der mitgelieferten Doku ist allerdings trotzdem Pflicht!

Gruß

mic

xMichiiix
03.10.2010, 15:22
Das intensive Studium der mitgelieferten Doku ist allerdings trotzdem Pflicht!


Das hab ich Gestern abend bist um 4 uhr nachts durch gelesen und auch verstanden bin gerade dabei die Bumper eine funktion zuzuweißen aber das klappt nicht (aber ich versuche es so lange bis es funktioniert, dafür gibt es ja diverse Möglichkeiten dank den "World Wide Web" herauszufinden wie man einen Bumper ansteuer das in der verfassten .pdf kann mir dort nicht so weiter helfen )

Mit freundlich Grüßen Michael K.

xMichiiix
03.10.2010, 16:06
Also irgendwie bekomme ich es nicht hin die Bumper so zu programmieren das wen man sie drück das der RP6 zurück fährt .... =(

radbruch
03.10.2010, 16:29
Leider sind die Akkus meiner Glaskugel nicht aufgeladen. Könnest du vielleicht das Problem genauer beschreiben und deinen Quellcode posten?

"bis um 4 uhr nachts durchgelesen..." Ich weiß schon, dass der RP6 "süchtig" machen kann, aber solltest du dir nicht auch mal eine Pause gönnen?

xMichiiix
03.10.2010, 16:39
Aber ich möchte auch so gern das Programmieren können, verstehste das? Und mal einen Erfolg sehen, das ganze jahr schon war irgendwie alles nicht so gelaufen wie ich es mir vorgestellt hatte, und jetz will ich endlich mal etwas können was andere bei uns in der gegend nicht können :roll:



#include "RP6RobotBaseLib.h"

void task_Bumpers(void)

int main(void)
{
initRobotBase();
setLEDs(0b001001);
powerON();

moveAtSpeed(50,50);
//getLeftSpeed(50,30)
//getRightSpeed(30,50)
startStopwatch1();
startStopwatch2();


while(true)
{
setLEDs(0b000001);
setLEDs(0b000010);
setLEDs(0b000100);
setLEDs(0b001000);
setLEDs(0b010000);
setLEDs(0b100000);
setLEDs(0b111111);

if(getStopwatch1() > 4000)
{
move(60, FWD, DIST_MM(300), true);
rotate(30, LEFT, 180, true);
move(60, FWD, DIST_MM(300), true);
rotate(30, LEFT, 90, true);
move(60,FWD,DIST_MM(200), true);
rotate(30, RIGHT, 45, true);
setStopwatch1(0);
}
if(getStopwatch2() > 200)
{
if(getBumperLeft() && getBumperRight()) escape();
else if(getBumperLeft())
escapeLeft(move(30, BWD, DIST_MM(100), true), rotate(20, RIGHT, 45, true));
else if(getBumperRight())
escapeRight(move(30, BWD, DIST_MM(100), true), rotate(20, LEFT, 45, true));
mSleep(50);
setStopwatch2(0);
}
task_motionControl();
task_Bumpers();
}
return 0;
}


PS:Bin erst heute um 9:30 aufgestanden 8-[

radbruch
03.10.2010, 19:14
Hallo

Ja, das kann ich schon verstehen. Aber verzwingen kann man es auch nicht. Hier mal eine fehler- und warnungsfrei kompilierbare Version deines Programms:


#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void)
{
writeString_P("\nBumper Status hat sich geaendert:\n");
if(bumper_left)writeString_P(" - Linker Bumper gedrueckt!\n");
else writeString_P(" - Linker Bumper nicht gedrueckt.\n");
if(bumper_right) writeString_P(" - Rechter Bumper gedrueckt!\n");
else writeString_P(" - Rechter Bumper nicht gedrueckt.\n");
}

int main(void)
{
initRobotBase();
BUMPERS_setStateChangedHandler(bumpersStateChanged );
setLEDs(0b111111);
powerON();

moveAtSpeed(50,50);
//getLeftSpeed(50,30)
//getRightSpeed(30,50)
startStopwatch1();
startStopwatch2();
startStopwatch3();
setLEDs(0b000000);

while(true)
{
if(getStopwatch1() > 4000)
{
move(60, FWD, DIST_MM(300), true);
rotate(30, LEFT, 180, true);
move(60, FWD, DIST_MM(300), true);
rotate(30, LEFT, 90, true);
move(60,FWD,DIST_MM(200), true);
rotate(30, RIGHT, 45, true);
setStopwatch1(0);
}
if(getStopwatch2() > 300)
{
writeString_P("\nADC Lichtsensor Links: ");
writeInteger(adcLSL, DEC);
writeString_P("\nADC Lichtsensor Rechts: ");
writeInteger(adcLSL, DEC);
writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat < 600) writeString_P("Warnung! Akku ist bald leer!\n");
setStopwatch2(0);
}
if(getStopwatch3() > 200)
{
if(getBumperLeft() && getBumperRight())
{
move(30, BWD, DIST_MM(100), true);
rotate(20, RIGHT, 180, true);
}
else if(getBumperLeft())
{
move(30, BWD, DIST_MM(100), true);
rotate(20, RIGHT, 45, true);
}
else if(getBumperRight())
{
move(30, BWD, DIST_MM(100), true);
rotate(20, LEFT, 45, true);
}
mSleep(50);
setStopwatch3(0);
}
task_RP6System(); // alle Tasks auf einmal
}
return 0;
}


Obwohl ich meinen RP6 jetzt reaktiviert habe, kann ich es trotzdem noch nicht testen:


RP6Loader Terminal - type ".help" for command list!

[RP6BOOT]

[READY]

[READY]

ADC Lichtsensor Links: 135
ADC Lichtsensor Rechts: 135
ADC Akku: 524
Warnung! Akku ist bald leer!

ADC Lichtsensor Links: 133
ADC Lichtsensor Rechts: 133
ADC Akku: 527
Warnung! Akku ist bald leer!

[RP6BOOT]

[READY]

ADC Lichtsensor Links: 140
ADC Lichtsensor Rechts: 140
ADC Akku: 524
Warnung! Akku ist bald leer!

ADC Lichtsensor Links: 138
ADC Lichtsensor Rechts: 138
ADC Akku: 527
Warnung! Akku ist bald leer!

[RP6BOOT]

[READY]

Bumper Status hat sich geaendert:
- Linker Bumper nicht gedrueckt.
- Rechter Bumper gedrueckt!

[RP6BOOT]

[READY]
Muss wohl erst die Akkus laden, weil sich der RP6 sofort resetet ;)

Gruß

mic

xMichiiix
06.10.2010, 16:03
Hallo,

da ich einen Thread offen habe, frag ich einfach einmal hier nach.
Ob diese Aufkleber für den RP6 passen:
http://www.conrad.de/ce/de/product/191385/ASURO-ZAHNRAeDERSATZ-MIT-AUFKLEBERN/2420181

Mfg Michi

radbruch
06.10.2010, 17:32
Hallo

Obwohl das nicht in der Beschreibung erwähnt wird, enthält dieses Set auch die Codeaufkleber für den RP6:
http://www.conrad.de/ce/de/product/191346/

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=404960#404960
+folgender Beitrag von SlyD.

Gruß

mic