Rechenfehler bei Multiplikation und Division in bestimmten Zahlenbereichen

Hallo Zusammen,

ich bastel mir gerade ein kleines Programm zusammen, welches Rechtecksignal für eine Schrittmotorendstufe ausgibt.

Klar, gibts schon.. aber ich wollt mich mal probieren.. Die Rampe zum Anfahren funktioniert ja auch schon..

Mein Problem gerade ist, dass er sich schlicht verrechnet... Und meines erachtens bin ich noch locker im Zahlenbereich von long:

void movemm(int mm){
long steps=mm*spr*wayofstep/p;
Serial.println(" ");
Serial.println("mm:");
Serial.println(mm);
Serial.println("spr:");
Serial.println(spr);
Serial.println("p:");
Serial.println(p);
Serial.println("wayofstep");
Serial.println(wayofstep);
Serial.print("steps in movemm: ");
Serial.println(steps);
//ramp(steps);

Der Serielle Monitor haut folgendes raus..

mm:
2
spr:
200
p:
2
wayofstep
4
steps in movemm: 800 -->richtig

mm:
4
spr:
200
p:
2
wayofstep
4
steps in movemm: 1600 -->richtig

mm:
64
spr:
200
p:
2
wayofstep
4
steps in movemm: -7168 -->falsch, richtig wäre 25600

mm:
100
spr:
200
p:
2
wayofstep
4
steps in movemm: 7232 -->falsch, richtig wäre 40000

mm:
122
spr:
200
p:
2
wayofstep
4
steps in movemm: 16032 -->falsch, richtig wäre 48800 

mm:
85
spr:
200
p:
2
wayofstep
4
steps in movemm: 1232 -->falsch, richtig wäre 34000

Hat da jemand ne Idee?

Viele Grüße und vielen Dank schonmal im voraus!

Problem kurz nach dem Posting gelöst -.- Die anderen Variablen waren vom Typ int.. Hab nun alle auf long geändert.. Funktioniert!

Lass mich raten. spr und wayofstep sind auch als int oder unsigned int deklariert. Damit hast du einen Integer Überlauf.

Korrekt:

long steps= (long)mm*spr*wayofstep/p;

oder:

void movemm(long mm)
{
}

EDIT: Du musst nur eine der Variablen auf long bringen. Ein einfacher Cast reicht auch, d.h. die Variablen selbst müssen als nicht unbedingt long sein. Hier bietet sich auch einfach an den Datentyp des Funktionsparameters auf long zu ändern. Dann kann man da auch einen int übergeben und es stimmt trotzdem

long * int = long int * int = int

Und ist wird erst mal in int gerechnet. Der Datentyp der Variablen der du später das Ergebnis zuweist ist da irrelevant.

Danke Serenifly!