PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : anfang einer kollisions-routine



malediction
13.01.2009, 23:56
nabend allerseits,

ich bin schon seit einiger zeit dabei, ein programm zu schreiben, mit dem der asuro kollisionen auswertet und dann wendet o.ä.

dazu hab ich angefangen, eine funktion zum wenden zu schreiben, in der ich nur gradzahl und richtung übergebe.

hier mein quelltext (nur von der funktion, rest folgt):


void wenden(int grad, char richtung) //funktion zum wenden
{
int degree=0; //variablen deklarieren, die ich brauche
char dir;

degree=grad; //übergabe der parameter an die internen variablen
dir=richtung;

if ((degree>=0)&&(degree<120)) { degree=degree*0,85; } //das hier hab ich nur für die anpassung gemacht,
else if ((degree>120)&&(degree<240)) { degree=degree*0,9; } //da mein asuro immer zu große winkel gefahren ist.
else if ((degree>240)&&(degree<=360)) { degree=degree*0,95; } //die werte hab ich experimentell ermittelt

if (dir=='r') {} //rechtskurve, alles wie gehabt
else if (dir=='l') { degree=degree*(-1); } //linkskurve, gradzahl mit -1 multiplizieren

Go(-80,200); //stück zurücksetzen
Turn(degree,200); //drehen
}



//aufruf der funktion sollte dann beispielsweise so aussehen:
wenden(90,'r');


mein problem ist jetzt, dass asuro zwar das stück rückwärts fährt, sich aber nicht wie gewollt dreht. er dreht sich gar nicht.
ich hab meinen fehler nicht finden können. vielleicht kann mir ja wer helfen.

danke schonmal,

grüße, malediction.

Willa
14.01.2009, 08:50
Hi!
Ich habe noch nie mit C gearbeitet, aber ist das Dezimalzeichen wirklich ein Komma...?

degree=degree*0,85
sollte das nicht heissen
degree=degree*0.85 ...?

p_mork
14.01.2009, 11:53
Wie mein Vorredner schon schrieb muss das ein Punkt und kein Komma in der Dezimalzahl sein, da sonst mit 0 multipliziert wird. Ausserdem ist degree ein integer, also ganzzahlig. Nimm entweder float als Datentyp oder multiplizier es zuerst mit 9 und teile dann durch 10, das ist dasselbe wie * 0.9.

MfG Mark

malediction
14.01.2009, 19:44
danke für die antworten. wer das mal ausprobieren.

das mit dem komma ist ja ma wieder ein schön blöder fehler #-o

und wenn ich den integer mit 0,9 multipliziere, rechnet er das doch normal und schneidet dann einfach den nachkommeterm ab oder nicht?!

malediction
14.01.2009, 21:41
so, hi nochmal.

also vielen dank für die tipps.
das klappt jetzt so, wie gewollt.

hier der code des gesamten programms:


#include "asuro.h"

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


while(1){
if (taster()!=0) {
BackLED(ON,ON);
StatusLED(RED);
wenden(90,'r');
} else {
BackLED(OFF,OFF);
StatusLED(GREEN);
fahren();
}
}


while (1);
return 0;
}

int taster(void)
{
int t1,t2;

while(1) {
t1=PollSwitch();
t2=PollSwitch();

if ((t1==t2)&&(t1==0b000001)) { return 6; }
else if ((t1==t2)&&(t1==0b000010)) { return 5; }
else if ((t1==t2)&&(t1==0b000100)) { return 4; }
else if ((t1==t2)&&(t1==0b001000)) { return 3; }
else if ((t1==t2)&&(t1==0b010000)) { return 2; }
else if ((t1==t2)&&(t1==0b100000)) { return 1; }

else if ((t1==t2)&&(t1!=0b000001)&&(t1!=0b000010)&&(t1!=0b000100)&&(t1!=0b001000)&&(t1!=0b010000)&&(t1!=0b100000)&&(t1!=0b000000)) { return 7; }

else { return 0; }

}
}

void wenden(int grad, char richtung)
{
int degree=0;
char dir;

degree=grad;
dir=richtung;

if ((degree>=0)&&(degree<120)) {
degree=degree*84;
degree=degree/100;
}
else if ((degree>120)&&(degree<240)) {
degree=degree*92;
degree=degree/100;
}
else if ((degree>240)&&(degree<=360)) {
degree=degree*98;
degree=degree/100;
}

if (dir=='r') { BackLED(OFF,ON); }
else if (dir=='l') {
BackLED(ON,OFF);
degree=degree*(-1);
}

Go(-80,200);
Turn(degree,200);
BackLED(OFF,OFF);
}

void fahren(void)
{
Go(10,120);
}


jetzt ist es allerdings so, dass asuro immer ein kleines stückchen fährt (halt die 10, die ich bei fahren() angegeben hab) und dann aber kurz pausiert.
ich dachte eigentlich nicht, dass das abfragen der taster und was da noch dazwischen passiert so lang dauert, dass keine flüssige fahrt zustande kommt...

was allerdings noch ein viel größeres problem ist, ist dass wenn ein taster gedrückt ist, er nur anfängt rückwärts zu fahren. er fährt und fährt und fährt rückwärts aber er bleibt nicht mehr stehen und wendet auch nciht.
und das obwohl meine wenden() funktion jetzt hinhaut. (hab sie mit verschiedensten fällen getestet.

ich kann mir nicht erklären woran das liegt...
kann mir wer helfen?!

danke schonmal.

Valen
15.01.2009, 22:18
Einfach, naja, wenn du die schaltung zeichnung versteht... odometrie messungen und backleds anschalten gehen nicht zusammen. Die leiterbahnen sind miteinander verknupft. Hmm, vieleicht wirken die messungen schon ein bisschen (kompliziertere spannungsteiler), aber die odoleds sind sicher ausgeschalted, und dan wird kein licht auf die scheiben schienen. Du sollte mit etwas anderes 'richtung signalen' geben.

malediction
15.01.2009, 22:24
achsooooooooooooooooooooooooooo...

das werde ich mirgen mal probieren... danke! :)

Valen
15.01.2009, 22:27
Bitte lies meinen post nochmal. Habe etwas da bei geschrieben.

malediction
16.01.2009, 07:25
ja das macht schon sinn.

hab mir den schaltplan nicht bis ins letzte detail angeschaut.
danke noch mal

malediction
16.01.2009, 10:22
danke valen, für deinen tipp.
jetzt funktioniert es so wie gewünscht. es lad wirklich an den backleds.

hab mich da auch reingefuchst und wenn man sich den schaltplan einfach mal anschaut macht das auch voll sinn.