PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm funktioniert nicht



RobotMichi
28.04.2009, 17:53
Hallo, Leute,
ich hab folgendes Problem:

Ich bin Anfänger was Roboter und programmieren betrifft und habe mir letzte Woche einen RP6 gekauft. Nun hab ich ein erstes Programm für den rp6 geschrieben und auch kompiliert:


#include "RP6RobotBaseLib.h"



void Bumper(void)

{
if(bumper_left)

writeString("Linker Bumper gedrueckt!! \n");

else

if(bumper_right)

writeString("Rechter Bumper gedrueckt!! \n");

else

if(bumper_left && bumper_right)

writeString("Beide Bumper gedrueckt!! \n");

}


int main(void)


{ initRobotBase();
powerON();

writeString("Hallo! \n");



while(true)

Bumper;


return 0;
}
Beim Kompiler kommt folgende Ausgabe:


-------- 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.


Size before:
AVR Memory Usage
----------------
Device: atmega32

Program: 6288 bytes (19.2% Full)
(.text + .data + .bootloader)

Data: 215 bytes (10.5% Full)
(.data + .bss + .noinit)




Compiling: RP6Base_LEDs.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_LEDs.lst -I../../RP6lib -I../../RP6lib/RP6base -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_LEDs.o.d RP6Base_LEDs.c -o RP6Base_LEDs.o
RP6Base_LEDs.c: In function 'main':
RP6Base_LEDs.c:39: warning: statement with no effect

Linking: RP6Base_LEDs.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_LEDs.o -I../../RP6lib -I../../RP6lib/RP6base -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_LEDs.elf.d RP6Base_LEDs.o ../../RP6lib/RP6base/RP6RobotBaseLib.o ../../RP6lib/RP6common/RP6uart.o --output RP6Base_LEDs.elf -Wl,-Map=RP6Base_LEDs.map,--cref -lm

Creating load file for Flash: RP6Base_LEDs.hex
avr-objcopy -O ihex -R .eeprom RP6Base_LEDs.elf RP6Base_LEDs.hex

Creating Extended Listing: RP6Base_LEDs.lss
avr-objdump -h -S RP6Base_LEDs.elf > RP6Base_LEDs.lss

Creating Symbol Table: RP6Base_LEDs.sym
avr-nm -n RP6Base_LEDs.elf > RP6Base_LEDs.sym

Size after:
AVR Memory Usage
----------------
Device: atmega32

Program: 6290 bytes (19.2% Full)
(.text + .data + .bootloader)

Data: 215 bytes (10.5% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:01

Die Übersetzung läuft also fehlerfrei ab.

Allerdings: Der Roboter hält sich nicht ganz daran. Er erzeugt nur die Ausgabe "Hallo!" und wenn ich auf den Bumpern herumdrücke, geschieht nichts. Aber warum?
Kann mir jemand weiterhelfen?

Mfg
Michi

Fabian E.
28.04.2009, 18:28
Du musst noch in deiner Schleife
void task_Bumpers(void) aufrufen, wenn du die Variablen nutzen möchtest.

Wenn du erst auf beide Bumper überprüfst und dann die einzelnen wird er dir auch anzeigen wenn beide gedrückt sind.

sechsrad
28.04.2009, 18:44
...Die Übersetzung läuft also fehlerfrei ab.....

Junge, die Übersetzung hat nichts mit der Funktionsfähigkeit der Hardware zu tun.

p_mork
28.04.2009, 19:53
Hallo Michi,

in deinem Code steht


while(true)
Bumper;


Richtig müsste es aber


while(true)
Bumper();

heißen (Klammern nach 'Bumper'), da der Funktionsname ohne Klammern die Adresse der Funktion ist und kein Aufruf.

MfG mark

RobotMichi
29.04.2009, 15:08
Hallo,

Mein Quelltext sieht nun so aus:


#include "RP6RobotBaseLib.h"



void Bumper(void)

{
if(bumper_left)

writeString("Linker Bumper gedrueckt!! \n");

else

if(bumper_right)

writeString("Rechter Bumper gedrueckt!! \n");

else

if(bumper_left && bumper_right)

writeString("Beide Bumper gedrueckt!! \n");

}

void task_bumpers(void)

{}

int main(void)


{ initRobotBase();
powerON();

writeString("Hallo! \n");



while(true)

{

void task_bumpers(void) {}


Bumper();


}

return 0;
}


, aber es funktioniert immer noch nicht. Es passiert genau das selbe wie am Anfang.

lg,
Michi

RobotMichi
29.04.2009, 15:11
Ich weiß, dass die Übersetzung nichts mit der Funktion der Bumper zu tun hat. Allerdings bin ich mir sicher, dass dies nicht an den Bumpern, sondern am Programm liegt.

Gruß,
Michi

p_mork
29.04.2009, 15:50
while(true)
{
void task_bumpers(void) {}
Bumper();
}

Und Was soll das jetzt? Warum definierst Du task_bumpers mitten in der Main ein zweites Mal?

Ich kenn mich zwar nicht mit der Lib des RP6 aus, aber sind bumper_left und bumper_right nicht auch Funktionen, die Aufgerufen werden müssen?

MfG Mark

RobotMichi
29.04.2009, 17:20
Und wie kann ich die Funktionen aufrufen?
Ich habe jetzt die Definition von task_bumpers wieder weggelöscht (ich weiß nicht, was dieser Aufruf überhaupt bezwecken soll), aber es hat sich nichts geändert.

Fabian E.
29.04.2009, 20:21
Wie wäre es denn wenn du dir einfach mal die Doku zum RP6 durchliest? Da steht das doch gaaaaaanz genau beschrieben... Da kannst du dein Programm auch abschreiben, macht das selbe, nur das es klappt...

RP6conrad
29.04.2009, 20:25
Du sollst besser starten mit ein Forbild program wo schon die Bumber functionieren. Da siehts du dan auch das erst diese BUMPERstatechangedhandler aufgerufen wird. Nur wen diese handler lauft, konnen auch die variabelen bumper_LEFT und bumper_RIGHT genutzt werden.

orusa
29.04.2009, 20:26
versuchs mal so:




#include "RP6RobotBaseLib.h"



void Bumper()
{
if(getBumperLeft())
{
writeString("Linker Bumper gedrueckt!! \n");
}
else if(getBumperRight())
{
writeString("Rechter Bumper gedrueckt!! \n");
}
else if(getBumperLeft() && getBumperRight())
{
writeString("Beide Bumper gedrueckt!! \n");
}
}


int main(void)

{ initRobotBase();
powerON();

writeString("Hallo! \n");

while(1)
{
Bumper();
}

return 0;
}


Bei mir funktioniert es so jedenfalls...

orusa
29.04.2009, 20:26
Hab eben noch einen Fehler bemerkt:

Die Abfrage, ob beide Bumper gedrückt sind, muss als erste kommen,
sonst ist zuerst die Bedingung "Linker Bumper ist gedrückt" erfüllt und der else-Zweig für die Abfrage beider Bumper wird nie erreicht.

Also so:



void Bumper()
{
if(getBumperLeft() && getBumperRight())
{
writeString("Beide Bumper gedrueckt!! \n");
}
else if(getBumperLeft())
{
writeString("Linker Bumper gedrueckt!! \n");
}
else if(getBumperRight())
{
writeString("Rechter Bumper gedrueckt!! \n");
}
}

Fabian E.
29.04.2009, 20:40
So, wie orusa es geschrieben hat, geht es auch. Will man allerdings statt den Funktionen die Variablen nutzen, muss man eben in der Hauptschleife task_bumpers(); aufrufen.

orusa
29.04.2009, 22:35
Richtig! Das wäre dann die alternative Lösung:


#include "RP6RobotBaseLib.h"



void Bumper()
{
if(bumper_left && bumper_right)
{
writeString("Beide Bumper gedrueckt!! \n");
}
else if(bumper_left)
{
writeString("Linker Bumper gedrueckt!! \n");
}
else if(bumper_right)
{
writeString("Rechter Bumper gedrueckt!! \n");
}
}


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

writeString("Hallo! \n");

while(1)
{
task_Bumpers();
Bumper();
}

return 0;
}


Noch etwas eleganter geht es über den Eventhandler:



#include "RP6RobotBaseLib.h"

void Bumper()
{
// wie oben
}

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

writeString("Hallo! \n");

BUMPERS_setStateChangedHandler(Bumper); // hier wird Bumper() an den Event gekoppelt

while(1)
{
task_Bumpers();
}

return 0;
}



In diesem Fall wird die Funktion Bumper() nur noch dann aufgerufen, wenn das Ereignis auftritt, dass sich der Zustand der Bumpers geändert hat.

RobotMichi
30.04.2009, 14:15
Danke, Leute, jetzt funkionierts, wie ich es mir vorgestellt habe. Ich werde nun versuchen, die LEDs mit einzubinden.

MfG
Michi