-         
Ergebnis 1 bis 7 von 7

Thema: verknüpfung von funktionen

  1. #1

    verknüpfung von funktionen

    Anzeige

    hallo zusammen, seit ca 2 wochen ärgere ich mich damit herum meinen asuro zu programmieren, doch ich hba keine ahnung wie man 2 verschiede sachen miteinander verknüpft...
    z.b. will ich, dass mein asuro die odometrie einhält und wenn ein taster berührt wird anhält und oder rückwärts fährt...
    einzeln bekomme ich beides hin, aber ich hab keine ahnung wie man die miteinander verknüpft... das hier ist mein versuch...
    bitte helft mir...

    Code:
    #include "asuro.h"
    
    int main(void)
    {	unsigned int data[2];
    
    	Init();
    	FrontLED(ON);
    	MotorDir(FWD,FWD);
    	while (1)
    		{
    		OdometrieData;
    		if (data [0]<data[1])
    			{MotorSpeed(200,150);}
    		else
    			{MotorSpeed(150,200);}
    		}
    	while (1)
    		{
    		if (PollSwitch()!=0)
    			{
    			MotorSpeed(255,255);
    			BackLED(ON,ON);
    			}
    		}
    		return 0;
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    25
    Beiträge
    69
    hi

    also 2 sachen gleichzeitig kann man nicht ausführen. Du kannst höchstens versuchen die PollSwitch funktion alle paar ms abzurufen oder du versuchst, die taster mit nem Interrupt abzufragen dann würde das programm automatisch pollswitch abfragen.


    MfG

    Jan

  3. #3
    sorry, aber ich versteh nur bahnhof...

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    25
    Beiträge
    69
    hi also es gibt 2 möglichkeiten, die pollswitch funktion abzufragen:

    1.) du fragst den asuro immer abwechselnd odometrie und taster ab
    oder
    2.) du fragst die taster über den externen interrupt 2 ab. hierzu solltest du dir am besten "mehr spaß mit asuro" kaufen, da ist das drin erklärt.


    Ich hoffe mal das dir meine erklärungsversuche nun weiterhelfen...im erklären war ich aber noch nie gut :P

    MfG

    Jan

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.956
    gleichzeitig gibts nicht bei mikrorechnern (bei deinem pc übrigens auch nicht, und selbst bei großrechnern nicht sofern sie nicht mehrere prozessoren haben), sondern nur "kurz nacheinander".

    in deinem programmcode (ich habe deinen beitrag der übersichtlichkeit halber geändert, bitte benutze ab jetzt den code-button) sind zwei endlosschleifen, die zweite wird nie ausgeführt weil die erste nie beendet wird. versuch doch mal beide abfragen in eine endlosschleife zu packen, dann werden sie abwechselnd ausgeführt.
    kleinschreibung ist cool!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    25
    Beiträge
    69
    hi

    bei dem programm fehlt was: du hast einm,al OdometrieData geschrieben, musst aber OdometrieData(data) schreiben, damit der mega8 weiß,welcher variable er die daten zuweisen muss

    MfG

    Jan

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo INGatRexroth,
    herzlich willkommen im besten Asuro-Forum unter der Sonne.

    Hier mal eine Zusammenfassung, was bisher gemeint ist:
    Code:
    #include "asuro.h"
    
    int main (void)
    {
       unsigned int data [2];
    
       Init ();
       FrontLED (ON);
       MotorDir (FWD, FWD);
    
       while (1)
       {
          OdometrieData (data);          // Die Klammern und das Ergebnis
          if (data [0] < data [1])
          {
             MotorSpeed (200, 150);
          }
          else
          {
             MotorSpeed (150, 200);
          }
    /*
    Das hier alles weg, da dann nun OdometrieData() und PollSwitch()
    immer nacheinander aufgerufen werden.
       }
    
       while (1)
       {
    weg bis hier hin
    */
          if (PollSwitch () != 0)
          {
             MotorSpeed (255, 255);
             BackLED (ON, ON);
          }
       }
    
       while (1);  // Ist dafür da, dass das Programm auf keinen Fall beendet wird.
                   // Sonst spinnt der Asuro.
       return 0;
    }
    Es gibt aber noch ein paar Probleme.
    - Wenn mit "PollSwitch() != 0" erkannt wird, dass ein Taster gedrückt wurde, dann schaltest du auf 'volle Pulle', ohne den Rückwärtsgang mit "MotorDir (RWD, RWD);" einzulegen.
    - Aber, wenn du nun rückwärts fährst, gibt es keine Stelle mehr im Programm, die die Motoren dann wieder zum vorwärts Fahren umschalten.
    - Also solltest du beim "if (PollSwitch() != 0)" noch einen else-Zweig spendieren, in dem wieder "MotorDir (FWD, FWD);" aufgerufen wird.

    Tut mir leid, aber auch dass wird noch nicht ausreichen.
    Was passiert, wenn die Wand erreicht wurde?
    - Volle Pulle zurück.
    - Taster wird nicht mehr von der Wand gedrückt.
    - Vorwärtsgang wird eingelegt.
    - Asuro fährt sofort wieder vor die Wand.
    --- und so fort.

    Hier kannst du am besten folgendes machen:
    Code:
          if (PollSwitch () != 0)
          {
             MotorDir (RWD, RWD);
             MotorSpeed (255, 150);    // Im BOGEN weg von der Wand !!!
             BackLED (ON, ON);
             for (i = 0; i < 200; i++) // 200 mal, i muss natuerlich definiert werden,
                Sleep (72);            // eine Millisekunde warten
                                       // Anstatt der 200 musst du auch andere Werte
                                       // probieren, bis der Bogen ausreicht um von der
                                       // Wand weg zu kommen.
          }
          else
          {
             MotorDir (FWD, FWD);
             BackLED (OFF, OFF);
          }
    Jetzt kommt aber leider noch etwas
    Dein Programmteil zum Geradeausfahren mit OdometrieData() wird leider nicht funktionieren.
    Die Funktion OdometrieData() holt von den Sensoren an den Rädern nur die Information, wie hell es dort gerade ist.
    Wenn sich diese schwarz-/weiss-Scheibe also dreht, bekommst du die Helligkeitsänderungen geliefert. Du bekommst nicht die Anzahl der schwarz-/weiss-Wechsel mitgeteilt.
    Somit wird das folgende "if (data [0] < data [1])" nicht die Raddrehung vergleichen, sondern nur die Helligkeit.

    Zu diesem Thema solltest du mal hier nachlesen.
    Becci hat dort ihr Programm vorgestellt. Darin ist direkt im ersten Code-Block ein Programm-Teil welches dir weiterhelfen kann.
    Suche dort mal:
    //Helligkeitswerte der Lichtschranken auslesen
    bis
    //zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
    //Wertebereich verlässt
    Nicht erschrecken, dazwischen ist der Programmteil, der aus den HELLIGKEITS-Änderungen ermittelt, wann sich das Rad weitergedreht hat.
    Das ist die Information, die du benötigst. (Hier kannst du bei genauem Studium aber einiges lernen.)
    (Der Programm-Teil ist im übrigen aus dem "Mehr Spaß mit Asuro II". Band I wurde dir ja schon von asuroer empfohlen. Da schliesse ich mich auf alle Fälle an.)

    Ich hoffe, dass ich dich nicht zu doll frustriert habe, sondern dass du weiter mit den 'Problemen' beim Asuro bzw. beim Programmieren kämpfst und dem Ding die Stirn bietest. Genau dafür ist der Asuro geschaffen. Zu Anfang ein Berg von Problemen, und dann kommt mit einem mal der Ah-ha-Effekt. Spätestens dann wirst du ein Abhängiger.

    Viel Erfolg wünscht
    Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

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