-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Was ist da bitte schön Falsch ???????

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    23
    Beiträge
    70

    Was ist da bitte schön Falsch ???????

    Anzeige

    Was ist hier bitte falsch.
    Der Asuro soll solange gerade aus fahren bis er irgendwo anstöst.

    Bei mir fährt der Asuro nur bei Tasterberührung und dann vorwärts.

    Code:
    #include "asuro.h" 
    
    void Msleep(int dauer) 
    { 
       int z; 
       for(z=0;z<dauer;z++) Sleep(72); 
    } 
      
    int main(void) 
    { 
       Init();
          
    	 
       while(1){
       if (PollSwitch()==1){
             StatusLED(RED);
             MotorSpeed(0,0);
    		 Msleep(350);
    		 
    		 }
    	else{
             MotorDir(FWD,FWD);
    	     MotorSpeed(200,200);
    	     StatusLED(GREEN);}
    	 	 
    		 }
       return 0; 
    }
    MFG FredWeise

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    26
    Beiträge
    239
    hallo, wenn du abfragts if(PollSwitch()==1), dann überprufst du, ob K6 (wenn ich mich nicht irre) gedrückt ist

    wenn du wissen willst, ob kein taster gedrückt ist musst du if(PollSwitch()==0) abfragen
    und dem entsprechend if(PollSwitch()!=0), wenn du wissen willst, ob irgend ein taster gedrückt ist

    weiters würde ich 2mal abfragen, da bei laufenden motoren die auswertung manchmal fehlerhaft is
    Code:
    t=PollSwitch();
    if(t==0 && PollSwitch()==0)
    {
         //deine Anweisungen
    }
    mfg hai1991

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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    23
    Beiträge
    70

    re was isn da falsch

    also so

    Code:
    #include "asuro.h" 
    
    void Msleep(int dauer) 
    { 
       int z; 
       for(z=0;z<dauer;z++) Sleep(72); 
    } 
      
    int main(void) 
    {
       Init();
          
    	t=PollSwitch(); 
       while(1){
             if(t==0 && PollSwitch()==0){
       
             StatusLED(RED);
             MotorSpeed(0,0);
    		 Msleep(350);
    		 
    		 }
    	else {
             MotorDir(FWD,FWD);
    	     MotorSpeed(200,200);
    	     StatusLED(GREEN);}
    	 	 
    		 }
       return 0;
    Wenn ichs so mache kommt folgende fehlermeldung
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken unbenannt_443.jpg  

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.10.2005
    Beiträge
    139
    lies dir mal die fehlermeldung durch. dann wirste deinen fehler finden

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    Versuchs mal mit deklarierter Variable t
    oder so:

    int main(void)
    {
    unsigned char t1;
    unsigned char t2;

    Init ();
    while(1)
    {
    t1=PollSwitch();
    t2=PollSwitch();
    if (t1==0 && t1==t2)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(200,200);
    StatusLED(GREEN);
    Msleep(350);
    }
    else
    {
    StatusLED(RED);
    MotorSpeed(0,0);
    }
    }
    while(1);
    return 0;
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    Mist, jetzt sind meine schönen Einrückungen alle rausgeflogen
    Gehört zwar sicher nicht hier her, aber kann mir bitte trotzdem jemand einen Tipp geben, wie ich meinen Code so schön formatiert in so ein aufklappbares Codefenster bekomme?

    EDIT: hat sich erledigt, habs inzwischen gefunden

    Code:
    int main(void) 
    { 
        unsigned char t1; 
        unsigned char t2; 
    
        Init (); 
        while(1) 
        { 
            t1=PollSwitch(); 
            t2=PollSwitch(); 
            if (t1==0 && t1==t2) 
            { 
                MotorDir(FWD,FWD); 
                MotorSpeed(200,200); 
                StatusLED(GREEN); 
                Msleep(350); 
            } 
            else 
            { 
                StatusLED(RED); 
                MotorSpeed(0,0); 
            } 
        } 
        return 0; 
    }
    Mein letztes while(1); war natürlich völlig überflüssig, weil das Programm ja nie aus der ersten while- Schleife raus kommen kann. Es steht bei mir eben aus Gewohnheit immer vor dem return 0 und ich hab einfach vergessen, es zu löschen.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    23
    Beiträge
    70

    RE wasn da falsch

    int main(void)
    {
    unsigned char t1;
    unsigned char t2;

    Init ();
    while(1)
    {
    t1=PollSwitch();
    t2=PollSwitch();
    if (t1==0 && t1==t2)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(200,200);
    StatusLED(GREEN);
    Msleep(350);
    }
    else
    {
    StatusLED(RED);
    MotorSpeed(0,0);
    }
    }
    return 0;
    Wenn ich das ausprobiere dann kommt folgende Fehlermeldung
    (siehe Bild)

    Wieso schreibt man eigendlich

    if (t1==0 && t1==t2)

    Und warum kürzt ir PollSwitch mit t ab was hat das für ein sinn
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken 1_615.jpg  

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    23
    Beiträge
    98
    du hast vergessen die asuro.h zu inkluden.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    26.11.2008
    Alter
    23
    Beiträge
    70

    RE Wan da falsch ??

    Danke für die schneele Antwort auf das inkluden von asuro.c hätte ich selber drauf kommen sollen

    Das Programm sieht richtig also so aus

    Code:
    #include "asuro.h"
    void Msleep(int dauer) 
    { 
       int z; 
       for(z=0;z<dauer;z++) Sleep(72); 
    } 
    int main(void) 
    { 
    unsigned char t1; 
    unsigned char t2; 
    
    Init (); 
    while(1) 
    { 
    t1=PollSwitch(); 
    t2=PollSwitch(); 
    if (t1==0 && t1==t2) 
    { 
    MotorDir(FWD,FWD); 
    MotorSpeed(200,200); 
    StatusLED(GREEN); 
    Msleep(350); 
    } 
    else 
    { 
    StatusLED(RED); 
    MotorSpeed(0,0); 
    } 
    } 
    return 0;
    }
    Es kommt auch keine Fehlermeldung mehr.
    Wenn ich das Prog ausführe fährt der Asuro nur geradeaus (Status LED GREEN) Die Taster interresieren ihn überhaupt nicht

    MFG FREDWEISE

    PS Ein paar Zeilen im Prog kann ich noch nicht deuten

    unsigned char t1;
    unsigned char t2;
    t1=PollSwitch();
    t2=PollSwitch();
    Würde mich über eine kurze Erklärung sehr freuen[/quote]

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.08.2005
    Beiträge
    178
    hallo,

    als erstes solltest du dir die funktion Pollswitch() noch einmal genauer ansehen (asuro manual abschnitt 9.2.12.). dann solltest du sehen dass im anfangspost der ausdruck
    PollSwitch()==1
    nicht dann wahr ist wenn irgendein taster gedrückt ist, sondern nur wenn K6 (und kein anderer gleichzeitig) gedrückt ist. der else block (vorwärtsfahrt) sollte also eigentlich entgegen deiner angabe auch ohne drücken eines tasters ausgeführt werden...!?
    weiters siehst du dass PollSwitch ein unsigned char als ergebnis liefert, das sollte dich bei den 'letzten unklarheiten im code' weiterbringen.

    Wieso schreibt man eigendlich
    if (t1==0 && t1==t2)
    das ist eine gute frage auf deren antwort ich auch gespannt bin. eigentlich sollte
    if (t1==0 && t2==0)
    performanter sein. du kannst auch
    if (PollSwitch() == 0 && PollSwitch() == 0)
    schreiben, dann sparst du dir die (expliziten) variablen.

    Und warum kürzt ir PollSwitch mit t ab was hat das für ein sinn
    t steht vermutlich kurz für temp, eine beliebte möglichkeit fehleranfälligen code zu provozieren. man sollte besser möglichst aussagekräftige variablennamen wählen um den code möglichst les- und wartbar zu halten. auch ist temp ansich wenig aussagekräftig. trotzdem ist die verwendung von solchen nicht-aussagekräftigen bezeichnern in codeschnipseln eines forumsbeitrags üblich und auch praktikabel, da es sich ja meist um eine überschaubare anzahl an codezeilen handelt.


    EDIT:
    ich sehe gerade dass der code immer noch nicht funktioniert. und ich hätte da eine vermutung warum das so ist:
    da PollSwitch ja beim ersten aufruf (t1) vermutlich einen falschen wert leifert wird PollSwitch ein weiteres mal aufgerufen (t2), was den korrekten wert liefern soll. also können t1 und t2 nur dann gleich sein, wenn beide ergebnisse richtig, oder beide falsch sind, und dem ist offenbar nicht so.
    also sollte man so vorgehen:

    Code:
    PollSwitch(); //das erste ergebnis interessiert nicht, da ohnehin falsch
    if (PollSwitch() == 0)
    {
        //...
    }
    Anmerkung: da ein richtiges ergebnis von PollSwitch vom ladezustand eines kondensators abhängt, kann es laut asuro manual auch mehrere PollSwitch aufrufe benötigen um ein korrektes ergebnis zu erhalten. ggf also so etwas:

    Code:
    for (int i = 0; i < 4; i++)
    {
        PollSwitch();
    }
    if (PollSwitch() == 0)
    {
        //...
    }
    oder auch so:
    Code:
    PollSwitch();
    PollSwitch();
    PollSwitch();
    PollSwitch();
    if (PollSwitch() == 0)
    {
        //...
    }
    lg
    "A robot with guns for arms shooting a plane made out of guns that fires guns" - Nelson Muntz

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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