- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: [Prog.-Frage] examples\EncoderTest\test.c und Funktion "

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42

    [Prog.-Frage] examples\EncoderTest\test.c und Funktion "

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Wie Ihr wisst, bin ich neu hier und habe 'mal wieder einige Fragen an Euch.
    (Diesmal zum Programmieren!)

    #2: zu EncoderTest:

    Warum finde ich nirgends - also weder in test.c noch in den "Include-Dateien" noch
    im ISP "SIGNAL (SIG_ADC)" - die _Definition_ "volatile int encoder[2];"?

    In asuro.h findet man unter /* --- Globale Variablen ----*/ NUR die _Deklaration_
    "extern volatile int encoder[2];"

    (Ich habe schon 'mal das "volatile" vorsorglich ergänzt!)

    Kann dies der Compiler selbst oder wurde es 'nur' vergessen?
    ------------------------------

    #3: an @Andun und @stochri zur Funktion "Go()":

    Warum verwendet Ihr die Variable "int tot_count"? Die macht doch m.M. nach genau das,
    was in der Array-Var. "encoder[0]" steht! Also, warum wird die Funktion "Go()" erst
    'mal größer mit "tot_count += encoder[LEFT];" und "EncoderSet(0,0);" und obendrein kann
    auch 'mal so'n Tic verlorengehen?

    Schon jetzt: Vielen Dank für Eure Antworten! (... und Euer Verständnis!)

    cu Helmut

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    und obendrein kann auch 'mal so'n Tic verlorengehen?
    ... kannst Du dies bitte mal näher erläutern, was Du hier genau meinst, oder war das nur eine allgemeine Frage?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42
    Hi ehenkes!

    ... kannst Du dies bitte mal näher erläutern, ...
    Gerne!
    (zu meiner Frage #3!)
    Die ISP (Interrupt Service Routine) SIGNAL (SIG_ADC) läuft im Hintergrund 'fleissig' weiter!
    Zwischen der Abfrage des Wertes für "tot_count" in der Zeile "tot_count += encoder[LEFT];"
    und dem Zurücksetzen der beiden (Array-)Variablen "encoder[0/1]" mit der Zeile "EncoderSet(0,0);"
    vergeht einige Zeit, in der sich der Inhalt sowohl von "encoder[LEFT]" als auch von
    "encoder[RIGHT]" verändert haben kann! Und das bemerkt unser Programm überhaupt nicht: Also
    können doch einige Tic's verloren gehen.

    Wenn aber die Variable "enc_count" anstatt mit "tot_count" mit "encoder[LEFT]" verglichen
    würde, gehen KEINE Tic's verloren und wir sparen uns noch den (Assembler-)Code der Zeile "EncoderSet(0,0);" und last not least brauchen wir auch die Var. "int tot_count" nicht!

    Code:
    void Go (int distance, int speed)
    {
      uint32_t enc_count;
      int tot_count = 0;
      int diff = 0;
      int l_speed = speed, r_speed = speed;
    
      // calculation tics/mm
      enc_count=abs(distance)*10000L;
      enc_count/=MY_GO_ENC_COUNT_VALUE;
      EncoderSet(0,0); // reset encoder
    
      MotorSpeed(l_speed,r_speed);
      if (distance<0) MotorDir(RWD,RWD);
      else MotorDir(FWD,FWD);
    
      while (tot_count<enc_count)
     /*++++++++++++++++++++++++++*/
      {
        tot_count += encoder[LEFT];
       /***************************/
        diff = encoder[LEFT] - encoder[RIGHT];
        if (diff > 0)
        { //Left faster than right
          if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
          else r_speed += 10;
        }
        if (diff < 0)
        { //Right faster than left
          if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
          else l_speed += 10;
        }
        EncoderSet(0,0); // reset encoder
       /****************/
        MotorSpeed(l_speed,r_speed);
        Msleep(1);
      }
      MotorDir(BREAK,BREAK);
      Msleep(200);
    }
    Gibt es auch 'ne Meinung/Antwort zu meiner Frage #2?

    cu Helmut

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42
    Frage #2 selbst gelöst!)
    #2: zu EncoderTest:

    Warum finde ich nirgends - also weder in test.c noch in den "Include-Dateien" noch
    im ISP "SIGNAL (SIG_ADC)" - die _Definition_ "volatile int encoder[2];"?
    In "globals.c" werden "int switched;" und "int encoder [2];" definiert.
    (Man sollte noch "volatile" ergänzen!)

    Leider hatte ich nach "encoder[2];" -also OHNE Space- gesucht und deshalb
    nichts gefunden! Sorry, dass ich Euch genervt habe.!;(

    cu Helmut

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Ist doch kein Problem. Mehrfaches Hinterfragen kann nichts schaden.
    Allgemeiner Hinweis zum Typ-Qualifizierer volatile: http://www.henkessoft.de/C++/Cpp_school/volatile.htm

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.07.2007
    Beiträge
    42
    Hi Erhard!

    Zuerst 'mal ein großes Dankeschön!

    ...
    Allgemeiner Hinweis zum Typ-Qualifizierer volatile: http://www.henkessoft.de/C++/Cpp_school/volatile.htm => einfach toll!!!
    Deine Inet-Seite habe ich mir angeschaut und finde auch Deine dortige
    Arbeit _Spitze_! Außerdem habe ich mir vorgenommen, demnächst bei Dir
    zu stöbern (allerdings muss man da viel Zeit mitbringen!) und damit
    auch 'mal wieder hinzu zu lernen!

    Nochmals Danke!

    cu Helmut

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Danke für das positive Feedback!

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress