-         

Ergebnis 1 bis 4 von 4

Thema: Problemm mit der Verzögerung

  1. #1

    Problemm mit der Verzögerung

    Anzeige

    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Vielleicht funktioniert es so besser:
    Code:
    #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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    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

    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.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    26
    Beiträge
    239
    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:
    Code:
    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
    mfg hai1991

    P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •