Hi!
Ich habe noch nie mit C gearbeitet, aber ist das Dezimalzeichen wirklich ein Komma...?
sollte das nicht heissendegree=degree*0,85
degree=degree*0.85 ...?
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):
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.Code: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');
ich hab meinen fehler nicht finden können. vielleicht kann mir ja wer helfen.
danke schonmal,
grüße, malediction.
Hi!
Ich habe noch nie mit C gearbeitet, aber ist das Dezimalzeichen wirklich ein Komma...?
sollte das nicht heissendegree=degree*0,85
degree=degree*0.85 ...?
Viele Grüße, William
-> http://william.thielicke.org/
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
danke für die antworten. wer das mal ausprobieren.
das mit dem komma ist ja ma wieder ein schön blöder fehler
und wenn ich den integer mit 0,9 multipliziere, rechnet er das doch normal und schneidet dann einfach den nachkommeterm ab oder nicht?!
so, hi nochmal.
also vielen dank für die tipps.
das klappt jetzt so, wie gewollt.
hier der code des gesamten programms:
Code:#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.
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.
achsooooooooooooooooooooooooooo...
das werde ich mirgen mal probieren... danke!
Der Optimist: \"Das Glas ist halb voll.\"
Der Pessimist: \"Das Glas ist halb leer.\"
Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"
Bitte lies meinen post nochmal. Habe etwas da bei geschrieben.
ja das macht schon sinn.
hab mir den schaltplan nicht bis ins letzte detail angeschaut.
danke noch mal
Der Optimist: \"Das Glas ist halb voll.\"
Der Pessimist: \"Das Glas ist halb leer.\"
Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"
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.
Der Optimist: \"Das Glas ist halb voll.\"
Der Pessimist: \"Das Glas ist halb leer.\"
Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"
Lesezeichen