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


von Sven (Anfänger) (Gast)


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

von Peter D. (peda)


Lesenswert?

Wie sind denn so Deine Kenntnisse ?

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


Peter

von Sven (Anfänger) (Gast)


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 :(

von AndreasH (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.