Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Tastern: PollSwitsch() gleich nach Start >0?
#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
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
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, 21: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.
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 !
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.
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 .
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
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?
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()
jawohl das t=PollSwitch() muss mehrmals aufgerufen werden.
hab jetzt das t=PollSwitch() 20 mal hintereindander aufgerufen, mein ASURO mach aber nur nochmehr kurven.
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.
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, 22: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...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.