www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HEX2BCD Code - Frage zum Ablauf


Autor: Sven (Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin Anfänger im Gebiet der Programmierung der AVR's.

Ich stand vor dem Problem eine hex Zahl in das BCD Format zubekommen.
Über Forumssuche habe ich folgenden Code gefunden.

A:
       ldi r18, -1 + '0'
_bcd1: inc r18
       subi r16, 100
       brcc _bcd1
       ldi r17, 10 +'0'
_bcd2: dec r17
       subi r16, -10
       brcs _bcd2
       subi r16 -'0'
       ret



Dieser funktioniert wunderbar, leider war er nie kommentiert und ich
komme einfach nicht hinter die Funktionsweise.

Sollte evtl 5 Minuten Zeit für solche Anfänger Fragen haben und kurz
ein Kommentar dazu beitragen, würde ich mich sehr freuen.

Grüße
Sven

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sind denn so Deine Kenntnisse ?

Z.B. weißt Du, welche Funktion hat das Carry, wie werden negative
Zahlen berechnet usw.


Peter

Autor: Sven (Anfänger) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter,

also das Carry Flag zeigt den Überlauf an, das is mir noch bekannt.

Ich hab auch den Befehl "subi" in der Befehlsliste nachgeschlagen,
leider steht da nur subrahieren ohne Carry.

Auch der ldi befehl "ldi r17, 10 +'0'" ist mir mir der 10+'0'
etwas schleierhaft. da ich diesen immer nur mit 8bit Konstanten benutzt
habe.

Grüße
Sven :(

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir das mal auf die Schnelle angesehen.
Deshalb alles unter Vorbehalt. Bin auch kein AVR-Spezialist.

Mit '0' lädst du den Ascii-Wert als 30h=48d in das Register.
R18 funktioniert wie ein Schleifenzähler aber direkt im BCD-Format.
Beim Eintritt hat R18 den Wert -1 + 30h= 2Fh = 47d.

Anschliessend wird von deiner umzuwandelnden Zahl solange 100 abgezogen
und R18 hochgezählt bis die 100-Stelle feststeht. D.h. solange der wert
positiv ist, ist das Carry nicht gesetzt. Dadurch wird mit "brcc
_bcd1" (branch if carry cleared) die Schleife durchgenudelt. Sobald
das Carry gesetzt ist, gibt es keine 100-Stelle mehr. Der Wert in R16
ist jetzt negativ und R18 hat die Anzahl der Stellen im BCD-Format.

Für die 10-Stellen wird von der negativen Zahl in R16 solange -10
abgezogen bis dieser wieder positiv ist. (Eine Subtraktion einer
negativen Zahl von einer negativen Zahl ist wie eine Addition
[(-60) - (-50) = (-60) + 50 = -10]).
Solange der Wert in R16 negativ ist, wird in der Schleife geblieben.
Solange ist auch das Carry gesetzt "brcs _bcd2" (branch if Carry
set).
Damit verbleiben in R16 die Einerstellen und R17 gibt dir die
Zehner-Stellen im BCD-Format an.

Zum Schluss wird R16 in BCD-Format umgewandelt.

hoffe ich habe das richtig und einigermaßen anschaulich erklärt.

Grüße
Andreas

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.