naja solange pollswitch 0 ist wird der counter erhöht... und sowie 512 erreicht ist dreht er um.
probiers mal andersrum...
Bei folgendem Code sollte der ASURO eigentlich vorwärts fahren bis er gegen ein Hindernis fährt allerdings dreht er andauernd um als ob ein Taster gedrückt worden wäre. Was kann ich dagen tun ??
mfg Daniel
Code:#include "asuro.h" int main(void) { Init (); int i; int counter; while(1) { MotorSpeed (255,255); MotorDir (FWD,FWD); if (PollSwitch() != 1 && PollSwitch() !=2 && PollSwitch() != 4 && PollSwitch() != 8 && PollSwitch() != 16 && PollSwitch() != 32) { counter++; } else { counter=0; } if (counter > 512) { counter = 0; StatusLED (RED); MotorDir (RWD,RWD); for (i = 0; i < 282; i++) { Sleep (255); } MotorDir (FWD,RWD); for (i =0;i< 282;i++) { Sleep (255); } } else { StatusLED (YELLOW); MotorDir (FWD,FWD); } } return 0; }
naja solange pollswitch 0 ist wird der counter erhöht... und sowie 512 erreicht ist dreht er um.
probiers mal andersrum...
Hi gandalfsz,
das Problem ist der Zähler, der nach 512 mal hochzählen die Routine zum Umdrehen einleitet. Außerdem würde ich noch ein paar Sachen anders machen. Schau mal hier und probiere damit weiter. Ist aber ohne Gewähr, da ungetestet:
Viel Spaß,Code:#include "asuro.h" int main(void) { // zuerst die benötigten Variablen deklarieren... unsigned int i; // ist in diesem Fall ausreichend und spart ein Byte // IST ES NATÜRLICH NICHT, DA I WEITER ALS // BIS 255 LÄUFT - also int ist schon OK unsigned char t1, t2; //Tastenwerte es ist notwendig mindestens zweimal //abzufragen, um Störungen zu eleminieren Init (); // OK, jetzt fahren wir los bis ein Hindernis kommt... MotorSpeed (100,100); MotorDir (FWD,FWD); while(1) { // Abfragen, ob wir an ein Hindernis gestoßen sind: t1 = PollSwitch(); t2 = PollSwitch(); // zur Sicherheit if (t1 && t2 && (t1 == t2)) // Taster war beide Male gedrückt und der gleiche Wert kam zurück { // fahre ein Stück zurück StatusLED (RED); MotorDir (RWD,RWD); for (i = 0; i < 282; i++) { Sleep (255); } // wenden MotorDir (FWD,RWD); for (i =0;i< 282;i++) { Sleep (255); } } // und wieder vorwärts fahren StatusLED (YELLOW); MotorDir (FWD,FWD); }// end while(1) return 0; }
_HP_
Das ich jeden Taster einzeln genommen hab liegt daran das die taster sobald ich die Motoren dazugenommen hab andauernd ohne Hinderniss ausgelöst haben.
mfg Daniel
EDIT : THX für das Prog obwohl ess nicht geht(er kommt aus dem rückwärtsfahren nicht mehr raus. aber du hast ja geschrieben ohne Garantie)
versuch mal folgendes:
if((PollSwitch()&PollSwitch()&PollSwitch())=0) then....
dann reicht es wenn ein einziges mal der wert 0 ist, die anderen beiden werte können grütze sein.
if((PollSwitch()&PollSwitch()&PollSwitch())==0) then....if((PollSwitch()&PollSwitch()&PollSwitch())=0) then....
Einverstanden?
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
jau... habs voll vergessen =)
So gandalfsz,
ich nehme an, Du hast den Fehler schon selbst gefunden - aber mir hat das natürlich auch keine Ruhe gelassen. Also habe ich das Programm getestet - und ja, ASURO fuhr nur rückwärts. Das lag daran, dass eine meiner Sparmaßnahmen natürlich Unsinn war: i kann nicht nur 1 Byte lang sein, da Du ja bis 282 abfragst und i dann maximal 255 werden kann. Also wird die for-schleife nie verlassen. Ich habe den code jetzt editiert und die nicht benötigten Teile gleich weggelassen. Jetzt funktioniert das - jedenfalls auf meinem Asuro. Es fällt aber auf, dass mein ASURO beim Programmstart erstmal ein Ausweichmanöver fährt. Das liegt daran, dass am Anfang PollSwitch() nicht Null zurückgibt, wenn kein Taster gedrückt ist. Das gibt sich dann aber sofort. Sollte Dein Asuro weiter ausweichen, ohne dass ein Taster gedrückt wird, dann musst Du ermitteln, was die Funktion bei Dir im "Leerlauf" zurückgibt und das Programm entsprechend umstellen.
Viel Erfolg....
_HP_
kleiner trick um das zu vermeiden: lass den ersten befehl ein Msleep(1000)sein, dann wartet er zwar ne sekunde länger aber die werte stimmen (zumindest eher =)
Hi damaltor,
ja, das wäre eine Idee. Leider funktioniert das nur, wenn man die Lib2.7 verwendet. Das Programm benutzt jedoch noch die Originalfunktionen. Aber natürlich kann man auch damit eine entsprechende Wartezeit realisieren.
Außerdem ist natürlich nicht gesagt, dass PollSwitch() Null zurückliefert, wenn keine Taste gedrückt wurde. Bei meinem Asuro ist das zwar so, aber ich denke, das ist nicht immer so...
Gruß,
_HP_
Lesezeichen