PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pollSwitch



The-BooN-
24.11.2006, 10:49
hab mal ne frage.. und zwar hab ich ein programm wo der asuro rückwärts fährt sobald seine taster gedrückt sind... bei den rechten drei tastern fährt er rückwärts links und bei den linken soll er rückwärts rechts fahren... rechts ist ok aber links gehen nur die äußersten und der rechte taster von der linken seite (manoman^^) macht das, was die rechten taster machen! hier mal der code:


#include "asuro.h"

/* Um eventuelle Unterschiede zwischen linken und rechtem Motor auszugleichen
* definieren wir 2 Werte für fullspeed links und rechts
*/
#define FULL_L 250 /* Fullspeed linker Motor */
#define FULL_R 250 /* Fullspeed rechter Motor */

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
}

/* Motor rückwärts links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(175,100);
}

/* Motor rückwärts rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(100, 175);
}

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

int main(void)
{
unsigned char t1, t2;

Init();
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if(t1 == 0 && t2 == 0) /* keine Taste */
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if(t1 & 0x07) /* Tasten links gedrückt? <<<HIER LIEGT DAS _ PROBLEM!!!*/
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(750); /* zeit zum rückwärtsfahren egal ob links oder rechts Msleep(1000) = 1sekunde*/
}
}
return 0;
}


BITTE HELFT MIR! MfG, The-BooN-

damaltor
24.11.2006, 11:10
versuchs mal mit der "normalen" schreibweise und mach dir das leben nicht unnötig schwer mit hex-zahlen... da könnte evtl der fehler schon liegen.

The-BooN-
24.11.2006, 11:55
was muss ich denn stattdessen eintragen???

m.a.r.v.i.n
24.11.2006, 12:03
Hi,

Ich würde erst mal nachprüfen, was für Tastenwerte beim Drücken von Tasten erkannt werden.
Siehe http://www.asurowiki.de/pmwiki/pmwiki.php/Main/TastSensorTestC

Evtl. muß man nämlich die PollSwitch Funktion anpassen.
Siehe dazu http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

Gruß m.a.r.v.i.n

der_andi
24.11.2006, 14:56
Wenn ich mich jetzt mit der bitverknüpferei nicht täusche ist die If-Bedingung nur erfüllt wenn alle drei Taster gedrückt wurden, frag doch einfach alle Schalter seperat ab.

Osser
24.11.2006, 15:03
Der Check stimmt schon. Wenn eines der drei ersten Bits gesetzt ist, ist die Bedingung erfüllt.


O.

der_andi
24.11.2006, 15:07
Hm, ok, dann werd ich jetzt nochmal Bitverknüpfungen nachgucken gehen.

odysee_2002
25.11.2006, 13:03
Hallo,

zum Testen der Schalter und aller anderen Sensoren, die was einlesen, habe ich ein kleines Programm geschrieben, welches die Werte via Hyperterminal ausgibt. Die erleichtert die Tests erheblich. Bei Interesse kann ich den Code posten.

Gruß

odysee_2002
27.11.2006, 22:16
Hallo,

aus dem Code oben ist zu erkennen, dass das mit PollSwitch so nicht klappen kann. Man liest mit Pollswitch immer alle Taster gleichzeitig zurück.
Um zu prüfen, ob ein bestimmter Taster gedrückt wurde muß man das Ergebnis bitweise maskieren.

z.B. taster = PollSwitch();

if (taster & 0x01) K1 gedrückt
if (taster & 0x02) K2 gedrückt und so weiter

Vielleicht hilft dies.

Gruß

damaltor
27.11.2006, 22:21
... genau das wird ja gerade erklärt ...

The-BooN-
01.12.2006, 10:08
hier ma mein code..... aber asuro fährt zwar nur er macht fünf taster das gleiche und einer nur macht das was er wirklich machen soll!



#include "asuro.h"

/* Um eventuelle Unterschiede zwischen linken und rechtem Motor auszugleichen
* definieren wir 2 Werte für fullspeed links und rechts
*/
#define FULL_L 250 /* Fullspeed linker Motor */
#define FULL_R 250 /* Fullspeed rechter Motor */

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
}

/* Motor rückwärts links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(175,100);
}

/* Motor rückwärts rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(100, 175);
}

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

int main(void)
{
unsigned char t1, t2, t3, t4, t5, t6;

Init();
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
t3 = PollSwitch();
t4 = PollSwitch();
t5 = PollSwitch();
t6 = PollSwitch();

if(t1 == 0 && t2 == 0 && t3 == 0 && t4 == 0 && t5 == 0 && t6 == 0) /* keine Taste gedrückt*/
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if(t1 & 0x01) /* Taste 1 links gedrückt?*/
{+
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if(t2 & 0x02) /* Taste 2 links gedrückt?)*/
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if(t3 & 0x04) /* Taste 3 gedrückt?)*/
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t4 & 0x08) /* Taste 4 rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
if (t5 & 0x16) /* Taste 5 rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
if (t6 & 0x32) /* Taste 6 rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(750); /* zeit zum rückwärtsfahren egal ob links oder rechts Msleep(1000) = 1sekunde*/
}
}
return 0;
}



PLEASE HELP!

damaltor
01.12.2006, 10:41
/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
}

50,50 ist zu wenig. da wird der asuro sich nciht bewegen.

ausserdem hast du für jeden taster einzeln pollswitch aufgerufen. das ist quatsch.
die pollswitch funktion gibt EINEN wert zurück, in dem alle taster gespeichert sind.

aslso steht in allen werten t1 bis t6 in deinem programm der gleiche wert, deshalb wird er zwangsweise nur mist machen...

wie pollswitch richtig verwendet wird, steht sehr gut erklärt in der anleitung. ausserdem schau mal hier:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25280#232210