PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC-gesteuerter RP6



matze120
25.09.2009, 13:54
Hi,
ich habe mal ne frage zum RC gesteuertm RP6

kann mir einer mal das fertige programm als hex datei schicken??

wäre total super

Danke

Matze

radbruch
25.09.2009, 16:42
Hallo

Warum kompilierst du das nicht selbst? Die einfache RC-Steuerung aus dem Dominoday-Thread [Link (https://www.roboternetz.de/phpBB2/viewtopic.php?p=328824#328824)] sieht so aus:

// RC-RP6 erster Versuch 18.11.07 mic

#include "rblib.h"
#include "rblib.c"

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;
}

Die RC-Kanäle kommen an den XBUS-Stecker, links/rechts an Pin10 (SCL), vor/zurück an Pin12 (SDA). RC-Empfänger + und - an VCC und GND des RP6. Die Hex-Datei dazu ist im Anhang.

Gruß

mic

matze120
25.09.2009, 17:43
Hi,
Danke erstmal

warum ich nicht selbst kompilimiere?

ich habe mac und habe noch nicht so eine gichtige idee wie ich das machen soll....

softwaretechnisch

radbruch
25.09.2009, 17:53
Hallo

Vielleicht hilft dir das weiter:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45198
(Der Beitrag von SylD ist allerdings schon etwas älter)

Und hier ein Thread über avrgcc auf mac:
http://www.mikrocontroller.net/topic/24166

Oder du fragst mal direkt bei arexx nach:

http://www.arexx.com/forum/recent.php

Gruß

mic

matze120
25.09.2009, 17:58
ja den beitrag habe ich schon gelesen.

ich arbeite momentan mit einem virtuellen pc wo ich xp drauf habe und da verwene ich winAVR

da bekomme ich immer eine fehlermeldung

Process exit code 2

ich tüftel noch dran

radbruch
25.09.2009, 18:27
Hallo

Obwohl der Mikrocontrollerthread schon etwas älter ist (sorry, hatte ich überlesen) findet man dadurch doch recht aktuelle Seiten:

http://home.arcor.de/torsten.schoenitz/uc_dev/avr/avr.html

Von dort kommt man dann nach hier:

http://www.obdev.at/products/crosspack/index.html

Da ich 'nen ollen PC hab' kann ich das weder nachvollziehen noch testen, aber es scheint Möglichkeiten zu geben die AVRs auch ohne Win oder Linux zu programmieren. Zum Flashen nimmst du natürlich den RP6-Loader, oder? (Sonst würde dir das Hex oben ja auch nix nutzen ;)

Gruß

mic

matze120
25.09.2009, 19:03
Ich habe mir die seiten mal angesehen und es ist wirklich sehr interessant...

glaube aber ich habe ein anderes problem. wenn ich auf make all kicke dann kommt folgendes


> "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: ../../RP6Lib/RP6base/RP6RobotBaseLib.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=../../RP6Lib/RP6base/RP6RobotBaseLib.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6RobotBaseLib.o.d ../../RP6Lib/RP6base/RP6RobotBaseLib.c -o ../../RP6Lib/RP6base/RP6RobotBaseLib.o
In file included from ../../RP6Lib/RP6base/RP6RobotBaseLib.c:69:
../../RP6Lib/RP6base/RP6RobotBaseLib.h:386: error: conflicting types for 'statusLEDs'
../../RP6Lib/RP6base/RP6RobotBaseLib.h:72: error: previous declaration of 'statusLEDs' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.c:1846: error: redefinition of 'setMotorDir'
../../RP6Lib/RP6base/RP6RobotBaseLib.c:947: error: previous definition of 'setMotorDir' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.c:1851: error: redefinition of 'startADC'
../../RP6Lib/RP6base/RP6RobotBaseLib.c:287: error: previous definition of 'startADC' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.c:1856: error: redefinition of 'readADC'
../../RP6Lib/RP6base/RP6RobotBaseLib.c:271: error: previous definition of 'readADC' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.c:1865: error: redefinition of 'updateStatusLEDs'
../../RP6Lib/RP6base/RP6RobotBaseLib.c:128: error: previous definition of 'updateStatusLEDs' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.c:1880: error: redefinition of 'setLEDs'
../../RP6Lib/RP6base/RP6RobotBaseLib.c:153: error: previous definition of 'setLEDs' was here
make.exe: *** [../../RP6Lib/RP6base/RP6RobotBaseLib.o] Error 1

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


kannst du mir dabei helfen?

Thx

radbruch
25.09.2009, 19:23
Oje, Makefiles und Kompilieren sind nicht so meine Stärken :-(


../../RP6Lib/RP6base/RP6RobotBaseLib.h:386: error: conflicting types for 'statusLEDs'
../../RP6Lib/RP6base/RP6RobotBaseLib.h:72: error: previous declaration of 'statusLEDs' was here

Das sieht so aus als wäre die Datei RP6RobotBaseLib.h zweimal eingebunden und deshalb auch die Funktionen doppelt definiert. Das dürfte eigentlich nie passieren, weil die Datei so startet:

#ifndef RP6BASELIB_H
#define RP6BASELIB_H
Nur wenn das Label RP6BASELIB_H nicht definiert ist (#ifndef) wird der folgende Code ausgeführt. Und der folgende Code startet mit der Definition dieses Labels...

Ein eher hilfloser Versuche wäre dies in deinem Programm einzufügen:

#include "RP6RobotBaseLib.h"
#define RP6BASELIB_H // zusäzliche Definition
Ich glaube aber nicht, dass es hilft. Wir müssen wohl abwarten bis dies ein Profi liest.

Gruß

mic

matze120
25.09.2009, 19:28
mhm schon mal besser die fehlermeldungen werden kürzer...


> "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:72: error: conflicting types for 'statusLEDs'
../../RP6Lib/rblib.h:35: error: previous declaration of 'statusLEDs' was here
../../RP6Lib/RP6base/RP6RobotBaseLib.h:386: error: conflicting types for 'statusLEDs'
../../RP6Lib/rblib.h:35: error: previous declaration of 'statusLEDs' was here
make.exe: *** [RP6Base_LEDs.o] Error 1

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

soweit hat das schonmal geklappt

radbruch
25.09.2009, 19:30
Aha!

../../RP6Lib/RP6base/RP6RobotBaseLib.h:72: error: conflicting types for 'statusLEDs'
../../RP6Lib/rblib.h:35: error: previous declaration of 'statusLEDs' was here
Die rblib soll die orginale baselib ersetzen, zusammen funktioniert es nicht!

matze120
25.09.2009, 19:47
ok

die fehlermeldung sieh jetzt so aus


> "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

radbruch
25.09.2009, 20:21
Jetzt solltest du uns mal dein Programm zeigen :)

matze120
25.09.2009, 20:27
dann tuh ich das mal


// 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;
}

das ist das program aus einem der ersten beiträge.

radbruch
25.09.2009, 20:43
*lol* Na klasse, das sollte ich ja kennen.

Übrigends sind diese Zeilen hier natürlich völlig falsch und absolut überflüssig:

#include "RP6RobotBaseLib.h"
#define RP6BASELIB_H // zusäzliche Definition

Das Programm verwendet meine Mini-Library weil die orginale Lib alle Timer belegt. Was meldet denn dein Kompiler wenn du das orginale Programm nur mit

#include "rblib.h"
#include "rblib.c"
übersetzen willst?

matze120
25.09.2009, 20:59
dann gibt er wieder mehr fehler aus



> "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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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_EXAMPL ES\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


danke übrigents für die mühe.

radbruch
25.09.2009, 21:20
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

matze120
26.09.2009, 12:49
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.

SlyD
26.09.2009, 20:46
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/RP6_project_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...

matze120
28.09.2009, 18:04
Hi,
das mit dem *c file includen hat schonmal geholfen aber komplett kompilimieren konnte ich das imer noch nicht


> "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_EXAMPL ES\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

diese fehlermeldung habe ich jetzt

danke für eure hilfe

radbruch
28.09.2009, 20:47
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():

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:

E:\technik\RP6\RP6Examples_20080915\RP6BASE_EXAMPL ES\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 hereDas 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:

################################################## #############################
# 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:

#SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
#SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c


Die orginale Version meines Progamms

// 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 ;)

matze120
30.09.2009, 15:19
Ja,

jetzt lässt es sich fast kompilimieren aber jetzt habe ich die fehlermeldung


> "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.

make.exe: *** No rule to make target `program_01.elf', needed by `elf'. Stop.

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

und wie bekomme ich das problem gelöst?


grüße
Matze

radbruch
30.09.2009, 15:40
Hallo

Wie oben schon geschrieben kenne ich mich mit den Kompilereinstellungen und den Makefiles überhaupt nicht aus (das erledigt mein KamAVR für mich). ;)

Ich würde deshalb einfach mal folgendes versuchen:
http://tinyurl.com/ybmfk8j

Gruß

mic

Mc Delta
22.03.2010, 17:15
Hi,
Was bewirkt eigentlich das test_program von radbruch?
Ich habe keinen Empfänger angeschlossen und das Program aus Neugierde ausprobiert.
Das Resultat:
Die rechte Kette des RP6´dreht sich stetig vorwärts.
Warum?
Danke für jegliche Aufklärung der Frage!

radbruch
22.03.2010, 18:26
Hallo

Auch hier geht es um das RC-Programm aus dem Dominoday-Thread. Ohne angeschlossenen RC-Empfänger macht der RP6 was er will, weil ich die Initialisierung der Inputwerte vergessen habe:

uint8_t rc_input_pwr, rc_input_dir;

Da mein Empfänger mit diesem Programm Werte zwischen 110 und 150 liefert, ist die Nullstellung (Mitte) bei ca. 130. Deshalb sollte die Initalisierung besser so aussehen:

uint8_t rc_input_pwr=130, rc_input_dir=130;

Gruß

mic

Mc Delta
23.03.2010, 14:32
Ok,
Das heißt dann also, dass RP6 die zugehörige Bedingung (um sich nach links drehen zu dürfen) als erfüllst ansieht und sich somit nch links dreht. :!:
Nun zu einem anderem Problem: Das Kompilieren!!!
Ich habe zwar deine rblib.c ins Makefile einetragen (unter SRC (sieh Code)).
Außerdem habe ich den Pfad von der rblib statt der RP6RobotBaseLib verwendet(siehe Code).
Trotzdem erscheint folgende Fehlermeldung:
make: *** No rule to make target `RC_RP6.elf', needed by `elf'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00
Warum?
Ich habe den Ordner wie die Datei benannt und eine Make all und eine Make Clean Datei zusammen mit dem Makefile und deinem ungeänderten C-Code in den Ordner gepackt.


TARGET = RC_RP6

################################################## #############################



################################################## #############################
# Specify relative path to RP6 library files here.
# This is "../../RP6lib" or "../RP6lib" usually.

RP6_LIB_PATH=F:/RP6/RP6lib/rblib
RP6_LIB_PATH_OTHERS=F:/RP6/RP6lib/RP6base F:/RP6/RP6lib/RP6common

################################################## #############################


#------------------------------------------------
# Main Source file is _automatically_ added here:
SRC = $(TARGET).c
# DO NOT EDIT THIS!


################################################## #############################
# 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
SRC += $(RP6_LIB_PATH)/rblib.c

Wäre wirklich nett, wenn mir jemand weiterhelfen kann. Danke!!

radbruch
23.03.2010, 14:54
Hallo

Da die beiden Variablen nicht initialisert waren, kann man nichts über deren Inhalt sagen. Aber wie du richtig erkannt hast scheint dein RP6 die "gefundenen" Werte als Befehl zum Drehen zu erkennen.

Mit den Makefiles kenne ich mich (immer noch) nicht aus. Aber es funktioniert sicher nicht, wenn du auch die orginale Lib zusammen mit der rblib einbindest. Deshalb müssen die ersten zwei Zeilen auch auskommentiert werden:


#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
SRC += $(RP6_LIB_PATH)/rblib.c

Wenn rblib.c so eingebunden wird, muss man das include im Programm entfernen:

#include "rblib.h"
//#include "rblib.c"

Aber das ändert vermutlich nichts an deiner "No Rules to make..."-Fehlermeldung. Soweit ich weiß bedeutet das, dass der Quellcode des Programms nicht gefunden wird. Ursachen sind z.B. falsche Pfade, Leer- oder Sonderzeichen in den Pfad- oder Dateinamen, falsche Dateinamen, bei Linux vermutlich auch falsche Groß-/kleinschreibung...

Gruß

mic

[Edit]
Die rblib-Geschichte ist ja eigentlich auch eine "Jugendsünde" von mir. Inzwischen kann ich eine Variante der Servoansteuerung anbieten die sich mit der RP6-Library verträgt:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=483757#483757

Allerdings ist dabei die Auflösung der Servoschritte nicht so hoch, deshalb muss man die Umrechnung der gemessenen RC-Signale in Motorparameter anpassen:

// RC-Signale an SCL und SDA messen 23.3.2010 mic

// Timersetup der Lib: Mode 10, Phase Correct
// Mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)

// Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38

// Aus: https://www.roboternetz.de/phpBB2/viewtopic.php?p=492812#492812

#include "RP6RobotBaseLib.h"

volatile uint8_t rc_input_pwr=26, rc_input_dir=26;

int main(void)
{
initRobotBase();
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
setLEDs(1); // und los!

writeString_P("\n\nRC-Empfänger an SCL und SDA auswerten.\n");
writeString_P("mic 23.3.2010\n\n");
while(1)
{
writeString_P("SCL (PC0): ");
writeInteger(rc_input_dir, 10);
writeString_P("\nSDA (PC1): ");
writeInteger(rc_input_pwr, 10);
writeString_P("\n\n");
mSleep(300);
}
return 0;
}
ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen
{
static uint16_t rc_temp_pwr=0;
static uint16_t rc_temp_dir=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; }
}(Nicht getestet, weil mein RC-Empfänger zur Zeit eingemottet ist)

Mc Delta
23.03.2010, 15:47
Danke für deine Antwort!
Das Problem lässt sich leider nicht aus dem weg schaffen. Könntest du bitte mal den Ordner oder ein Zip File zum Download stellen wo deine ganzen Daten zum kompilieren dieses einzigen Programmes drauf sind? Das wäre echt super, weil ich wirklich keine Ahnung habe wie ich das Problem lösen soll. Alle anderen Programme zu kompilieren klappt ja aber ich vermute, dass ist wegen dieser anderen LIB.
Vilen Dank!!!!!!

Mc Delta
23.03.2010, 15:53
Hast du vielleicht einen Vorschlag, wie man mit der standart RP6lib ein Programm zum fernsteuern des RP6´schreiben könnte? Es soll nur 2 Kanäle auswerten können und mit jedem Kanal einen Motor ansteuern.
Braucht man dafür überhaupt eine ISR?

radbruch
23.03.2010, 16:06
Nochmals Hallo

Das geht selbstverständlich auch ohne ISR. Aber dann ist es blockierend und wirft das gesammte Tasksystem des RP6 über den Haufen.

Oben im Edit habe ich eine Variante mit orginaler RP6-Lib und Timer1-ISR zur Impulsmessung angehängt. Die gemessenen Werte werden ans Terminal gesendet und sollten ungefähr zwischen 14 und 38 liegen. Wenn das so funktioniert (ich habe die Messung mit Brücken an den Pins simuliert) hast du schon eine brauchbare Basis für eine RC-Fernsteuerung. Was noch fehlt ist die Umrechnug der gemessenen Werte in passende Motorbefehle.

Hier noch eine Variante ohne ISR, ohne RC-Empfänger kann ich aber zu den gemessenen Werten nichts sagen. Möglicherweise tritt ein Überlauf der Variable auf, dann müßte man nach dem Hochzählen noch eine kurze Verzögerung (eine for-Schleife) einfügen:


// Blockierende Impulsmessung an SCL (PC0) 23.3.2010 mic

#include "RP6RobotBaseLib.h"

uint16_t temp;

int main(void)
{
initRobotBase();
setLEDs(1); // und los!

while(1)
{
temp=0;
while(PINC & 1); // Warten bis kein Impuls ansteht
while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses
while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen


writeInteger(temp, 10);
writeString_P("\n");
mSleep(300);
}
return 0;
}

Gruß

mic

[Edit]
Wertebereich der blockierenden Messung ist ca. 500 bis 3000:

// RP6 misst blockierend seine eigenen Servoimpulse an SCL ;) 23.3.2010 mic

#include "RP6RobotBaseLib.h"

volatile uint8_t servo; // Servopositionen und Impulszähler
uint16_t temp;

int main(void)
{
initRobotBase();
servo=26; // Servomitte?
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
DDRA |= (E_INT1); // Servopins auf Ausgang setzen
DDRC |= (SCL | SDA);
setLEDs(1); // und los!
startStopwatch1();
startStopwatch2();
while(1)
{
if(getStopwatch1()>300) // alle 0,3 Sekunden Impuls messen
{
setStopwatch1(0);
temp=0;
while(PINC & 1); // Warten bis kein Impuls ansteht
while(!(PINC & 1)); // Warten auf Start des zu messenden Impulses
while(PINC & 1) temp++; // solange der Impuls ansteht Zähler hochzählen
writeInteger(temp, 10);
writeString_P("\n");
}

if(getStopwatch2()>1500) // alle 1,5 Sekunden eine neue Servoosition
{
setStopwatch2(0);
switch(servo)
{
case 26: servo=45; break;
case 45: servo=25; break;
case 25: servo=10; break;
case 10: servo=26; break;
}
}
}
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10
if(servocount < 400) servocount++; else servocount=1;
}

Mc Delta
26.03.2010, 17:05
Hi,
Ich habe drei Fragen:
1.
Warum schreibst du in den WriteInteger Befehl noch eine "10" nach dem Komma? (Ich beziehe mich auf folgendes Programm)


// RC-Signale an SCL und SDA messen 23.3.2010 mic

// Timersetup der Lib: Mode 10, Phase Correct
// Mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)

// Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38

// Aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=492812#492812

#include "RP6RobotBaseLib.h"

volatile uint8_t rc_input_pwr=26, rc_input_dir=26;

int main(void)
{
initRobotBase();
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
setLEDs(1); // und los!

writeString_P("\n\nRC-Empfänger an SCL und SDA auswerten.\n");
writeString_P("mic 23.3.2010\n\n");
while(1)
{
writeString_P("SCL (PC0): ");
writeInteger(rc_input_dir, 10);
writeString_P("\nSDA (PC1): ");
writeInteger(rc_input_pwr, 10);
writeString_P("\n\n");
mSleep(300);
}
return 0;
}
ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen
{
static uint16_t rc_temp_pwr=0;
static uint16_t rc_temp_dir=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; }
}

Und 2.
Würde dieser Code vom Prinzip her funktionieren oder fehlt noch was, außer den Werten die ich noch nicht kenne?


#include "RP6RobotBaseLib.h"

volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26;

int main(void)
{
initRobotBase();
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung

while(1)
{
// if (rc_input_pwrl<x && rc_input_pwrl>y) {changeDirection(BWD); moveAtSpeed(60,0)}
// if (rc_input_pwrl<x && rc_input_pwrl>y) {changeDirection(FWD); moveAtSpeed(60,0)}
// if (rc_input_pwrr<x && rc_input_pwrr>y) {changeDirection(BWD); moveAtSpeed(0,60)}
// if (rc_input_pwrr<x && rc_input_pwrr>y) {changeDirection(FWD); moveAtSpeed(0,60)}
// task_motionControl();
}
return 0;
}
ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen
{
static uint16_t rc_temp_pwrl=0;
static uint16_t rc_temp_pwrr=0;
if (PINC & 1) rc_temp_pwrl++; else
if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; }
if (PINC & 2) rc_temp_pwrr++; else
if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; }
}

und 3.
Hat jetzt zwar nicht sehr viel mit dem Thema zu tun aber ist ja schnell beantwortet. Kann man das RP6 C-Control PRO M128
Erweiterungsmodul so wie man es bei Conrad bekommt direkt benutzen ohne diesen extra Baustein (C-CONTROL PRO UNIT MEGA 128)?? Mit benutzen meine ich Programmieren und in Verbindung mit dem RP6 laufen lassen.???
)
Danke!

radbruch
26.03.2010, 17:45
Hallo

Zu 1: Die Funktion writeInteger() wird in RP6uart.c folgenderweise definiert:

/**
* Write a number (with specified base) to the UART.
*
* Example:
*
* // Write a hexadecimal number to the UART:
* writeInteger(0xAACC,16);
* // Instead of 16 you can also write "HEX" as this is defined in the
* // RP6RobotBaseLib.h :
* writeInteger(0xAACC, HEX);
* // Other Formats:
* writeInteger(1024,DEC); // Decimal
* writeInteger(044,OCT); // Ocal
* writeInteger(0b11010111,BIN); // Binary
*/
void writeInteger(int16_t number, uint8_t base)
{
char buffer[17];
itoa(number, &buffer[0], base);
writeString(&buffer[0]);
}
Erster Parameter ist der 16bit Wert der angezeigt werden soll, zweiter Parameter die Zahlenbasis der Ausgabe. Diese Basis wird direkt an itoa (integer to ascii) weitergereicht. Eine Auswahl von gebräuchlichen Basen werden in RP6uart.h definiert und vor dem Kompilieren durch die entsprechenden Werte ersetzt:

#define HEX 16
#define DEC 10
#define OCT 8
#define BIN 2
Und weil ich mein kleines Köpfchen nicht mit allem Müll überladen will, merke ich mir nicht die Definitionen sondern gebe die Basis direkt als Ziffer ein;)

Zu 2: Wenn deine Progammvariante per Copy&Paste aus meinem Programm zusammengesetzt ist (es scheint mir so), dann sollte es auch funktionieren. Zu den zu erwartenden Werten: Bei Servosteuerungen wird meist ein 100kHz-Takt verwendet, weil dann 100 Einheiten genau einer Millisekunde entspricht. Da die Timer1-Overflow-ISR des RP6 mit knapp 20kHz aufgerufen wird, sollte der Wert für eine Millisekunde (das ist ungefähr die Mitte meiner RS2-Servos) etwas größer als 20 sein. (Die 26 von oben sind etwas außerhalb der Mitte.)

Zu 3: Nein, ohne C-Control PRO MEGA128 (http://www.conrad.de/ce/de/product/191563/) kann man das M128 nicht verwenden. Das C-Control ist der Microkontroller des M128 (mit einem ATMega128):


Mit diesem Modul können Sie die in Basic und CompactC programmierbaren C-Control PRO MEGA128 Module zur Steuerung des RP6 über den I²C Bus verwenden.Leider köchelt Conrad hier sein eigenes Süppchen, Basic und CompactC sind zwar verbreitet, aber leider kein echter Standart. Da ich noch keinen Kontakt zum C-Control hatte, würde ich mir ein M32 (http://www.conrad.de/ce/de/product/191550/) zulegen.

Gruß

mic

Mc Delta
26.03.2010, 18:17
Natürlich ist das dein Programm. Ich habe es eben nur ein bisschen erweitert und unnötige Kommentare rausgestrichen. Also du hast ja gesagt dass das Programm funktionieren sollte. Es soll nämlich die gelesenen Werte (14 bis 38 ) in Motorbefehle umwandeln. Tja wenn das so ist brauch ich mir nur noch die Fernsteueranlage kaufen und kann den RP6 dann mit dieser Fernsteuern. Danke