-         

Ergebnis 1 bis 6 von 6

Thema: Problem mit Programm

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16

    Problem mit Programm

    Anzeige

    Hallo alle zusammen,
    ich habe ein Problem mit einem Asuro-Programm. Eigentlich soll der Asuro eine linie lang fahren, dann gegen einen Gegenstand fahren, eine Reifenumdrehung zurück fahren und wieder von vorne.
    Sobald ich die Taster drükce, stellen die Motore nicht auf REW, sondern
    die Status-Led leuchtet rot auf, und die Motoren tuen so lange nichts, bis man die Taster wieder los lässt. Dann bleibt die Status LED auf Rot und werdn nicht Grün, d.h., das Programm ist irgendwo im unteren Teil "gefangen", da die Status-LED nicht wieder Grün werden, woraus sich folgernlässt, dass das Programm nicht nach "oben" kommt. Zudem laufen die Motoren wieder vorwärts weiter und nicht für eine Reifenumdrehung rückwärts.

    Hier mein Programm:
    Code:
    #include "asuro.h"				//P//LINIENVERFOLGUNG
    #define LINIENWERT				//D//
    //folgende werte müssen ggf.
    //verändert werden!!!
    #define SCHWELLENWERT 600		//D//GRENZE ZWISCHEN HELL UND DUNKEL FESTLEGEN
    #define HYSTERSIS 10			//D//WERT ZUR VORBEUGUNG VON STÖRUNGEN
    //die hier nicht mehr!!!
    #define LOW 0					//D//-}\WERTE ZUR ÜBERPRÜFUNG, OB SCHON EIN
    #define HIGH 1					//D//-}/WECHSEL STATTGEFUNDEN HAT, FESTLEGEN
    int main(void)					//V//PROZESSOR IN GRUNDZUSTAND VERSETZEN
    {
    unsigned int status[2]={0,0};	//V//SPEICHER FÜR "HAT WECHSEL STSTTGEFUNDEN?"
    unsigned int odata[2];			//V//SPEICHER FÜR GEBERSCHEIBENZUSTAND
    unsigned int counter[2]={0,0};	//V//SPEICHER ZUM ZÄHLEN DER GEBERSCHEIBEN-IMPULSE
    unsigned int ldata[2];			//V//SPEICHER FÜR LINIENFOLGE BEREITSTELLEN
    unsigned char t1;				//V//SPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
    unsigned char t2;				//V//VERGLEICHSSPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
    Init();							//S//START DES PROGRAMMS
      StatusLED(GREEN);				//A//STATUS-LED AUF GRÜN
      FrontLED(ON);						//A//LINIENFOLGE-LED AN
      MotorDir(FWD,FWD);				//A//MOTOREN AUF VOR 
    
    	while(1)							//E//ENDLOSSCHLEIFE:
    	{
    	t1=PollSwitch();					//A//TASTENABFRAGE
    	t2=PollSwitch();					//A//VERGLEICHSTASTENABFRAGE
    
    		if(t1==t2&&t1==0)					//?//WENN KEINE TASTE GEDRÜCKT
    			{								//!//(MIT VERGLEICH MIT t2 ZUR SICHERSTELLUNG DER RICHTIGKEIT t2s)
    			LineData(ldata);					//://LINIENFOLGE-DATEN EINLESEN
    				if(ldata[0]>ldata[1])				//:?/WENN LINKS HELLER ALS RECHTS,
    					{MotorDir(FWD,FWD);					//://BEIDE MOTOREN AUF VORWÄRTS
    					MotorSpeed(150,0);}					//://LINKS MEHR GAS
    				else								//:?/SONST:
    					{MotorDir(FWD,FWD);					//://BEIDE MOTOREN AUF VORWÄRTS
    					MotorSpeed(0,150);}					//://RECHTS MEHR GAS
    			}											//://KOLLISIONANWEISUNG SCHLIEßEN
    			
    		else{								//!?/wENN KOLLISION
    			MotorSpeed(0,0);					//!//MOTOREN ANHALTEN
    			MotorDir(RWD,RWD);					//!//MOTOREN AUF RÜCKWÄRTS
    			StatusLED(RED);
    			LineData(ldata);					//!//LINIENFOLGE-DATEN EINLESEN
    
    			while(counter[0]<40)					//!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
    				{								//!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT
    				OdometrieData(odata);				//!//ODOMETRIEWERTE EINLESEN
    
    					if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
    														//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    						{								//!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
    						counter[0]++;
    						MotorDir(RWD,RWD);
    						MotorSpeed(150,150);
    						}											//!//WECHSEL?-ANWEISUNG SCHLIEßEN
    
    					if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
    														//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    						{								//!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???	
    						counter[0]++;						//!//ZÄHLER EINEN IMPULS HOCHSETZEN
    						MotorDir(RWD,RWD);
    						MotorSpeed(150,150);
    						}									//!//WECHSEL?-ANWEISUNG SCHLIEßEN
    				}								//!//counter-anweisung geschlossen, wenn counter<40 ist,
    												//!//kehre zu while(counter<40) zurück, ansonsten mache
    												//!// in Reihenfolge weiter
    			}								//!//WENN KOLLISION-ANWEISUNG ZU ENDE
    	}									////Wieder von vorne, ENDE ENDLOSSCHLEIFE
    return 0;						////return(0)
    }								////PROGRAMM ENDE
    Dadurch, dass ich die "while(counter...){}"-Schleife durch "StatusLED(RED)" ersetzt habe, und dies ging, kann man folgern, das der Fehler hier irbendwo liegt:

    Code:
    else{								//!?/wENN KOLLISION
    			MotorSpeed(0,0);					//!//MOTOREN ANHALTEN
    			MotorDir(RWD,RWD);					//!//MOTOREN AUF RÜCKWÄRTS
    			StatusLED(RED);
    			LineData(ldata);					//!//LINIENFOLGE-DATEN EINLESEN
    
    			while(counter[0]<40)					//!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
    				{								//!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT
    				OdometrieData(odata);				//!//ODOMETRIEWERTE EINLESEN
    
    					if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
    														//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    						{								//!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
    						counter[0]++;
    						MotorDir(RWD,RWD);
    						MotorSpeed(150,150);
    						}											//!//WECHSEL?-ANWEISUNG SCHLIEßEN
    
    					if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
    														//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    						{								//!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???	
    						counter[0]++;						//!//ZÄHLER EINEN IMPULS HOCHSETZEN
    						MotorDir(RWD,RWD);
    						MotorSpeed(150,150);
    						}									//!//WECHSEL?-ANWEISUNG SCHLIEßEN
    				}								//!//counter-anweisung geschlossen, wenn counter<40 ist,
    												//!//kehre zu while(counter<40) zurück, ansonsten mache
    												//!// in Reihenfolge weiter
    			}								//!//WENN KOLLISION-ANWEISUNG ZU ENDE
    Nur finde ich diesen nicht.
    Kann mir vielleicht jemand helfen???

    Danke schonmal im voraus,
    C-3PO

    PS: Ich habe auch irgendwie eben in dem Programmers notepad Fenster aus versehen die fehleranzeig weggecklickt und weiß nicht wie ich es wiederbekommen soll. Kann mir da auch irgendwer helfen???

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.01.2008
    Alter
    26
    Beiträge
    239
    hallo *C-3PO*

    ich habe mir gerade dein programm durchgelesen und mir ist folgendes aufgefallen:

    du fragst zwei mal in einer if den wert von status ab, ich habe aber nichts gesehen wo du diesen änderst
    wenn ich dein programm richtig interpretiert habe müsstest du doch diesen wert in den beiden if-schleifen ändern:

    Code:
                   if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
                                              //!//HAT WECHSEL DER GEBERSCHEIBENFARBE
                      {                        //!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
                      counter[0]++;
                      MotorDir(RWD,RWD);
                      MotorSpeed(150,150);
                      status[0]=HIGH;                              //hier das 1. mal
                      }                                 //!//WECHSEL?-ANWEISUNG SCHLIEßEN
    
                   if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
                                              //!//HAT WECHSEL DER GEBERSCHEIBENFARBE
                      {                        //!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???   
                      counter[0]++;                  //!//ZÄHLER EINEN IMPULS HOCHSETZEN
                      MotorDir(RWD,RWD);
                      MotorSpeed(150,150);
                      status[0]=LOW;                              //und hier das 2. mal
                      }
    noch etwas:
    so viel ich gesehen habe hast du status als array mit 2 elementen definiert, verwendest aber nur eins. dh. du könntes speicherplatz sparen (hat aber auf das programm keinen einfluss)

    ich hoffe, dass dier das weiter hilft
    mfg hai1991

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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Die rote zeilen machen nicht was du wunscht, denke ich.

    [Edit: doch das machen sie, ich habe mir geirrt die prioritat ist richtig... bitte vergesse diesen post]


    while(counter[0]<40) //!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
    { //!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT
    OdometrieData(odata); //!//ODOMETRIEWERTE EINLESEN

    if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
    //!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    { //!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
    counter[0]++;
    MotorDir(RWD,RWD);
    MotorSpeed(150,150);
    } //!//WECHSEL?-ANWEISUNG SCHLIEßEN

    if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
    //!//HAT WECHSEL DER GEBERSCHEIBENFARBE
    { //!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???
    counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN
    MotorDir(RWD,RWD);
    MotorSpeed(150,150);
    } //!//WECHSEL?-ANWEISUNG SCHLIEßEN
    } //!//counter-anweisung geschlossen, wenn counter<40 ist,
    Meinst du vieleicht:

    Code:
    if(status[0]== (LOW && (odata[0]> (SCHWELLENWERT+HYSTERSIS) ) ) )
    Die "relational operator" (<> => =<) hat höhere priorität uber die logische AND, OR operator ( && || ). Und die gleichungs operator (==) hat höhere priorität uber logische AND.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Aber die Counter[0]++; könnte mehrmahls ausgefuhrt werden wenn die gerberscheibe langsahm runddreht und die While schleife schnell wieder anfangt. Also wird die counter schneller ablaufen aber nicht die gleiche anzahl von scheibe flachen sind vorbei gegangen. Vieleicht gehts hier falsch.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2008
    Beiträge
    16
    Hallo alle zusammen,
    ich merke gerade, dass ich wirklich vergessen habe, status auf HIGH bzw. LOW zu setzen. Aber ich glaube, ich habe hier nur die falsche Datei rein kopiert und mit der anderen, die ich eigentlich reinkopieren wollte hats auch nicht geklappt.Ich werde es aber noch mal versuchen.
    Gruß,
    C-3PO

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

    Ich vermute, du hast nicht bemerkt dass ich hier noch editiert hatte:

    http://www.roboternetz.de/phpBB2/vie...=412809#412809

    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
  •