PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm geht nicht!



Chrissi_P
19.02.2009, 17:25
Hallo,
ich habe ein Programm geschrieben, bei dem sich der Asuro entweder nach rechts, oder links drehen soll.
Aber er springt immer bei switch nach TurnL, weil immer die linke backLed leuchtet. die werte, die PollSwitch zurüchgibt stimmen, die hab ich gemessen! Ich finde keinen Fehler!
so sieht das programm aus, vielleicht habe ich irgendwas übersehen:

#include "asuro.h"

//Metoden
void TurnR (void);
void TurnL (void);

int main(void)
{
//Inizialisieren
Init();
//Variablen
unsigned char t1 = 0;
unsigned char t2 = 0;
unsigned char t3 = 0;
// losfahren
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
//endlosschleife
while(1)
{
//tastenabfrage
t1 = PollSwitch();
Sleep(10);
t2 = PollSwitch();
Sleep(10);
t3 = PollSwitch();
//tastenauswertung
switch (t1 && t2 && t3){
case 32: TurnR(); break;
case 16: TurnR(); break;
case 8: TurnR(); break;
case 4: TurnL(); break;
case 2: TurnL(); break;
case 1: TurnL(); break;
case 0: MotorDir(FWD, FWD); break;
};
};
//wegen int:
return(0);
};

void TurnR (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(FWD, RWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(OFF,ON);
};

void TurnL (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(RWD, FWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(ON,OFF);
};



schonmal danke für die hilfe
Chrissi

radbruch
19.02.2009, 18:02
Hallo

Der "Fehler" liegt wohl hier:

switch (t1 && t2 && t3){

&& ist ein logisches Und, das Ergebniss ist false wenn eines der ts false ist. Wird nun eine Taste gedrückt und alle ts sind ungleich null dann ist der Ausdruck true und GCC speichert das als 1 und case interpretiert es als Auswahl. Alles klar? So könnte es funktionieren:

if (t1 && (t1 == t2 == t3)) switch(t1){

was bedeutet: wenn t1 true ist (also ungleich 0) und t1 gleich t2 gleich t3 ist dann switche mit t1...

Ach, und mit großer MotorSpeed() die Drehrichtung ändern ist übel fürs Getriebe!

Gruß

mic

Chrissi_P
19.02.2009, 19:14
Danke, ich werde es morgen testen, im Moment keine zeit!

Chrissi_P
27.02.2009, 20:45
Sorry, dass das so lange gedauert hat, aber es funktioniert noch nicht so ganz!

hai1991
28.02.2009, 14:05
hallo

was heißt "funktioniert noch nicht so ganz"???
kannst du dein problem genauer beschreiben, damit wir wissen, wo man zu suchen anfangen soll

Chrissi_P
02.03.2009, 18:01
Hallo,
Entschuldigung für den sinnlosen Post!!
Ich habe ein bisschen an switch rumprobiert, aber bei
if (t1 == t2 == t3) switch (t1){
dreht er sich wie wild mal in die eine, mal in die andere Richtung, er meint dauernd dass er irgendwo anstösst!
bei
if ((t1 =! 0) && (t2 =! 0) && (t3 =! 0)) switch (t1){
meint er, dass er immer an der gleichen Stelle anstößt, und macht so einen Kreis nach rückwärts rechts!
Ich weiß nicht, was ich diesmal falschgemacht hab, oder ob ich nur einen dummen Syntaxfehler gemacht hab!

so sieht das Programm im Moment aus:

#include "asuro.h"

//Metoden
void TurnR (void);
void TurnL (void);

int main(void)
{
//Inizialisieren
Init();
//Variablen
unsigned char t1 = 0;
unsigned char t2 = 0;
unsigned char t3 = 0;
// losfahren
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
//endlosschleife
while(1)
{
//tastenabfrage
t1 = PollSwitch();
Sleep(10);
t2 = PollSwitch();
Sleep(10);
t3 = PollSwitch();
//tastenauswertung
if ((t1 =! 0) && (t2 =! 0) && (t3 =! 0)) switch (t1){
case 32: TurnR(); break;
case 16: TurnR(); break;
case 8: TurnR(); break;
case 4: TurnL(); break;
case 2: TurnL(); break;
case 1: TurnL(); break;
case 0: MotorDir(FWD, FWD); break;
};
};
//wegen int:
return(0);
};

void TurnR (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(FWD, RWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(OFF,ON);
};

void TurnL (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(RWD, FWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(ON,OFF);
};


mfg Chrissi

Wsk8
02.03.2009, 19:42
Hallo,
also ich schreib den ungleich-operator normal so: != anstatt =!. Weiß nicht ob das beim asuro einfluss hat.

Warum machst du keine einfache if-else-konstruktion.

if (irgendwas) {
mach was...
}
else if (irgendwas) {
mach was...
}


mfg

Chrissi_P
03.03.2009, 15:00
Hallo Wsk8,
der ungleich-operator war das Problem!
Es bedurfte nur noch einer kleinen änderung an den Turn() Methoden, da in switch bei einer abfrage auf != 0 ein case 0: natürlich unsinnig ist!
So funktioniert es:

#include "asuro.h"

//Metoden
void TurnR (void);
void TurnL (void);

int main(void)
{
//Inizialisieren
Init();
//Variablen
unsigned char t1 = 0;
unsigned char t2 = 0;
unsigned char t3 = 0;
// losfahren
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
//endlosschleife
while(1)
{
//tastenabfrage
t1 = PollSwitch();
Sleep(10);
t2 = PollSwitch();
Sleep(10);
t3 = PollSwitch();
//tastenauswertung
if ((t1 != 0) && (t1 = t2 = t3)) switch (t1){
case 32: TurnR(); break;
case 16: TurnR(); break;
case 8: TurnR(); break;
case 4: TurnL(); break;
case 2: TurnL(); break;
case 1: TurnL(); break;
};
};
//wegen int:
return(0);
};

void TurnR (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(FWD, RWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(OFF,ON);
MotorDir(FWD,FWD);
};

void TurnL (void)
{
//variablen
int i=0;
//stueck zurueck
MotorDir(RWD,RWD);
for (i=0;i<50;i++)
{Sleep(255);}
//drehen
MotorDir(RWD, FWD);
for (i=0;i<50;i++)
{Sleep(255);}
BackLED(ON,OFF);
MotorDir(FWD,FWD);
};


mfg Chrissi