Datum: 26.04.2008 13:55
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
Datum: 26.04.2008 14:09
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.
Datum: 26.04.2008 15:24
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
Datum: 26.04.2008 17:46
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.
Datum: 01.05.2008 14:23
>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.
Datum: 31.05.2008 00:43
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
Datum: 31.05.2008 01:07
Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab und vom Low-Byte 232.
Datum: 31.05.2008 03:08
>>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
Datum: 31.05.2008 12:14
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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel