PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bei der Kollision funktioniert irgendwas nicht.



InFaIN
30.12.2007, 17:05
Hi.

Ich habe mir jezt diesen code geschrieben. Leider funktioniert er nur zu hälfte. Findet eine Kollision statt fährt er wie programiert rückwärts. Doch nicht immer so wie er soll. abundzu fährt er einfach 3mal rückwärts, oder er fährt links rückwärts und dann noch zweimal rechts. Wo kann der Fehler liegen?



#include "asuro.h"
int main(void)
{
unsigned int z ,l ,r;
unsigned char taste1, taste2;
Init();
taste2=PollSwitch();
while(1)
{


taste1=PollSwitch();
if (taste1 && (taste1==taste2))
{
if (taste1==1) {l=90;r=120;}
if (taste1==2) {l=0;r=120;}
if (taste1==4) {l=120;r=90;}
if (taste1==8) {l=90;r=120;}
if (taste1==16) {l=120;r=0;}
if (taste1==32) {l=120;r=90;}
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(l,r);
for(z=0;z<250;z++)
{
Sleep(255);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
taste2=taste1;
}
return 0;
}


Danke schonmal im voraus.

damaltor
30.12.2007, 17:49
hm ich würde es spontan immer noch auf die ungenauigkeit von pollswitch schieben.

was ist das für ein ansatz, dass taste2 immer wieder mit taste1 überschrieben wird?

InFaIN
30.12.2007, 18:05
Erstmal danke für deine antwort.

1. Ich hab des ganze schon mit 3sicherheitsabfragen gemacht d.h 6mal abgerufen.

2. Ich hab es auch schon versucht mit taste1 = "" und taste2=""

damaltor
30.12.2007, 18:08
mach doch einfach teste1= 0

;)

radbruch
30.12.2007, 18:52
Hallo


was ist das für ein ansatz, dass taste2 immer wieder mit taste1 überschrieben wird?
Das ist mein Ansatz, taste2 speichert den letzten PollSwitch()-Wert, der in taste1 steht, am Ende der Schleife bevor am Anfang der Schleife ein neuer Wert in taste1 eingelesen wird.

Das wird jetzt aus zwei Gründen etwas kritisch. Erstens vergeht die z-Schleifenzeit zwischen den Tastenabfragen. Zweitens, und das ist wohl das Problem, wird der if-Zweig auch ausgeführt, wenn ein Tastenwert erkannt wird, der nicht 1,2,4,8,16 oder 32 ist. Also wenn z.B. mehr als eine Taste gedrückt wird, oder wenn die Taster nicht richtig kalibriert sind. Weil aber für l und r keine Defaultwerte zu Beginn des If-Zweigs definiert wurden, macht der asuro das letzte gültige nochmal. Ein schneller Test wäre z.B.:

if (taste1 && (taste1==taste2))
{
l=r=0;
if (taste1==1) {l=90;r=120;}

Wenn der zweite Fall eintritt, bleibt er einfach stehen.

Gruß

mic

robo.fr
31.12.2007, 15:21
Hallo InFaIn,

Du kannst die Routine für eine sichere Tastenabfrage von hier
http://www.roboterclub-freiburg.de/asuro/zufall/zufall.html
nehmen.

Gruß,
robo

InFaIN
01.01.2008, 10:22
Also erstmal ein gutes neues Jahr und ich hoff ihr seid nicht über euren Asuro gerutscht.

Vielen Dank für eure Hilfen. Ich habe es gerade eben hinbekommen. Für alle die das selbe Proplem haben, hier mein funktionierender code:



#include "asuro.h"
int main(void)
{
unsigned int z ,l ,r;
unsigned char taste1, taste2 ,taste3, taste4;
Init();


while(1)
{
taste4=PollSwitch();
taste2=PollSwitch();
taste1=PollSwitch();
taste3=PollSwitch();
if (taste1 && (taste1==taste2) && (taste3==taste4) && (taste1==taste3) && (taste1==taste4))
{
l=0;
r=0;
if (taste1==1) {l=120;r=0;}
if (taste1==2) {l=0;r=160;}
if (taste1==4) {l=0;r=120;}
if (taste1==8) {l=120;r=0;}
if (taste1==16) {l=160;r=0;}
if (taste1==32) {l=0;r=120;}
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(l,r);

for(z=0;z<250;z++)
{
Sleep(255);
}
}
else
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
taste2=0;
taste1=0;
}
return 0;
}


Noch ein schöner Jahr 2008!

damaltor
02.01.2008, 02:44
wenn taste1 = taste4 ist, und taste1 = taste3 ist, dann brauchst du nicht nochmal z prüfen ob taste3 = taste4 ist...