- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Programmierproblem beim Asuro

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.07.2007
    Beiträge
    11

    Programmierproblem beim Asuro

    Anzeige

    Powerstation Test
    Hallo alle zusammen.....

    habe ein kleines Problem mit dem Programm von meinem Asuro, aber vill könnt ihr mir ja weiter helfen.

    So sieht das Programm aus.....


    Code:
    #include "asuro.h"
    
    int DriveCircle( int angel, unsigned char Dir)
       {   Encoder_Init(0,0);
       
          
          int segments_left;
          int segments_right;
          unsigned char MotorDr_Left = FWD;
          unsigned char MotorDr_Right = RWD;
          int MotorSpdLeft = 120;
          int MotorSpdRight = 120;
          
          
          
          if (angel == 45)
          {
          segments_left = 13;
          segments_right = 13;
          }
          else if (angel == 90)
          {
          segments_left = 27;
          segments_right = 27;
          }
          else if (angel == 180)
          {
          segments_left = 53;
          segments_right = 53;
          }
          else if (angel == 360)
          {
          segments_left = 107;
          segments_right = 107;
          }
          else
          {
          StatusLED(RED);   // Statusleuchtdiode Rot schalten
          }
          
          
          
          Encoder_Set(0,0);
          
          
         
          if(Dir == RIGHT)
          {
             MotorDr_Left = FWD;
             MotorDr_Right = RWD;
          }
          
          
         
          if(Dir == LEFT)
          {
             MotorDr_Left = RWD;
             MotorDr_Right = FWD;
          }
          
          while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
          {
             MotorDir(MotorDr_Left,MotorDr_Right);
             MotorSpeed(MotorSpdLeft,MotorSpdRight);
             
             if(encoder[LEFT] >= segments_left)
             {
                MotorSpdLeft = 160;
             }
             
             if(encoder[RIGHT] >= segments_right)
             {
                MotorSpdRight = 160;
             }
             
             if(encoder[LEFT]&&encoder[RIGHT] >= segments_left)
             {
                MotorSpeed(BREAK, BREAK);
                Msleep(300);
                MotorSpeed(0,0);   // Kollision! Sofort anhalten
             }
          
          
          }
          return 0;
             
       }      
       
    
    int DriveLength( int length, unsigned char MotorDr, int MotorSpd)
       {
          Encoder_Init();
          int diff;
          float cycles;
          int segments_left;
          int segments_right;
          int MotorSpdLeft = MotorSpd;
          int MotorSpdRight = MotorSpd;
          unsigned char schalter;
          
          cycles = length / 12,2;      // Umdrehungen des linken Reifens = zu fahrende Strecke links / Reifen-Umfangs (Umfang = 12,2 cm !!!)
          segments_left = cycles * 40;   // Anzahl der zu fahrenden Segmente = Umdrehungen * Anzahl der Segmente pro Umdrehung (40)
          segments_right = cycles * 40;
          Encoder_Set(0,0);
          
          while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
          {
             MotorDir(MotorDr,MotorDr);
             MotorSpeed(MotorSpdLeft,MotorSpdRight);
             schalter = PollSwitch();
             PrintInt(schalter);
             
             if(( schalter > 0)&&(MotorDr == FWD))
             {
             MotorSpeed(0,0);
             MotorDir(BREAK,BREAK);
             Msleep(300);
             
             return encoder[LEFT];
             }
             
             diff = encoder[LEFT]-encoder[RIGHT];
             
             if ((diff > 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdRight = MotorSpdRight + (MotorSpdRight / 100 * 2.5);
                MotorSpdLeft = MotorSpd;
             }
             else if ((diff < 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdLeft = MotorSpdLeft + (MotorSpdLeft / 100 * 2.5);
                MotorSpdRight = MotorSpd;
             }
             else if ((diff == 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdLeft = MotorSpd;
                MotorSpdRight = MotorSpd;
             }
             
             if(encoder[LEFT] >= segments_left)
             {
                MotorSpdLeft = 0;
             }
             
             if(encoder[RIGHT] >= segments_right)
             {
                MotorSpdRight = 0;
             }
          
          
          }
          MotorSpeed(0,0);
          
          
          
          
       return encoder[LEFT];
       }
    
    
          
    int main(void)
    {
          Init();
       
       StatusLED(GREEN);
       int blink = 0;
       float cycles;
       int way = 0;
       int segments;
       unsigned char endschalt;
       
       
       while(way < 1000)
       {   
       
          segments = DriveLength(100, FWD, 120);
          cycles = segments / 40;
          way = way + (cycles * 12.2);
       
       
          endschalt = PollSwitch();
          PrintInt(endschalt);
          
          if (( endschalt == 2)||( endschalt == 16)||( endschalt == 18 ))
             {
             DriveLength(10, RWD, 120);
             DriveCircle(90, RIGHT);
             }
             else if ( endschalt == 32)
             {
             DriveCircle(45, RIGHT);
             }
             else if ( endschalt == 1)
             {
             DriveCircle(45, LEFT);
             }
       
       
          
       }   
          
       
       
                
       while(1)
       {
          if (blink == 0)
          {
             blink = 1;
             StatusLED(OFF);
             Msleep(300);
          }
          else if(blink == 1)
          {
             blink = 0;
             StatusLED(GREEN);
             Msleep(300);
          }
       }
             
       
              
        return 0;
    }

    Folgende Fehler treten auf:


    Code:
    C:\WinAVR\Asuro\FirstTry>make all 
    set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
    | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
    [ -s test.d ] || rm -f test.d
    -------- begin --------
    avr-gcc --version
    avr-gcc (GCC) 3.3.1
    Copyright (C) 2003 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.
    
    avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
    test.c: In function `DriveCircle':
    test.c:4: warning: implicit declaration of function `Encoder_Init'
    test.c:43: warning: implicit declaration of function `Encoder_Set'
    test.c:61: error: `encoder' undeclared (first use in this function)
    test.c:61: error: (Each undeclared identifier is reported only once
    test.c:61: error: for each function it appears in.)
    test.c:61: error: `LEFT' undeclared (first use in this function)
    test.c:61: error: `RIGHT' undeclared (first use in this function)
    test.c:79: warning: implicit declaration of function `Msleep'
    test.c: In function `DriveLength':
    test.c:106: error: `encoder' undeclared (first use in this function)
    test.c:106: error: `LEFT' undeclared (first use in this function)
    test.c:106: error: `RIGHT' undeclared (first use in this function)
    test.c:111: warning: implicit declaration of function `PrintInt'
    test.c: In function `main':
    test.c:188: error: `RIGHT' undeclared (first use in this function)
    test.c:196: error: `LEFT' undeclared (first use in this function)
    make: *** [test.o] Error 1
    
    > Process Exit Code: 2

    Wäre echt cool wenn ihr mir bei meinem Problem helfen könntet....

    Gruß
    2stoned

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo 2stoned

    erstmal herzlich willkommen im RN-Forum. Da hast du ja gleich zu Beginn eine harte Nuss zum Knacken vorgelegt. Bitte verwende die code-Tags, vor allem wenn das Programm so umfangreich ist. (Du kannst übrigends deinen Beitrag noch editieren und das nachholen.)

    Bevor ich mich in die tiefen deines Codes stürze, ein kleine Frage vorweg:

    Welche Version von asuro.h verwendest du denn? Soweit ich beim Überfliegen deines Programm sehe, verwendest du die erweiterten Funktionen die nur bei den neueren Versionen verfügbar sind.

    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!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.07.2007
    Beiträge
    11
    Das müsste glaub ich 2.10 sein.....

    Hab von dem C++ nich so die Ahnung....das Programm hab ich mir aus verschiedenen Beispielen zusammengebastelt.

    Vill hilft es wenn ich mal schreibe was das Programm bewirken sollte.....

    Gruß
    2stoned

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Version steht irgendwo oben in der Datei, aber 2.1 ist sicher zu alt. Aktuell ist zur Zeit Version 2.7, aber die kann ich nicht empfehlen, weil ich sie nicht verwende. Version 2.6 dürfte auch ok sein, die kann man u.a. hier downloaden:

    http://sourceforge.net/project/showf...roup_id=155217

    Da ich aber in meinen Programmen diese Funktionen nicht verwende, muss dich nach dem Komplilieren einer unterstützen, der sich damit auskennt.

    Woher hast du das Programm eigentlich? Wenn du nicht so die Ahnung hast, vielleicht kannst du uns die Quellen nennen von denen du die Einzelteile zusammenkopiert hast. Hast du die Teile eigentlich schon getestet oder ist das der erste Versuch?

    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!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    12.07.2007
    Beiträge
    11
    Das is der erste Versuch....

    Hab den Asuro erst seit Samstag.

    Wie funktioniert das eigentlich das meine texte in nem separaten Kasten stehen, damit nich so viel Platz verbraten wird?

    Gruß
    2stoned

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Nochmal hallo

    Hab den Asuro erst seit Samstag.
    Ach so, dann würde ich an deiner Stelle das Programm erstmal ganz hinten in die Schublade legen und versuchen, die StatusLED zum Leuchten zu bringen. Vielleicht in verschiedenen Farben? Das meiste was du dazu wissen must, steht in der Dokumentation des asuros. Dann ein bisschen Motoren drehen lassen und schrittweise anspruchsvollere Dinge programmieren. Einen Linienfolger oder ein Nikolaushäuschen (meins fehlt ja immer noch, aber man kommt eben zu nichts) zum Beispiel. Alles weitere kommt dann von alleine...

    Bitte nicht falsch verstehen, aber auch "alte asuro-Hasen" hätten vermutlich Probleme, dir das Riesenprogramm oben zu erklären.

    Zu den Boxen:

    Über dem Eingabefeld sind verschiedene Symbole mit denen du deine Beiträge formatieren kannst, die wichtigsten sind wohl code, quote, img und url. Entweder vor und nach dem Text auf das entsprechende Symbol klicken (dann werden [starttag] und [/endetag] erzeugt), oder den gewünschten Text markieren und dann auf das Symbol klicken. Mit [Vorschau] kannst du dann prüfen, ob alles so aussieht wie es soll.

    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!

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von radbruch
    Nikolaushäuschen (meins fehlt ja immer noch, aber man kommt eben zu nichts)
    Laß dir Zeit, bei mir hat es auch über ein halbes Jahr gedauert
    Lieber Asuro programieren als arbeiten gehen.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Wenn ich den Code von 2stoned kopiere, dann fällt mir als erstes auf, daß ein Leerzeichen vor dem ---#include "asuro.h"--- in der Kopi steht.

    @2stoned Ist das Leerzeichen tatsächlich in dem Source?

    Wenn das aber kein Problem macht (die angegebenen Fehler deuten nicht darauf), liegt es wieder einmal an der benutzten LIB.

    Wenn man mal alle Fehler zusammenzieht, bleibt folgendes übrig:

    warning: implicit declaration of function `Encoder_Init'
    warning: implicit declaration of function `Encoder_Set'
    warning: implicit declaration of function `Msleep'
    error: `encoder' undeclared (first use in this function)
    error: `LEFT' undeclared (first use in this function)
    error: `RIGHT' undeclared (first use in this function)

    Was mir auffällt ist, dass dies NUR Funktionen, bzw. Defines, aus der hier im Forum 'erzeugten' LIB sind. Es ist keine Funktion dabei, die auch schon beim Asuro mitgeliefert wurde. Z.B.:

    Init();
    MotorSpeed(0,0);
    MotorDir(BREAK,BREAK);
    StatusLED(GREEN);

    @2stoned Kannst du bitte einmal die Datei Makefile aus dem im Fehleroutput angegeben Pfad "C:\WinAVR\Asuro\FirstTry" hier als [ code ] eintragen.

    Alleine der Pfadname bringt mich auf den Gedanken, dass du einiges von der Asuro-CD kopiert hast (da gibt es nämlich das Verzeichnis FirstTry) und dann in diesem Verzeichnis dein eigenes test.c mit dem oben angegeben Code 'gefüllt' hast.
    Das wäre komplett falsch, da auf der Asuro-CD NICHT die LIB ist, von der du bestimmt schon so viel im Forum gelesen hast.

    @2stoned Hast du so gearbeitet? Wenn ja, müssen wir dir noch die Lib erklären und dich da unterstützen.
    Lieber Asuro programieren als arbeiten gehen.

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich kann das Programm zwar nicht kompilieren, war aber so frei mal ein paar Stellen zu kommentieren. Ist noch nicht vollständig, aber ich muss zur Arbeit:

    Code:
    #include "asuro.h"
    
    int DriveCircle( int angel, unsigned char Dir)
       {   Encoder_Init(0,0);
    
    
          int segments_left;
          int segments_right;
          unsigned char MotorDr_Left = FWD;
          unsigned char MotorDr_Right = RWD;
          int MotorSpdLeft = 120;
          int MotorSpdRight = 120;
    
    
    
          if (angel == 45)
          {
          segments_left = 13;
          segments_right = 13;
          }
          else if (angel == 90)
          {
          segments_left = 27;
          segments_right = 27;
          }
          else if (angel == 180)
          {
          segments_left = 53;
          segments_right = 53;
          }
          else if (angel == 360)
          {
          segments_left = 107;
          segments_right = 107;
          }
          else
          {
          StatusLED(RED);   // Statusleuchtdiode Rot schalten
          }
    
    
    
          Encoder_Set(0,0);
    
    
    
          if(Dir == RIGHT)
          {
             MotorDr_Left = FWD;
             MotorDr_Right = RWD;
          }
    
    
    
          if(Dir == LEFT)
          {
             MotorDr_Left = RWD;
             MotorDr_Right = FWD;
          }
    
          while((encoder[LEFT] < segments_left)||(encoder[RIGHT] < segments_right))
          {
             MotorDir(MotorDr_Left,MotorDr_Right);
             MotorSpeed(MotorSpdLeft,MotorSpdRight);
    
             if(encoder[LEFT] >= segments_left)
             {
                MotorSpdLeft = 160;
             }
    
             if(encoder[RIGHT] >= segments_right)
             {
                MotorSpdRight = 160;
             }
    
             if(encoder[LEFT]&&encoder[RIGHT] >= segments_left)
             {
                MotorSpeed(BREAK, BREAK);
                Msleep(300);
                MotorSpeed(0,0);   // Kollision! Sofort anhalten
             }
    
    
          }
          return 0;
    
       }
    
    
    int DriveLength( int length, unsigned char MotorDr, int MotorSpd)
       {
          Encoder_Init();
          int diff;
          float cycles;
          int segments_left;
          int segments_right;
          int MotorSpdLeft = MotorSpd;
          int MotorSpdRight = MotorSpd;
          unsigned char schalter;
    
    // In der folgenden Rechnung waehre es guenstiger erst zu multiplizieren
    // und dann die Division durchzufuehren um den Rundungsfehler der Division
    // nicht noch zu multiplizieren.
    // Wenn die Werte um den Faktor 10 vergroeßert werden, kann man auch
    // auf float verzichten:
    // segments_left = segments_right = lenght*40/12.2 bzw. lenght*400/122
    
          cycles = length / 12,2;      // Umdrehungen des linken Reifens = zu fahrende Strecke links / Reifen-Umfangs (Umfang = 12,2 cm !!!)
          segments_left = cycles * 40;   // Anzahl der zu fahrenden Segmente = Umdrehungen * Anzahl der Segmente pro Umdrehung (40)
          segments_right = cycles * 40;
          Encoder_Set(0,0);
    
    // Besser auf die Summe der Werte beider Seiten pruefen. Wenn eine Seite trotz
    // Regelung hinterherhinkt, faehrt der asuro sonst weiter bis die langsame Seite
    // auch den Wert erreicht hat:
    // while ((encoder[LEFT]+encoder[RIGHT]) < ((segments_left+segments_right))
    
          while((encoder[LEFT]+ < segments_left)||(encoder[RIGHT] < segments_right))
          {
             MotorDir(MotorDr,MotorDr);
             MotorSpeed(MotorSpdLeft,MotorSpdRight);
             schalter = PollSwitch(); // PollSwitch() ohne Mehrfachabfragen !!!
             PrintInt(schalter); // funktioniert in den wenigsten Faellen !!!
    
             if(( schalter > 0)&&(MotorDr == FWD))
             {
             MotorSpeed(0,0);
             MotorDir(BREAK,BREAK);
             Msleep(300);
    
             return encoder[LEFT];
             }
    
             diff = encoder[LEFT]-encoder[RIGHT];
    
    // Auch hier koennte man die Rechnug umstellen um die Rundungsfehler durch die
    // Integerrechnung zu minimieren:
    // (MotorSpdRight * 25 / 1000) bzw. (MotorSpdLeft * 25 / 1000)
    // Ein "unsigned int" waere guenstiger, weil die Speeds nie negativ werden
    // Und auch wieder bei der Gesamtstrecke auf Summe beider Seiten pruefen
    
            if ((diff > 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdRight = MotorSpdRight + (MotorSpdRight / 100 * 2.5);
                MotorSpdLeft = MotorSpd;
             }
             else if ((diff < 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdLeft = MotorSpdLeft + (MotorSpdLeft / 100 * 2.5);
                MotorSpdRight = MotorSpd;
             }
             else if ((diff == 0)&&(encoder[LEFT] < segments_left)&&(encoder[RIGHT] < segments_right))
             {
                MotorSpdLeft = MotorSpd;
                MotorSpdRight = MotorSpd;
             }
    
    // Wenn die schnellere Seite stoppt, dreht der asuro beim Anhalten, wenn die andere Seite alleine weiterfaehrt
             if(encoder[LEFT] >= segments_left)
             {
                MotorSpdLeft = 0;
             }
    
             if(encoder[RIGHT] >= segments_right)
             {
                MotorSpdRight = 0;
             }
    
    
          }
          MotorSpeed(0,0);
    
    
    
    
       return encoder[LEFT];
       }
    
    
    
    int main(void)
    {
          Init();
    
       StatusLED(GREEN); // die ist immer gruen nach dem Init();
       int blink = 0;
       float cycles;
       int way = 0;
       int segments;
       unsigned char endschalt;
    
    
       while(way < 1000)
       {
    
          segments = DriveLength(100, FWD, 120);
          cycles = segments / 40;
          way = way + (cycles * 12.2);
    
    
          endschalt = PollSwitch(); // PollSwitch() ohne Mehrfachabfragen !!!
          PrintInt(endschalt); // funktioniert in den wenigsten Faellen !!!
    
          if (( endschalt == 2)||( endschalt == 16)||( endschalt == 18 ))
             {
             DriveLength(10, RWD, 120);
             DriveCircle(90, RIGHT);
             }
             else if ( endschalt == 32)
             {
             DriveCircle(45, RIGHT);
             }
             else if ( endschalt == 1)
             {
             DriveCircle(45, LEFT);
             }
    
    
    
       }
    
    
    
    
       while(1)
       {
          if (blink == 0)
          {
             blink = 1;
             StatusLED(OFF);
             Msleep(300);
          }
          else if(blink == 1) // wenn nicht 0, dann muss es 1 sein
          {
             blink = 0;
             StatusLED(GREEN);
             Msleep(300);
          }
       }
    
    
    
        return 0;
    }
    Vielleicht hilft es euch weiter.

    Viel Glück heute am 13.

    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!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    12.07.2007
    Beiträge
    11
    Hallo

    Nein ich habe die test.c nicht abgeändert....habe eine neue test.c geschrieben.

    Kann ich dem Asuro denn irgendwie die Befehle erklären damit er weiß was ich von ihm will?? Oder is das nicht möglich??

    Gruß
    2stoned

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad