Jetzt solltest du uns mal dein Programm zeigen :)
ok
die fehlermeldung sieh jetzt so aus
Code:> "make.exe" all -------- begin -------- avr-gcc (WinAVR 20081124rc3) 4.3.2 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. 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 In file included from RP6Base_LEDs.c:6: ../../RP6Lib/RP6base/RP6RobotBaseLib.h:77: error: two or more data types in declaration specifiers make.exe: *** [RP6Base_LEDs.o] Error 1 > Process Exit Code: 2 > Time Taken: 00:00
und jetzt ???
danke
Jetzt solltest du uns mal dein Programm zeigen :)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
dann tuh ich das mal
das ist das program aus einem der ersten beiträge.Code:// RC-RP6 erster Versuch 18.11.07 mic #include "rblib.h" #include "rblib.c" #include "RP6RobotBaseLib.h" #define RP6BASELIB_H // zusäzliche Definition uint8_t y, z; uint8_t rc_input_pwr, rc_input_dir; uint8_t rc_pwr, rc_dir; ISR(TIMER0_COMP_vect) { //static uint16_t count=0; static uint16_t rc_temp_pwr=0; static uint16_t rc_temp_dir=0; //if(count>x) PORTA &= ~16; else PORTA |= 16; // E_INT1 (Pin8) //if(count>y) PORTC &= ~1; else PORTC |= 1; // SCL (Pin10) //if(count>z) PORTC &= ~2; else PORTC |= 2; // SDA (Pin12) //if(count<1000)count++; else count=0; if (PINC & 1) rc_temp_dir++; else if (rc_temp_dir) { rc_input_dir=rc_temp_dir-1; rc_temp_dir=0; } if (PINC & 2) rc_temp_pwr++; else if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr-1; rc_temp_pwr=0; } } void servo_init(void) { //DDRA |= 16; // E_INT1 als Ausgang //DDRC |= 3; // SCL und SDA als Ausgang TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8 TIMSK = (1 << OCIE0); // Interrupt ein OCR0 = 9; // 100kHz? } int main(void) { rblib_init(); servo_init(); setLEDs(0b1001); setMotorDir(FWD,FWD); setMotorPWM(0,0); while(1) { rc_pwr=0; rc_dir=0; if (rc_input_dir<120) { rc_dir=150-rc_input_dir; setMotorDir(BWD,FWD); } if (rc_input_dir>140) { rc_dir=rc_input_dir-110; setMotorDir(FWD,BWD); } if (rc_input_pwr<120) { rc_pwr=150-rc_input_pwr; setMotorDir(FWD,FWD); } if (rc_input_pwr>140) { rc_pwr=rc_input_pwr-110; setMotorDir(BWD,BWD); } rc_pwr*=3; if (rc_pwr) { if (rc_input_dir<120) setMotorPWM(rc_pwr-rc_dir,rc_pwr+rc_dir); else if (rc_input_dir>140) setMotorPWM(rc_pwr+rc_dir,rc_pwr-rc_dir); else setMotorPWM(rc_pwr,rc_pwr); } else { setMotorPWM(rc_dir*3, rc_dir*3); } } return 0; }
*lol* Na klasse, das sollte ich ja kennen.
Übrigends sind diese Zeilen hier natürlich völlig falsch und absolut überflüssig:
Das Programm verwendet meine Mini-Library weil die orginale Lib alle Timer belegt. Was meldet denn dein Kompiler wenn du das orginale Programm nur mitCode:#include "RP6RobotBaseLib.h" #define RP6BASELIB_H // zusäzliche Definition
übersetzen willst?Code:#include "rblib.h" #include "rblib.c"
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
dann gibt er wieder mehr fehler aus
danke übrigents für die mühe.Code:> "make.exe" all -------- begin -------- avr-gcc (WinAVR 20081124rc3) 4.3.2 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. 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 ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `updateStatusLEDs': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6base/RP6RobotBaseLib.c:129: multiple definition of `updateStatusLEDs' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:37: first defined here ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `readADC': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6base/RP6RobotBaseLib.c:272: multiple definition of `readADC' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:28: first defined here ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `startADC': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6base/RP6RobotBaseLib.c:288: multiple definition of `startADC' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:23: first defined here ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `setMotorDir': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6base/RP6RobotBaseLib.c:948: multiple definition of `setMotorDir' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:18: first defined here ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `__vector_10': 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 ../../RP6Lib/RP6common/RP6uart.o: In function `writeChar': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6common/RP6uart.c:73: multiple definition of `writeChar' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:57: first defined here ../../RP6Lib/RP6common/RP6uart.o: In function `writeString': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6common/RP6uart.c:97: multiple definition of `writeString' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:61: first defined here ../../RP6Lib/RP6common/RP6uart.o: In function `writeInteger': E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/RP6common/RP6uart.c:165: multiple definition of `writeInteger' RP6Base_LEDs.o:E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPLES\Example_01_LEDs/../../RP6Lib/rblib.c:66: first defined here make.exe: *** [RP6Base_LEDs.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:00
Es ist für mich keine Mühe. Ich bewundere vielmehr deine Hartnäckigkeit mit der du am Ball bleibst. Ein Problem ist einfach, dass ich mich mit den internen Vorgängen beim Kompilieren nicht so gut auskenne. Und dass ich nicht das Notepad/Avrstudio verwende. Denn hier scheint mir das eigentliche Problem zu liegen. Irgendwie wird trotz allem ein Teil der orginalen RP6-Lib eingebunden. Deshalb habe ich auch nicht erkannt, dass du versuchst mein Programm zu kompilieren.
Was mich dabei sehr verwirrt: Hast du das RC-Programm als "RP6Base_LEDs" gespeichert? Ich habe das Gefühl, irgendwie scheinen da zwei Programme in einem Projekt verbunden. Ob das aber am Makefile, an den geöffneten Dateien im Notepad oder sonstwas verursacht wird kann ich nicht sagen. Ich würde deshalb vorschlagen, dass wir mal eine kleine Pause machen und bis morgen abwarten. Möglicherweise meldet sich jemand der sich besser auskennt.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi,
ja, ich have es als RP6_LEDs gespeichert weil mir in diesem projekt bisher nur das kompilimieren gelungen ist wenn ich das in einem seperatem projekt speicher kommt immer eine fehlemeldung
no rule to make target *.elf
und deswegen ist das unter RP6_LEDs gespeichert.
Habe leider keine Zeit ausführlich zu antworten, aber es gibt hier schon viele viele Threads zu dem Thema! Einfach mal die SuFu benutzen.
#include "rblib.h"
#include "rblib.c" <<<<<------ lösch das mal
Man included keine C Dateien das ist böse!![]()
Und das hier:
http://www.arexx.com/rp6/downloads/R...t_template.zip
hernehmen als Template für eigene Projekte und entsprechend umbennenen. (aber die alte RP6 Library Version die noch dabei ist bitte durch die aktuelle Version ersetzen! )
MfG,
SlyD
PS:
Im Makefile muss immer der Name des Haupt Quelldatei angegeben werden! TARGET = RP6Base_LEDs z.B. wenn die Datei RP6Base_LEDs.c heisst...
Hi,
das mit dem *c file includen hat schonmal geholfen aber komplett kompilimieren konnte ich das imer noch nicht
diese fehlermeldung habe ich jetztCode:> "make.exe" all -------- begin -------- avr-gcc (WinAVR 20081124rc3) 4.3.2 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. 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 ../../RP6Lib/RP6base/RP6RobotBaseLib.o: In function `__vector_10': 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 RP6Base_LEDs.o: In function `main': 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' make.exe: *** [RP6Base_LEDs.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:02
danke für eure hilfe
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():
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: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 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)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
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:
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:############################################################################### # 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
Die orginale Version meines ProgammsCode:#SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c #SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
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 ;)Code:// RC-RP6 erster Versuch 18.11.07 mic #include "rblib.h" #include "rblib.c" uint8_t y, z; ...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen