Archiv verlassen und diese Seite im Standarddesign anzeigen : Testprogramm läuft nicht
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.
Du hast aus versehen den Source Code statt dem Compilerout hingeschrieben.
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
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?)
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
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
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
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!
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.
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
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?
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
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...
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
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
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 =(
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.
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
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
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;
}
}
}
}
Weiss keiner woran´s liegt?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.