PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verändertes Beispielprogramm in den Rp6 laden



DerNeuling
06.04.2010, 12:31
Hallo Com,
was ich vorraus sagen möchte:Ich habe keine Ahnung von Robotik.Ich habe mir ein bisschen etwas über die C-Sprache durchgelesen und will jetzt-wie empfohlen-ein bisschen Learning by doing betreiben.
Mein Problem:Ich habe in Programmers Notepad(WinAVR) das erste Move-Beispiel aus dem Ordner Rp6Examples geöffnet(Der Roboter fährt einen Kreis).Ich wollte aber,dass der Rp6 rückwärts einen Kreis fährt,also habe ich bei der Main-Funktion aus FWD(vorraus) BWD gemacht(rückwärts).Dann habe ich wie in der Anleitung auf Make All geklickt und dann in einem neuen Ordner auf meinem PC gespeichert.Dann habe ich den Rp6 angeschlossen und den Rp6 Loader geöffnet.Aber als ich das geänderte Beispielprogramm öffnen wollte war keine hex.-Datei in dem Ordner,obwohl doch aus dem Beispielprogramm mit einem Klick auf Make All eine hex.-datei werden sollte bzw. sie auf den Mikrocontroller abgestimmt werden sollte.
Was habe ich falsch gemacht?
Danke schonmal für die Antworten.

Magelan1979
06.04.2010, 16:35
Moin,
hast Du auch die "[RP6] Make All" verwendet?. Ich habe nach der Installation von WinAVR mit PN2 festgestellt, dass bereits eine "Make All" vorhanden war. Auch musste ich erfahren, dass ich bei meinem 64bit Rechner erstmal speichern musste, bevor die richtige Datei kompiliert wurde - beim 32bit-System war das egal. Zuletzt könntest Du ja mal den Compiler-Text posten.

Gruß Magelan

DerNeuling
06.04.2010, 18:06
Es war von Anfang an schon ein Make All Button da.
Ich verstehe nicht was du im 2. Teil meinst.Muss ich wenn ich im Haptfenster die Beispieldatei verändert habe(also den Text) speichern und erst danach auf Make All klicken?
Hier der veränderte Beispieltext:

#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
setLEDs(0b010000);
startStopwatch1();
}
}

void blink(void)
{
if(getStopwatch1() > 500)
{
statusLEDs.LED2 = !statusLEDs.LED2;
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
}

int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b100001);

BUMPERS_setStateChangedHandler(bumpersStateChanged );

powerON();

changeDirection(BWD);
moveAtSpeed(80,30);

while(true)
{
blink();
task_RP6System();
}
return 0;
}

mfG

Magelan1979
06.04.2010, 18:38
1. Wegen der [RP6]Make All:
Im Manual v RP6_MANUAL_DE_20071219 Seite 51f(Menüeinträge erstellen) stehen die Prameter die für die Make All gelten müssen. Kannst diese ja mal vergleichen.
2. Ja genau das meinte ich, erst speichern dann kompilieren.
3. Mit dem Compiler-Text meinte ich den Text, der nach dem Compilieren unterhalb des Quelltextfensters erscheint. Nicht den Quelltext. Hatte mich da wahrscheinlich unsauber ausgedrückt.

Gruß Magelan

Edit: Du kannst ja mal versuchen nonsense in den Quellcode einzubauen, wenn da keine Fehlermeldung (rot ist nie gut )kommt, dann kompiliert er nicht.

DerNeuling
06.04.2010, 20:07
Also in der Anleitung auf Seite 51-54 oder so stand bei den Screens nur 2 mal Parameter und danach in der Spalte nichts mehr.In der Anleitung stand auch,dass das wenn es schon vorhanden ist [WinAVR]Make All heißt(so steht es auch bei mir).
Ich habe jetzt erst gespeichert und dann auf Make All geklickt.Dann kam aber ein Fehler bzw. nur das hier kam heraus:

> "make.exe" all
make.exe: *** No rule to make target `all'. Stop.

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

Der Compilertext ist so(dieses mal ohne das ich dazwischen gespeichert habe):

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


Size before:
AVR Memory Usage
----------------
Device: atmega32

Program: 6342 bytes (19.4% Full)
(.text + .data + .bootloader)

Data: 149 bytes (7.3% Full)
(.data + .bss + .noinit)




Creating load file for EEPROM: RP6Base_Move_01.eep
avr-objcopy -j .eeprom --set-section-flags .eeprom=alloc,load \
--change-section-lma .eeprom=0 -O ihex RP6Base_Move_01.elf RP6Base_Move_01.eep
avr-objcopy: there are no sections to be copied!
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
make.exe: [RP6Base_Move_01.eep] Error 1 (ignored)

Size after:
AVR Memory Usage
----------------
Device: atmega32

Program: 6342 bytes (19.4% Full)
(.text + .data + .bootloader)

Data: 149 bytes (7.3% Full)
(.data + .bss + .noinit)



-------- end --------


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

Wie du siehst bin ich ziemlich planlos ](*,)

Magelan1979
06.04.2010, 20:27
Okay, dann mal weiter:
Versuch es mal mit der aktuellsten Version von WinAVR (bei mir avr-gcc (WinAVR 20100110) 4.3.3). Dann noch eine Frage: Hast du ein 32bit oder 64bit OS ?

DerNeuling
06.04.2010, 23:01
Ok dann werde ich es mit einer neueren Version versuchen,aber mir ist nicht klar was das bringen soll.Der RP6 soll ja nur genau das selbe machen wie im Beispielprogramm,nur soll er rückwärts und nicht vorwärts fahren.Naja ich versuch das morgen.
Ich habe einen 64bit PC.(bzw. da stand bei System irgendwo was mit 64 bit)
Aber was ist ein OS?

shedepe
06.04.2010, 23:14
OS ist das Operatingsystem auf Deutsch Betriebssystem. Das kann Windows oder ähnliches sein. Unter Systeminformationen sollte stehen ob du eine 32 oder eine 64 Bit Version hast

Magelan1979
07.04.2010, 06:05
OK, sollte es ein 64bit System sein, dann verwende bitte die neuste Version von WinAVR und ersetzte nach der installation die Datei msys-1.0.dll in dem Verzeichnis WinAVR\utils\bin. Ach ja, installiere WinAVR direkt im Root-Verzeichnis (C:\WinAVR ).

Gruß Magelan

DerNeuling
07.04.2010, 10:43
Also ich downloade mir grade die Version 20100110 . Die Datei msys-1.0.dll soll ich dann durch diese Zip-Datei aus der CD ersetzen?

Edit: Hier sind 2 Datein:
1. msys-1.0 (DLL-Datei)
2. msys-1.0.dll.old (OLD-Datei)

DerNeuling
07.04.2010, 13:29
Ich glaube ich weiß jetzt wo das Problem liegt.
Ich habe jetzt in PN2:

1.Ein verändertes Beispielprogramm gespeichert.
2.Ein unverändertes Beispielprogramm(Move1 oder so)gespeichert.

Beide in einem neuen Ordner.Diesen habe ich dann geöffnet und dann gemerkt,dass nur die unveränderte Version eine C-Datei ist,bei der anderen stand nur Datei.Kann es sein das der MakeAll Button(oder Funktion) nur funktioniert,wenn es eine C-Datei ist?Wenn ja,wie mache ich das?

Magelan1979
08.04.2010, 09:19
Speicher unter... [Dateiname].c

Hat es sonst soweit geklappt

robokiller
08.04.2010, 10:06
Hallo derneuling,
hast du im makefile hinter target den namen des programms ohne .c eingetragen ???
wenn du dann auf make all klickst musst du den nahemen des programmes aber mit .c eingeben

___________________________

Mfg roboKiller

SlyD
08.04.2010, 11:54
Hallo,

die msys.dll ersetzen ist *NICHT* notwendig - es funktioniert bei Dir ja wie man oben an der Compiler Ausgabe sehen kann.
Das muss man NUR DANN machen wenn Fehlermeldungen wie.
avr-gcc: spawnvp oder sync_with_child kommen würden was hier aber nicht der Fall ist ...
(s. die entsprechenden alten Threads hier im Forum - Suchfunktion verwenden!)


Öffne mal ALLE Beispielprogramme über die .ppg Datei im Hauptverzeichnis der Beispielprogramme.
Dann die C Datei des Programms öffnen die Du compilieren willst - dann make all ausführen - vorher evtl. mal probehalber noch make clean (dann werden alle bisherigen Compiler ausgaben gelöscht).
Es wird in PN2 immer das projekt übersetzt von dem Du gerade eine Datei im Editor geladen hast.



Solche problemchen wurden hier schon oft diskutiert - bitte die Suchfunktion verwenden (auf das RP6 Forum beschränken und z.B. nach makefile oder compiler suchen).


MfG,
SlyD

DerNeuling
08.04.2010, 20:17
Es funktioniert irgendwie nicht.
Ich habe jetzt nichts weiter getan als das hier:

#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
setLEDs(0b010000);
startStopwatch1();
}
}

void blink(void)
{
if(getStopwatch1() > 500)
{
statusLEDs.LED2 = !statusLEDs.LED2;
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
}

int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b100001);

BUMPERS_setStateChangedHandler(bumpersStateChanged );

powerON();

changeDirection(BWD);
moveAtSpeed(80,80);

while(true)
{
blink();
task_RP6System();
}
return 0;
}

als C-Datei zu speichern und dann hab ich auf Make All geklickt: Errorcode: 2 .
Dann das selbe noch mal und davor noch auf Make Clean(und danach auf Make All),und wieder Errorcode:2 (auch als ich auf Make Clean geklickt habe).Was mach ich falsch?Ich habe die alte Version benutzt,da ich bei der neueren nicht wusste welche Datei ich mit welcher austauschen muss(siehe oben).

Edit:Habe es jetz nochmal gemacht.Dieses mal FWD statt BWD und es hat funktioniert.Nur als ich es im RP6 Loader gesucht habe war keine Hex-Datei da.Ich habe es nachdem ich auf Make All geklickt habe in einem neuen Ordner gespeichert.Wiso ist dort jetzt keine Hex-Datei?

SlyD
08.04.2010, 20:26
Du musst gar keine Datei austauschen habe ich doch schon geschrieben ;)


> und dann in einem neuen Ordner auf meinem PC gespeichert

Ah sorry das hatte ich erst überlesen.

Du brauchst natürlich das MAKEFILE dazu im selben Ordner damit der Compiler weiss was er denn tun soll.
Ausserdem MUSS die Ordnerstruktur exakt so sein wie bei den Beispielen - sonst müsste das Makefile entsprechend angepasst werden.


SUCHFUNKTION ("makefile" auf RP6 Forum beschränkt) benutzen ich habe keine Zeit das hier alles nochmal zu tippen - sorry ;)

MfG,
SlyD

DerNeuling
08.04.2010, 21:00
SlyD du bist ein Gott!Hat endlich geklappt.Ich ab gesucht und diese Anweisungen befolgt:

für ein eigenes Programm machst du Folgendes:
1. Einen eigenen Unterordner im Ordner RP6BASE_PROGRAMS anlegen (z.B. MeinProg_01).
2. In den neuen Ordner (MeinProg_01) kopierst du make_all und make_clean aus irgendeinem Demo-Programm und natürlich dein eigenes Programm.
3. Von einem ähnlichen Demo-Programm (was also ähnliches macht wie dein Programm) kopierst du makefile in den neuen Ordner.
4. Mit einem Editor (kann auch Notepad 2 sein) öffnest du das makefile.
5. Du änderst die Zeile TARGET = ... so, dass da anstelle von ... der Name deines Programms (ohne .c) steht.
6. Etwas weiter unten im makefile suchst du Zeilen, die mit SRC = beginnen, und überprüftst, ob da alle Libraries eingebunden werden, die dein Programm braucht.


Zu Nr.3 :Ich habe das Beispielprogramm Move_01 genommen,da mein Programm ja nur statt moveAtSpeed(80,30); --> moveAtSpeed(80,80); hatte.Also nur eine kleine Veränderung.Aber woher soll ich(bei Nr.6) wissen,welche Libraries(was ist das überhaupt) in meinem Programm eingebunden werden.Ich weiß nur,dass ich immer am Anfang schreiben muss "RP6_Base.lib" oder so.Was gibt es noch für Libraries?