PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problemm mit der Verzögerung



Xarni
06.10.2008, 18:28
Hallo,
kann mir jemand sagen was an diesem code nicht stimmt:

#include "asuro.h"
void wait (int mis)
{
int z;
for (z = 0; z < mis; z++)
Sleep (36);
}

int main(void) {
Init ();
while (1) {
Sleep(100);
if (PollSwitch()>1)
{
StatusLED (RED);
MotorSpeed(0,0);
wait (5000);
}
else {
StatusLED (GREEN);
MotorDir (FWD,FWD);
MotorSpeed (150,150);
}
}
}

Asuro soll eigentlich beim betätigen eines tasters anhalten etwas warten und dann weiterfahren. staddessen fährt er immer ein stück vorwärts, hällt an, wartet und fährt wieder ein bischen.
freue mich auf antworten O:)

radbruch
06.10.2008, 20:57
Hallo

Vielleicht funktioniert es so besser:

#include "asuro.h"
void wait (int mis)
{
int z;
for (z = 0; z < mis; z++)
Sleep (36);
}

int main(void)
{
char t;
Init ();
while (1) {
t=PollSwitch();
Sleep(100);
if ((t==PollSwitch()) && (t>1))
{
StatusLED (RED);
MotorSpeed(0,0);
wait (5000);
}
else {
StatusLED (GREEN);
MotorDir (FWD,FWD);
MotorSpeed (150,150);
}
}
}



Möglicherweise stören die Motoren die Auswertung der Tasten. Du könntest beidesmal MotorSpeed(0,0); angeben und es ohne Motoren testen.

Gruß

mic

Xarni
07.10.2008, 13:43
Hallo nochmal,

ja jetzt funktionierts danke sehr
da ich aber immer alles genau wissen will hab ich noch die frage wieso es mit diesem befehl besser funktioniert :roll:

hab auserdem herausgefunden das die verzögerung die auswertung der tasten stört also wenn man "wait (5000);" im if wegnimmt gehts, wäre dankbar wenn man mir das auch jemand erklären würde.

hai1991
07.10.2008, 16:28
hallo Xarni

das mit den tastern ist fogendermaßen:
besonders bei laufenden motoren kann es in den schaltkreisen zu kurzzeitigen spannungsspitzen und -schwankungen kommen. davon wird aber natürlich auch die taster auswertung betroffen, und man erhält einen "falschen" wert.

dadurch dass diese schwankungen aber nur für kurze zeit sind kann man diese ausortieren, wenn man mehrmals hintereinander (mind. 2 mal) die taster abfragt und die wert vergleicht. falls sie gleich sind kann man davon ausgehen, dass es ein "richtiger" wert ist.

hier noch mal kurz der algorythmus zur fehlervermeidung:


int t;
t=PollSwitch(); //1. einlesen der Taster

if( t==PollSwitch() ) //gleichzeitiges einlesen und vergleichen der Tasterwerte
{
//auszuführende Befehle, wenn PollSwitch 2 mal den selben wert geliefet hat
}
else
{
//hier können noch Anweisungen stehen, falls mind. 1 mal ein falscher wert geliefet wurde
//ist aber nicht unbedingt notwendig
}


natürlich kannst du PollSwitch noch öfter aufrufen, die werte in variablen speichern und dann alle auf gleichheit überprüfen, aber im normalfall kommt man mit 2 aufrufen aus.
gelegentlich kann es zwar noch zu einem ausreißer kommen, aber das ist meistens nicht so schlimm.


das mit dem wait in der if-schleife ist fogends:

nehmen wir an, du hast das besagte wait ausgelassen und es wird kein taster gedrückt.
wenn sich nun ein falscher wert einschleicht wird in diesem durchlauf in die if-schleife gesprungen, die motoren gestoppt und die statusled auf RED geschalten.
im nächsen durchlauf liefert pollswitch aber wieder den richtigen wert und motorspeed und die statusled werden dementsprchend gesetzt.

wie du siehst wird die statusled nur einen durchlauf lang auf red geschalten. das ist aber deutlich zu kurz, dass du es erkennen könntest. und daher schaut es so aus, als ob pollswitch immer den richtigen wert liefert.


so, jetzt steht wait wieder in der if-schleife, mal schauen was dann passiert:
wenn jetzt ein falscher wert kommt springt der µC in die if-Schleife, setzt motorspeed und statusLED etsprechend und wartet.
durch das warten haben die motoren genug zeit stehen zu bleiben, und du siehst jetzt auch die farbänderung der led.


ich hoffe, das beantwortet deine fragen

PS: wenn du ein programm postest wäre es nicht schlecht die code-buttons zu verwenden. es ist dann einfach leichter zu lesen