*C-3PO*
15.12.2008, 19:01
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:
#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:
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???
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:
#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:
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???