- SF800 Solar Speicher Tutorial         
Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 67

Thema: Probleme mit if-Bedingungen????????????????

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das ist aber beruhigend, dass zumindest enige Menschen auf diesem Planeten Englisch können!!!!!!!!!!!!!!

    Danke schön!

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Zitat Zitat von damaltor
    du hast die endlosschleife vergessen...

    folgendes passiert:
    die werte werden direkt hintereinander eingelesen, sind also gleich. dann fährt der asuro einige millisekunden vorwärts, bevor er die (gleichen) werte vergleicht und beginnt, sich zu drehen. und das macht er bis zum abschalten...
    Das hab ich grade nochmal durchgelesen und immer noch nicht verstanden!
    Wenn die Werte ungleich sind, dann soll er sich doch solange drehen, wie die Werte immernoch ungleich sind.
    Nachdenk........
    AHHHHHHHHHHHH!!!!!!!!!
    Meinst du das vielleicht so:

    #include <asuro.h>

    int main(void)
    {
    Init();
    unsigned int data[2];
    unsigned int dataalt[2];
    FrontLED(ON);
    LineData(dataalt);
    while(1)
    {
    LineData(data);
    MotorDir(FWD,FWD);
    MotorSpeed(200,230);
    while(data[0]+data[1]!=dataalt[0]+dataalt[1])
    {
    MotorDir(RWD,FWD);
    MotorSpeed(200,230);
    break;
    }
    }
    while(1);
    return 0;
    }


    Gruß Roboaktiv

    @ jeffreydj: Dieser Codebutton geht bei mr irgendwie nicht!

  3. #13
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    wenn der code button nocht geht, dann schreibe vor deinen code folgendes:

    Code:
    und dahonter
    das ist schon besser, allerdings hättest du nur das erste if durch while ersetzen müssen. achte darauf, dass auch in jedem durchlauf der schleife neue werte gemessen werden!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Irgendwie find ich da kein (erstes) IF. Wo ist denn das so ungefähr? Im Momemt (so wie es da oben steht) wird doch immer ein neuer Wert gemessen oder?

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104

    Neues Problem

    Ah! Jetzt hab auch ich es verstanden!
    Allerdings hab ich jetzt schon wieder nen neues Problem:

    Code:
    #include <asuro.h>
    
    int main(void)
    {
    Init();
    while(1)
    	{
    		MotorDir(FWD,FWD);
    		MotorSpeed(200,220);
    		while(PollSwitch()!=0)
    			{
    			MotorDir(RWD,RWD);
    			MotorSpeed(200,220);
    			Sleep(250);
    			Sleep(250);
    			MotorDir(RWD,FWD);
    			MotorSpeed(200,220);
    			Sleep(250);
    			Sleep(250);
    			Sleep(250);
    			break;
    			}
    	}
    while(1);
    return 0;
    }
    Der Asuro soll nun so rumfahren, bis er gegen einen Gegenstand fährt. Dann soll er nen Stück nach hinten fahren um genug Platz für die anschließende Drehung zu haben. Aber irgendwie funltioniert das nicht.

    Was mach ich diesmal falsch?
    Ist das vielleicht der gleiche Fehler wie oben?

    Roboaktiv

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    PollSwitch() ist etwas zickig, bei Kollisionsabfragen verwende ich deshalb die direkte Abfrage des Tasteneingangs. Es werden dabei alle Tasten ausgewertet, aber nicht erkannt, welche gedrückt ist:

    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))

    Im Programm verwendet man das dann so:

    if taste StatusLED(RED); else StatusLED(OFF);

    oder

    MotorSpeed(200,200);
    while keine_taste;
    MotorSpeed(0,0);

    Selbstverständlich funktioniert das auch ohne #define:

    if (!(PINC & (1<<PC4))) StatusLED(RED); else StatusLED(OFF);

    ist aber nicht so schön zu lesen.

    Warum fährst du eigentlich mit einer While-Schleife zurück? Mit einer if-Abfrage würde es auch funktionieren und käme dem Sinn näher: Fahre zurück, wenn eine Taste gedrückt wird. Beidesmal wird die Rückfahrbefehlsfolge einmal ausgeführt (der break ist unnötig!). Der Unterschied wäre, wenn die Wand mitfahren würde (oder ein Taster klemmt) und am Ende des Ausweichens eine Taste immer noch gedrückt ist. Dann würde mit while (aber ohne break!) der asuro sofort ein weiteres mal zurückweichen, bei if (oder while mit break) würde kurz vorwärts gesetzt und dann erst zurückgewichen. Allerdings so schnell, das mans nicht bemerkt.

    Gruß

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

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Weiter oben hat damaltor am 22.06.2007 um 22:45 Was mit while anstatt If geschrieben und da dachte ich:"Dann machtes nochmal so!" Wahrscheinlich bezog sich das nur auf die Odometrie-Geschicht. Dieses #define dient nur zu erstellen einer Funktion oder?

    Müsste das dann im ganzen Programm ungefähr so aussehen?
    Code:
     
    #include <asuro.h>
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4)) 
    
    int main(void)
    {
    Init();
    while(1)
       {
          MotorDir(FWD,FWD);
          MotorSpeed(200,220);
          if(keine_Taste)
             {
             MotorDir(RWD,RWD);
             MotorSpeed(200,220);
             Sleep(250);
             Sleep(250);
             MotorDir(RWD,FWD);
             MotorSpeed(200,220);
             Sleep(250);
             Sleep(250);
             Sleep(250);
             }
       }
    while(1);
    return 0;
    }
    Oder doch irgendwie anders?
    Roboaktiv

  8. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Nahe dran, aber noch nicht perfekt.

    Mit #define definierte Wörter werden im weiteren Programm durch den Text ersetzt, den man definiert hat. Ein

    #define Lampe_rot StatusLED(RED)

    ersetzt alle Stellen im Programm die Lampe_rot heisen mit dem Text StatusLED(RED) (bisschen banal vielleicht) Das verwendet man um sich Tipparbeit zu ersparen und/oder um ein Programm verständlicher/unverständlicher zu gestalten.

    Zum deinem aktuellen Programm:

    keine_Taste muss natürlich keine_taste heisen, weil es so auch im #define steht. Alles in c ist case-sensitiv, das bedeutet, Groß- und kleinschreibung wird unterschieden. Ausserdem möchtest du doch prüfen, ob eine Taste gedrückt ist. Also sollte die Abfrage if taste... heisen. Die Klammern könntest du weglassen, denn die sind im #define schon dabei.

    Die Zeiten der Sleep()s sind zu kurz! Sleep(36) entspricht ca. 1 Millisekunde (soweit ich weis und nur, wenn du eine der neueren asuro.c verwendest.) Also würden 3 Sleep(250) ungefähr 750/36 ms verzögern. Das sind quasi 0,02 unmerkliche Sekunden.

    for (zeit=0; zeit<1000; zeit++) { Sleep(36); }

    würde dann eine Sekunde verzögern. Alternativ kennen die neueren Libaries auch die Msleep()-Funktion. Hier kann die Zeit direkt in Millisek. angegeben werden:

    Msleep(1000);

    wartet dann auch eine Sekunde lang.

    Ob if oder while, viele Wege führen zum Ziel.

    Gruß

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

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.06.2007
    Alter
    32
    Beiträge
    104
    Müsste dann die if-Schleife so aussehen?
    Code:
    if(keine_taste) //Wenn keine Taste gedrückt ist, dann...
    {
    MotorDir(RWD,RWD);
    MotorSpeed(200,220);
    for(zeit=0;zeit<1000;zeit++) //zeit wird oben natürlich definiert
    {
             Sleep(36);
    }
    MotorDir(RWD,FWD);
    MotorSpeed(200,220);
    for(zeit=0;zeit<1000;zeit++)
    {
             Sleep(36);
    }
    }
    zu #define: Wären denn die KLammern falsch?
    zu Msleep (bzw. Sleep): Den Asuro hab ich zu Weihnachten 2006 bekommen.

    Danke,
    Roboaktiv
    Gruß Roboaktiv


    It is öde to be blöde

  10. #20
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Es wird immer besser.

    zeit (mir fiel kein blöderer Name ein) sollte natürlich als int definiert sein. Die Schleifen müsten so funktionierten. c ist recht flexibel in der Gestaltung des Quelltextes.

    if taste wird ersetzt durch if (!(PINC & (1<<PC4)))
    if (taste) wird ersetzt durch if ((!(PINC & (1<<PC4))))

    Das ist eigentlich nicht falsch und wird vom Compiler erkannt und wegrationalisiert. Das erzeugte .hex sollte bei beiden Varianten gleich sein.

    Die Dateien auf der asuro-CD sind schon recht alt, neuere Libaries gibt es hier, Infos zu V2.7 findest du hier. Allerdings ist die brandneue Version 2.7 recht kompliziert, für Einsteiger würde ich ältere Versionen empfehlen. (Msleep() und PrintInt() gibt es seit ca. V2.1?) Für ein Update brauchst du lediglich die Dateien asuro.h und asuro.c jeweils durch die neueren Versionen ersetzen.

    Gruß

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

Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress