mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16 Bit wert durch 2 teilen


Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch 
2teilen.

Hab das einfach so gemacht

lsr templ
lsr temph

das scheint aber doch nicht so einfach zu sein.

denn wenn temph = 1 dann wird 0 daraus

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorsicht: wenn du das obere Register nach rechts schiebst, muss ja das 
niedrigste Bit desselben wieder im unteren Register auftauchen!!!

Probiers mal mit

[avrasm]
clc ; Carry = 0
ror TEMPH
ror TEMPL
[/avrasm

Autor: Michael K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann zwar kein assembler, aber da gibts doch sicher auch nen right shift 
?

shr 1 ?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achtung: das funktioniert so nur für unsigned 16 Bit Werte.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René Schink wrote:
> hallo,
>
> ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch
> 2teilen.
>
> Hab das einfach so gemacht
>
> lsr templ
> lsr temph
Wenn Du einen Wert nach rechts schieben willst, dann muss das Carry-Flag 
berücksichtigt werden. Deshalb ist lsr hier der falsche Befehl. Dafür 
musst Du ror verwenden, und dann erst das High-Byte und direkt danach 
das Low-Byte schieben

> das scheint aber doch nicht so einfach zu sein.
>
> denn wenn temph = 1 dann wird 0 daraus
Ist doch korrekt: Eins geteilt durch zwei ist nunmal Null... Das ist 
eine ganzzahlige Division, bei der ist das eben so. Der µC schaut, wie 
oft die Zwei in die Eins reinpasst, und das ist eben Null mal... Wenn Du 
runden willst, musst Du das "von Hand" machen (z.B. indem Du vor der 
Division die Hälfte des Divisors, in diesem Fall also eine 1, 
hinzuaddierst)...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lsr TempH
ror TempL

spart das vorherige Löschen des Carry-Flags.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne die genauen Assembler-Befehle jetzt nicht (AVR?)
Aber Du musst letztendlich das High-Byte nach rechts schieben, dabei das 
LSB ins Carry übertragen lassen und beim Low-Byte dasselbe, jedoch muss 
das Carry-Bit beim rechts schieben ins MSB reingeschoben werden.
Schau Dir mal die instruction set für Deinen µC an

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe oben ;-)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Travel Rec. wrote:
> lsr TempH
> ror TempL
>
> spart das vorherige Löschen des Carry-Flags.
Richtig. Das ist die sinnvollste Methode. Wichtig ist eben, dass das, 
weas beim Rechts-Schieben hinten aus dem High-Byte rausfällt vorne ins 
Low-Byte reingeschoben wird. Und das macht ror ...

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal zur Zusammenfassung:

unsigned 16 Bit:

LSR temp_hi
ROR temp_lo

signed 16 bit:

ASR temp_hi
ROR temp_lo

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wrote:
> Nochmal zur Zusammenfassung:
> [...]
So steht es auch als Beispiel in der Befehlssatzdokumentation vom 
AVR-Assembler (z.B. in der AVRStudio-Hilfe)

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René Schink wrote:
> hallo,
>
> ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch
> 2teilen.
>
> Hab das einfach so gemacht
>
> lsr templ
> lsr temph
>
> das scheint aber doch nicht so einfach zu sein.
>
> denn wenn temph = 1 dann wird 0 daraus
    |  *2        /2
----+-------------------
mit |  lsl l     asr h
VZ  |  rol h     ror l
    |
ohne|  lsl l     lsr h
VZ  |  rol l     ror l

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Travel Rec.
>siehe oben ;-)

Siehe Uhrzeit ;-))

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luther Blissett wrote:

>
>     |  *2        /2
> ----+-------------------
> mit |  lsl l     asr h
> VZ  |  rol h     ror l
>     |
> ohne|  lsl l     lsr h
> VZ  |  rol l     ror l
         ^^^^^
         rol h natürlich
> 

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reicht es nicht, wenn einer die richte Antwort postet?

Ich kenne auch die Lösung und das sogar für 32Bit. Soll ich das hier 
auch noch posten?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass 
"lsr" übers Carry geht. Wird wohln Typo sein.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht in der Assembler Übersicht in der AVR-Studio4 online-Hilfe.

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Reicht es nicht, wenn einer die richte Antwort postet?

Das kommt nunmal vor, daß während man noch schreibt, andere die Frage 
schon beantworten.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Pauli wrote:
> Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass
> "lsr" übers Carry geht. Wird wohln Typo sein.
Was für ne Datenblattversion haste denn? Bei mir steht das "C" unter 
"Flags" korrekt drin...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Ich kenne auch die Lösung und das sogar für 32Bit. Soll ich das hier
> auch noch posten?
Nein, kannste Dir echt sparen. Dein Posting an sich ist schon 
überflüssig wie ein Kropf.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johannes: Ja, das "C" steht auch unter Flags. Aber bei "ror" steht in 
der Vorschrift z.B. genau drin: "C <- Rd(0)"

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Pauli wrote:
> @Johannes: Ja, das "C" steht auch unter Flags. Aber bei "ror" steht in
> der Vorschrift z.B. genau drin: "C <- Rd(0)"
Ach, so meinstest Du das... Stimmt natürlich, hätte man entweder bei 
beiden weglassen oder bei beiden hinschreiben können...

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...

und durch 4 ist dann
  lsr TempH
  ror TempL ;/2

  lsr TempH
  ror TempL ;/4

oder sehe ich das verkehrt?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, ist richtig.

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.