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:
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:#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
Nur finde ich diesen nicht.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![]()
![]()
![]()
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???









Lesezeichen