PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Tastern: PollSwitsch() gleich nach Start >0?



MicRos
11.12.2006, 19:08
#include "asuro.h"

int main(void)
{ Init();
unsigned int i,t;
t=0;
MotorSpeed(140,140);
MotorDir(FWD,FWD);
while(1) {
t=PollSwitch();
if (t>0) {
MotorDir(RWD,BREAK);
for(i=1;i<100;i++){
Sleep(255);
}
MotorSpeed(140,140);

}
}
FrontLED(ON);
return 0;
}


Ich habe meinen Asuro diesen Code gegeben, doch leider fähr er nur kurz gerade aus und fängt dann mit dem if(t>0) an.
Woran könnte das liegen?
MfG
MicRos

Downad
11.12.2006, 19:53
Ich habe meinen Asuro diesen Code gegeben, doch leider fähr er nur kurz gerade aus und fängt dann mit dem if(t>0) an.
Woran könnte das liegen?

meinst du damit, dass er
A.)
MotorDir(RWD,BREAK);
for(i=1;i<100;i++){
Sleep(255);
macht?

oder
B.) macht er das nun nicht?

ZU A.) hast du dir mal die werte von PollSwitch(); ausgeben lassen? da gibt es einige routine hier im forum, evtl. ist da die tolleranz so, dass er "denkt" ein taster ist gedrückt.

ZU B.) hmm mal sehen ob ich das mit dem code richtig verstehe. er soll fahren bis ein hindernis kommt,
t=PollSwitch();
if (t>0)
dann drehen
MotorDir(RWD,BREAK);
for(i=1;i<100;i++){
Sleep(255);

und danach weiter
MotorSpeed(140,140);
sollte kein hindernis kommen dann brennt die LED
FrontLED(ON);


fehlt da nach der drehung nicht ein MotorDir(FWD,FWD);???

gruß
downad

MicRos
11.12.2006, 19:58
A war richtig. ich such dan was zum ausgeben der daten. zu B:
ja, stimmt, war vorher richtig, hab es aber dann reduziert wegen dem fehler, hat da aber auch keine wirkung gezeigt.
MfG
MicRos

[edit]
ich hab das ganze mal mit SerWrite probiert, da klappte alles. und mit dem fahren nach den drehen auch, da ist er aber einiges gefahren und dann mitten im Zimmer auf der stelle gedreht.

damaltor
11.12.2006, 20:20
kurz nach dem start ist pollswitch meist >0. daran könnte es liegen. auch im laufenden programm werden häufig falsche werte ausgegeben.

verhindern kannst du das, indem du nach dem start eine kurze verzögerung machst
Sleep(255); (das sind ca 3 millisekunden, du wirst es nicht merken =) und dann IMMER wenn du pollswitch abfragst, 3-4 mal fragst um einen guten wert zu bekommen (also nicht nur zu beginn, sondern immer wenn du die werte abfragst). ersetze also

t=PollSwitch();durch
for(i=0;i<10;i++)
{
PollSwitch();
}
t=PollSwitch();
der wert wird also 10x abgefragt, bevor er in der variable gespeichert wird. dadurch werden dann meist korrekte werte zurückgegeben.

EDH
11.12.2006, 20:21
das scheitert glaub ich an der PllSwtich() fuintkion.
(1) mehrmals hintereinenader aufrufen, wenn das nicht nützt dann,
(2) stattdessen die variable switched hernehmen
erst mit StartSwitch() interrupt aktivieren !

MicRos
11.12.2006, 20:25
mit der while fnktion müsste ja eigentlich die Funktion imer wiederholt werden, da es mit der (1) imer den wert erfüllt zurückgibt. bei 2. blick ich grad net durch.

EDH
11.12.2006, 20:35
pro while schleife ein mal. nachdem da ne sekunde verzögerung drinne ist, wird pollswitch alle sekunde einmal ausgeführt.
für computer berhältnisse seeeeeeeeeeehr wenig.

du musst pollswitch mehrmals dirket hintereinander aufrufen, weil sich die kondensatoren da erst entladen müssen.

alle sekunde einmal nützt nix .

Downad
11.12.2006, 20:37
mit der neune lib (ich glaube 2.6 )
gibt es die möglichkeit pber einen interrupt sowas zu lösen.

hier ein bsp mit switched und einer ausgabe


int main(void)
{
Init();
Encoder_Init();
StartSwitch(); //Startet das switched!!!
int sw_pressed;

SerWrite("\n\r",2);
// 123456789012345678901234567890123456789012
SerWrite("Hallo Ralf, ich beginne mit dem Programm: ",42);
SerWrite("\n\r",2);


while (1) {

while (!switched) { /solange kein Hindernis
SerWrite("-nix-",5);
} //end while (!switched)

sw_pressed=PollSwitch(); //lade sw_pressed mir PollSwitch wert
//ausgabe an terminal
SerWrite("\n\rSchalter: ",12);
PrintInt(sw_pressed);
serWrite("\n\r",2);

switched=0;
} //end while (1)

// Nie vergessen, reine Vorsichtsmassnahme..
while(1){}
return 0;

} // end int main()


gruß
downad

MicRos
11.12.2006, 20:38
ok, ich füge dann eine for zählerschleife ein, mal testen ob das dann geht.
was muss ich eigentlich öfters aufrufen? das t=PollSwitsch?

EDH
11.12.2006, 20:41
und hier gleich ne neuere version von dem code oben, die keine syntaxfehler enthält


#include "asuro.h"
int main(void)
{
Init();
Encoder_Init();
StartSwitch(); //Startet das switched!!!
int sw_pressed;

SerWrite("\n\r",2);
// 123456789012345678901234567890123456789012
SerWrite("Hallo Ralf, ich beginne mit dem Programm: ",42);
SerWrite("\n\r",2);


while (1) {

while (!switched) { //solange kein Hindernis
SerWrite("-nix-",5);
} //end while (!switched)

sw_pressed=PollSwitch(); //lade sw_pressed mir PollSwitch wert
//ausgabe an terminal
SerWrite("\n\rSchalter: ",12);
PrintInt(sw_pressed);
SerWrite("\n\r",2);

switched=0;
} //end while (1)

// Nie vergessen, reine Vorsichtsmassnahme..
while(1){}
return 0;

} // end int main()

EDH
11.12.2006, 20:43
jawohl das t=PollSwitch() muss mehrmals aufgerufen werden.

MicRos
11.12.2006, 20:45
hab jetzt das t=PollSwitch() 20 mal hintereindander aufgerufen, mein ASURO mach aber nur nochmehr kurven.

EDH
11.12.2006, 20:48
haste mal die werte ausgeben lassen?

nur für den fall, das bei dir irgendein wiederstand oder so flaschist, und dann selbst wenn kein taster gedrückt ist ist beim ad wandler was gröseres als drann steht.

MicRos
11.12.2006, 20:52
wie gesagt mit dem ser Write hat er mir immer nur was ausgespukt wenn ich nen taster betätigt hab. kann aber ncohmal testen.

damaltor
11.12.2006, 21:35
also 20 mal ist fast schon zu viel, 5-10 mal hat sich bei mir bewährt. wenn du willst, kannst du auch nur PollSwitch() anstelle von t=PollSwitch() mehrfach aufrufen, ist aber egal. hauptsache, bei der letzten abfrage wird t=PollSwitch() benutzt.

in der Anleitung stehen die Werte, die Pollswitch je nach gedrückten tasten zurückgeben sollte. hast du mal robiert, diese ausgeben zu lassen? hast du mit anderen programmen auch probleme mit den tastern?

die variable switched ist zuverlässiger, arbeitet aber über einen interrupt (zum anfang sollte es auch mit PollSwitch ganz gut klappen). meld dich wenn du neuigkeiten hast...