Hi,
erst mal vielen Dank. Ich werde den Code heute Abend mal durcharbeiten.
Ist ja ne ganze Menge. Mal sehen, ob ich das gebacken kriege.
MfG L
Druckbare Version
Hi,
erst mal vielen Dank. Ich werde den Code heute Abend mal durcharbeiten.
Ist ja ne ganze Menge. Mal sehen, ob ich das gebacken kriege.
MfG L
Hallo izaseba,
ich kenne den Code schon (Posting weiter oben).
Ehrlich gesagt, ist mir der Code noch zu komplex (Anfänger).
Ich sehe nicht mal, in welche Register meine 2 Reggister gehören. Könntest Du mir bitte noch etwas unter die Arme greifen?
Danke schon jetzt Lothar
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 :-k )
Der einstieg ist hier:
und zwar werden die Register rBin1L und rBin1H mit Deinem Wert belegt, den Rest mit sei usw. kannst Du hier vergessen...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
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...
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...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
So, jetzt wird Bin2ToDigit angesprungen, die nichts anderes macht als
rmp auf null setzen,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
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 :-k
Gruß Sebastian
Hallo izaseba,
vielen Dank für Deine ausführliche Erklärung. Dank Deiner Hilfe ist es mir jetzt klar geworden. Ich hatte den Versuch schon auf Eis gelegt und wollte es mir später mal wieder anschauen, wenn ich besser bescheid weiß.
Das mit dem Ablegen im Ram mittels Z-Zeiger hatte ich nicht verstanden. Jetzt ja.
MfG Lothar