Hallo NomiS
Soweit ich's überblicke, sollte dein Code erstmal etwas optimiert werden :
--- Bei den vielen gleichen Ausgaben würde sich wohl eine Funktion ala
schreibeWert(text_parameter, wert_links, wert_rechts, text_einheit)
lohnen.
--- keine floats! Auch mit integern kann man prima rechnen, bzw. speichert man nicht so: float pie = 3.14; sondern int pie =314; und teilt nach der Rechnung das Ergebniss durch 100 (oder verzichtet ganz auf pi und schreibt direkt 314 in die Rechnung):
msright = (rightimpuls * ((Umfang*pie)/Muster))/(Zeit*1000);
wird dann zu
msright = (rightimpuls * ((Umfang*pie/100)/Muster))/(Zeit*1000);
oder, noch besser, man rechnet konstante Werte schon vorher aus:
int pie = 314; //15927; //pie
int Umfang = 12; //.0165920775; //
(38.25*pie); //Umfang in cm
int Muster = 12; //anzahl der Hell Dunkel übergänge
int pie_umfang_muster=pie*umfang/(Muster*100);
msright = (rightimpuls * pie_umfang_Muster / (Zeit*1000);
Was das allerdings soll, verstehe ich nicht ganz. Umfang ist doch schon pi*2r?
--- Warum nimmst du alle Odowerte mal 4? Du füllst nur mit zusätzlichen Nullen auf und vergleichst mit einem Wert, der auch zusätzliche Nullen hat. Lass die Multiplikationen weg, dann kannst du platzsparend und viel schneller mit 8Bit-Werten rechnen.(Der AVR ist ein 8Biter!):
unsigned char triggerleft = (((222-150)/2)+150); //Helldunkelwechsel linkes Rad
--- if(data[0]==triggerright)
Ähm, das verstehe ich auch nicht. Auf == sollte man bei Odowerten nicht prüfen, denn es könnte sein, das genau dieser Wert übersprungen wird. Was passiert eigentlich, wenn mehrmals hintereinander triggerlevel beim selben Segment der Codescheibe erkannt wird? Woran erkennst du das nächste Segment auf der Codescheibe? (data[0] war doch links, oder?)
---Vielleicht sollte man erst den Weg ausrechnen:
weg=impulse/anzahldercodescheibensegmente*umfang
Und dann die Geschwindigkeit:
geschw=weg/zeit
Die Beschleunigung ist dann die Geschwindigkeitsänderung und nicht ganz so einfach zu messen/zu berechnen und hier wohl nicht so sinnvoll.
--- Warum nennst du das "telemetrie"?
Das sind mal die gröbsten Punkte die mir auffallen. Wie ist denn dieses Programm entstanden? Hast du das am Stück eingegeben oder hast du die einzelnen Teile erstmal getestet und dann zusammengefügt?
Gruß
Mic
[Edit]
Oje:
for (speed=80;speed<=255;speed +=10) wenn speed schon >245 ist, muss die Schleife beendet werden.
rightimpuls--; negative Beschleunigung beim Abbremsen?
...
MotorSpeed(0,0);
return 0;}
Der ATMega8 hat 8kB Flashspeicher(Datenblatt)
Wohl kaum...Und geht das Programm bei jemandem?
Lesezeichen