www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Divison


Autor: Stephan Haringer (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Detlef _a (detlef_a)
Datum:

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

Autor: Profi (Gast)
Datum:

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

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.