Forum: Mikrocontroller und Digitale Elektronik Berechnung geht schief


von Samuel Rapp (Gast)


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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Was ist denn das fuer nen furchtbarer Ausdruck... ausserdem: Vorzeichen 
zu schieben is auch nich so der Hit, "arithmetisches shift" heisst Dein 
Freund.
Was hast Du ueberhaupt vor?

von Samuel Rapp (Gast)


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

von yalu (Gast)


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 >>.

von yalu (Gast)


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?

von Samuel Rapp (Gast)


Lesenswert?

danke yalu, das war genau der richtige tip

Grüsse
Samuel

von Simon K. (simon) Benutzerseite


Lesenswert?

Der Compiler sollte außerdem so schlau sein und das /128 in die 
schnellste Version umzubauen (shifts).

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.