Forum: Mikrocontroller und Digitale Elektronik Divison


von Stephan Haringer (Gast)


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

von A.K. (Gast)


Lesenswert?

1: Liegt vermutlich ausserhalb des Bereichs, der mit OUT erfasst werden
kann. STS verwenden.

von Detlef _. (detlef_a)


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

von Profi (Gast)


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

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.