Hallo Lothar,
Sorry, ich habe Deine Antwort etwas verpennt
Trotzdem versuche ich es etwas zu erklären (vielleicht hast Du das Problem noch nicht gelöst
)
Der einstieg ist hier:
Code:
warte:
sbis ADCSRA,ADIF
rjmp warte
;fertig und lese Ergebnis ein
in rBin1L,ADCL
in rBin1H,ADCH
cbi PORTD,PD3 ;Pin PD3 wieder LOW
cbi DDRD,PD3 ;und wieder als Eingang
sei ;Interrups wieder an
rcall berechne ;Rechne Ergebnis in ascii um und schreibe
;es in sram
und zwar werden die Register rBin1L und rBin1H mit Deinem Wert belegt, den Rest mit sei usw. kannst Du hier vergessen...
dann geht es nach berechnen und weiter nach Bin2ToBcd5, was dann die Routine von Gerd Schmidt wohl ist...
So, zuerst werden die Reister mit push auf den Stack gelegt, damit die Werte beim verlassen der Routine nicht weg sind, ob man das braucht, weiß ich nicht, naja...
Code:
ldi rmp,HIGH(10000) ; Lade 10.000 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(10000)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen
hier wird mit Hilfe von rmp, was wohl ein Arbeitsregister >= R16 ist 10000 in die zwei unteren Register rBin2H u. rBin2L geladen. Hier könnte man auch zwei Register über R16 nehmen, wenn man noch welche frei hat, ich habe es aber einfach so übernommen...
So, jetzt wird Bin2ToDigit angesprungen, die nichts anderes macht als
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
rmp auf null setzen,
Deine Ausgangszahl in rBin1L / H mit rBin2 L / H (wo jetzt 10000 drin steht) zu vergleichen,
Ist Deine Zahl kleiner, wird rmp in RAM abgespeichert (wo der z Zeiger hinzeigt) und mit ret zurückgegangen, ist sie größer wird davon 10000 ( rBin1L / H ) abgezogen rmp inkrementiert, wieder verglichen.
Das Spielchen solange, bis Deine Zahl kleiner als 10000 wird...
Jetzt ist hoffentlich auch klar, daß im rmp z.B. bei 30000 3 drin steht und bei 45121 eine 4 [-o<
So nach dem ret geht es in Bin2ToBcd5 mit 1000 100 und 10 weiter die einser werden direkt gespeichert.
jetzt steht im Ram irgendwo wo der Z Zeiger hingezeigt hat, unsere Ausgangszahl in Digits zerlegt drin.
rBin1L / H werden wiederhergestellt ( die zwei pop's)
Ich habe dann noch eine Routine eingebaut, die mit die führenden Nullen bei Zahlen die kleiner 10000 sind entfernt und fertig, danach kommt nur noch die UART Ausgabe wo die Zahlen mit 0x30 verodert werden.
Ich hoffe, daß es etwas verständlicher geworden ist
Gruß Sebastian
Lesezeichen