-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Robby RP6 für totalen Einsteiger...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.11.2008
    Beiträge
    14

    Robby RP6 für totalen Einsteiger...

    Anzeige

    Hey Leute!

    Ich habe mir einen RP6 gekauft...
    Leider habe ich noch fast keine Erfahrung, kann jedoch anhand der schönen Examples ganz gut C nachvollziehen.
    nachdem ich nun versucht habe ein eigenes Programm zu schreiben, wollte ich es uploaden. Bei dem Versuch es via Programmers Notepad über Tools mit Make All zu compilen blieb leider der Erfolg aus^^
    ich fand schnell heraus, dass ich auch Make All, Clear All und die Lib in den Ordner mit meiner .c Datei packen musste. leider gab es immernoch Fehlermeldungen, die ich nicht nachvollziehen kann.

    Man muss doch die .c Datei in eine dem Chip (Atmega32) verständliche .hex umwandeln, oder? Die Informationen über den Chip stehen also in der MakeAll datei drinnen? was sind die ganzen anderen Dateien wie bspw. .elf und so weiter...?

    hier ein kleiner errorcode: meine Datei heißt compile.c und ich habe auch in makefile statt des example namen meinen dateinamen eingefügt.

    Code:
    > "make.exe" all
    
    -------- begin --------
    avr-gcc (WinAVR 20080610) 4.3.0
    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: Compile.elf
    avr-gcc -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Compile.o -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/Compile.elf.d Compile.o ../../RP6Lib/RP6base/RP6RobotBaseLib.o ../../RP6Lib/RP6common/RP6uart.o --output Compile.elf -Wl,-Map=Compile.map,--cref    -lm
    Compile.o: In function `main':
    D:\Programme\RP6\Compile\Compile/Compile.c:7: undefined reference to `setLEDs'
    D:\Programme\RP6\Compile\Compile/Compile.c:8: undefined reference to `msleep'
    D:\Programme\RP6\Compile\Compile/Compile.c:9: undefined reference to `setLEDs'
    D:\Programme\RP6\Compile\Compile/Compile.c:10: undefined reference to `msleep'
    D:\Programme\RP6\Compile\Compile/Compile.c:11: undefined reference to `setLEDs'
    D:\Programme\RP6\Compile\Compile/Compile.c:12: undefined reference to `msleep'
    make.exe: *** [Compile.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00

    Beste Grüße und Danke für eure Hilfe!

    Luca

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2008
    Beiträge
    18
    Hi LucaSilva301,
    laut des Errorcodes müsste es daran liegen, dass die Lib nicht eingebungen wurde oder die Befehle falsch geschriegen werden

    Man schreibt bei msleep das S groß also mSleep(wert).

    Ich glaube aber das das an der Lib liegt.
    Suche mal in der Makefile nach der Zeile
    RP6_LIB_PATH=Pfad
    Pfad solltest du halt mit dem Pfad des Libordners ersetzen z.B RP6_LIB_PATH=RP6Lib wenn die Lib im gleichen Verzeichnis ist.

    Hoffe ich konnte helfen.

    mfg

    Laias

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.11.2008
    Beiträge
    14
    Hey!
    Vielen Dank...
    es lag an beidem und jetzt krieg ich meine .hex endlich
    nun noch eine kurze Frage:
    mein code ist folgender:
    Code:
     #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	
    	setLEDs(0b100100);
    	mSleep(500);
    	setLEDs(0b010010);
    	mSleep(500);
    	setLEDs(0b001001);
    	mSleep(500);
    	
    	while(true) 
    	{			
    		return 7;
    	}
    }
    aber leider klappt das mit dem loop noch nicht so richtig...
    hat mich sowieso schon gewundert, dass das while garnicht erklärt weerden muss, aber es stand auch so in den examples. könnte ich einfach statt "(true)" "(setLED(0b001001)" schreiben?

    Danke nochmal für deine schnelle Antwort!
    beste Grüße
    Luca

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2008
    Beiträge
    18
    Die While Schleife führt alles immer wieder aus. Allerdings nur wenn der Wert in der Klammer 1(oder true) ist. Dass heist das in deinem Code die While Schleife immer aktiv ist und du desshalb in die Klammer nicht den setLEDs befehl einfügen musst.

    Die eigentliche Schleife steht zwischen den { } Klammern also:


    Code:
    while(true){
    // Deine Schleife wie z.B LED Lauflicht
    }
    Das return 7 ist übrigens auch unnötig würde ich einfach weglassen.

    Hoffe ich konnte dir das etwas erklären.
    Kann dir auch empfehlen bei Fragen einfach bei Google nach nem C Tutorial
    zu schauen davon gibt es viele die die Befehle verständlich erklären.

    mfg

    Laias

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Schrobenhausen, München
    Alter
    24
    Beiträge
    583
    Hi,

    meines Erachtens ist z.b. die while-schleife auch schön ausführlich in der rp6-anleitung erklärt, das sollte nicht das problem sein...

    aber um das nochmal zu verdeutlichen was laias natürlich völlig korrekt und eigentlich ausreichend erklärt hat:

    aus:
    Code:
     #include "RP6RobotBaseLib.h" 
    
    int main(void) 
    { 
       initRobotBase(); 
        
       setLEDs(0b100100); 
       mSleep(500); 
       setLEDs(0b010010); 
       mSleep(500); 
       setLEDs(0b001001); 
       mSleep(500); 
        
       while(true) 
       {          
          return 7; 
       } 
    }
    wird dann wenn er die ganze zeit die LEDs schalten soll

    Code:
     #include "RP6RobotBaseLib.h" 
    
    int main(void) 
    { 
       initRobotBase(); 
        
       while(true) 
       {  
       setLEDs(0b100100); 
       mSleep(500); 
       setLEDs(0b010010); 
       mSleep(500); 
       setLEDs(0b001001); 
       mSleep(500); 
           } 
    return 0;
    }
    dashier

    also wenn dus bei laias noch nicht verstanden hast, dann hoffe ich dass ich helfen konnte^^

    @laias: ob man das return 7; weglassen kann bezweifle ich...

    der compiler sollte dann eine errormessage ausgeben we "return [int] expected" oder irgendsowas, da die funktion main ja den rückgabetyp int hat
    (siehe INT main(void){...})

    LG Pr0gm4n

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.11.2008
    Beiträge
    14
    Hey
    Danke für die Antworten,
    habs jetzt einfach so gelöst:

    Code:
    while(true)
    {
    //MEIN PROGRAMM
    }
    hat super funktioniert und das return ist auch unötig.
    habe nur noch eine Frage:
    wenn ich die Bumpers aktivieren möchte, muss ich die bumpers void direkt am anfang des Programms schreiben oder in dein main-teil einbinden?
    Bei mir reagiert er nämlich garnicht auf sie und macht einfach mit dem normalen Programmablauf weiter.
    Bsp.:
    Code:
    //declarations
    
    {
    //erst die bumpers
    }
    
    int main(void)
    {
    Bewegunsabläufe
    }
    sry bin jetzt in der Schule und kann leider keinen richtigen code posten...
    vielleicht versteht ihrs trotzdem, sonst nachher nochmal genauer.
    Danke
    Luca
    [/code]

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2008
    Beiträge
    18
    Ok die Bumpers...
    Um die Bumpers auszuwerten brauchst du die Befehlte getBumperLeft() und getBumperRight() für den Linken und Rechten Bumper. Der Befehl gibt 1 Zurück wenn der Bumper gedrückt wird und 0 falls nicht.
    Hier ein kleines Beispiel zum Verstehen:

    Code:
    //Alles was in ein RP6 Prog rein gehört (includes etc)
    
    int main(void) {
    
    while(true) {
    if(getBumperRight()) setLEDs((0b000001); // Schalte Led 1 ein falls rechter Bumper gedrückt wird.
    if(getBumperLeft()) setLEDs((0b000010); //Schalte Led 2 falls linker Bumper gedrückt wird. 
    mSleep(50); /* Dieser Befehl stoppt die Schleife für 50ms, dies hat keine 
    große Auswirkung auf das Ergebnis sondern dient dazu, dass der RP6 den Bumper nur 20mal in der Sekunde auswerten soll. */
    }
    
    }
    Hab den Code nicht getestet müsste aber funktionieren.
    Hoffe habe dich richtig verstanden oder woltest du dir eine Funktion zum
    Auswerten der Bumper bauen?

    Laias

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    04.11.2008
    Beiträge
    14
    Hey!
    danke! genau dass wollte ich wissen.
    Jetzt kann ich ja auch statt der LEDs Bewegung einbringen.
    Mein Problem war vorher eben, dass er nicht darauf reagiert hat und mit der standart schleife weitergemacht hat.
    Also wenn ich einen normalen loop schreibe in dem er nur vorwärts fährt, aber möchte, dass er bei getBumperLeft zurückfährt, 45° rechts dreht und dann wieder am anfang mit vorwärts fahren weitermacht. (Das gleiche gespiegelt mit getBumperRight nur dann links drehen...)

    wie schreibe ich also, dass der mainloop (vorwärts fahren) unterbrochen wird, sobald ein bumper berührt wird?

    Danke nochmal und einen schönen Abend!
    Luca

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    Der mainloop darf eigentlich nicht unterbrochen werden für eine saubere Ablauf. Prinzip ist das die Mainloop standig durchlaufen werd. Wen etwas passiert soll eine Function aufgerufen und bearbeitet werden, dan wieder zu Mainloop. Die blockierende Functionen(mSleep, delay...) haben das Nachteil das alles andere was auch noch in Mainloop derin ist, nicht mehr bearbeitet wird !!
    Scheint kompliziert zu sein, aber sieht mal die Beispielen an die schon functionieren.

    für ihre Frage :
    In mainloop
    if (getBumberLeft()) move(100,BWD,50,0);

    Jetzt ist naturlich wichtig das in das andere Teil von Mainloop diese Move nicht wiederum gegengesprochen wird !!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    04.11.2008
    Beiträge
    14

    Danke!

    Hey,
    vielen Dank!

    also hab es jetzt soweit verstanden...
    möchte gerne ein eigenes Programm schreiben, bei dem der RP6 vorwärts fährt bis ein bumper gedrückt wird. Leider kann ich ihn immer nur mit
    move([Geschwindigkeit],[Richtung],[Strecke],true)
    bewegen. Das macht es mir schwer eine stetige überprüfung einzubauen.
    Ich kann nur folgendes machen:

    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	while (true)
    		{
    		move(300,FWD,30,true);
    		if ((getBumperLeft() || getBumperRight()))
    			{
    			move(200,BWD,200,true);
    			}
    		}
    }
    Er fährt also ein möglichst kleines Stück um dann die bumpers zu prüfen und gegebenenfalls zu reagieren.
    Leider etwas langsam und äußerst hässlich aufgrung der stockenden bewegungen^^
    Wie kann ich zum Beispiel schreiben:

    while ("Bumpers not hit")
    {
    FWD,[Geschwindigkeit]
    }
    if ("bumpers hit")
    {
    BWD,[Geschwindigkeit],[Strecke]
    }

    Danke für eure Hilfe!
    Luca

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •