www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Berechnung geht schief


Autor: Samuel Rapp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Samuel Rapp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

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

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

Das ist aber das, was du im Moment rechnest, da + stärker bindet als >>.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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?

Autor: Samuel Rapp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke yalu, das war genau der richtige tip

Grüsse
Samuel

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.