Hast du schon mal testweise probiert, was passiert wenn du ein Programm reinlädst in dem er nur rotieren soll?
Druckbare Version
Hast du schon mal testweise probiert, was passiert wenn du ein Programm reinlädst in dem er nur rotieren soll?
also wenn ich das beispiel rp6 control 9 move reinlade funktioniert das alles super. in der endlosschleife sind die move und rotate befehle drin, alles super.
wenn ich ne methode draus mach void Fahren (void) mit den gleichen befehlen und die methode dann in der endlosschelife aufrufe, dann geht auch alles super.
aber wenn ich bei den bumpers schreibe, if bumper_left... und dann move oder rotate schreibe, dann macht er das zwar, aber danach geht nichts mehr. der watchdog bleibt stehen und nichts rührt sich...
Ich hab jetzt auch ein Problem
Ich steuere meinen RP6 über die Tasten, ich kann ihn 100 mal vorwärts und zurück fahren lassen. Aber sobald ich in drehen lasse macht er nichts mehr danach. Erst hab ichs mit rotate probiert, das klappte nicht also versuchte ich es mit move. Das will allerdings auch nicht .
Hier das Programm :
Code:#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
setLEDs(0b1111);
mSleep(1000);
setLEDs(0b0000);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}
while(true)
{
uint8_t key = getPressedKeyNumber();
{
if(key == 5)
{
changeDirection(FWD);
moveAtSpeed(100,100);
}
if(key == 4)
{
changeDirection(BWD);
moveAtSpeed(100,100);
}
if(key == 1)
{
changeDirection(RIGHT);
move(100,RIGHT,DIST_CM(10),true);
changeDirection(FWD);
moveAtSpeed(0,0);
}
if(key == 3)
{
changeDirection(LEFT);
move(100,LEFT,DIST_CM(10),true);
changeDirection(FWD);
moveAtSpeed(0,0);
}
if(key == 2)
{
moveAtSpeed(0,0);
}
}
task_I2CTWI();
}
return 0;
}
Habe lange nichts mehr damit gemacht, aber kann es sein, dass er mit LEFT und RIGHT bei MOVE nichts anfangen kann? Versuche mal für´s Drehen die rotate-Funktion
doch kann er, er dreht ja. Nur wenn er den Befehl move ausgeführt hat tut er nichts mehr. Und rotate habe ich auch schon probiert, funktionierte aber auch nicht.
@Mario94:
"Move" wird bei dir ja benutzt, wenn du Taste 1 oder 3 drückst. Danach wird der RP6 mit "moveAtSpeed(0,0);" gestoppt (d.h. er "tut nichts mehr").Zitat:
Nur wenn er den Befehl move ausgeführt hat tut er nichts mehr.
Also tut dein RP6 doch das, was du ihm beigebracht hast.
Gruß Dirk
Richtig, wenn ich diese Taste drücke macht er genau das was ich will.
Aber dadurch wird der gesamte programmablauf blockiert und er reagiert auf keine Taste mehr.
Wie oben geschrieben, ich könnte ihn 100 mal vor und zurückfahren lassen. Aber sobald ich ihn einmal drehen lasse reagiert er auf keine Taste mehr.
Ok...aus irgendeinem Grund steht in der Slave vom RP6 bei move und bei rotate am ende false. Wenn ich jetzt mein Programm mit rotate true schreibe tut er dies zwar, aber danach reagiert er auf keine Taste mehr.
Wenn ich allerdings wie in der Slave steht, false dahinter schreibe, funktioniert es. Er rotiert und reagiert auf die Tasten, genau wie er es soll.
Hier nochmal der Code:
@ Momo2712: Versuchs mal mit rotate 0 anstatt 1 bzw. mit false anstatt true, kann gut sein das du das selbe Problem hast.Code:#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
setLEDs(0b1111);
mSleep(1000);
setLEDs(0b0000);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}
while(true)
{
uint8_t key = getPressedKeyNumber();
{
if(key == 5)
{
changeDirection(FWD);
moveAtSpeed(100,100);
}
if(key == 4)
{
changeDirection(BWD);
moveAtSpeed(100,100);
}
if(key == 1)
{
rotate(130,RIGHT,50,false);
}
if(key == 3)
{
rotate(130,LEFT,50,false);
}
if(key == 2)
{
moveAtSpeed(0,0);
}
}
task_I2CTWI();
}
return 0;
}
Hi Leute,
ich habe ein Problem bei mit dem I2C-Bus Programm.
Zum testen habe ich versucht, das Beispielprogramm \RP6BASE_EXAMPLES\RP6Base_I2CSlave.c zu kompilieren und auf den RP6 zu laden.
Jedoch bekomme ich immer die Fehler:
Ich habe die neuste Version der Librarys (Version 20080915) und exakt das Beispielprogramm genommen, ohne etwas zu verändern.Code:> "make.exe" all
-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 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: 6904 bytes (21.1% Full)
(.text + .data + .bootloader)
Data: 246 bytes (12.0% Full)
(.data + .bss + .noinit)
Compiling: main-base.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main-base.lst -I../RP6Lib -I../RP6Lib/RP6base -I../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/main-base.o.d main-base.c -o main-base.o
Linking: main-base.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main-base.o -I../RP6Lib -I../RP6Lib/RP6base -I../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/main-base.elf.d main-base.o ../RP6Lib/RP6base/RP6RobotBaseLib.o ../RP6Lib/RP6common/RP6uart.o --output main-base.elf -Wl,-Map=main-base.map,--cref -lm
main-base.o: In function `getCommand':
C:\RP6\Base/main-base.c:307: undefined reference to `I2CTWI_writeRegisters'
C:\RP6\Base/main-base.c:307: undefined reference to `I2CTWI_writeBusy'
C:\RP6\Base/main-base.c:309: undefined reference to `I2CTWI_writeRegisters'
C:\RP6\Base/main-base.c:310: undefined reference to `I2CTWI_writeRegisters'
C:\RP6\Base/main-base.c:311: undefined reference to `I2CTWI_writeRegisters'
C:\RP6\Base/main-base.c:312: undefined reference to `I2CTWI_writeRegisters'
C:\RP6\Base/main-base.c:313: undefined reference to `I2CTWI_writeRegisters'
main-base.o:C:\RP6\Base/main-base.c:314: more undefined references to `I2CTWI_writeRegisters' follow
main-base.o: In function `task_commandProcessor':
C:\RP6\Base/main-base.c:361: undefined reference to `setLEDs'
main-base.o: In function `task_updateRegisters':
C:\RP6\Base/main-base.c:237: undefined reference to `I2CTWI_readBusy'
C:\RP6\Base/main-base.c:239: undefined reference to `I2CTWI_readRegisters'
C:\RP6\Base/main-base.c:240: undefined reference to `I2CTWI_readRegisters'
C:\RP6\Base/main-base.c:241: undefined reference to `I2CTWI_readRegisters'
C:\RP6\Base/main-base.c:242: undefined reference to `I2CTWI_readRegisters'
C:\RP6\Base/main-base.c:243: undefined reference to `I2CTWI_readRegisters'
main-base.o:C:\RP6\Base/main-base.c:244: more undefined references to `I2CTWI_readRegisters' follow
main-base.o: In function `task_updateRegisters':
C:\RP6\Base/main-base.c:269: undefined reference to `I2CTWI_dataWasRead'
C:\RP6\Base/main-base.c:269: undefined reference to `I2CTWI_dataReadFromReg'
main-base.o: In function `signalInterrupt':
C:\RP6\Base/main-base.c:92: undefined reference to `I2CTWI_dataWasRead'
main-base.o: In function `task_MasterTimeout':
C:\RP6\Base/main-base.c:419: undefined reference to `setLEDs'
C:\RP6\Base/main-base.c:423: undefined reference to `setLEDs'
main-base.o: In function `main':
C:\RP6\Base/main-base.c:444: undefined reference to `setLEDs'
C:\RP6\Base/main-base.c:446: undefined reference to `setLEDs'
C:\RP6\Base/main-base.c:448: undefined reference to `I2CTWI_initSlave'
main-base.o: In function `motionControlStateChanged':
C:\RP6\Base/main-base.c:151: undefined reference to `isMovementComplete'
make.exe: *** [main-base.elf] Error 1
> Process Exit Code: 2
> Time Taken: 00:00
Die Antwort wird wahrscheinlich kurz, da der Fehler bei mir liegt, ich weiß aber nicht wo?!
Vielen Dank
Ich
@Ich:
Laut Ausdruck kompilierst du ein Programm namens "main-base.c" und nicht das RP6Base_I2CSlave.c.Zitat:
Zum testen habe ich versucht, das Beispielprogramm \RP6BASE_EXAMPLES\RP6Base_I2CSlave.c zu kompilieren ...
Und das Programm main-base.c kennt wohl nicht die I2C-Library.
Gruß Dirk