PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Turn - unendliches Drehen ?!



Mastermsc
09.11.2006, 19:57
Hallo, ich habe hier ein Programm mit dem AVR Studio geschrieben. Es macht aus das ,was ich will. Es fährt solange, bis er auf eine schwarze Stelle trifft, dann leuchtet kurz die Status LED rot, anschließend gelb und bleibt dort die ganze Zeit stehen. Nun möchte ich, dass der Asuro sich um 90° dreht,was aber nicht funktioniert, denn er dreht sich unendlich .



#include "asuro.h"

int main(void)
{
unsigned int data[2]; //Speicher bereit stellen
int zeit=0;
Init();
FrontLED(ON);
LineData(data);

MotorDir(FWD,FWD); // Vorwärts fahren lassen,
MotorSpeed(110,100); //mit dieser Geschwindigkeit



while(1) {
LineData(data);
if(data[0]<50 || data[1]<50){StatusLED(RED);for(zeit=0;zeit<200;zeit++){Sleep(220);}
}
if(zeit==200){
StatusLED(YELLOW);
MotorDir(BREAK,BREAK);MotorSpeed(0,0);for(zeit=0;z eit<200;zeit++){Sleep(120);}


}

Turn(90,120);Sleep(200);
}





return 0;


}

Was mache ich falsch? Könnt ihr mir helfen?

Dann hätte ich noch eine Frage : warum funktioniert es nicht ,wenn ich
if(zeit==200){
StatusLED(YELLOW);
MotorDir(BREAK,BREAK);MotorSpeed(0,0);for(zeit=0;z eit<200;zeit++){Sleep(120);}
}
außerhalb der while(1){} Schleife schreibe ? Denn daran könnte es liegen, dass Turn nicht richtig funktioniert..


ThX schonmal für eure Hilfe O:)

EDH
09.11.2006, 20:03
(1) vor turn() musst du Encoder_Init(); aufrufen
(2) wenn du den code von oben rausnimmst, hast du in der while schleife nichts was deienen asuro zum stoppen veranlassen könnt

mfg EDH

Mastermsc
09.11.2006, 20:30
OmG bin ich plöd !
//EDIT2

Ja daran lag es....schöndankeee EDH !
Wie bekomme ich s nun hin,dass er bis zum Ende der schwarzen Fläche fährt und dann anhält ?

EDH
09.11.2006, 20:41
probier mal aus, ob das hier geht



#include "asuro.h"

int main(void)
{
int data[2];
Init();
Encoder_Init();
FrontLED(ON);
while(1) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
LineData(data);
while(data[0]>50 && data[1]>50) {
LineData(data);
}
StatusLED(YELLOW);
LineData(data);
while(data[0]<100 && data[1]<100) {
LineData(data);
}
StatusLED(RED);
Turn(90,130);
}
return 0;
}

Mastermsc
09.11.2006, 20:51
Danke für deine Mühe, aber es funktioniert nicht. So wendet er direkt die Turn Funktion an, egal ob weiße oder schwarze Fläche, ohne erst einmal nach vorne zu fahren ...

EDH
10.11.2006, 15:01
ich den code aus dem posting oben jetzt so verändert, das es eigentlich gehen müsst
ACHTUNG: es kann sein, das du die helligkeitswerte für den liniensensor bei dir noch einwenig anpassen musst.

mfg EDH

Mastermsc
10.11.2006, 17:04
Hallo ! Danke nochmal EDH, aber er macht nicht,dass was ich will... egal muss ich wohl selber hinkriegen , kannst du mir erklären, was das hier zu bedeuten hat


while(data[0]<50 && data[1]<50) {
LineData(data);
}


Was führen denn diese von dir angewandten Schleifen aus? Was davor oder dahinte steht ?

Eine Frage noch: Das Programm soll später in eine Funktion geschrieben werden. Dann will ich nur einmal aufrufen ... also das er nur einmal die schwarze Linie findet ,sich dreht, dann weiterfährt und anhält. Anschließend soll dieses Programm für beendet erklärt werden, somit mit der nächsten Funktion ,damit einem anderen Prozess weitermachen. Geht das? ich habe bedenken, weil da ja diese while(1) Schleife ist.

danke schonmal

EDH
10.11.2006, 19:56
tja äh bei mir hat das programm funktioniert...


(1) durcvh die schleife fragt er solange die liniensensoren ab, bis er irgenbdwann auf einen schwarze linie trifft

(2) nehm einfach dei while schleife raus, dann wird das ganze nur einaml ausgeführt

Mastermsc
10.11.2006, 20:03
Wenn ich die While(1) Schleife rausnehme, dann fährt er nur noch geradeaus und hält bei einer schwarzen Fläche überhaupt nicht an.

EDH
10.11.2006, 20:06
ich hab mich da wohl ein wenig missverständlich ausgedrückt. nicht die komplette while schleife
ddu löschts aus dem code nur while(1) , und die zwei kklammern, so dass dann der code ind der schleife noch da stheht , aber es keine while schleife mehr ist

mfg EDH

Mastermsc
10.11.2006, 23:16
Jo, super ,funzt gut ! Nur die eine frage habe ich immer noch
while(data[0]<50 && data[1]<50) {
LineData(data);
}


Was führen denn diese von dir angewandten Schleifen aus? Was davor oder dahinte steht ?

Müsste es denn nicht z.B. LineData(data);
while(data[0]<50 && data[1]<50) {
MotorDir(FWD,FWD);
...

}


heißen ?

EDH
11.11.2006, 14:46
na ja der kreativität sind keine grenzen gesetzt. man kann das sicher auch anders machen.

durch die while schleife fragt er bei mir so lange die liniensensoren ab, bis er irgendwann auf eine schwarze fläche trifft. mit der motorsteuerung hat das ichts zu tun

was meinst du mit

Was davor oder dahinter steht??

mfg EDH