PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche C Grundlagen hilfe



s3r1alz
05.02.2010, 16:33
Ich begrüße alle hier im RoboterNetz.
Derzeit besuche ich eine Fachschule um dort meinen Automatisierungstechniker zu absolvieren. Darum habe ich mir einen ASURO gekauft um tiefer in die Elektronik und vor allem in C einzutauchen.
Was die Elektronik angeht habe ich keine Probleme gehabt den ASURO aufzubauen, da dies auch mein ursprünglicher Beruf ist. Aber von C habe ich keine Ahnung da dies komplett Neuland ist =P~

Nun mein Problem am Anfang, ich habe ein Programm genommen welches auch in der Anleitung beschrieben steht und dies ein wenig abgeändert, denn ich will das der ASURO geradeaus fährt bis er irgendwo aneckt. Dann soll sich das rechte Rad rückwärts drehen (am besten das sich ASURO um 90° dreht) und dann soll er wieder an den Anfang des Programms springen und das ganze geht von vorn los bis er wieder Aneckt.
Wie bekomme ich das geschrieben das er sich um 90° dreht und wie ist der Befehl dazu das er das Programm von vorn beginnt?

Ich hoffe ihr könnt mir weiterhelfen. Vielen Dank schon mal im vorraus.

#include "asuro.h"

int main(void)
{
Init();

MotorDir(FWD,FWD);
MotorSpeed(100,100);
StatusLED(GREEN);

while (PollSwitch()==0)
{
SerWrite("Vorwärts!\n",10);
}

MotorSpeed(0,0);
StatusLED(RED);
BackLED(ON,ON);

while(1)
{
SerWrite("Angeeckt, drehung um 90°\n",5);
MotorDir(RWD,RWD);
MotorSpeed(0,100);
}
return(0);
}

Virus
05.02.2010, 16:40
willkommen im RN
also while ist schon richtig, while true und mit jedem erreichen des letzten Befehls springt der Prozessor wieder an den Anfang der Schleife zurück.

s3r1alz
05.02.2010, 16:48
Hey, danke für deine schnelle Hilfe.
Willst du mir jetzt damit sagen das ich im letzten Abschnitt statt while(1) --> while true schreiben soll?
Weil wenn dann muss doch noch irgendein Befehl rein wann er zurückspringen soll, also am besten nachdem er die 90° Drehung gemacht hat!

-jan_
05.02.2010, 17:07
Moin!

while(1) stimmt schon.. die schleife wird dann ewig wiederholt.

Zum rest kann ich leider nichts sagen da ich die verwendeten funktionen nicht kenn..

Jaecko
05.02.2010, 17:22
while(...) wird solange wiederholt, wie die Bedingung in den Klammern wahr (true) ist. In C ist das der Fall, wenn der Ausdruck z.b nicht 0 ist.

Die While zu verlassen geht mit 2 Möglichkeiten: Die While-Bedingung mit einer Variable machen, die du vor dem Verlassen auf wahr setzt:

while(x)
{
}

Solange x irgendwas anderes als 0 ist, dann bleibt er drin. Setzt du x 0, stimmt die Bedingung nicht mehr: Schleife wird verlassen.

Andere Möglichkeit: Befehl break; in der Schleife für sofortiges Verlassen.

s3r1alz
05.02.2010, 18:07
Danke danke für die Hilfen, da werd ich doch gleich nochmal ein wenig herumprobieren.

s3r1alz
05.02.2010, 19:39
So, nach längerem hin und her überlegen sieht mein Programm jetzt so aus:

#include "asuro.h"
int zaehler;
char x=1;
int main(void)
{
Init();

MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);


while (PollSwitch()==0)
{
SerWrite("Vorwärts!\n",11);
}

StatusLED(RED);
BackLED(ON,ON);

while (x)
{
for(zaehler=0;zaehler<2;zaehler++)
{
SerWrite("Angeeckt, drehung um 90°\n",26);
MotorDir(RWD,RWD);
MotorSpeed(0,150);
}
x=0;
}
return(0);
}

Ich habe mir dabei gedacht das ich eine Zählerschleife setze welche anfängt zu zählen sobald ASURO irgendwo aneeckt, und wenn sie zB 2 erreicht, aus der for Bedingung raus springt und x=0 setzt. Was zur Folge hat das auch die Rückwärts fahren Schleife nicht mehr wahr ist und das ganze Programm von oben wieder neu abgearbeitet wird!
Warum funktioniert das beenden der Rückfahr Bedingung nicht?
Es klappt bis dahin das ASURO fährt, irgendwo aneeckt. Und dann dreht sich ASURO ewig Rückwärts im Kreis!

Jaecko
05.02.2010, 21:45
Du setzt hier x zwar 0, aber x bleibt dann auch 0. Es wird nirgendwo mehr auf 1 o.ä. gesetzt.
Zudem fehlt "aussen rum" noch ne while(1) um den Teil, der immer wiederholt werden soll... d.h. die while(x) wird nur ein einziges Mal abgearbeitet. Danach folgt das "return 0"; was der Controller da dann macht... hm gute Frage... was eigentlich?
Endlosschleife? "Irgendwas" was grad so im Flash rumliegt?

josua
06.02.2010, 13:40
genau, um alles muss ein while(1) und um eine bestimmte zeit rückwärts zu fahren,bzw. zu drehen gibt es zwei möglichkeiten: sleep oder odometrie
das ist im forum schon an verschiedenen stellen erklärt, einfach mal suchen.

gruß josua

s3r1alz
07.02.2010, 16:06
So ich hab es jetzt nach langem probieren hin bekommen. Mein Programm sieht jetzt so aus:

#include "asuro.h"

int main (void)
{
Init();
int p;
while(1){
MotorDir(FWD,FWD);
MotorSpeed(125,125);
if(PollSwitch()>0) //wenn ich hier 1 eingebe tritt der Fehler
{ //trotzdem ab und an auf!
MotorDir(RWD,RWD);
MotorSpeed(125,125);
for(p=0;p<300;p++)
{Sleep(72);}

MotorDir(BREAK,RWD);
MotorSpeed(0,125);
for(p=0;p<1000;p++)
{Sleep(72);}
}
}
while(1){}
return 0;
}
Allerdings Funktioniert es nicht so wie ich es mir Vorgestellt habe. Denn wenn ich PollSwitch()>0 Eingebe macht das Programm was es will und wenn ich >1 Eingebe Funktioniert es ganz gut, aber ich nehme ja den rechten Kollisionsschalter aus dem rennen da ich ja größer 1 vorgebe und ab und zu während des gerade ausfahren verhält sich das Programm so wie während einer Kollision.
Woran kann es liegen? Und wie oder was muss ich evtl. verändern damit ich PollSwitch()>0 Einstellen kann und es so einwandfrei Funktioniert das der ASURO wirklich nur während einer Kollission mit irgend einem der Schalter das restliche Programm ausführt und nicht wann er will ;)

radbruch
07.02.2010, 16:21
Hallo

Die Motoren stören die Tastenabfrage. Dagegen hilft nur eine mehrfache Abfrage der Tasten und eventuell eine bessere Kalibrierung:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=43367
(einer der unzäligen Threads dazu)

Gruß

mic

josua
07.02.2010, 16:42
frag poll switch 2mal ab und lass ihn nur abbiegen, wenn beide mal ein tastendruck erkannt wird(manchmal kommt ein störsignal ohne tastendruck). des könnte helfen.

gruß josua

s3r1alz
07.02.2010, 17:27
Vielen Dank für eure Hilfe. Werd ich dann gleich mal probieren!

s3r1alz
08.02.2010, 11:38
Super =D> , so Funktioniert es einwandfrei.
Ich muss allerdings die Erkennung des Tastendrucks 4x abfragen da es bei 2 oder 3 maliger Abfrage trotzdem zu Störungen kam.

#include "asuro.h"

int main (void)
{
Init();
int p;
while(1){
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(135,135);
if(PollSwitch()>0 && PollSwitch()>0 && PollSwitch()>0 && PollSwitch()>0)
{
BackLED(ON,ON);
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
for(p=0;p<300;p++)
{Sleep(72);}

MotorDir(BREAK,RWD);
MotorSpeed(0,125);
for(p=0;p<1000;p++)
{Sleep(72);}
}
}
while(1){}
return 0;
}

josua
08.02.2010, 13:30
kann schon mal vorkommen, aber schön dass es jetzt funktioniert.

gruß josua

s3r1alz
10.02.2010, 09:56
Kann mir einer verraten wo ich die aktuelle Version 2.8.0.lib her bekomme. Am besten mit install. Anleitung und Info was sonst noch zu Beachten ist. Da man sie hier nicht Runter laden kann!

http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Bibliothek#toc7

oberallgeier
10.02.2010, 10:19
Kann mir einer verraten wo ich die aktuelle Version 2.8.0.lib her bekomme. ...Das könnte sicher die Suchfunktion verraten. Schau mal hierher. (https://www.roboternetz.de/phpBB2/viewtopic.php?p=275614#275614&sid=f6b5cffca7ca63e2f85139e27fa06c1c)

s3r1alz
11.02.2010, 09:04
Danke dank, die SuFu hab ich benutzt aber irgendwie finde ich das etwas Unübersichtlich und auf diese Thread bin ich zB. nicht gestoßen!

oberallgeier
11.02.2010, 10:18
... die SuFu hab ich benutzt aber irgendwie finde ich das etwas Unübersichtlich und auf diese Thread bin ich zB. nicht gestoßen ...Da bin ich schon ziemlich überrascht! Ich habe eben in der Suchfunktion eingegeben:
asuro lib 2.8
(o) nach allen Wörtern suchen
Forum: | | |--Asuro

Darauf bekomme ich 3 (in Worten drei !) Treffer - also nicht wirklich unübersichtlich! Der erste Treffer mit den meisten Antworten und dem letzten Posting von 08 Feb 2010, 22:05 wurde von sternthaler erstellt (kannst Du vielleicht nicht wissen - einer DER asuro-lib-gurus). In diesem Thread wird zuerst sehr ausführlich die Installation der lib 2.7 erläutert und die Bestimmung verschiedener Baumuster-Daten, in jüngerer Zeit auch Postings zu v2.8rc1. Was bei Deiner Suche schief gegangen ist, will ich jetzt garnicht wissen - hier jedenfalls mein Beweis, dass die Suchfunktion SEHR effektiv und informativ ist.

Hast Du jetzt die gewünschte Lib?

s3r1alz
11.02.2010, 11:13
Ja, dickes fettes Dankeschön.
Wer weiß, Hauptsache ich hab sie jetzt.