PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterproblem



gandalfsz
05.04.2007, 21:30
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


#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;
}

damaltor
05.04.2007, 21:58
naja solange pollswitch 0 ist wird der counter erhöht... und sowie 512 erreicht ist dreht er um.

probiers mal andersrum...

_HP_
05.04.2007, 22:07
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:




#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;
}


Viel Spaß,

_HP_

gandalfsz
05.04.2007, 22:17
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)

damaltor
05.04.2007, 22:43
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.

radbruch
05.04.2007, 23:06
if((PollSwitch()&PollSwitch()&PollSwitch())=0) then....


if((PollSwitch()&PollSwitch()&PollSwitch())==0) then....

Einverstanden?

damaltor
05.04.2007, 23:09
jau... habs voll vergessen =)

_HP_
08.04.2007, 21:08
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_

damaltor
08.04.2007, 22:18
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 =)

_HP_
09.04.2007, 09:44
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_

gandalfsz
09.04.2007, 13:31
Ich habs zum laufen gebracht mit int statt unsigned char. Kann man wenn man die neue Lib verwendet noch die Funktionen der alten nutzen ? (Ich meine ob sie abwärtskompatibel ist). Danke für die Hilfe
ps: Im Moment kann ich mit den Tastern sowieso nichts machen da mein Asuro einen Selbstmordversuch gestartet hat und vom Tisch gefahren ist :cry: und dabei sind ein paar Taster draufgegangen ](*,)

_HP_
09.04.2007, 14:54
Ja, kann man. Die Bibliothek enthält neben neuen Funktionen auch die alten. Lediglich der Timer wurde von 72kHz auf 36 kHz geändert - es dauert jetzt also doppelt so lange, bis der Zähler hochgezählt wird.

Sorry - dass Dein Asuro vom Tisch gefallen ist. Ich hoffe, Du kannst Ihn wieder reparieren....

Gruß,

_HP_

damaltor
11.04.2007, 15:34
dass der timer verändert wurde, hat übrigens mehr oder weniger keine auswirkungen auf die programmierung. du musst nichts weiter beachten.

gandalfsz
11.04.2007, 17:28
Man muss aber den halben Wert nehmen oder ??
mfg Daniel

damaltor
11.04.2007, 19:27
nein. programmiere so wie immer.
die funktion, die sich ändert, ist Sleep(). hier musst du den halben wert nehmen.

alternativ dazu kannst du jedoch jetzt Msleep() benutzen. diese funktion erspart die rechnerei, du kannst einfach millisekunden angeben.
Msleep(1000); wartet also etwa eine sekunde.