mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik (8051) Fragen zum Umgang mit 16 Bit Ganzzahlen


Autor: Lars R. (larsr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich muss im Zuge eines Projektes mit 16 Bit großen Ganzzahlen umgehen. 
Das Programm ist für einen 8051 bestimmt.

Mein Problem damit ist relativ einfach zu beschreiben. Angenommen ich 
habe die Zahl 3572, dann liegt mir diese in zwei Registern mit den 
Inhalten 0x0D und 0xF4 vor. Wie komme ich nun einzeln an die Tausender-, 
Hunderter-, Zehener- und Einserstelle um diese auf einem Display 
darstellen zu können?

Bei lediglich 8 Bit großen Ganzzahlen erledige ich dies durch einfaches 
Teilen durch 100 und nochmaliges Teilen des Rests durch 10. Da der 8051 
allerdings keine 16 Bit-Division besitzt, suche ich nach einer möglichst 
einfachen Methode, um dies realisieren zu können.

(Ja, ich weiß, dass es im Internet beispiele für eine 16 Bit-Division 
gibt, aber diese halte ich für zu umständlich, da es hier um eine 
relativ einfache Aufgabe geht.)

Kennt jemand von euch eine Möglichkeit, wie ich dies realisieren könnte?

Gruß, Lars

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lars R. wrote:

> Bei lediglich 8 Bit großen Ganzzahlen erledige ich dies durch einfaches
> Teilen durch 100 und nochmaliges Teilen des Rests durch 10. Da der 8051
> allerdings keine 16 Bit-Division besitzt, suche ich nach einer möglichst
> einfachen Methode, um dies realisieren zu können.

In dem Fall ist die einfachste Variante:
In einer Schleife 10000 subtrahieren und mitzählen wie oft das ging
ehe ein Unterlauf auftrat.
Mit dem Rest dann, 1000 subtrahieren etc.

Die Division wird also durch eine Folge von Subtraktionen ersetzt
und mitgezählt wie oft dies möglich ist, ehe ein Unterlauf
eintritt.

Für allgemeine Divisionen ist das nicht zu gebrauchen, aber
für diese Spezialdivisionen durch 10000, 1000, 100 etc. geht
das wunderbar, weil ja in einem Schritt nie öfter als 9 mal
subtrahiert werden muss.

Autor: Lars R. (larsr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke für diesen Vorschlag. Darauf bin ich noch gar nicht gekommen! 
Irgendwie übersieht man manchmal die einfachsten Möglichkeiten. Ich bin 
wohl zu sehr PC verwöhnt...

Wenn ich so überlege dürfte dies wesentlich einfacher und viel schneller 
als diese komplizierte Divison sein.

Grüße, Lars

Autor: Der Schelm (derschelm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist auch eine Alternative, die entsprechende Zahl anders 
darzustellen, also z.B. jeweils ein Nibble für die EINER, ZEHNER, 
HUNDERTER ,... Ist dann natürlich nicht mehr so easy zum Rechnen.

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Vielleicht ist auch eine Alternative, die entsprechende Zahl anders
>darzustellen, also z.B. jeweils ein Nibble für die EINER, ZEHNER,
>HUNDERTER

=>BCD-Zahlen
Der 8051 besitzt extra Befehle und Flags zum Rechnen mit BCD-Zahlen.

Autor: Toaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe eigentlich genau das gleiche Problem wie Lars. Habe mir dazu auch 
schon die Antwort von Karlheinz angeschaut und in der Theorie klingt für 
mich das alles ganz logisch. Da ich aber leider erst ne gute Woche mit 
Assembler was am Hut hab, weiß ich nicht ganz wie ich das dann in der 
Praxisumsetzen soll. Wie kann man bei 8Bit 10000 subtrahieren? Mag für 
manche jetzt bissel albern klingen, aber ich hab davon nicht wirklich 
nen Plan, aber brauch das ganze für ne Aufgabe.

Wäre nett, wenn mir das ganze mal einer, am besten an nem Beispiel von 
ner 4 oder 5 stelligen Zahl, erklören könnte.

Danke

Autor: SamS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab 
und vom Low-Byte 232.

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab
>>und vom Low-Byte 232.
VORSICHT, DAS IST FALSCH UND HILFT ANFÄNGERN  N I C H T  WEITER!
DAS MUSS GANZ DEUTLICH GESAGT WEREN!

Was machst Du, wenn das LO-Byte vor dem Subtrahieren schon kleiner als 
232
ist?? Nun? Eben!

Du musst das Carry-Ergebnis der Subtraktion des LO-Bytes bei der
Subtraktion des HI-Bytes berücksichtigen.

Jochen Müller

Autor: SamS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also...es soll eine Anregung sein, sonst hätte ich den Assembler-Code 
gleich mitgeliefert. Selbstverständlich muss er das Carry-Bit 
berücksichtigen. Aber ich dachte, er wisse das dann schon.

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.