mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16bit Zahl Shiften beim ATMega8 (8bit MCU)


Autor: Jan Purrucker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

ich habe folgendes Problem:
Ich lade eine 16bit Zahl in zwei Register (Highbyte und Lowbyte)
Diese möchte ich nun mit dem Befehl lsl (logical shift left)
verschieben. Allderdings ist die Zahl in zwei Bytes, der Befehl lsl
lässt jedoch sich nur auf ein Register anwenden.
Hat jemand zu diesem Problem eine Lösung?

Hier noch kurz der Assembler-Code Auszug:

ldi r16, LOW(10000)
ldi r17 HIGH(10000)

Das gleiche Problem stellt sich dann z.B. bei den Befehlen add
(Addieren) oder sub (Subtrahieren).
Das ganze brauche ich für eine Multiplikationsroutine von zwei 16 bit
Zahlen.
Die ApNote AVR200 oder www.avr-asm-tutorial.net behandeln
diese Themen leider nur schematisch.
Vielen Dank schon mal für Anregungen oder CodeZeilen.

Gruß
Jan Purrucker

Autor: Jan Purrucker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

ich habe noch vergessen, dass der ATMEGA8, mit dem ich zwei 16bit
Zahlen multiplizieren will bereits eine Hardware-Multiplziere hat,
der sich mit dem Befehl mul rd, Rr ansprechen lässt. Allderdings nur
wieder zwei 8bit Zahlen. Wie kann man mit diesem Befehl zwei 16 bit
Zahlen multipliziern?
Wie man eine 16bit Zahl mit lsl shiftet wäre aber trotzdem nicht
schlecht zu wissen.
Danke nochmal für konstruktive Antworten.

Gruß
Jan Purrucker

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

schau Dir mal an wofür das Carry-Flag gut ist.

Grüße,
AK

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der mega8 besitzt doch nen multiplikationsbefehl für 8 bit und schreibt
das ergebnis als 16Bit wert in die register 0 und 1, oder irre ich da?
musste dir nur überlegen wie das früher mit dem multiplizieren in der
schule lief, das ist bei binären zahlen ähnlich:

    12 x 34
    34
     68
    =======
    408

also low byte mit dem jeweils anderen 2bytes multiplizieren
und danach das high bytegenau so.
dann ist die routine im wesentlichen noch ein addition mit carry

Autor: Jan Purrucker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp.
Nun bräuchte ich für andere Zwecke nur noch einen Befehl oder Routine,
mit der man eine 16bit Zahl (steht in zwei Registern) nach links oder
rechts schieben kann.

Gruß
Jan

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Allderdings ist die Zahl in zwei Bytes, der Befehl lsl
> lässt jedoch sich nur auf ein Register anwenden.
> Hat jemand zu diesem Problem eine Lösung?
>
> Hier noch kurz der Assembler-Code Auszug:
>
> ldi r16, LOW(10000)
> ldi r17 HIGH(10000)

lsl r16
rol r17

> Das gleiche Problem stellt sich dann z.B. bei den Befehlen add
> (Addieren)

add r16, r20
adc r17, r21

sub r16, r20
sbc r17, r21

> oder sub (Subtrahieren).

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lsl,lsr,rol,ror...

lsl unteresbyte
rol oberesbyte

Mit lsl schiebst du alle Bits des unteren Bytes nach links, das obere
Bit davon "fällt" ins Carry, mit rol "rotierst" du das obere Byte,
du schiebst dabei das Carry ins unterste Bit, alle Bits eine Stelle
nach links und das oberste Bit ins Carry.

Analog dazu:

lsr oberesbyte
ror unteresbyte

Falls das aber eine Hausaufgabe (Schule/Studium) war, dann gib bitte
auch die Quelle deiner Lösung an.

...

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOL

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.