Forum: Mikrocontroller und Digitale Elektronik [gcc] Division durch Multiplikation, 16bit


von Henne (Gast)


Lesenswert?

Moin,

Derzeit macht mir folgendes Problem Kopfzerbrechen:

Ein Wert soll mit einer Auflösung von 16bit von 0..Max eingestellt 
werden. Leider scheint der übliche Weg über Multiplikation und 
anschließendes Schieben hier zu hakeln:

uint32_t tmp= (MulH<<8) +MulL;  //bilde 16bit Multiplikator
X.Soll= (tmp * Max)>>16;

X.Soll und Max sind uint16_t.

Schon das Bilden des Multiplikators scheint zu mislingen, da MulH= 0xFF 
und MulL= 0xFF bereits tmp= 0xFFFFFFFF ergibt...

Für eine Idee wäre ich echt dankbar.

Viele Grüße,
Hendrik

von Matthias L. (Gast)


Lesenswert?

Überlauf!

Du musst MulH und MulL als uint32_t deklarieren
1
uint32_t tmp= ( (uint32_t)MulH<<8) + (uint32_t)MulL;  //bilde 16bit Multiplikator

von Gast (Gast)


Lesenswert?

was für ein Typ ist MulH?
uint8?
dann gäbe (MulH<<8) für beliebige Werte immer 0x00, oder?

von Henne (Gast)


Lesenswert?

MulL und MulH sind uint8.

Mal schaun...
Hendrik

von Johannes M. (johnny-m)


Lesenswert?

Henne wrote:
> MulL und MulH sind uint8.
Autsch! Dann siehe Matthias' Posting...

von Henne (Gast)


Lesenswert?

Danke, Mathias. Das hatte ich wirklch verpeilt...
Der 2-Achsen DMX-Stepper läuft jetzt schon mal - fehlt noch Mikroschritt 
:-)

Hendrik

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.