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
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?
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
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 >>.
> 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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.