PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : verknüpfung von funktionen



INGatRexroth
27.11.2007, 17:22
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...


#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;
}

asuroer
27.11.2007, 18:47
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

INGatRexroth
27.11.2007, 19:16
sorry, aber ich versteh nur bahnhof...

asuroer
27.11.2007, 23:20
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

damaltor
27.11.2007, 23:40
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.

asuroer
28.11.2007, 16:21
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

Sternthaler
29.11.2007, 01:45
Hallo INGatRexroth,
herzlich willkommen im besten Asuro-Forum unter der Sonne.

Hier mal eine Zusammenfassung, was bisher gemeint ist:

#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:

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 :frown:
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. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=35721)
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