- 3D-Druck Einstieg und Tipps         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 31

Thema: Rolf Simulation-Programm Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    Hi!

    Er fährt schonmal, reagiert auch auf buttons u.s.w... aber er hält sich nicht an seine zeit... er hört also nicht auf zu fahren... versteh nicht ganz warum... hab auch entsprechende änderungen am code vorgenommen, jedoch ohne erfolg.
    Teilweise fängt auch die Gelbe StatusLED zum blinken an. Kann jedoch nicht erkennen woran das liegt.

    Hier noch einmal der Code

    Code:
    #include "asuro.h"
    
    void erwarten(unsigned int male);		//Rufe Wartemodus ab
    void collusion(unsigned int lang);		//Rufe Collusion ab
    
    int main(void)
    {
      Init();
    //Ab hier beginnt Rolf zu "Leben" 
    //Morgenmassage senden
      SerPrint("\r\nMuah... muss ich aufstehen?\r\n"); 
    
    //Rolf wartet erstmal ab
      erwarten(1);
    
    //Rolf startet Kollusionsfahrt 
      collusion(10000);
    
      return 0;
    }
    
    //Funktionen
    //Rolf wartet auf etwas
    void erwarten(unsigned int male) {
      unsigned int i; 
      for (i = 0; i <= male; i++)
      {
        Msleep(500);
        StatusLED(GREEN);
        Msleep(10);
        BackLED (OFF, ON);
        Msleep(500);
        StatusLED(OFF);
        Msleep(10);
        BackLED (ON, OFF);
        Msleep(500);
        BackLED (OFF, ON);
        Msleep(500);
        BackLED (ON, OFF);
    	if (i == male) BackLED (OFF, OFF); //Schalte Alles ab wenn am ende
      }
    }
    
    //Rolf vorwaerts
    void FWARD(void)
    {
        FrontLED(ON);		//Kuendige Anfahren an
        Msleep(300);
        FrontLED(OFF);
        Msleep(150);
        FrontLED(ON);
        Msleep(300);
        FrontLED(OFF);
        MotorDir(FWD,RWD); 		//Beide Motoren vorwaerts
        MotorSpeed(150,150);	//Los gehts
    }
    
    //Rolf rueckwaerts
    void RWARD(void)
    {
        MotorDir(RWD,FWD);		//Beide Motoren rueckwearts
        MotorSpeed(120,120);	//Los gehts
    }
    
    //Rolf rueckwaerts links
    void RWDL(void)
    {
        MotorDir(RWD,FWD);		//Beide Motoren rueckwearts
        MotorSpeed(120,0);		//Los gehts
    }
    
    //Rolf rueckwaerts rechts
    void RWDR(void)
    {
        MotorDir(RWD,FWD);		//Beide Motoren rueckwearts
        MotorSpeed(0,120);		//Los gehts
    }
    
    //Rolf stoppen
    void STOP(void)
    {
        MotorSpeed(0,0);
        FrontLED(OFF);
    }
    
    //Rolf kollusionsprogramm
    void collusion(unsigned int lang)
    {
    	unsigned long startzeit = Gettime();
    	unsigned char t1;
    	unsigned char t2;
    	unsigned long zeit;
    	zeit = startzeit + lang;
    
      while ( startzeit < zeit ) //Fahre so lange wie zeit gegeben ist
      {
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    
    		if (t1 == 0 && t2 == 0 && startzeit < zeit)		//Keine Taste gedrueckt, Rolf feahrt vorwaerts
    		    {
    			FWARD();          	//Auf gehts
    		    }
    		else if (t1 && t2 && t1 == t2)
    		    {
    		        STOP();			//Stoppen
    		      if (t1 & 0x07 && startzeit < zeit)		//Linke tasten beruehrt
    		      {
    		        RWDL();			//LinksRueckwaerts ausweichen
    		      }
    		      if (t1 & 0x38 && startzeit < zeit)		//Rechte tasten beruehrt
    		      {
    		        RWDR();			//RechtsRueckwearts ausweichen
    		      }
    		      Msleep(1000);       	//Eine Sekunde rueckwarts fahren
    		    }
    		else STOP();
      }
    	STOP();
    }
    Hat jemand einen gut gemeinten rat für mich? ^^

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Er hält nicht an seiner zeit weil er nimmer eines zweites mal die zeit abfragt und benutzt. Nur beim einstieg von deine collusion funktion (initialisierung von startzeit) tüt er das. Jedenfalls wurde 'startzeit' immer kleiner sein als 'zeit' und deshalb wurde Rolf niemals aus die while-schleife herauskommen ... denke ich.

    [Edit] Wechsel mall startzeit mit Gettime() im start der while schleife. Dan söllte er mal ein bisschen rühe nehmen. Aber ich verstehe nich wozu du die 'startzeit < zeit' auch ins If-stelle(n) gesteckt hat. Das ist überflussig nach meiner meinung.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    33
    Beiträge
    239
    hallo hardest

    ich bin mir nicht sicher, aber ich würde es mal so probieren
    Code:
    void collusion(unsigned int lang)
    {
       unsigned long startzeit = Gettime();
       unsigned char t1;
       unsigned char t2;
       unsigned long zeit;
       
    
      while (gettime() < (startzeit + lang) ) //Fahre so lange wie zeit gegeben ist
      {
       t1 = PollSwitch();
       t2 = PollSwitch();
    
             //Rest deines Progammes
      }

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    argh,... richtig, is sollte doch die for schleife nehmen...

    so sollte es ja funktionieren richtig?

    unsigned long startzeit= Gettime();
    for (zeit = 0; zeit > startzeit + lang; startzeit = startzeit)

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Nein, weil startzeit=startzeit kein inkrementierung is. Zeit wird nie großer. Wechsel das mit zeit++. Has du das ende meiner 2er bericht im diesem topic gelesen?

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.068
    wenn die gelbe status led blinkt, dann halte mal den transceiver drüber. wenn du in hyperterminal jetzt VLVLVL esen kannst, dann sind die batterien leer.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    hmmh... danke für die batterie info...

    Ich dachte das ich mit startzeit = startzeit einfach die Gettime() funtkion nochmals abfrage, die nun einen neuen wert beeinhaltet... obwohl... ich muss die funktion live abfragen... da sie ja ausserhalb der for schleife nicht aktuell ist

    also:
    startzeit = Gettime();
    for (zeit = 0; zeit > startzeit + lang; zeit = Gettime())

    so sollte es funktionieren nicht?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2007
    Ort
    Aachen
    Beiträge
    9
    Hallo Hardest,

    Zitat Zitat von Hardest
    ...
    also:
    startzeit = Gettime();
    for (zeit = 0; zeit > startzeit + lang; zeit = Gettime())

    so sollte es funktionieren nicht?
    ...
    Also nochmal: Diese For-Schleife wird nie durchlaufen, weil zeit immer kleiner als startzeit + lang sein wird.
    Du musst also zeit mit Gettime() initialisieren und die Bedingung auf zeit < (startzeit+lang) ändern.
    Merke: Die Bedingung in einer For-Schleife ist ein Eintritts- bzw. Wiederholungskriterium, kein Abbruchkriterium.

    Aber das wird schon. Es ist noch kein Meister vom Himmel gefallen.

    Gruß
    Buggie
    Gruß
    Buggie

    Das wohlüberlegte Treffen von Entscheidungen folgt einer alten Tradition: Zuerst raten und danach die anderen dafür verantwortlich machen.
    Scott Adams

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    Ups entschuldige ... manchmal bin ich recht schwer vom begriff ^^

    Habs nun einwandfrei hinbekommen... funzt supergut
    Naja fast... manchmal geht er einfach aus ^^ aber da hab ich irgendein faktor missachtet... muss ich noch genauer darauf eingehen...

    Ansonsten... vielen dank Buggie

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    10.10.2007
    Ort
    Aachen
    Beiträge
    9
    Zitat Zitat von Hardest
    Naja fast... manchmal geht er einfach aus ^^ aber da hab ich irgendein faktor missachtet... muss ich noch genauer darauf eingehen...
    Was genau bedeutet das? Geht er wirklich aus oder führt er nur keine erkennbaren Aktionen aus?

    Gruß
    Buggie
    Gruß
    Buggie

    Das wohlüberlegte Treffen von Entscheidungen folgt einer alten Tradition: Zuerst raten und danach die anderen dafür verantwortlich machen.
    Scott Adams

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test