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?
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?
Danke schonmal im voraus.Code:#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; }
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?
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=""
mach doch einfach teste1= 0
Hallo
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.was ist das für ein ansatz, dass taste2 immer wieder mit taste1 überschrieben 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.:
Wenn der zweite Fall eintritt, bleibt er einfach stehen.Code:if (taste1 && (taste1==taste2)) { l=r=0; if (taste1==1) {l=90;r=120;}
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo InFaIn,
Du kannst die Routine für eine sichere Tastenabfrage von hier
http://www.roboterclub-freiburg.de/a...ll/zufall.html
nehmen.
Gruß,
robo
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:
Noch ein schöner Jahr 2008!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; }
wenn taste1 = taste4 ist, und taste1 = taste3 ist, dann brauchst du nicht nochmal z prüfen ob taste3 = taste4 ist...
Lesezeichen