PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung und Kollisionstest klappen nicht ... HILFE!



Tigger88
25.06.2008, 23:40
Hallo!
Für ein Schulprojekt sollte mein Asuro eine Linie verfolgen und mithilfe der Taster Hindernisen ausweichen, je nachdem welche Taster betätigt werden.

Leider will das Programm nicht so wie ich.

Könnte jemand vllt. mit dem geschulten Auge einen Blick drauf werfen und den Fehler finden?
Der Asuro verfolgt nur die Linie, auf Taster gibt es keine Reaktion.

Ich sitze schon seit 2 Tagen an dem und bin ratlos.
Danke euch sehr im Voraus!!


#include "asuro.h"
#include "myasuro.h"


#define FULL_L 200
#define FULL_R 200


/************************************************** *************************
*
* unsigned int data[2]; = Speicher fur Liniensensor reservieren
*
* data[0] = linker Sensor, data[1] = rechter Sensor
************************************************** **************************/



//DEFINITIONEN FUER TEILPROGRAMM DER TASTER


/* Motor vorwдrts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rьckwдrts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rьckwдrts Links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}

/* Motor rьckwдrts Rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}

/* Motor stop */
void MotorStop(void)
{
MotorSpeed(0,0);
}


//ENDE DER DEFINITIONEN





void FollowLine (void) //FollowLine wird erklдrt bzw. definiert

{
unsigned int data[2]; //Speicher fuer Liniensensor reservieren
Init();
FrontLED(ON);
MotorDir(FWD,FWD);

while(1)

{
{

if

(PollSwitch()<=0)
LineData(data); //Liniensensor auslesen

if(data[0]>data[1]) //Wenn links heller als rechts

{
MotorSpeed(150,30); //dann links schneller als rechts
}

else //ansonsten

{
MotorSpeed(30,150); //rechts schneller als links
}
}
}
}






int main(void)


{
unsigned char t1, t2;
Init();
EncoderInit ();


while (1)
{

if
(PollSwitch()>=0);

{
t1 = PollSwitch(); //Taster zweimal abfragen
t2 = PollSwitch();
}

{

if (t1 == 0 && t2 == 0) /* keine Taste gedrueckt*/

{
FollowLine(); //Linie folgen (Programm von oben ausfuehren)
FrontLED(ON);
BackLED(OFF,OFF);
}


else if ( (t1 != 0) && (t2 != 0) && (t1 == t2)) //sonst wenn Tasten ungleich null
{
MotorStop(); //Motor anhalten. WELCHE TASTEN gedrueckt? 3 Moeglichkeiten:






if ( t1 == 0x12) //0x12, also tasten vorne gedrьckt?

{
Go(-10,100); // dann: 10cm nach hinten; geschw 100
BackLED(ON,OFF); // mit eingeschalteten hinteren LEDs
}




if ((t1 & 0x07) > 0 ) /* Tasten links gedrьckt? */

{
Turn (-90, 150); // dann: rechts um 90 grad geschw 150
FrontLED(OFF);
BackLED(ON,OFF);
}





if (t1 & 0x30) /* Tasten rechts gedrьckt? */
{
Turn (90, 150); // links um 90 grad geschw 150
FrontLED(OFF);
BackLED(OFF,ON);
}



Msleep(1000); /* 1 Sekunde warten */
}
}
}
return 0;
}

radbruch
26.06.2008, 00:49
Hallo

In dieser Version deines Programms wird auf Tasten nicht mehr reagiert wenn die Funktion FollowLine() ausgeführt wird. Es gibt keine Entkommen aus while(1) {...}!

Warum betreibst du in main() den großen Aufwand um das Ergebniss von PollSwitch() zu überprüfen und in FollowLine() prüfst du nur einmalig auf ein (PollSwitch()==0)? (kleiner als 0 kann das Ergebniss von unsigned char PollSwitch() nicht werden)

btw: In FollowLine() sollte kein erneutes Init() aufgerufen werden.
if (PollSwitch()>=0); in main() ist natürlich auch unnötig, den Rest des Programms habe ich mir noch nicht genauer angeschaut.

Gruß

mic

Ceos
26.06.2008, 13:32
kleine warnung: übermäßiges PollSwitch() oder LineData() aufrufen stört den AutoEncoder EMPFINDLICH!!! also mit timer interrupt das werte abfragen machen (timer1 ist UNBENUTZT ... wenns mit der letzten asurolib noch net geändert wurde :p)