Das ist aber beruhigend, dass zumindest enige Menschen auf diesem Planeten Englisch können!!!!!!!!!!!!!!
Danke schön!
Druckbare Version
Das ist aber beruhigend, dass zumindest enige Menschen auf diesem Planeten Englisch können!!!!!!!!!!!!!!
Danke schön!
Das hab ich grade nochmal durchgelesen und immer noch nicht verstanden!Zitat:
Zitat von damaltor
Wenn die Werte ungleich sind, dann soll er sich doch solange drehen, wie die Werte immernoch ungleich sind.
Nachdenk........
AHHHHHHHHHHHH!!!!!!!!!
Meinst du das vielleicht so:
#include <asuro.h>
int main(void)
{
Init();
unsigned int data[2];
unsigned int dataalt[2];
FrontLED(ON);
LineData(dataalt);
while(1)
{
LineData(data);
MotorDir(FWD,FWD);
MotorSpeed(200,230);
while(data[0]+data[1]!=dataalt[0]+dataalt[1])
{
MotorDir(RWD,FWD);
MotorSpeed(200,230);
break;
}
}
while(1);
return 0;
}
Gruß Roboaktiv
@ jeffreydj: Dieser Codebutton geht bei mr irgendwie nicht!
wenn der code button nocht geht, dann schreibe vor deinen code folgendes:
das ist schon besser, allerdings hättest du nur das erste if durch while ersetzen müssen. achte darauf, dass auch in jedem durchlauf der schleife neue werte gemessen werden!Code:
und dahonter
Irgendwie find ich da kein (erstes) IF. Wo ist denn das so ungefähr? Im Momemt (so wie es da oben steht) wird doch immer ein neuer Wert gemessen oder?
Ah! Jetzt hab auch ich es verstanden!
Allerdings hab ich jetzt schon wieder nen neues Problem:
Der Asuro soll nun so rumfahren, bis er gegen einen Gegenstand fährt. Dann soll er nen Stück nach hinten fahren um genug Platz für die anschließende Drehung zu haben. Aber irgendwie funltioniert das nicht.Code:#include <asuro.h>
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(200,220);
while(PollSwitch()!=0)
{
MotorDir(RWD,RWD);
MotorSpeed(200,220);
Sleep(250);
Sleep(250);
MotorDir(RWD,FWD);
MotorSpeed(200,220);
Sleep(250);
Sleep(250);
Sleep(250);
break;
}
}
while(1);
return 0;
}
Was mach ich diesmal falsch?
Ist das vielleicht der gleiche Fehler wie oben?
Roboaktiv
Hallo
PollSwitch() ist etwas zickig, bei Kollisionsabfragen verwende ich deshalb die direkte Abfrage des Tasteneingangs. Es werden dabei alle Tasten ausgewertet, aber nicht erkannt, welche gedrückt ist:
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))
Im Programm verwendet man das dann so:
if taste StatusLED(RED); else StatusLED(OFF);
oder
MotorSpeed(200,200);
while keine_taste;
MotorSpeed(0,0);
Selbstverständlich funktioniert das auch ohne #define:
if (!(PINC & (1<<PC4))) StatusLED(RED); else StatusLED(OFF);
ist aber nicht so schön zu lesen.
Warum fährst du eigentlich mit einer While-Schleife zurück? Mit einer if-Abfrage würde es auch funktionieren und käme dem Sinn näher: Fahre zurück, wenn eine Taste gedrückt wird. Beidesmal wird die Rückfahrbefehlsfolge einmal ausgeführt (der break ist unnötig!). Der Unterschied wäre, wenn die Wand mitfahren würde (oder ein Taster klemmt) und am Ende des Ausweichens eine Taste immer noch gedrückt ist. Dann würde mit while (aber ohne break!) der asuro sofort ein weiteres mal zurückweichen, bei if (oder while mit break) würde kurz vorwärts gesetzt und dann erst zurückgewichen. Allerdings so schnell, das mans nicht bemerkt.
Gruß
mic
Weiter oben hat damaltor am 22.06.2007 um 22:45 Was mit while anstatt If geschrieben und da dachte ich:"Dann machtes nochmal so!" Wahrscheinlich bezog sich das nur auf die Odometrie-Geschicht. Dieses #define dient nur zu erstellen einer Funktion oder?
Müsste das dann im ganzen Programm ungefähr so aussehen?
Oder doch irgendwie anders?Code:
#include <asuro.h>
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(200,220);
if(keine_Taste)
{
MotorDir(RWD,RWD);
MotorSpeed(200,220);
Sleep(250);
Sleep(250);
MotorDir(RWD,FWD);
MotorSpeed(200,220);
Sleep(250);
Sleep(250);
Sleep(250);
}
}
while(1);
return 0;
}
Roboaktiv
Hallo
Nahe dran, aber noch nicht perfekt. O:)
Mit #define definierte Wörter werden im weiteren Programm durch den Text ersetzt, den man definiert hat. Ein
#define Lampe_rot StatusLED(RED)
ersetzt alle Stellen im Programm die Lampe_rot heisen mit dem Text StatusLED(RED) (bisschen banal vielleicht) Das verwendet man um sich Tipparbeit zu ersparen und/oder um ein Programm verständlicher/unverständlicher zu gestalten.
Zum deinem aktuellen Programm:
keine_Taste muss natürlich keine_taste heisen, weil es so auch im #define steht. Alles in c ist case-sensitiv, das bedeutet, Groß- und kleinschreibung wird unterschieden. Ausserdem möchtest du doch prüfen, ob eine Taste gedrückt ist. Also sollte die Abfrage if taste... heisen. Die Klammern könntest du weglassen, denn die sind im #define schon dabei.
Die Zeiten der Sleep()s sind zu kurz! Sleep(36) entspricht ca. 1 Millisekunde (soweit ich weis und nur, wenn du eine der neueren asuro.c verwendest.) Also würden 3 Sleep(250) ungefähr 750/36 ms verzögern. Das sind quasi 0,02 unmerkliche Sekunden.
for (zeit=0; zeit<1000; zeit++) { Sleep(36); }
würde dann eine Sekunde verzögern. Alternativ kennen die neueren Libaries auch die Msleep()-Funktion. Hier kann die Zeit direkt in Millisek. angegeben werden:
Msleep(1000);
wartet dann auch eine Sekunde lang.
Ob if oder while, viele Wege führen zum Ziel.
Gruß
mic
Müsste dann die if-Schleife so aussehen?
zu #define: Wären denn die KLammern falsch?Code:if(keine_taste) //Wenn keine Taste gedrückt ist, dann...
{
MotorDir(RWD,RWD);
MotorSpeed(200,220);
for(zeit=0;zeit<1000;zeit++) //zeit wird oben natürlich definiert
{
Sleep(36);
}
MotorDir(RWD,FWD);
MotorSpeed(200,220);
for(zeit=0;zeit<1000;zeit++)
{
Sleep(36);
}
}
zu Msleep (bzw. Sleep): Den Asuro hab ich zu Weihnachten 2006 bekommen.
Danke,
Roboaktiv
Hallo
Es wird immer besser. O:)
zeit (mir fiel kein blöderer Name ein) sollte natürlich als int definiert sein. Die Schleifen müsten so funktionierten. c ist recht flexibel in der Gestaltung des Quelltextes.
if taste wird ersetzt durch if (!(PINC & (1<<PC4)))
if (taste) wird ersetzt durch if ((!(PINC & (1<<PC4))))
Das ist eigentlich nicht falsch und wird vom Compiler erkannt und wegrationalisiert. Das erzeugte .hex sollte bei beiden Varianten gleich sein.
Die Dateien auf der asuro-CD sind schon recht alt, neuere Libaries gibt es hier, Infos zu V2.7 findest du hier. Allerdings ist die brandneue Version 2.7 recht kompliziert, für Einsteiger würde ich ältere Versionen empfehlen. (Msleep() und PrintInt() gibt es seit ca. V2.1?) Für ein Update brauchst du lediglich die Dateien asuro.h und asuro.c jeweils durch die neueren Versionen ersetzen.
Gruß
mic