Berechnung geht schief

Gast #893822
Lesenswert?

Hallo Folgende berechnung geht schief bei benutzung der KEIL µVision 3 
Umgebung:

//PWMCH2 ist controller register
signed long m1 = 0;
signed long c1 = 0;

PWMCH2 = -(short)(((0xFFFFFFFF-m1+1) * PWMDAT0)>>7 + c1)


0xFFFFFFFF-m1+1 ergibt in meinem Aktuellen Beispiel richtigerweise den 
Wert 0x40
PWMDAT0 ist 0x04A7
c1 beträgt 0x00000005
(0xFFFFFFFF-m1+1) * PWMDAT0>>7 ergibt noch richtigerweise den Wert 
0x253,
wenn jdeoch noch c1 hinzuaddiert ist das Ergebnis 0xFFEE

Wieso das wo liegt der Fehler?

Grüße

Samuel
Gast #893840
Lesenswert?

0xFFFFFFFF-m1+1 benötige ich um das Vorzeichen von m1 zu ändern.
der shift um 7 ist dazu da, um durch 128 zu teilen (ist notwendig, da 
normale Divisionen auf dem AduC70xx erschreckend langsam sind).

PWMCH2 ist ein dutycycle register der PWM Einheit, PWMDAT0 ist des 
frequenzregister. ich berechne also aus der frequenz und ein paar 
anderen Parametern (m1, c1) den Duty Cycle
Gast #893855
Lesenswert?

Ich habe zwar den Ausdruck und was du damit bezewcken möchtest nicht 
ganz
verstanden, aber ich vermute, dass du dieses willst:
1
PWMCH2 = -(short)((((0xFFFFFFFF-m1+1) * PWMDAT0)>>7) + c1)

und nicht dieses:
1
PWMCH2 = -(short)(((0xFFFFFFFF-m1+1) * PWMDAT0)>>(7 + c1))

Das ist aber das, was du im Moment rechnest, da + stärker bindet als >>.
Gast #893862
Lesenswert?

> 0xFFFFFFFF-m1+1 benötige ich um das Vorzeichen von m1 zu ändern.

Wieso schreibst du statt dessen nicht einfach -m1? Das macht exakt das
Gleiche, und jeder erkennt, was beabsichtigt ist :)

Und wieso schreibst du für den gesamten Ausdruck nicht einfach
1
PWMCH2 = (m1 * PWMDAT0 >> 7) - c1;

Das macht fast das Gleiche wie der ursprüngliche Ausdruck (mit den
anders gesetzten Klammern), nur dass das Ergebnis ab- statt
aufgerundet wird. Aber ist das schlimm?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren