a) Du hältst den Motor nie an.
b) Nach return ist dein Programm zuende, was auch immer du danach schreibst, wird NIEMALS ausgeführt werden.
mfG
Markus
a) Du hältst den Motor nie an.
b) Nach return ist dein Programm zuende, was auch immer du danach schreibst, wird NIEMALS ausgeführt werden.
mfG
Markus
In C wird die Hauptfunktion main() normalerweise von einem übergeordneten Betriebssystem aufgerufen und über return springt das Programm zum aufrufenden Punkt zurück. Dieser Rücksprungpunkt ist bei AVR-GCC aber nicht defininiert, deshalb springt das Programm ins Nirwanwa, wenn es mit return beendet wird.
Ein Programm könnte etwa so aussehen:
(ungetestet)PHP-Code:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
unsigned int ldata[2];
Init();
FrontLED(ON);
Sleep(255); // warten bis FrontLED leuchtet
LineData(ldata); // ADC auf Betriebstemperatur bringen
// MotorDir(FWD,FWD); // Init() setzt MotorDir schon auf FWD,FWD
MotorSpeed(150,150); // losfahren
while(1)
{
LineData(ldata); // Liniensensoren einlesen
if (ldata [0] > ldata [1]) // links heller, nach rechts fahren
{
MotorSpeed(200,100);
StatusLED(RED);
}
else
{
MotorSpeed(100,200); // rechts heller (oder gleich), nach links fahren
StatusLED(YELLOW);
}
if (PollSwitch()>0) // Taster betätigt?
{
MotorSpeed(0,0); // wenn ja, dann stop
StatusLED(GREEN);
BackLED(ON,ON);
while(1); //Stop und Ende
}
}
return(0); // darf nie ausgeführt werden!
}
Das funktioniert aber nur, wenn PollSwitch() richtig arbeitet.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
ok gut, aber wie müsste es denn aussehen, wenn ich a beibehalten soll also a schon auf 0 gesetzt werden muss?? Denn mei eigentliches Programm sieht so aus: Er soll einer Linie folgen, bei Kollision einen Becher (Servo über Backled angeschlossen) heben, ich untersuchen ob schwarz oder weiß (Odometiesensor nach vorn gelegt) nach links oder Rechts fahren je nachdem welche Farbe, linie Folgen bis Kollision nochmals drehen und auf ursprüngliche Linie fahren.
Code:#include "asuro.h" #include "myasuro.h" int main(void) { unsigned int odata[2]; unsigned int ldata[2]; Init(); int a; int b; int c; int d; int e; int f; FrontLED(ON); while(1) { MotorDir(FWD,FWD); a=1; c=1; d=1; while(a) { LineData(ldata); if (ldata [0] > ldata [1]) { MotorSpeed(200,100); } else if (PollSwitch()>0) { a=0; } else { MotorSpeed(100,200); } } return(0); for (b=0; b<40; b++) { BackLED(OFF,ON); Msleep(1); BackLED(OFF,OFF); Msleep(19); } } { OdometrieData(odata); if (odata[0] > 500) { { MotorSpeed(0,200); Msleep(1000); MotorSpeed(200,200); } while(c) { LineData(ldata); if (ldata [0] > ldata [1]) { MotorSpeed(200,100); } else if (PollSwitch()>0) { c=0; for (f=0; f<40; f++) { BackLED(OFF,ON); Msleep(2); BackLED(OFF,OFF); Msleep(18); } } else { MotorSpeed(100,200); } } return(0); } { MotorSpeed(100,200); Msleep(1000); MotorSpeed(200,200); } OdometrieData(odata); if (odata[0] < 500) { { MotorSpeed(200,0); Msleep(1000); MotorSpeed(200,200); } while(d) { LineData(ldata); if (ldata [0] > ldata [1]) { MotorSpeed(200,100); } else if (PollSwitch()>0) { d=0; for (e=0; e<40; e++) { BackLED(OFF,ON); Msleep(2); BackLED(OFF,OFF); Msleep(18); } } else { MotorSpeed(100,200); } } return(0); } { MotorSpeed(100,200); Msleep(1000); MotorSpeed(200,200); } } return(0); }
Geändert von radbruch (19.06.2011 um 17:22 Uhr) Grund: Code-Tag eingefügt
Dazu benötige ich Variablen ich habe die einzelnen Programmteile getestet und sie funktionieren aber eben nicht das mit den Tastern die Variablen werden nicht auf 0 gesetzt die whileschleifen werden nicht verlassen
Hallo
Großes Lob, weil dein Programm fehler- und warnungsfrei übersetzt werden kann. Großer Tadel: Wo sind die Kommentare?
Ich habe dein Programm nochmals umformatiert:
Man sieht nun deutlich die extreme Verschachtelung und die Wiederholungen der einzelnen Programmteile. Vielleicht solltest du mal den Ablauf analysieren:PHP-Code:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
unsigned int odata[2];
unsigned int ldata[2];
int a;
int b;
int c;
int d;
int e;
int f;
Init();
FrontLED(ON);
while(1)
{
MotorDir(FWD,FWD);
a=1;
c=1;
d=1;
while(a)
{
LineData(ldata);
if (ldata [0] > ldata [1])
{
MotorSpeed(200,100);
}
else if (PollSwitch()>0)
{
a=0;
}
else
{
MotorSpeed(100,200);
}
}
return(0);
for (b=0; b<40; b++)
{
BackLED(OFF,ON);
Msleep(1);
BackLED(OFF,OFF);
Msleep(19);
}
}
{
OdometrieData(odata);
if (odata[0] > 500)
{
{
MotorSpeed(0,200);
Msleep(1000);
MotorSpeed(200,200);
}
while(c)
{
LineData(ldata);
if (ldata [0] > ldata [1])
{
MotorSpeed(200,100);
}
else if (PollSwitch()>0)
{
c=0;
for (f=0; f<40; f++)
{
BackLED(OFF,ON);
Msleep(2);
BackLED(OFF,OFF);
Msleep(18);
}
}
else
{
MotorSpeed(100,200);
}
}
return(0);
}
{
MotorSpeed(100,200);
Msleep(1000);
MotorSpeed(200,200);
}
OdometrieData(odata);
if (odata[0] < 500)
{
{
MotorSpeed(200,0);
Msleep(1000);
MotorSpeed(200,200);
}
while(d)
{
LineData(ldata);
if (ldata [0] > ldata [1])
{
MotorSpeed(200,100);
}
else if (PollSwitch()>0)
{
d=0;
for (e=0; e<40; e++)
{
BackLED(OFF,ON);
Msleep(2);
BackLED(OFF,OFF);
Msleep(18);
}
}
else
{
MotorSpeed(100,200);
}
}
return(0);
}
{
MotorSpeed(100,200);
Msleep(1000);
MotorSpeed(200,200);
}
}
return(0);
}
Folge_Line_bis_Becher_erkannt_wird();
Schliesse_Greifer();
Links_oder_Rechts_abbiegen();
Folge_Line_bis_Becher_erkannt_wird();
Öffne_Greifer();
Das sollte es im Wesentlichen sein. Es soll wohl sowas werden:
btw: return in main() beendet das Programm sofort!!!
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ja sowas in der Art soll es werden, wusste ich gar nicht das es den Film auch gibt... Hab aber nicht abgekupfert... Was kann ich jetzt machen, dass es was wird? was könnte es verbessern? denn das ist ja genau das gleiche Programm oder? soll ich wie du gesagt hast die Kommentare hinzufügen oder was genau? Aber das ändert ja nichts an der Funktionsweiße...
Wie schon zu sehen: der Greifer bewegt durch den Servo und das schwarze Kästchen vorne, indem der Sensor und eine blaue Led zur Helligkeitsmessung drin sind, dank diesem Kästchen werden fast immer richtige Messergebnisse egal bei welcher Umgebungshelligkeit gemessen.
Ne, Kommentare ändern natürlich nichts an der Funktionsweise, aber sie helfen auch dir selbst dein eigenes Programm zu verstehen. Ich hab' mal versucht deine Gedanken in ein Programm zu packen:
Allerdings kann ich nicht sagen, ob das so funktioniert.PHP-Code:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
unsigned int data[2]; // Speicherplatz für Odo- und Linedaten
int i; // Integervariable zur freien Verwendung
Init();
FrontLED(ON); // Linienbeleuchtung einschalten
Sleep(255); // warten bis LED volle Helligkeit erreicht hat
LineData(data); // ADC anwärmen
while(1)
{
MotorSpeed(200,200); // und losfahren
while(PollSwitch() == 0) // folge der Linie bis zum ersten Hinderniss
{
LineData(data);
if (data [0] > data [1])
MotorSpeed(200,100);
else
MotorSpeed(100,200);
Sleep(100); // Regelung etwas dämpfen
}
MotorSpeed(0,0); // anhalten weil Hinderniss erkannt wurde
Msleep(500);
for (i=0; i<40; i++) // Becher aufnehmen (Servoimpuls 40x senden)
{
BackLED(OFF,ON);
Msleep(1); // Impulslänge 1ms
BackLED(OFF,OFF);
Msleep(19); // Impulspause 19ms
}
OdometrieData(data); // Becherfarbe ermitteln
if (data[0] > 500)
{
MotorSpeed(0,200); // hell bedeutet nach links abbiegen
StatusLED(YELLOW);
}
else
{
MotorSpeed(200,0); // dunkel bedeutet nach rechts abbiegen
StatusLED(RED);
}
Msleep(1000); // eine Sekunde drehen
StatusLED(GREEN); //fertig
MotorSpeed(200,200); // weiterfahren (und hoffen, dass die Linie noch da ist ;)
while(PollSwitch() == 0) // folge der Linie bis zum zweiten Hinderniss
{
LineData(data);
if (data [0] > data [1])
MotorSpeed(200,100);
else
MotorSpeed(100,200);
Sleep(100);
}
MotorSpeed(0,0); // nochmals anhalten
Msleep(500);
for (i=0; i<40; i++) // und Becher wieder ablegen
{
BackLED(OFF,ON);
Msleep(2); // Impulslänge 2ms
BackLED(OFF,OFF);
Msleep(18); // Prima!
}
// Vermutlich sollten wir jetzt nochmals drehen. Da wir aber vergessen haben,
// welche Farbe der Becher hatte, wissen wir nicht, wohin wir drehen sollen ;)
}
return(0);
}
Schicker Greifer. Irgendwo habe ich den auch schon mal gesehen ;)
Gruß
mic
Edit: Ich vermute, hell und dunkel für die Becherfarbe sind vertauscht...
Geändert von radbruch (19.06.2011 um 20:14 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo, also vielen Dank das funktioniert schon ganz gut, nur am ende fährt der Asuro wild durch die gegend und betätigt die ganze Zeit den Greifer, aber soweit ist das ganz gut, ich mache jetzt einfach wieder Odata und Ldata daraus.. Noch eine Frage an der Stelle, kann ich die Odata später nochmal aufrufen oder soll ich einfach neu messen lassen??
Vielen Dank
Lesezeichen