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:
Kurz erklärt: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
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:
Da die einer nicht mehr abgezogen werden müßen reicht einCode: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
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







Zitieren

Lesezeichen