PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inteligenter Asuro oder Programmbug?



Joggel84
01.06.2010, 21:56
Hi erstma wieder ^^
ich habe mir gestern mal die Asuro Lib runtergeladen und installiert funktioniert soweit auch alles ganz gut.
Nun habe ich mein Kollisionsprogramm um geschrieben mit GoTurn, was soweit auch super funktioniert (nochmal ein Lob an die Mitwirkenden an der Lib =D> ) und mit Msleep was auch klappt :).
Nun zu meiner Frage könnte mein Programm so Anfängermässig sein das wenn Taster eins gedrückt wird auch ab und an mal Funktionen der anderen Taster mit hinten dran gehängt werden? Seltsamer Weise passen die Abläufe auch meistens zur Situation z.B. wenn er in einer Ecke an Eckt und zufällig 2-3 Funktionen macht ob wohl Physikalisch nur ein Taster betätigt wurde(Der Asuro ist noch in Grundausstattung).
Ich hänge mal mein Programmcode mit dran vielleicht hilft es bei der Antwort , aber für die Profis sieht es Bestimmt extrem Anfänger mässig aus und unübersichtlich, aber bin ja auch noch ein Anfänger auf dem Gebiet ^^


#include "asuro.h"
#include "time.c"
#include "encoder.c"

void main()
{
int zaehler;

Init();
EncoderInit ();

while(1)
{
if (PollSwitch() == 1)
{
if(PollSwitch() == 1)
{
if(PollSwitch() == 1)
{

StatusLED (YELLOW);

MotorDir(RWD,RWD);
MotorSpeed(255,255);
for( zaehler=0; zaehler < 50; zaehler++ )
Msleep(3);
MotorDir(BREAK,BREAK);
for( zaehler=0; zaehler < 100; zaehler++ )
Msleep(5);

GoTurn(0,-45,200);

for( zaehler=0; zaehler < 200; zaehler++ )
{

Msleep(3);
}
}
}
}


if (PollSwitch() ==2)
{
if(PollSwitch() == 2)
{
if(PollSwitch() == 2)
{

StatusLED (YELLOW);

MotorDir(RWD,RWD);
MotorSpeed(255,255);
for( zaehler=0; zaehler < 50; zaehler++ )
Msleep(3);
MotorDir(BREAK,BREAK);
for( zaehler=0; zaehler < 100; zaehler++ )
Msleep(5);

GoTurn(0,-90,200);

for( zaehler=0; zaehler < 200; zaehler++ )
{

Msleep(3);
}
}
}
}

else


if (PollSwitch() ==32)
{
if(PollSwitch() == 32)
{
if(PollSwitch() == 32)
{

StatusLED (YELLOW);

MotorDir(RWD,RWD);
MotorSpeed(255,255);
for( zaehler=0; zaehler < 50; zaehler++ )
Msleep(3);
MotorDir(BREAK,BREAK);
for( zaehler=0; zaehler < 100; zaehler++ )
Msleep(5);

GoTurn(0,45,200);

for( zaehler=0; zaehler < 200; zaehler++ )
{

Msleep(3);
}
}
}
}



if (PollSwitch() ==16)
{
if(PollSwitch() == 16)
{
if(PollSwitch() == 16)
{

StatusLED (YELLOW);

MotorDir(RWD,RWD);
MotorSpeed(255,255);
for( zaehler=0; zaehler < 50; zaehler++ )
Msleep(3);
MotorDir(BREAK,BREAK);
for( zaehler=0; zaehler < 100; zaehler++ )
Msleep(5);

GoTurn ( 0, 90, 200);

for( zaehler=0; zaehler < 200; zaehler++ )
{

Msleep(3);
}
}
}
}

else
{
StatusLED (GREEN);
BackLED (OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(180,185);
}

}
}




Gruss
Jörg

Osser
02.06.2010, 18:29
Hi Joggle,


dann behaupte ich mal, dass Du ein eher 'guter Anfänger' bist wenn Du das als schlecht bezeichnest.

Der Grund für das Fehlverhalten ist, dass die Funktion PollSwitch() nicht so arbeitet wie Du das erwartest.
1) Die Widerstandskette am Asuro ist halt nicht unbedingt 100-Pro genau wegen Fertigungsabweichungen bei den Widerständen.
2) Wird die Messung via PollSwitch() z.B. exact nach drücken des Schalters gestartet, muss erst die minimale Kapazität des Ports und der Leitung geladen werden und ausserdem Prellt der Schalter dabei auch noch.
Das ganze ergibt dann einen zu Kleinen Wert bei dieser Messung.
3) War davor ein anderer Schalter gedrückt gehts evtl. genau andersherum und Du erhälst einen zu hohen Wert.


Ich hab in deinem Programm gesehen dass Du an verschiedenen Stellen wiederholt PollSwitch() verwendest was das beschriebene Verhalten erklären kann, da ja immer eine neue Messung gestartet wird.

Lösungsansatz:
1) Zusammenfassen der Schalterauswertung vor alle IF Anweisungen
2) Mittelwert bilden über z.B. 3-5 Messungen von PollSwitch()
3) Auswerten dieser einen aufbereiteten Messung in den IF-Zweigen


Dann wird das Proggi sicherlich eher ausführen was Du eigentlich wolltest.



Gruss,

O.

Besserwessi
02.06.2010, 19:01
Die Mittelwertbildung bei Pollswitch würde ich nicht empfehlen. Wenn da ein Höherwertiger Taster mal gerade an der grenze ist und Prellt, müßte man schon sehr viele Werte Mitteln dass auch die niederwertigen taster stimmen.
Das ist die Lösung mit den vielen IF bedungungen schon intelligenter. Die konsequente Lösung ist es solange Pollswitch aufzurufen bis man 3-5 mal hintereinander den Selben Wert bekommt. Dann kann man dem Wert trauen.

Osser
02.06.2010, 19:22
Hi,

ja, dem würde ich auch zustimmen.
Aber das Zusammenfassen an den Anfang würde ich dann trotzdem vorschlagen.

Gruss,

O.


NB. Zum Auswerten wäre ein Intervall von Werten auch besser um einzelne Schalter einzugrenzen.

Joggel84
02.06.2010, 20:49
Das mehrfache benutzen der PolSwitch funktion hatte eigentlich nur den Hintergrund das bei einmaligem Aufrufen der Asuro bei mir in der einen Funktion selsamer weise hengen geblieben ist. Was ich mir allerdings weder elektrisch noch Programm technisch erklären konnte beim 2mal aufrufen gings besser aber mit dem dritten mal wars bis jetzt am Besten:)
Wie meint ihr das den mit dem Zusammenfassen?

Und danke wegen Dem Guten Anfänger ^^ ich programmier auf der Arbeit immer mal wieder unsre Messsysteme usw und hab von der Lehre her schon SPS Grundlagen gehabt und muss sagen ist irgendwie doch alles gleich im Groben und ganzen

Gruss
Jörg


edit:
Habe gerade noch etwas komisches bemerkt bei dem Programm.O.o
wenn der asuro an irgendwas hengen bleibt was unter den Tastern ist bzw irgendwas was die Taster definitiv nich Drückt weicht er ebenfalls aus als wenn einer gedrückt wäre O.o hab ich da irgendwo was mit ein Programmiert unbewusst? oder liegt das zufällig mit in der encoder .c aus der Lib?