- 12V Akku mit 280 Ah bauen         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 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
    Also es leuchtet dann rein gar nichts mehr, als wär er aus ^^ also eingentlich "keine erkennbaren Aktionen" ^^

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    So...

    Habs nun schon mal so hinbekommen, dass es ohne probleme funktioniert... nur teilweise hat er seinen spinnenden momente wo er einfach neustartet, oder einfach einen gedrückten button simuliert und dementsprechend reagiert. Oder manchmal blingt die Statusled gelb grün (abwechselnd) und er sendet unlesbare zeichen ^^

    Teilweise aber funktioniert es wieder tadelos... müsste ein hardwarefehler sein oder? Vll mischen sich auch alte programmteile ein?

    Vll ist es aber doch mein Code... wer ihn mal anguggen will

    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);
    
    //miau
      RWARD();
      Msleep(1000);
      STOP();
      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 zeit = 0;
    	unsigned long startzeit = Gettime();
    	unsigned char t1;
    	unsigned char t2;
    
      while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
      {
    	zeit = Gettime();
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    
    		if (t1 == 0 && t2 == 0 && zeit < (startzeit+lang))	//Keine Taste gedrueckt, Rolf feahrt vorwaerts
    		    {
    			FWARD();          	//Auf gehts
    		    }
    		else if (t1 && t2 && t1 == t2 && zeit < (startzeit+lang))
    		    {
    		        STOP();			//Stoppen
    		      if (t1 & 0x07 && zeit < (startzeit+lang))		//Linke tasten beruehrt
    		      {
    		        RWDL();			//LinksRueckwaerts ausweichen
    			SerPrint("\r\n     Hab links was beruehrt, weiche aus...\r\n"); 
    		      }
    		      if (t1 & 0x38 && zeit < (startzeit+lang))		//Rechte tasten beruehrt
    		      {
    		        RWDR();			//RechtsRueckwearts ausweichen
    			SerPrint("\r\n     Hab rechts was beruehrt, weiche aus...\r\n"); 
    		      }
    		      Msleep(1000);       	//Eine Sekunde rueckwarts fahren
    		    }
    	SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n"); 
    	PrintLong(zeit);
      }
    	STOP();
    	SerPrint("\r\nVerlasse Collisionsschleife.\r\n"); 
    }

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Rolf, äh meine natürlich Hardest,

    erst einmal ein herzliches Willkommen im Forum.

    Vll ist es aber doch mein Code... wer ihn mal anguggen will
    anguggen hab ich getan.

    Die while()-Geschichte habt ihr ja schon zusammenbekommen.
    Die 'spinnerten Momente', ja da liegst du richtig, es ist dein main()-Programm, welches das Problem erzeugt. Die Hardware können wir bestimmt ausschliessen.

    Das main() läuft bei dir einmal von oben nach unten durch. Startet zwischendurch deine Funktionen und endet unten bei der }.
    Das ist nicht gut, da die CPU dann Langeweile bekommt und ein bisschen rumspinnt.

    2 Möglichkeiten führen zu einer Besserung.

    1) Dein main() wird genau ein mal durchlaufen:
    Code:
    int main(void)
    {
      Init();
    //Ab hier beginnt Rolf zu "Leben"
       .
       .
    //miau
      RWARD();
      Msleep(1000);
      STOP();
    
      while (1);  // <<<<<------ Hier wird die CPU geparkt. KOMA-Zustand
                  // Wiederbeleben von Rolf nur noch mit aus- und einschalten moeglich.
    
      return 0;  // Sieht ueberfluessig aus, verhindert aber ein waring beim Compiler.
    }
    2) Oder Rolf wird senil und wiederholt immer alles:
    Code:
    int main(void)
    {
      Init();
    //Ab hier beginnt Rolf zu "Leben"
    //Morgenmassage senden
      SerPrint("\r\nMuah... muss ich aufstehen?\r\n");
    
      while (1)  // <<<<---- die Schleife der Wiederholung beginnen ...
      {
    
    //Rolf wartet erstmal ab
        erwarten(1);
        .
        .
        STOP();
    
      }   // <<<<---- ... und natürlich die Schleife zumachen.
    
      while (1);  // Das ist zwar nun ueberfluessig, aber schuetzt vor
                  // 'spinnenden Momenten', falls die Schleife oben durch einen
                  // Programmfehler verlassen wird.
      return 0;
    }
    Ob dies schon ausreicht alle von dir beschriebenen Sonderlebensfunktionen zu beheben, weiss ich nicht genau. Vor allem die Taster-Funktion hat im Rolf so ihr Eigenleben. Aber ist es nicht genau das was du mit deinem Programm erreichen wolltest? Ist es so nicht schon fertig?

    Weiter viel Erfolg, vor allem Spaß und viel Geduld mit Rolf
    wünscht euch Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    Ach so ist das

    Die Programmiersprache C liegt quasie direkt an der substanz... nicht läuft von selbst... hat vor und nachteile

    Aber eher vorteile weil es den Programmierer nervt bis er sich beugt und Intelligenz "fressen" muss ^^

    Wunderbar... vielen dank... werd ich gleich mal ausprobieren hehe

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.068
    hrhr... fang mal assembler an. DAS liegt dann wirklich an der substanz... da geht überhaupt nix mehr von allein. allerdings kann man mit assembler auch die absolut kleinsten und schnellsten programme schreiben. wenn man den überblick behält.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    also kann ich assembler gleich mal vergessen ^^


    Also ich habe nun Rolfs ablauf in eine unendliche schleife gepackt... und darunter auch eine die den Atmega am laufen hält, wenn er aus der ersten schleife ausbrechen sollte.

    Jedoch spinnt er so genauso... hmmh.. sagen wir mal... sogar noch einwenig mehr ^^

    Hier der geänderte 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"); 
    
    //Rolfs ablaufchema in eine unendliche schleife setzen
      while (1)
      {
    
    //Rolf wartet erstmal ab
      erwarten(1);
    
    //Rolf startet Kollusionsfahrt 
      collusion(10000);
    
    //miau
      RWARD();
      Msleep(1000);
      STOP();
      }
    
    //Rolfs durchdrehverhinderungsschleife
      while (1);
      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 zeit = 0;
    	unsigned long startzeit = Gettime();
    	unsigned char t1;
    	unsigned char t2;
    
      while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
      {
    	zeit = Gettime();
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    
    		if (t1 == 0 && t2 == 0 && zeit < (startzeit+lang))	//Keine Taste gedrueckt, Rolf feahrt vorwaerts
    		    {
    			FWARD();          	//Auf gehts
    		    }
    		else if (t1 && t2 && t1 == t2 && zeit < (startzeit+lang))
    		    {
    		        STOP();			//Stoppen
    		      if (t1 & 0x07 && zeit < (startzeit+lang))		//Linke tasten beruehrt
    		      {
    		        RWDL();			//LinksRueckwaerts ausweichen
    			SerPrint("\r\n     Hab links was beruehrt, weiche aus...\r\n"); 
    		      }
    		      if (t1 & 0x38 && zeit < (startzeit+lang))		//Rechte tasten beruehrt
    		      {
    		        RWDR();			//RechtsRueckwearts ausweichen
    			SerPrint("\r\n     Hab rechts was beruehrt, weiche aus...\r\n"); 
    		      }
    		      Msleep(1000);       	//Eine Sekunde rueckwarts fahren
    		    }
    	SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n"); 
    	PrintLong(zeit);
      }
    	STOP();
    	SerPrint("\r\nVerlasse Collisionsschleife.\r\n"); 
    }
    Er macht nur das was er soll wenn ich auf keinen taster drücke... warum bringen die taster alles durcheinander? Eine sehr sehr nervige angelegenheit.. grml

    Gibt es noch eine möglichkeit, die rolf das machen lässt was man ihn auch vorschreibt?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Hallo Hardest,

    Erstmall, was mir auffällt ist das du in jeder If-schleife testet ob die zeit schön passiert ist (... && zeit < (startzeit+lang)... ). Das is nicht nötig weil das schön beim eintrit die while-schleife sicher ist. Dieser test wird immer die selbe antwort geben im selben durchlauf. Fur deine asuro ist das nur sinlose arbeit. Und persönlich wurde ich die zeit = Gettime(); am ende die while-schleife platzen, sondern nützt die while-schleife (testen fur einer neue eintrit) eine veralterte zeit. Das werde dein program nicht besser laufen lassen (ich meine dein taster problem auflösen) sondern wurde es etwas netter machen.

    Deine taster-testen problem liegt vielleicht an t1 & 0x38. 38=32+4+2. Also ich bin nicht ganz sicher welcher bestimmte taster das sind aber ich denke taster 6, 3 und 2. Das sind taster an die linker (6?) und rechter seite (3,2?). Versuche mall mit 0x46 (=32+16+8, oder taster 6, 5 und 4 wenn ich ´s recht habe). 0x07 stimmt wenn es taster 1,2 und 3 meinen söllte. Wenn 's nicht (besser) geht wechsel dieser zahlen mal fur die linke und rechter fahrt.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Hmm, ich habe mir geirrt. 0x38 ist ein hexadecimal nummer, nicht decimal. Also 0x38=3*16+8=32+16+8, und so stimmt mit taster 4,5,6. Vergesse mein 0x46.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2008
    Beiträge
    16
    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"); 
    
    //Rolfs ablaufchema in eine unendliche schleife setzen
      while (1)
      {
    
    //Rolf wartet erstmal ab
      erwarten(1);
    
    //Rolf startet Kollusionsfahrt 
      collusion(10000);
    
    //miau
      RWARD();
      Msleep(1000);
      STOP();
      }
    
    //Rolfs durchdrehverhinderungsschleife
      while (1);
      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 zeit = 0;
    	unsigned long startzeit = Gettime();
    	unsigned char t1;
    	unsigned char t2;
    
      while (zeit < (startzeit+lang)) //Fahre so lange wie zeit gegeben ist
      {
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    
    		if (t1 == 0 && t2 == 0)	//Keine Taste gedrueckt, Rolf feahrt vorwaerts
    		    {
    			FWARD();          	//Auf gehts
    		    }
    		else if (t1 && t2 && t1 == t2)
    		    {
    		        STOP();			//Stoppen
    		      if (t1 & 0x07)		//Linke tasten beruehrt
    		      {
    		        RWDL();			//LinksRueckwaerts ausweichen
    			SerPrint("\r\n     Hab links was beruehrt, weiche aus...\r\n"); 
    		      }
    		      if (t1 & 0x38)		//Rechte tasten beruehrt
    		      {
    		        RWDR();			//RechtsRueckwearts ausweichen
    			SerPrint("\r\n     Hab rechts was beruehrt, weiche aus...\r\n"); 
    		      }
    		      Msleep(1000);       	//Eine Sekunde rueckwarts fahren
    		    }
    	zeit = Gettime();
    
    	SerPrint("\r\nWiederhohle Schleife fuer Collisionsfahrt\r\n"); 
    	PrintLong(zeit);
      }
    	STOP();
    	SerPrint("\r\nVerlasse Collisionsschleife.\r\n"); 
    }
    So ich habe die änderungen vorgenommen... teilweise funktioniert es... nur teilweise spinnt er wieder völlig, schaltet sich manchmal sogar ab, oder startet einfach von neu. Ich hab wirklich keine ahnung ^^ warum er so ein eigenleben entwickelt ^^ ist ja auch irgendwie beabsichtigt, nur irgendwie kontrollierter ^^

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Zitat Zitat von Hardest
    ...
    So ich habe die änderungen vorgenommen... teilweise funktioniert es... nur teilweise spinnt er wieder völlig, schaltet sich manchmal sogar ab, oder startet einfach von neu. Ich hab wirklich keine ahnung ^^ warum er so ein eigenleben entwickelt ^^ ist ja auch irgendwie beabsichtigt, nur irgendwie kontrollierter ^^
    Wie bist du sicher das er abschaltet und von neu startet? Kanst du die output von serielen schnittstellen auf ihren rechner sehen? Sagt er "Muah... muss ich aufstehen?" mit einiger regelmäß? Dann denke ik mall an eine hardware-reset das passiert, oder ähnliches. Weil er das nur einmall ausgeben sollte am start. Ich denke zu viel spannungsabfall durch bremsenden motoren oder etwas. Dein programm seht ganz gut aus.

    Vieleicht kannst du versuchen mehr 'debug-messages' in dein programm einzufügen und uber serielen schittstelle ubertragen. Dan kannst du besser sehen wenn und was er eigentlich tut, und wenn er etwas nicht söllte. Also wie "Ich gehe nach links" oder "t1 ist: xx, und t2 ist: xx".

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen