HEX2BCD Code - Frage zum Ablauf

Gast #89234
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
Gast #89236
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 :(
Gast #89237
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.