-         

Ergebnis 1 bis 6 von 6

Thema: Asuro / C

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    24
    Beiträge
    13

    Asuro / C

    Anzeige

    Habe da ein Programm für den Asuro, das keine Errors enthält.
    Normalerweise sollte es so funktionieren: Geradeaus fahren, Status LED auf Grün schalten, Vorderes LED einschalten. Wenn eine Kollision erfolgt, Motor Stoppen, Status LED auf Rot schalten, Vorderes LED Abschalten, über Infrarot Diode "AUA!" Senden.

    Code:
    #include "asuro.h"
    int main(void) {
    	Init();
    	while (1) {
    			{StatusLED (GREEN);
    			FrontLED(ON);
    			MotorDir(FWD,FWD);
    			MotorSpeed (180,180);}
    		
    		if (PollSwitch()>0) 			{MotorSpeed (0,0);
    				    			StatusLED (RED);
    							 FrontLED(OFF);
    							 SerWrite("AUA!", 4);
    							 }
    
    	}
    }
    Trotzdem führt er das Prog. anders aus. Es ist etwa so, als würde er zwischen den 2 Blöcken "Fahrt" und "Kolision" hin und her springen. = Status LED Flackert, Vorderes LED Flackert, Motor zittert, "AUA!" wird permanent gesendet. Wenn mann einen Kollisionstaster drückt, Leuchtet das Front LED schwach, und das Status LED Fllackert glaub ich auch noch. (Das ist aber so schwach, dass man ganz genau hinsehen muss).
    Gibt es da jetzt einen Fehler in der Programmierung oder ist ein Kollosionstaster oder der IC defekt?

    Dann hätte ich noch eine Frage: Wie kann man eine Verzögerung Programieren, die länger als 1 Sekunde anhält?

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    02.03.2008
    Beiträge
    8
    wenn ein taster gedrückt ist wird der teil oberhalb der if bedingung auch ausgeführt daher flackert das ... setzte doch den oberen teil in eine else oder mach Msleep(2000); am ende der if dann wird das zumindest für ne zeit lang angezeigt

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

    was dein asuro macht ist föllig richtig.
    aber dazu schauen wir uns jetzt mal an was in deinem programm steht:

    Code:
    //den anfang lassen wir weg ...
    
    while(1)
    { //Endlosschleife, wird immer wiederholt
           
            //statusled auf grün und frontled ein
            //motor auf vorwärts mit 180, 180
            
            if(PollSwitch()>0)
            {//falls eine taste gedrückt wird:
                     
                     //motor aus
                     //statusled auf rot und frontled aus
                     //AUA über hyperterminal ausgeben
    
            }//ende der if-schleife. da kein else vorhanden ist wird einfach fortgesetzt
    
    }//ende der while(1)-schleife, dh. es wird wieder von oben begonnen!
    noch kurz zum ablauf:

    nach dem einschalten tritt asuro in die endlosschleife ein
    - schalten der leds
    - schalten des motors
    - prüfen ob taste gedrückt ist:
    -- wenn ja: motor aus, leds schalten.
    dann gehts einfach weiter, egal ob noch eine taste gedrückt ist oder nicht!
    - sprung zum anfang der endlosschleife!


    altenativ könntest du es zb. so machen:
    Code:
    #include "asuro.h"
    int main(void) {
       Init();
       while (1) 
       {
             StatusLED (GREEN);
             FrontLED(ON);
             MotorDir(FWD,FWD);        //motor ein
             MotorSpeed (180,180);
          
          if(PollSwitch()>0)               //falls ein taster gedrückt wir in der if-anweisung fortsetzen         
          {
                          MotorSpeed (0,0);
                          StatusLED (RED);
                          FrontLED(OFF);
                          SerWrite("AUA!", 4);
                          while(PollSwitch()>0) {}    //solange ein taste gedrückt ist soll er nichts machen
          }//ende der if-anweisung
    
       }//ende der endlosschleife, von oben wieder anfangen
       return 0;       //sollte normaler weiße immer am ende der main()-funktion stehen
    }
    was mir noch aufgefallen ist: die runden kalmmern ( { und } ) um den ausführungsblock nach while(1){ kannst du dir sparen
    mfg hai1991

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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    24
    Beiträge
    13
    Danke für die Raschen Antworten, vorallem an hai1991. Super Erklärt, habs verstanden. Werd's heute noch Ausprobieren

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.08.2008
    Ort
    Karlsruhe
    Alter
    30
    Beiträge
    7
    ähm, was macht denn Msleep(2000); ?
    2000 Milisekunden = 2 Sekunden warten?
    Danke
    E

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2008
    Alter
    24
    Beiträge
    13
    DAS GIBTS DOCH NICH! Immer, wenn ich flaschen will, dann gibt es schon beim ersten Package einen Timeout! Aber gestern hat er noch ein paar mal Funktioniert! Ich krieg das einfach nicht hin, egal wie oft und mit welchen Lichtverhältnissen ich das probier! Aber genau das war schonmal der Fall, hab es dann noch ein paar mal probiert, und dann is es wieder für ne Weile (bis jetzt) gegangen! Was mach ich da Falsch?

Berechtigungen

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