PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Projekt klappt nicht



hansebanger
18.06.2009, 14:52
Hallo!
Wir haben hier ein Projekt, das wir selbst programmiert haben und für uns logisch erscheint...allerdings macht unser Roboter nicht das was wir wollen!!!

Unser Projekt: Der ASURO soll eine Kurve fahren, an die er im ersten Durchgang anstößt...im zweiten Durchgang soll er sie perfekt nehmen...

Dies wollen wir erreichen, das der ASURO im ersten Durchgang die "Wechsel von Hell-Dunkel" bei der Odometrie zählt und im zweiten Durchgang nach einer bestimmten Anzahl die Kurve fahren (Wert durch Abzug von erstem Durchgang)!!!


MfG,
Hansebanger vs. Bangboy
#include "asuro.h"
void SleepEx(short);
#define STOP 120
int main(void)
{

unsigned char taste;
unsigned int data[2],dato[2];
int i,S,DrehR,DrehL;

Init();

while (1==1)
{

FrontLED(ON);
S=0;
MotorDir(FWD,FWD);
MotorSpeed(100,100);


// Weite messen
OdometrieData(data);

if (data[0]>900) {
(i++);}



do {
taste=PollSwitch();
if (taste > 7)
{
DrehR=i;
MotorSpeed(0,0);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(0,100);
SleepEx(15);
MotorSpeed(0,0);
SleepEx(10);
MotorDir(FWD,FWD);
MotorSpeed(105,100);
}
else if((taste < 7) && (taste > 0) )
{
DrehL=i;
MotorSpeed(0,0);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(100,0);
SleepEx(15);
MotorSpeed(0,0);
SleepEx(10);
MotorDir(FWD,FWD);
MotorSpeed(105,100);
}

// Stop am Ende
LineData(dato);
if ((dato[0] < STOP) && (dato[1] < STOP))
{
MotorSpeed(0,0);
S=1;
}



if (S=1) {

while (i<(DrehL-20))
{
MotorSpeed(105,100);
}

if (i>(DrehL-20))
{
MotorSpeed(120,20);
}
}



}


while(1);

}
}
void SleepEx(short zsecnds)
{
int wdhlg=zsecnds/.03;
int i=0;
while (i<wdhlg)
{
Sleep(216);
i++;
}
}

Valen
18.06.2009, 16:28
Erst mahl, du verwendest den Backled funktion zusammen mit dem Odometrie messungen. Das kan nicht. Wenn die backleds an gehen, gehen die odoleds aus. Du muss die backleds wieder ausschalten und odoleds wieder anschalten vordem du die odometrie-messungen machst. Automatisch geht das einfach nicht. Sonnst werden die dunkel/hell werten auch nicht bemerkst.

Zweitens, bist du sicher das die dunkelheit wert höher kommt als 900 in deiner Asuro?

Drittens, die i variable in deinen main funktion is irgendeiner zahler fur DrehL und DrehR (aber erklar das mal ein bisschen besser was das genau vorhast damit, habe keine ahnung warum oder wie das sin macht). Aber du hast diesen i wert niemahls auf einer anfangswert gesetzt. Das konnte jeder art von 'kwatsch' wert haben wenn Asuro angeschaltet wird. Wenn einer andere wert darauf verlasst wird, ist Asuro total verwirrt. Geb die andere variabelen auch mahl einer anfangswert wenn sie nicht erstens mit einer funktion zugewesen werden.

hansebanger
20.06.2009, 11:07
Okay danke, dass wusste ich nicht das die BackLeds und die OdoLeds zusammen nicht gehen. Muss man die OdoLeds dann extra einschalten oder geht das automatisch wenn die Odometrie ausgelesen wird und mit welchem Befehl mach ich das ?

Der Dunkelheitswert könnte auch ein problem sein danke ich werde das gleich mal abtesten.

Also die Variable i soll zählen wie oft die Odometrie von Hell auf Dunkel wechselt und wenn der Asuro das erste mal die Kurve fährt unter DrehL oder DrehR abgespeichert werden je nach Rechts- oder Linkskurve.

Denkst du das mit dem Zählen könnte so Funktionieren ?

Vielen Dank für deine Antwort !!

MFG,
Hansebanger vs. Bangboy

Valen
20.06.2009, 12:57
Oops, ich habe mich geirrt mit dem odoleds/backled. Ich hatte noch die erweiterten lib in meiner kopf. Das ist wirkt nicht auf dem gleichen weg. Die leute von Arexx oder DLR haben das schon gut (aber nur einfach) programiert in dem orginalem lib. Die backleds un odoleds schalten gut ab un an wenn du die funktionen OdometrieData bsw. BackLED benutzt. Aber zusammen gebrauchen geht nochstehts nicht. Das is ein hardware-fakt laut den schaltplan. (leiterbahnen sind verknupft) Einfache losung ist nicht die backleds an haben wenn du fahrst mit odometrie messungen. Sie sehen auch aus wie bremslichten, nicht!?!

Das an- und abschalten von den Odoleds steht am ende von Asuro.h. Das wird gemacht mit DEFINE ubersetzungen. Nur ODOMETRIE_LED_ON oder ODOMETRIE_LED_OFF in deiner programme setzen wenn du das mochtest. Den compiler (oder eigentlich den C pre-prozessor) macht da Port commandos von. Und die sind etwas cryptishc zu lesen.

Backleds werden geschalted mit den BackLED(,) funktion. Aber du hast das schön verstanden. Wie das programiert is steht in Asuro.c. Leider auch ein bisschen cryptisch wenn du die register nahmen der Atmega CPU nicht kennst. Dafur muss man den Atmega8 cpu anleitung zur seite haben. (pdf in Englisch auf der CD oder in einer link hier oben im forum)

Die code ist vielleicht schwierig zu verstehen fur ein anfanger, aber mit ein gutes C-sprache buch lernt man vast was dar im asuro.c und asuro.h steht.

Ich denke das problehm ist auch den struktur von deine Main programme. In dem while-schleife macht du nur ein odometrie messung and das linkem Rad pro taster-abfrage. Aber diesen taster abfrage muss doch nur am ende der strecke? Denn motorspeed wechselingen (stat tasten prellung) werden auch gleich so oft ausgefuhrt. Das macht keinen sinn fur odometrie messungen der strecke. Du hast das auch mit einer 'do' commando gemacht, aber dar ist offensichtlich keine while am ende. (mach mahl bestimmte ein-spring abstanden mit leerzeichen fur den schleifen und If commandos, das ist besser zu lesen. Programmers Notepad sollte auch dabei hilfen) Den compliler ist ok mit nur ein Do, weil den while optionel ist. (nicht sicher daon) Aber das hat schon folgen fur deine programme ablauf. Und mit das warten von 25 sekunden (mit SleepEx) wenn da eine taster geprellt ist, ist das schon eine sehr lange durchlauf fur odometrie messungen mit drehende motoren.

Dan sind wir bei "// Stop am Ende". Aber deine Asuro ist noch immer in seiner ersten durchlauf den grossen erste while-schleife. Das stimmt nicht. Er ist nur ein wenig auf dem weg (naja, wenn keiner taste geprellt is, sonnst ist es 25 sekunden später). Dann misst du den linie helligkeit, und nimmt gass weg wenn Asuro nicht auf den linie steht (beleuchting weniger als Stop-wert) Das macht sin.

Aber wenn er denkt am ende zu sein geht er in einer while-schleife, wo drin er nur den motorspeed auf einer bestimmte wert. Das problem mit diesen while schleife (und den danach auch) is: (i<(DrehL-20)). Ich hab schon gesagt das die i variablen jeder kwatsch wert haben konnte wen sie nicht ein anfangswert hat. Das gilt auch fure DrehL (und DrehR, aber dies wirdt ignoriert in deiner program). Aber wenn einiger den Rechter taster gedruckt werden (diese sind die niedrige bits der taster wert) wird DrehL gleich i. Und mit die logische stellung oben ist das möglich einer endloss-schleife geworden. Das hangt ab von den anfangs-kwatsch wert von i und DrehL, und wann die taster angeprellt sind.

Wenn er nicht in diesen endloss-schleife reingeht ist er endlich am ende der do-blocke. Und wiederholt diesen do-block endloss (ahh, dar ist den endlich der verlierten klammern-mit-while von do :) ) Aber den odometrie messung steht gerade for dem do-block. Und wird also nicht wiederholt.

Konklussion: nur immer ein mal die odometrie wert gemessen in das ganze program. Und moglich bleibt er irgendwo hangen in seine gedanken.

Wenn ich programmier-aufgaben gemacht habe musste ich sie erst anschaulig machen mit den folgende diagrammen. Und nur danach den c-code dafur zu bedenken wenn den ganzen durchlauf fur dich sinn gemacht hat. Vielleicht hilfst dir auch.

Fluss diagram:

http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm

http://de.wikipedia.org/wiki/Programmablaufplan

damaltor
20.06.2009, 16:40
leeren beitrag von Valen entfernt.

20.06.2009,17:40

Valen
20.06.2009, 17:44
Danke, Damaltor