PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Programm



*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???

hai1991
15.12.2008, 21:53
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:



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

Valen
17.12.2008, 14:10
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:


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.

Valen
17.12.2008, 14:21
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.

*C-3PO*
17.12.2008, 20:50
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

radbruch
17.12.2008, 20:55
Hallo

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

https://www.roboternetz.de/phpBB2/viewtopic.php?p=412809#412809

Gruß

mic