PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Eure Meinung bitte



Tobias Stosius
25.05.2011, 14:28
Schönen guten Nachmittag,
ich habe ein Programm geschrieben (Tischkante erkennen) und wollte nun eure Meinung dazu hören
- was haltet ihr allgemein von dem Code
- lässt sich daraus was machen
- was könnte besser sein
- was ist bereits in ordnung
-- Außerdem brauche ich eure Hilfe bei einer Fehlermeldung--:

test.c:4: error: expected identifier or '(' before '{' token

bestimmt kennen einige von euch die schon und wissen was zu tun ist.

Hier nun der Code(Ich hab sehr viele Kommentare verwendet nicht wundern):


#include "asuro.h"
#define STOP 80
int main(void);
{
unsigned int lineData[2];
int ergAL,ergBL,eL;
int ergAR,ergBR,eR


Init();
unsigned char running = TRUE;
//------------------------------------------------------------------------//
{StatusLED(GREEN);
FrontLED(ON); //LED wird eingeschaltet|ASURO steht auf dem Tisch
Msleep(10); //Pause bis LED an ist
lineData(lineData); //Speicher bereitstellen
Konf0L= (lineData[0]); //Ergebnis T9 (Links)
Konf0R= (lindData[1]); //Ergebnis T10 (Rechts)

//------------------------------------------------------------------------//

{StatusLED(RED); //Zur Prüfung ob ASURO auf hier misst
FrontLED(OFF); //LED ausschalten|ASURO steht auf dem Tisch
Msleep(10); //Wieder eine kurze Pause
lineData(lineData); //Bereitstellen des Speichers
Konf1L= (lineData[0]); //Ergebnis T9 (Links)
Konf1R= (lindData[1]); //Ergebnis T10 (Rechts)
}
//------------------------------------------------------------------------//

/*
Jetzt berechnen wir aus dem beiden eben ermittelten
Werten einen Zwischenwert. Dieser gibt an, wann der
ASURO auf dem Tisch ist.
*/

Konf01 = (Konf0-Konf1);
//------------------------------------------------------------------------//
/*
Im nächsten Schritt wird ein Wert ermittelt,
für den Fall, dass der ASURO sich über der
Tischkante befinden. Im Prinzip ist es
der gleiche Code wie eben.
*/


//------------------------------------------------------------------------//
{StatusLED(YELLOW); //Einfach zur Unterscheidung, dass der ASURO HINTER dem Tisch misst
FrontLED(ON); //LED wird eingeschaltet|ASURO steht über der Kante
Msleep(10); //Pause bis LED an ist
lineData(lineData); //Speicher bereitstellen
Konf2L= (lineData[0]); //Ergebnis T9 (Links)
Konf2R= (lindData[1]); //Ergebnis T10 (Rechts)

//------------------------------------------------------------------------//
{StatusLED(RED); //Zur Prüfung ob ASURO auch hier misst
FrontLED(OFF); //LED ausschalten|ASURO steht über der Kante
Msleep(10); //Wieder eine kurze Pause
lineData(lineData); //Bereitstellen des Speichers
Konf3L= (lineData[0]); //Ergebnis T9 (Links)
Konf3R= (lindData[1]); //Ergebnis T10 (Rechts)

//------------------------------------------------------------------------//

/*
Berechnung einiger Zwischenwerte
*/

ZW01l= (Konf0L-Konf1L); //ASURO auf dem Tisch| Zwischenwert für Links
ZW01r= (Konf0R-Konf1R); //ASURO auf dem Tisch| Zwischenwert für Rechts

ZW23l= (Konf2L-Konf3L); //ASURO über der Kante| Zwischenwert für Links
ZW23r= (Konf2R-Konf3R); //ASURO über der Kante| Zwischenwert für Rechts


do {
MotorSpeed (150,150);
MotorDIR (FWD,FWD);
if ((ZW01l < ZW23l) || (ZW01r < ZW23R))
{
MotorDir(RWD,RWD);
MotorSpeed(225,225);
Msleep(500);
MotorSpeed(0,0);
BackLED(ON,ON);

}
}
while(1);
return 0;
}

TobiKa
25.05.2011, 15:38
1.

-- Außerdem brauche ich eure Hilfe bei einer Fehlermeldung--:
test.c:4: error: expected identifier or '(' before '{' token
Was das Semikolon hinter main() weg!

2.
Ich hoffe die schlechte formatierung deines Codes liegt am kopieren ins Forum.

3.
Du überprüfst nur einmal ob die Linien Sensoren und danach fährt er ohne überprüfung immer weiter?!

Tobias Stosius
25.05.2011, 16:01
1. Danke ;)
2. Ja liegt am kopieren
3. Da liegt noch der Knackpunkt. Ich wollte es so machen, dass der ASURO zuerst "konfiguriert" wird.
Er soll am Anfang die Werte ermitteln wenn er auf einem Tisch steht und die Werte wenn er über die Kante schaut.
Natürlich müsste er die Werte immer wieder mit aktuellen Messergebnissen (bei der fahrt) abgleichen. Wenn ich da eine Hilfestellung bekommen
würde wäre ich nicht ganz undankbar :)
Anhand dieser Daten soll er sich besser an verschiedene Umgebungen anpassen können.

Tobias Stosius
30.05.2011, 09:03
So, neuer Anlauf!
Ich habe jetzt die Odometrie mit dem Linienfolger verbunden.
Dabei dient der Linienfolger zur Erkennung von Tischkanten. Somit soll der ASURO
Auf verschieden großen Flächen fahren können ohne irgendwo runter zu fallen.

#include "asuro.h"
int main(void)
{
unsigned int data[2];
Init();
while(1)
{
OdometrieData(data);
if (data [0] || data [1] < (70))
{StatusLED(GREEN);}

else
{StatusLED(RED);}

LineData(data);
if (data[0] < data[1])
{
BackLED(ON,ON);
}
else
{
BackLED(OFF,OFF);
}
}
}




Ich habe noch keine Werte o.ä. eingesetzt da ich zuerst testen wollte wie die beiden Programme zusammenarbeiten.
Meine Frage ist wie man den ASURO über die Odometrie dazu bringt, sich zu drehen und dann weiter zu fahren, wieder zu drehen usw.

Tobias Stosius
30.05.2011, 11:06
Mittlerweile habe ich die Vermutung, dass mein ASURO die Programme nicht mehr richtig durchspielt.
Zum test sollten die LEDs alle abwechselnd blinken, solange bis der ASURO ausgeschaltet wird.
Nach dem flashen, wie könnte es anders sein, leuchteten alle LED gleichzeitig. Natürlich tat sich dann nichts mehr.
Ich habe schon verschiedene Möglichkeiten mit return und while ausprobiert(an verschiedenen Stellen im Programm etc.)
leider blieb der Erfolg des Ganzen auf der Strecke.
Kann es vielleicht damit zusammen hängen, dass die Batterien leer sind oder kurz davor stehen?

Valen
31.05.2011, 11:16
Leider kann die Odometrie nicht Funktionieren wann den BackLEDs angeschaltet werden. Die Schaltungen sind Verknüpft. Die Odometrie LEDS müssen aus weil sonnst die BackLEDs kein minus Potential bekommen an den Kathoden.

Valen
31.05.2011, 11:32
Mittlerweile habe ich die Vermutung, dass mein ASURO die Programme nicht mehr richtig durchspielt.
Zum test sollten die LEDs alle abwechselnd blinken, solange bis der ASURO ausgeschaltet wird.
Nach dem flashen, wie könnte es anders sein, leuchteten alle LED gleichzeitig. Natürlich tat sich dann nichts mehr.
Ich habe schon verschiedene Möglichkeiten mit return und while ausprobiert(an verschiedenen Stellen im Programm etc.)
leider blieb der Erfolg des Ganzen auf der Strecke.
Kann es vielleicht damit zusammen hängen, dass die Batterien leer sind oder kurz davor stehen?Ohne dein Programm gesehen zu haben können wir nicht Beurteilen ob es ein Software-Problem ist. Aber es ist möglich das den eingebaute Bootloader Programm eine zu niedrige Batteriespannung misst, und dann den StatusLED auf Rot schaltest. Dann soll auch biss abschalten "VL" gesendet werden über den IR-verbindung. Aber ich kann mich nicht erinnern ob alle der andere LEDs auch gleichzeitig angeschaltet werden. Weil das wurde den Batterie noch schneller leer machen. Das macht mir kein Sinn.

Tobias Stosius
31.05.2011, 11:45
Also im Grunde ist es egal welches Programm ich schreibe...
Als test nehmen ich mal ein aktuelles:


#include "myasuro.h"
#include "asuro.h"

int main()
{
Init();
EncoderInit();
while (1);
{
Go(300,150);
Turn(90,150);
}
return 0;
}



Bei diesem Beispiel leuchtet die StatusLED vom ASURO Grün und mehr tut sich nicht weder anstumpen noch drohen noch bitten oder betteln hilft. Stur wie ein Panzer der Kollege...

Bei dieser Form hier bewegt sich der ASURO ein mal nach vorne und dreht sich in die entsprechende Richtung und bleibt dann stehen, wieder leuchtet die LED Grün:

#include "myasuro.h"
#include "asuro.h"

int main()
{
Init();
EncoderInit();


Go(300,150);
Turn(90,150);

while (1);
return 0;
}

Valen
31.05.2011, 11:59
Also im Grunde ist es egal welches Programm ich schreibe...
Als test nehmen ich mal ein aktuelles:


#include "myasuro.h"
#include "asuro.h"

int main()
{
Init();
EncoderInit();
while (1);
{
Go(300,150);
Turn(90,150);
}
return 0;
}



Bei diesem Beispiel leuchtet die StatusLED vom ASURO Grün und mehr tut sich nicht weder anstumpen noch drohen noch bitten oder betteln hilft. Stur wie ein Panzer der Kollege...Doch ein Software Problemm! Also nicht egal:

while (1);

Das hier oben ist ein sehr Kompaktes Endloss-schleife. Asuro kommt hier nicht raus. Und weil am ende von den Init-funktion die StatusLED Grün schaltet ist. Macht er nichts weiter und Erklärt deine Erfindungen. Die {}-Klammern haben keine weitere Einfluss mehr auf den Ablauf von das Programm. Lössung: ; weg!



Bei dieser Form hier bewegt sich der ASURO ein mal nach vorne und dreht sich in die entsprechende Richtung und bleibt dann stehen, wieder leuchtet die LED Grün:

#include "myasuro.h"
#include "asuro.h"

int main()
{
Init();
EncoderInit();


Go(300,150);
Turn(90,150);

while (1);
return 0;
}

Genau so hier. Erst eine strecke mit Go, danach ein Drehung von eine bestimmte Winkel. Danach geht er Fest in ein Endloss-schleife. Diese Variant ist aber gut. Weil Asuro nimmer das Befehl return 0; ausführen soll. Lösung: die Go und Turn Funktion Eindinden in eine weitere While-schleife:


...
while (1)
{
Go(300,150);
Turn(90,150);
} // Ende von den While-endloss schleife

while (1); // Eine weitere, aber überflussige, endloss-schleife zur behebung das ausfuhren der return Befehl.

return 0;
} //Ende Main-Funktion

Ceos
31.05.2011, 12:13
while (1);

er schleift sich in einer leeren Schleife zu tode!

das Semikolon sagt ihm dass deine Schleife da beendet ist die geschweiften Klammern ignoriert er einfach!

Tobias Stosius
31.05.2011, 12:20
Oh man... Vielen Dank!!
Ich kenne mich noch nicht so 100%ig aus. Da mangelt es noch an
dem ein oder anderen Baustein.
Wenn ich das jetzt richtig verstanden habe sorgt das Semikolon dafür, dass die
Schleife beendet wird und der Teil der in geschweiften Klammern steht weg fällt.

Valen
31.05.2011, 12:26
Oh man... Vielen Dank!!
Ich kenne mich noch nicht so 100%ig aus. Da mangelt es noch an
dem ein oder anderen Baustein.
Wenn ich das jetzt richtig verstanden habe sorgt das Semikolon dafür, dass die
Schleife beendet wird und der Teil der in geschweiften Klammern steht weg fällt.Nein, die Semikolon gibt das ende an von was in dem Schleife ausgeführt werden soll. Weil da zwischen while(1) und den Semikolon nichts steht, macht er auch nichts in den Endloss-schleife.

while(1);
=
'Solange 1 (nicht gleich 0 ist), mache: Nichts ;'

Die Code zwischen geschweiften Klammern ist wirklich ein Teil von sein Programm (diese Code steht sogar wirklich in sein Flash-gehirn). Aber beim ablaufen kommt er dort einfach nicht.

Tobias Stosius
31.05.2011, 12:28
Jetzt hat's klick gemacht. Nochmal vielen lieben Dank. ich glaube ohne euch wäre ich jetz echt aufgeschmissen gewesen.

Valen
31.05.2011, 12:44
Ich hatte meine letzte Beitrag nog ein Bischen geändert gleichzeitig das du deine Beitrag gepostet hat.

Eine weitere Erklärung:

Entweder gibt es nur ein Befehl, oder nichts, gefolgt durch ein Semikolon, das jedes mal durch while wiederholt wird:



while (1) Sleep(10); // Wiederhole Sleep(10) für immer.

Oder es steht zwischen geschweifte Klammern, die nicht durch ein Semikolon gefolgt durften zu sein:


while(1) {
StatusLED(RED);
Sleep(72);
StatusLED(YELLOW);
Sleep(72);
StatusLED(GREEN);
Sleep(72);
} // Kein Semikolon benötigt, die steht schon hinter das letzte Befehl.