PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Testprogramm läuft nicht



9999
14.05.2009, 20:34
Hi,

habe jetzt einen RP6 und habe gleich mal ein kleines Testprogramm geschrieben, das aber nicht läuft.

Hier mein Source-Code:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
char receiveBuffer[5];
receiveBytes(5);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&receiveBuffer[0]);
if(receiveBuffer == "Hello")
{
writeString_P("Hi!\n");
}
}

Und hier der Compiler-Output:


> "C:\RP6Examples\RP6BASE_EXAMPLES\Test\\make_all.bat"

C:\RP6Examples\RP6BASE_EXAMPLES\Test>set LANG=C

C:\RP6Examples\RP6BASE_EXAMPLES\Test>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: Test.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DDEBUG_MEASURE_DUTY_CYCLE -O -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Test.lst -I../../RP6lib -I../../RP6lib/RP6base -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/Test.o.d Test.c -o Test.o

Linking: Test.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DDEBUG_MEASURE_DUTY_CYCLE -O -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Test.o -I../../RP6lib -I../../RP6lib/RP6base -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/Test.elf.d Test.o --output Test.elf -Wl,-Map=Test.map,--cref -lm
Test.o: In function `main':
C:\RP6Examples\RP6BASE_EXAMPLES\Test/Test.c:5: undefined reference to `initRobotBase'
C:\RP6Examples\RP6BASE_EXAMPLES\Test/Test.c:8: undefined reference to `receiveBytes'
C:\RP6Examples\RP6BASE_EXAMPLES\Test/Test.c:9: undefined reference to `waitUntilReceptionComplete'
C:\RP6Examples\RP6BASE_EXAMPLES\Test/Test.c:10: undefined reference to `copyReceivedBytesToBuffer'
C:\RP6Examples\RP6BASE_EXAMPLES\Test/Test.c:13: undefined reference to `writeNStringP'
make: *** [Test.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:03



Du hast aus versehen den Source Code statt dem Compilerout hingeschrieben.

Ist editiert, danke für den Hinweis.

Luki.B.
14.05.2009, 20:46
Du hast aus versehen den Source Code statt dem Compilerout hingeschrieben.

SlyD
14.05.2009, 20:59
Ist in diesem Fall aber auch egal :)

Das oben kann schon deswegen nicht so wie gedacht funktionieren, weil da überhaupt keine Endlosschleife im Code drin ist (s. Anleitung und Beispiele ;) ).


Weiterhin kannst Du keine Zeichenkette mit einer einfachen Bedingung wie "if(receiveBuffer == "Hello") " vergleichen.

Das geht nur mit einzelnen Zeichen direkt.
Eine Zeichenkette ist ein ARRAY mit Bytes (also quasi ein ganzer Haufen von Variablen) - Du kannst kein Array mit einem Array über "==" vergleichen - jedes Element muss einzeln mit dem entsprechenden anderen Element verglichen werden.

Musst schon Funktionen wie strcmp verwenden (oder selbst duch das Array laufen... ).

So in etwa:
if(strcmp(receiveBuffer,"Hello")==0)
// mach was...

Hoffe das hilft Dir weiter, frag ruhig wenn noch was unklar ist.

MfG,
SlyD

9999
14.05.2009, 21:36
Der Source-Code sieht jetzt so aus:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
char receiveBuffer[5];
while(true)
{
receiveBytes(5);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&receiveBuffer[0]);
if(strcmp(receiveBuffer,"Hello")==0)
{
writeString_P("Hi!\n");
}
}
}

Der Compiler-Output ist immernoch derselbe.

btw: Wofür genau ist eigentlich die Endlosschleife gut? Ohne müsste das Programm doch normalerweisse auch laufen(Würde zwar nach einem Durchlauf abbrechen, aber laufen müsste es doch, oder?)

SlyD
14.05.2009, 22:03
Ja eigentlich sollte es auch ohne laufen - aber der Programmzähler des Mikrocontrollers könnte dann einfach über den Reset des Programmspeichers laufen... wenn da noch überreste von alten Programmen vorhanden sind, kann sonstwas passieren.

Die Fehlermeldungen vom Compiler deuten darauf hin das in Deinem Makefile was nicht richtig ist oder Du die Ordnerstruktur nicht so aufgebaut hast wie bei den Beispielprogrammen (die Relativposition der RP6Lib muss stimmen, sonst findet die der Compiler nicht (oder man passt das entsprechend im Makefile an) - zwei Verzeichnisebenen höher... )

Hier mal ein Beispiel:
http://www.arexx.com/rp6/downloads/RP6_project_template.zip
(die Lib die hier dabei ist eine ALTE 2007er Version... die nicht mehr verwenden - muss ich mal updaten das Beispiel.)

MfG,
SlyD

9999
14.05.2009, 22:28
Also die Verzeichnisstruktur sieht bei mir so aus:



C:\RP6Examples\
-RP6BASE_EXAMPLES
-Test
-Test.c
-makefile
-make_all.bat
-make_clean.bat
-RP6CONTROL_EXAMPLES
-RP6Lib

Das Makefile sieht so aus:


TARGET = Test
RP6_LIB_PATH=../../RP6lib
RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common
SRC = $(TARGET).c
MCU = atmega32
FORMAT = ihex
ASRC=
DEBUG =dwarf-2
EXTRAINCDIRS = $(RP6_LIB_PATH) $(RP6_LIB_PATH_OTHERS)
CSTANDARD = -std=gnu99
CDEFS = -DDEBUG_MEASURE_DUTY_CYCLE
CINCS =
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS) $(CINCS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB =
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
SCANF_LIB =
MATH_LIB = -lm
EXTMEMOPTS =
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
AVRDUDE_PROGRAMMER = stk500
AVRDUDE_PORT = com1 # programmer connected to serial device
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
DEBUG_MFREQ = $(F_CPU)
DEBUG_UI = insight
DEBUG_BACKEND = avarice
GDBINIT_FILE = __avr_gdbinit
JTAG_DEV = /dev/com1
DEBUG_PORT = 4242
DEBUG_HOST = localhost
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rmdir
COPY = cp
WINSHELL = cmd
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)

all: begin gccversion sizebefore build sizeafter end

build: elf hex eep lss sym

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym

begin:
@echo
@echo $(MSG_BEGIN)

end:
@echo $(MSG_END)
@echo

HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf

sizebefore:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
2>/dev/null; echo; fi

sizeafter:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
2>/dev/null; echo; fi

gccversion :
@$(CC) --version

program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)

gdb-config:
@$(REMOVE) $(GDBINIT_FILE)
@echo define reset >> $(GDBINIT_FILE)
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
@echo end >> $(GDBINIT_FILE)
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
ifeq ($(DEBUG_BACKEND),simulavr)
@echo load >> $(GDBINIT_FILE)
endif
@echo break main >> $(GDBINIT_FILE)

debug: gdb-config $(TARGET).elf
ifeq ($(DEBUG_BACKEND), avarice)
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
@$(WINSHELL) /c pause
else
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
endif
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)

COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000




coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof

%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags .eeprom=alloc,load \
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0

%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@

%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@

.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@

%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@

%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@

%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@

clean: begin clean_list end

clean_list :
@echo
@echo $(MSG_CLEANING)

include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config

SlyD
14.05.2009, 22:51
Automatisch generiert?
Nunja. In dem obigen Makefile hast Du bei src die C Dateien der RP6Lib nicht eingetragen. Den Rest hab ich mir nicht mehr angeschaut.

Nimm am besten das aus dem oben verlinkten Zip Archiv und ändere da einfach den Namen von deinem Programm. Der Rest passt dann schon sofort.

MfG,
SlyD

9999
15.05.2009, 19:58
Nimm am besten das aus dem oben verlinkten Zip Archiv und ändere da einfach den Namen von deinem Programm. Der Rest passt dann schon sofort.

Hat funktioniert, Danke!

9999
15.05.2009, 21:15
Habe noch ein kleines Problem.

Wenn ich folgendes Programm kompiliere, auf den Roboter lade und starte:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
char receiveBuffer[5];
while(true)
{
writeString_P("Programm gestartet!\n");
receiveBytes(5);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&receiveBuffer[0]);
if(strcmp(receiveBuffer,"Hello")==0)
{
writeString_P("Hi!\n");
}
}
}


wird erstmal "Programm gestartet!" ausgegeben.
Wenn ich allerdings "Hello" eingebe, gibt der Roboter nichts aus, er sollte aber "Hi!" ausgeben.

Dirk
16.05.2009, 08:27
Hallo 9999,

die beste Art, eigene Programme für den RP6 zu schreiben ist, erst mal die Demos zu ändern mit eigenen Ideen.

In der Demo "Example_02_UART_02" wird z.B. gezeigt, wie man eine Benutzereingabe machen kann und Text als Antwort ausgibt.

Gruß Dirk

9999
16.05.2009, 10:14
Habe jetzt mal das Beispiel EXAMPLE_02_UART_02 angeschaut.

Mein Testprogramm habe ich auch entsprechend umgeschrieben, und es läuft:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
char receiveBuffer[5];
writeString_P("Programm gestartet!\n");
while(true)
{
receiveBytes(5);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&receiveBuffer[0]);
if(receiveBuffer[0] == 'H' && receiveBuffer[1] == 'e' && receiveBuffer[2] == 'l' && receiveBuffer[3] == 'l' && receiveBuffer[4] == 'o')
{
writeString_P("Hi!\n");
}
}
}


Allerdings muss es doch eine weniger umständliche Art geben um einen eingegebenen Text mit einem anderen zu vergleichen, als jeden Buchstaben einzeln zu überprüfen?

Gibt es vielleicht sowas wie eine String-Funktion?

SlyD
16.05.2009, 12:52
Habe ich ja oben schon genannt - strcmp. Und alle anderen sonstigen üblichen C Standard Funktionen gibt es natürlich auch (s. avrlibc doku)
Du musst aber schauen ob in dem Buffer nicht noch ANDERE Zeichen reingeraten sind - also lass dir mal den Inhalt zeichen für zeichen (auch als Zahl mit writeInteger) ausgeben!

MfG,
SlyD

9999
19.05.2009, 18:56
Folgender Code:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
void RC5_COMMAND(RC5data_t rc5data)
{
if(rc5data.device == 10)
{
moveAtSpeed(0,0);
}
}
void ACS_EVENT_HANDLER(void)
{
if(obstacle_left || obstacle_right)
{
changeDirection(RIGHT);
writeString_P("!\n");
while(true)
{
if(!obstacle_left && !obstacle_right)
{
changeDirection(FWD);
break;
}
}
}
}
ACS_setStateChangedHandler(ACS_EVENT_HANDLER);
IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
moveAtSpeed(45,45);
task_motionControl();
while(true)
{
task_motionControl();
task_ACS();
}
}

funktioniert nicht so wie er soll.

Der Roboter sollte wenn er auf ein Hindernis stößt rechts abbiegen und bei Druck eines beliebigen Knopfs auf der Fernbedienung stehen bleiben.

Allerdings rollt er immer gerade weiter, egal ob ein Hindernis vor ihm ist oder ich einen Knopf auf der Fernbedienung drücke.

Fabian E.
20.05.2009, 17:27
Wie wärs wenn du dich erst mal mit den grundlegenden Dingen der C-Syntax beschäftigst...

9999
20.05.2009, 18:09
Wie wärs wenn du dich erst mal mit den grundlegenden Dingen der C-Syntax beschäftigst...

Den C-Crashkurs aus dem RP6-Manual habe ich durch, das sollte doch langen, oder?

Fabian E.
20.05.2009, 18:19
Naja du könntest dir mal überlegen, wo man eigene Methoden implementiert... Jedenfalls nicht in der Main-Methode...Sondern außerhalb davon.

Fabi

SlyD
20.05.2009, 18:25
Mal abgesehen von den Funktionen in einer Funktion (sowas sollte man wirklich nicht tun wenn man nicht weiss was man tut ;) ) ist Dein Problem hier eher dass die Event Handler nicht blockieren dürfen.

Sehr ähnlich zu diesem Verständnisproblem hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=48028


Lass das mit den Event Handlern lieber erstmal bleiben und mach alles in der Hauptschleife... das ist einfacher zu überblicken.

MfG,
SlyD

9999
20.05.2009, 19:34
Der Quellcode sieht jetzt so aus:


#include "RP6RobotBaseLib.h"

/*void RC5_COMMAND(RC5data_t rc5data)
{
if(rc5data.device == 10)
{
moveAtSpeed(0,0);
}
}
void ACS_EVENT_HANDLER(void)
{
if(obstacle_left || obstacle_right)
{
changeDirection(RIGHT);
writeString_P("!\n");
while(true)
{
if(!obstacle_left && !obstacle_right)
{
changeDirection(FWD);
break;
}
}
}
}*/

int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
/*ACS_setStateChangedHandler(ACS_EVENT_HANDLER);
IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);*/
moveAtSpeed(45,45);
task_motionControl();
while(true)
{
task_motionControl();
task_ACS();
if(rc5data.device == 10)//Wenn eine Taste auf der Fernbedienung gedrückt wird, ...
{
moveAtSpeed(0,0);//...dann hält der Robter an.
}
}
}


Die Event Handler sind wie man sehen kann auskommentiert.

Allerdings spuckt der Compiler drei Errors aus:

Test2.c:40: error: 'rc5data' undeclared (first use in this function)
Test2.c:40: error: (Each undeclared identifier is reported only once
Test2.c:40: error: for each function it appears in.)

Edit: Mir fällt gerade auf, dass das ganze nur 1 Error ist, der in 3 Zeilen ausgegeben wird.

Edit 2: Ok, das Problem habe ich mit Hilfe folgender Codezeile gelöst:


RC5data_t rc5data;

Edit 3: Der Roboter reagiert trotzdem nicht auf Tastendrücke =(

9999
20.05.2009, 21:48
Als ich mir den Roboter auf der Digicam angeschaut habe, ist mir aufgefallen, dass die IR-LEDs garnicht leuchten, obwohl in der Ausführungsschleife task_ACS(); drinsteht.

Edit: Habe das Problem dank folgendem Aritkel schon selber gelöst:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Der Roboter reagiert jetzt auf die Fernbedienung.

9999
23.05.2009, 18:21
Das mit dem fernsteuern funktioniert jetzt einwandfrei, allerdings funktioniert das ACS nicht.(Der Roboter reagiert überhauptnicht auf Hindernisse.)

Hier der Quellcode:


#include "RP6RobotBaseLib.h"

uint8_t rc5command;
uint8_t obstrue;
uint8_t SPEEDset;

void RC5_COMMAND(RC5data_t rc5data)
{
rc5command = rc5data.key_code;
}
/*void ACS_EVENT_HANDLER(void)
{
if(obstacle_left || obstacle_right)
{
changeDirection(RIGHT);
writeString_P("!\n");
while(true)
{
if(!obstacle_left && !obstacle_right)
{
changeDirection(FWD);
break;
}
}
}
}*/

void ACS_EVENT_HANDLER(void)
{
obstrue = 1;
}

int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
/*ACS_setStateChangedHandler(ACS_EVENT_HANDLER);*/
IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
uint8_t SPEED = 45;

while(true)
{
task_motionControl();
task_ACS();

if(rc5command > 0)
{
switch(rc5command)
{
case 32: // Vorwärtstaste
changeDirection(FWD); //Vorwärtsfahren
break;
case 33: //Rückwärtstaste
changeDirection(BWD); //Rückwärtsfahren
break;
case 17: //Volume -
changeDirection(LEFT);
break;
case 16: //Volume +
changeDirection(RIGHT);
break;
case 34: //SFI
if(SPEED < 160)
{
SPEED += 10; //Geschwindigkeit erhöhen
}
break;
case 47: //Swap
if(SPEED > 10)
{
SPEED -= 10; //Geschwindigkeit erniedrigen
}
break;
case 12: //OFF-Taste (Funktioniert noch nicht richtig)
SPEEDset = 0;
if(SPEED > 0) //Wenn Geschwindigkeit > 0
{
SPEED = 0;//setze Geschwindigkeit auf 0
SPEEDset = 1;
}
else if(SPEED == 0 && SPEEDset == 0)//Wenn Geschwindigkeit gleich 0
{
SPEED = 45;//Setze Geschwindigkeit auf 45
}
}
moveAtSpeed(SPEED,SPEED);
task_motionControl();
rc5command = 0;
if(obstrue == 1)
{
changeDirection(RIGHT);
task_motionControl();
mSleep(100);
changeDirection(FWD);
}
}
}
}

Fabian E.
23.05.2009, 18:24
Wenn du mit den task_xxx-Methoden arbeitest, darfst du nicht solange Sleeps einbauen... und warum rufst du nach jeder Änderung wieder task_motionControl auf?

Fabi

9999
28.05.2009, 18:23
Ohne die Sleeps funktioniert´s auch nicht:


#include "RP6RobotBaseLib.h"

uint8_t rc5command;
uint8_t obstrue;
uint8_t SPEEDset;

void RC5_COMMAND(RC5data_t rc5data)
{
rc5command = rc5data.key_code;
}
/*void ACS_EVENT_HANDLER(void)
{
if(obstacle_left || obstacle_right)
{
changeDirection(RIGHT);
writeString_P("!\n");
while(true)
{
if(!obstacle_left && !obstacle_right)
{
changeDirection(FWD);
break;
}
}
}
}*/

void ACS_EVENT_HANDLER(void)
{
obstrue = 1;
}

int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
/*ACS_setStateChangedHandler(ACS_EVENT_HANDLER);*/
IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
uint8_t SPEED = 45;

while(true)
{
task_motionControl();
task_ACS();

if(rc5command > 0)
{
switch(rc5command)
{
case 32: // Vorwärtstaste
changeDirection(FWD); //Vorwärtsfahren
break;
case 33: //Rückwärtstaste
changeDirection(BWD); //Rückwärtsfahren
break;
case 17: //Volume -
changeDirection(LEFT);
break;
case 16: //Volume +
changeDirection(RIGHT);
break;
case 34: //SFI
if(SPEED < 160)
{
SPEED += 10; //Geschwindigkeit erhöhen
}
break;
case 47: //Swap
if(SPEED > 10)
{
SPEED -= 10; //Geschwindigkeit erniedrigen
}
break;
case 12: //OFF-Taste (Funktioniert noch nicht richtig)
SPEEDset = 0;
if(SPEED > 0) //Wenn Geschwindigkeit > 0
{
SPEED = 0;//setze Geschwindigkeit auf 0
SPEEDset = 1;
}
else if(SPEED == 0 && SPEEDset == 0)//Wenn Geschwindigkeit gleich 0
{
SPEED = 45;//Setze Geschwindigkeit auf 45
}
}
moveAtSpeed(SPEED,SPEED);
task_motionControl();
rc5command = 0;
if(obstrue == 1)
{
changeDirection(RIGHT);
startStopwatch1();
while(true)
{
task_motionControl();
if(getStopwatch1() >= 100)
{
changeDirection(FWD);
setStopwatch1(0);
break;
}
}
obstrue = 0;
}
}
}
}

Fabian E.
28.05.2009, 19:46
Wenn du die Registrierung des Eventhandlers ausklammerst kanns auch nicht gehen.

Fabi

9999
28.05.2009, 20:34
Wenn du die Registrierung des Eventhandlers ausklammerst kanns auch nicht gehen.

Fabi

Die Zeile " ACS_setStateChangedHandler(ACS_EVENT_HANDLER);"ist jetzt nicht mehr auskommentiert, allerdings funktioniert das ganze immernoch nicht.


#include "RP6RobotBaseLib.h"

uint8_t rc5command;
uint8_t obstrue;
uint8_t SPEEDset;

void RC5_COMMAND(RC5data_t rc5data)
{
rc5command = rc5data.key_code;
}
/*void ACS_EVENT_HANDLER(void)
{
if(obstacle_left || obstacle_right)
{
changeDirection(RIGHT);
writeString_P("!\n");
while(true)
{
if(!obstacle_left && !obstacle_right)
{
changeDirection(FWD);
break;
}
}
}
}*/

void ACS_EVENT_HANDLER(void)
{
obstrue = 1;
}

int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
ACS_setStateChangedHandler(ACS_EVENT_HANDLER);
IRCOMM_setRC5DataReadyHandler(RC5_COMMAND);
uint8_t SPEED = 45;

while(true)
{
task_motionControl();
task_ACS();

if(rc5command > 0)
{
switch(rc5command)
{
case 32: // Vorwärtstaste
changeDirection(FWD); //Vorwärtsfahren
break;
case 33: //Rückwärtstaste
changeDirection(BWD); //Rückwärtsfahren
break;
case 17: //Volume -
changeDirection(LEFT);
break;
case 16: //Volume +
changeDirection(RIGHT);
break;
case 34: //SFI
if(SPEED < 160)
{
SPEED += 10; //Geschwindigkeit erhöhen
}
break;
case 47: //Swap
if(SPEED > 10)
{
SPEED -= 10; //Geschwindigkeit erniedrigen
}
break;
case 12: //OFF-Taste (Funktioniert noch nicht richtig)
SPEEDset = 0;
if(SPEED > 0) //Wenn Geschwindigkeit > 0
{
SPEED = 0;//setze Geschwindigkeit auf 0
SPEEDset = 1;
}
else if(SPEED == 0 && SPEEDset == 0)//Wenn Geschwindigkeit gleich 0
{
SPEED = 45;//Setze Geschwindigkeit auf 45
}
}
moveAtSpeed(SPEED,SPEED);
task_motionControl();
rc5command = 0;
if(obstrue == 1)
{
changeDirection(RIGHT);
startStopwatch1();
while(true)
{
task_motionControl();
if(getStopwatch1() >= 100)
{
changeDirection(FWD);
setStopwatch1(0);
break;
}
}
obstrue = 0;
}
}
}
}

9999
30.05.2009, 18:05
Weiss keiner woran´s liegt?