Hallo
Nein, es hat überhaupt nicht geholfen. Das eigentliche Problem besteht nach wie vor: Die orginale RP6-Library wird eingebunden obwohl wir das nicht wollen. Ohne rblib.c werden die doppelten Definitionen der Funktionen nicht mehr gemeldet, allerdings fehlen dann auch diejenigen Funktionen die in rblib.c definiert sind: rblib_init() und setMotorPWM():
Code:
RP6Base_LEDs.c:(.text+0x8c): undefined reference to `rblib_init'
RP6Base_LEDs.c:(.text+0xb6): undefined reference to `setMotorPWM'
RP6Base_LEDs.c:(.text+0x164): undefined reference to `setMotorPWM'
Das in der RP6-Lib die ISR des Timer0 belegt ist, diese aber auch im RC-Steuerprogram neu definiert wird (ISR(TIMER0_COMP_vect) ) erkennt der Kompiler natürlich auch:
Code:
E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6base/RP6RobotBaseLib.c:1463: multiple definition of `__vector_10'
RP6Base_LEDs.o:e:\technik\rp6\rp6examples_20080915\rp6base_examples\Example_01_LEDs/RP6Base_LEDs.c:13: first defined here
Das ist letzlich auch der Grund warum ich mir damals eine eigene abgespeckte Lib zusammenkopiert habe. (Bei einem Microprozessor ala z80 oder 6809 würde ich zur Laufzeit einfach die Sprungtabellen manipulieren, bei den AVRs habe ich eine vergleichbare Möglichkeit bisher noch nicht gefunden)
Warum das includen von C-Dateien "böse" ist kann ich als C-Neulich nicht sagen. Ich war bisher der Meinung, eine mit #include eingefügte Datei wird eben schlicht an der Stelle eingesetzt, an der man sie includet. Ob das nun #defines einer h-Datei sind, oder Arrays für eine Zeichensatzdefinition oder eben zusätzliche Funktionen in einer Datei mit Endung .c
Aber ich schweife mal wieder ab, zurück zum eigentlichen Problem: Die Datei rblib.c muss unbedingt includet werden und die Datei RP6RobotBaseLib.c darf es auf gar keinen Fall sonst funtzt das nicht mit dem RC-Programm. Die Frage ist deshalb: Wo und wieso wird die RP6-Lib eingebunden?
Gruß
mic
[Edit]
Ich habe mir nun (zum ersten mal) ein RP6-Makefile angeschaut. Es stammt aus den Beispielen, Nr.1: LEDs Datei: makefile
Und siehe da, hier scheint unser Problem zu schlummern:
Code:
###############################################################################
# If there is more than one source file, append them here separated by spaces.
# Usually you have to add the Library files here! (ONLY add c files "*.c" here,
# NO header files "*.h"!)
# Don't forget to add relative paths!
SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
#SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CslaveTWI.c
#SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c
Hier werden die Dateien RP6RobotBaseLib.c (und RP6uart.c) in ein Projekt eingebunden. Das # ist wohl der Start eines Kommentars, dann sollten diese Änderungen unser Problem lösen:
Code:
#SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
#SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
Die orginale Version meines Progamms
Code:
// RC-RP6 erster Versuch 18.11.07 mic
#include "rblib.h"
#include "rblib.c"
uint8_t y, z;
...
zusammen mit den Dateien rblib.h und rblib.c im selben Verzeichniss (das hast du ja schon) sollte nun endlich fehlerfrei kompilierbar sein. Hoffe ich zumindest ;)
Lesezeichen