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

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