www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei Registeraddition


Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lese 2 5-stellige Zahlen ein, die ich in 4 Registern ablege, d. h.
die letzten drei Ziffern in ein Register und die ersten 2 Ziffern in
ein Register. Genau so verfahre ich mit der 2. Zahl. Beim addieren
verwende ich folgenden Code:

mov   a, R2 ;letzte 3 Stellen der Zahl 1 in Akku
add  a, R4 ;letzte 3 Stellen der Zahl 2 zu Akku addieren
mov  R5, a ;Ergebnis in Register 5 ablegen
mov  a, R1 ;ersten 2 Stellen Zahl 1 in Akku
addc  a, R3 ;ersten 2 Stellen Zahl 2 dazu addieren
mov  R6, a ;Ergebnis in Register 6 ablegen

Leider funktioniert die Addition mit dem Highbyte irgendwie nicht und
das ergebnis wird total verfälscht.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie legst Du drei Ziffern in einem Register ab?

Mit drei Ziffern kann ein Wert zwischen 0 und 999 dargestellt werden,
der passt nicht in ein Register (das ist nämlich nur 8 Bit breit und
kann also keine Werte größer 255 aufnehmen).

Du solltest Dich mal mit der binären Repräsentation von Zahlen
beschäftigen.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja auch eines der Probleme. Ich habe bis jetzt nur Zahlen der
Form 11111 oder 22222 verwendet so das diese Problem nicht auftaucht,
um erst einmal das Problem des Übertrags in den Griff zu bekommen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falscher Ansatz. Solange die Zahlen nicht korrekt binär in obere/untere
Hälfte aufgetrennt werden, solange wird diese Rechnung nicht aufgehen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am obigen Beispiel:

222 + 111 = 333 => 77 im Register (modulo 256), plus Übertrag
22 + 11 + Übertrag = 34.
Ergebis: oben 34, unten 77.
=> so wird das nichts.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das das so nichts wird ist mir auch klar geworden. Ich gebe die 5
Ziffern nacheinander mit der Tastatur des Controllers ein. Mir ist aber
noch nicht klar geworden wie ich diese Zahl korrekt auftrenne bzw.
richtig in ablege.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Reiner,

warum machst du es nicht so:

1. Die erste Zahl, die du eingibst, multiplizierst du mit 10000, die
zweite mit 1000, die dritte mit 100, usw.

2. Nach dem Multiplizieren addierst du die Ergebnisse jeweils in eine
_3-Byte-Variable (3-Byte, weil 5 Stellen = 99999 und in 2 Byte passen
nur 65536 Werte).

Das heisst, du hast die 3-Byte Variable, die die endgültige Zahl
enthält, und eine weitere 3-Byte Variable, in der du die Berechnung
(Multiplikation) durchführst.

Nur so als Lösungsansatz, vielleicht gibt es auch was
Besseres/einfacheres/schnelleres.

Gruß Ralf

Autor: Reiner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Habe inzwischen eine Lösung gefunden um die 16bit Zahl einzulesen und
auf zwei Register zu verteilen. Zuerst lege ich alle 5 Ziffern in 5
Register(jede ziffer eines). Danach multipliziere ich die vorletzte
Ziffer(10er) Stelle mit 10 und addiere sie zur letzten Stelle(1er)
hinzu. Das Ergebnis kommt ins Lowbyteregister des gesamten Ergebnisses.
Danach reduziere ich die 100er Stelle um 1 und addiere 100 auf das
Ergebnis(Lowbyte), gibt es einen Übertrag so addiere ich ihn zum
Highbyte. Ist die hunderter Stelle abgearbeitet, reduziere ich die
1000er Stelle um 1 und addiere bei der 100er stelle 9 dazu. Danach baue
ich wider die 100er Stelle ab. Das ganze mache ich so lange bis die
100er, die 1000er und die 10000er nur noch 0 betragen.

Im Anhang befindet sich der Code. Mein Problem ist nun, das irgendwo
noch ein Fehler ist, ich ihn aber momentan nicht sehe.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der übliche Weg, V ist hier ein 16-bit Registerpaar:

  V auf 0 setzen
nun für jede Ziffer, von links nach rechts:
  V mit 10 multiplizieren
    [Anmerkung: 10=2*(2^2+1), also 10x=2*(2*2*x+x)]
  auf V die Ziffer draufaddieren (mit Übertrag)

Autor: Martin S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist schon erstaunlich, wie groß man einfachen unformatierten Text
"aufblasen" kann. Dein hübsches Assemblerprogramm besteht aus ca 3000
Zeichen und frisst als Word-Dokument locker mal 26 KB. Wenn du es als
Postscript ausgibst, kannst du es auch auf 47 KByte expandieren !

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och, man kann sicherlich auch 'ne TrueColor-Bitmap davon erzeugen ...
die kann dann ruhig noch größer werden :-)


Martin S. hat recht: Word-Dateien sind für Quelltexte hier zu recht
äußerst ungern gesehen.
Quelltexte kann man auch ganz wunderbar in *.txt - Dateien
unterbringen.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Habe das Problem gelöst, die Zahlen werden korrekt eingelesen und auf
zwei 8 bit Register verteilt. Auch die 16 bit Addition und die
Subtraktion gehen ohne Probleme.
Jetzt stehe ich vor dem Problem das mein Ergebnis über drei Register
verteilt ist, ich aber eine einzige Dezimalzahl ausgeben möchte. Wie
kann ich das machen?

mfg Reiner

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gleiche rückwärts. Division durch 10, Rest ist letzte Ziffer. Mit
dem Quotienten wiederum das gleiche. Solang wiederholen bis er 0 ist.
So kriegt man die Ziffern von rechts nach links.

Dumm ist nur, dass es für die Division keine Abkürzung gibt, wie bei
der Multiplikation.

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.