-
        

Ergebnis 1 bis 9 von 9

Thema: Programm funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18

    Programm funktioniert nicht

    Anzeige

    Ich bin Anfänger und habe mein erstes Programm geschrieben. Der Asuro soll, wen er auf ein Hinderniss trifft sofort anhalten. Aber es passiert gar nichts nur die LED leuchtet grün woran liegts? Was mach ich falsch?
    Hier das Programm:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	Init();
    	
    	while(PollSwitch()==0){ 
    	MotorDir(FWD,FWD);
    	MotorSpeed(120,120);
    	StatusLED(GREEN);
    	}
    	
    	MotorDir(BREAK,BREAK);
    	MotorSpeed(0,0);
    	
    	
    	
    	while(1)
    	return 0;
    }

  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

    Aber es passiert gar nichts nur die LED leuchtet grün
    Das liegt in erster Linie daran, dass die StatusLED schon bei Init() auf grün geschaltet wird und sich das im Programm nie mehr ändert...

    Dieser Programmteil
    Code:
       while(PollSwitch()==0){
       MotorDir(FWD,FWD);
       MotorSpeed(120,120);
       StatusLED(GREEN);
       }
    wird solange ausgeführt bis mit PollSwitch() ein Tastenwert eingelesen wird der ungleich null ist. Blöderweise ist PollSwitch() ziemlich zickig und meldet gelegentlich auch einen Wert ungleich null wenn keine Taste gedrückt wird. Ursache dafür ist zum einen die Bauteilestreuung der Tastenbeschaltung (R24-32) die man eventuell durch eine bessere Kalibrierung der Tasten ausgleichen kann. Zum anderen stören die Motoren enorm, dies kann man durch Mehrfachabfragen und Plausibilitätsprüfungen ausmerzen.

    Wenn nun eine Taste erkannt wird, wird die Schleife verlassen, mit
    Code:
       MotorDir(BREAK,BREAK);
       MotorSpeed(0,0);
    werden die Motoren abgeschaltet und mit
    Code:
       while(1)
       return 0;
    wird endlos zum aufrufenden Programm zurückgesprungen. Da bei den AVRs kein aufrufendes Programm existiert, springt das erste return() irgendwo in den Speicher des AVRs und dieser stürzt dadurch ab.

    Ungetestet:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
       Init();
    
       StatusLED(YELLOW); // starten
       MotorDir(FWD,FWD);
       MotorSpeed(120,120);
    
       // weiterfahren solange bei drei Lesungen mindestens einmal null dabei war
    	while((PollSwitch()==0) || (PollSwitch()==0) || (PollSwitch()==0));
    
       StatusLED(RED); // anhalten
       MotorDir(BREAK,BREAK);
       MotorSpeed(0,0);
    
    	while(1); // Endlosschleife (mit Semikolon an Ende!)
    	return 0; // dieser Befehl wird nie erreicht
    }
    Infos zu den Tasten:
    http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

    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
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18
    vielen Dank für die schnelle antwort aber leider funktiert es so auch nicht. gibt es also noch eine weitere möglichkeit?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    561
    Hallo

    Was macht er denn wenn du radbruchs Programm benutzt?
    Das sieht eig. korrekt aus.

    Gruß Thund3r

  5. #5
    Neuer Benutzer
    Registriert seit
    22.03.2010
    Ort
    Hinterzarten
    Alter
    37
    Beiträge
    2
    Hallo das Grundgerüst für das Programm:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
       Init();
       
       while(1)//Endlosschleife!!!
       {
          //hier der Programmcode rein!!!
    
          return 0;
       }//Ende while
    
    }
    Gruss
    Markus

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    561
    Hallo

    Das ist das Grundgerüst für jedes Asuro-Programm
    Ich denke das ist nich das Problem.

    Gruß Thund3r

  7. #7
    Neuer Benutzer
    Registriert seit
    22.03.2010
    Ort
    Hinterzarten
    Alter
    37
    Beiträge
    2
    Wenn ich mir sein Code anschaue, dann schon!!!

    Gruss Markus

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    561
    Hallo

    Zitat Zitat von janse
    Der Asuro soll, wen er auf ein Hinderniss trifft sofort anhalten
    Mehr nicht.

    Also ist eine Endlosschleife überflüssig.

    In radbruchs Programm fährt er solange bis er auf ein Hindernis trifft --> also so wie gewünscht.

    Gruß Thund3r

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

    Das ist als "Grundgerüst" ungeeignet:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
       Init();
       
       while(1)//Endlosschleife!!!
       {
          //hier der Programmcode rein!!!
    
     // DIESES RETURN DARF NICHT INNERHALB DER SCHLEIFE STEHEN!!!
         // return 0; 
       }//Ende while
    
    }
    Gruß

    mic

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

Berechtigungen

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