Divison

Gast #409772
Lesenswert?
• ▲
▼
Hallo
Habe 2 Fragen zum programmieren mit Avr Studio:
1.
beim atmega8 setze ich das tccr1a,b z.b. folgendermaßen:
.def temp = r16
...
...
ldi temp, 0x42
out tccr1b, temp

warum kann ich das beim mega 48 nicht so machen?
immer fehler in Zeile: out tcc......

2.
wie kann ich ein 16 bit register mit 360 dividieren? / oder mit dem
Kehrwert multiplizieren

grüße Steff
#409774
Lesenswert?
• ▲
▼
@2

So:
x/360 = (128*x-32*x-4*x-x)/32768 , naja fast, da treten Fehler auf.
Du muß mit 32Bit rechnen. Die Multiplikationen und Divisionen mit
Potenzen von 2 mit Schieben machen.

Oder so, das ist genau:
pp=128;mm=360*128;fak=0;
for(k=0:6)
   if(x>mm){x=x-mm;fak=fak+pp;}end;
   pp=pp/2;mm=mm/2;
end

Du muß aber nochmal genau draufkucken, ob das so stimmt, auch für
negative x.

Cheers
Detlef
Gast #409775
Lesenswert?
• ▲
▼
Der "16-Bit-Kehrwert" von 360 ist 65536/360=182,04444 (0xB6).
Also multiplizierst Du mit 0xB6 und verwendest nur die oberen 16 Bits
des 32-Bit-Ergebnisses:
z.B. x=4660=0x1234
x/360=12,94444
x*182=848120=0x000CF0F8, 0x000C = 12

Wenn Du runden willst, addierst Du einfach das Bit15 zum Ergebnis.
hier ist es das höchste Bit des linken Fs, ist gesetzt, also ist das
gerundete Ergebnis 13.

Wenn Du die Nachkommastellen auch noch ausgeben willst, multipliziertst
Du das 0xF0F8 * 0x2710 = 24C4D780 und gibst die oberen 16 Bits
(aufgerundet 0x24C5) aus (,9413).

n.b. 0x2710 = 10000

Das ist nicht ganz genau, weil wir oben das 182,04444 abrundeten.
Besser ist es, mit 0xB60B (256*182,04444) zu multiplizieren und nur die
oberen 8 Bits des 32-Bit-Ergebnisses zu verwenden. Die reichen aus, da
das maximale Ergebnis 65535/360=182,0416667 sein kann.

Das o.g. Beispiel:
0x1234*0xB60B=0x0CF1C03C
              0x0C=12
                0xF1C0*0x2710=0x24E35C00
                              0x24E3=9443
Ausgabe ist dann   12,9443

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.