Ok, es ist zum Teil von Gerd Schmidt http://www.avr-asm-tutorial.net/index.html abgekupfert, habe nur etwas für mich angepasst, aber egal.
Alles dreht sich um Folgende Funktion:
Code:
Bin2ToDigit:
clr rmp ; Zähler auf Null
Bin2ToDigita:
cp rBin1H,rBin2H ; Vergleiche MSBs miteinander
brcs Bin2ToDigitc ; MSB Binärzahl kleiner, fertig
brne Bin2ToDigitb ; MSB Binärzahl größer, subtrahiere
cp rBin1L,rBin2L ; MSB gleich, vergleiche LSBs
brcs Bin2ToDigitc ; LSB Binärzahl kleiner, fertig
Bin2ToDigitb:
sub rBin1L,rBin2L ; Subtrahiere LSB Dezimalzahl
sbc rBin1H,rBin2H ; Subtrahiere Carry und MSB
inc rmp ; Erhöhe den Zähler
rjmp Bin2ToDigita ; Weiter vergleichen/subtrahieren
Bin2ToDigitc:
st z+,rmp ; Speichere das Ergebnis und erhöhe Zeiger
ret ; zurück
Kurz erklärt:
Ich speichere das Ergebnis in SRAM, der Z Zeiger muß auf die erste Speicherzelle eingestellt werden.
In rBin1H und rBin1L liegt meine Zahl die Umgewandelt werden soll.
Jetzt ruft man die Funktion 3 Mal auf, aber bevor man sie aufruft muß man in die Register rBin2H und rBin2L die Zahl laden, die substrahiert werden soll, etwa so:
Code:
ldi rBin2H,HIGH(1000)
ldi rBin2L,LOW(1000)
rcall Bin2ToDigit
ldi rBin2H,HIGH(100)
ldi rBin2L,LOW(100)
rcall Bin2ToDigit
ldi rBin2H,HIGH(10)
ldi rBin2L,LOW(10)
rcall Bin2ToDigit
Da die einer nicht mehr abgezogen werden müßen reicht ein
st z,rBin1L aus um die in Sram zu kriegen.
Ich hoffe, es ist verständlich und irgendwie nützlich
.
Bin mal gespannt was Ihr dazu sagt .
Gruß Sebastian
Lesezeichen