Gast
#207793
@llo
habe versuch mit der programm zu spielen aber ich verstehe was nicht
was wird im dieser Umwandlungrotine gemacht?
woher dienst die multiplikation mit 320.313?
was ist genauo im unterprogramme fpconv10m: passiert?
;UMWANDLUNGSROUTINE
fpconv10:
rcall fpconv10m ; Multipliziere mit 320.313
rcall fpconv10r ; Runden und Division mit 65536
rcall fpconv10a ; Umwandlung in ASCII-String
rjmp fpconv10f ; Setze Dezimalpunkt und Nullabschluss
fpconv10f:
ldi rmp,'.' ; Setze Dezimalpunkt
mov R6,rmp
ldi rmp, 86 ;V
mov R10,rmp
ret ; Alles fertig
; Startbedingung:
; +---+---+
; | R2+ R1| Eingabezahl
; +---+---+
; +---+---+---+---+
; | R6| R5| R4| R3| Multiplikant 320.313 = $00 04 E3 38 (00 02 80 A0)
bei 2,56V
; | 00| 04| E3| 38| 328.000 (05 01 40) bei 5.12V
; +---+---+---+---+
; +---+---+---+---+
; |R10| R9| R8| R7| Resultat
; | 00| 00| 00| 00|
; +---+---+---+---+
;
fpconv10m:
clr R6 ; Setze den Multiplikant auf 320.313
ldi rmp,$04
mov R5,rmp
ldi rmp,$E3
mov R4,rmp
ldi rmp,$38
mov R3,rmp
clr R10 ; leere Ergebnisregister
clr R9
clr R8
clr R7
fpconv10m1:
mov rmp,R1 ; Prüfe ob noch Bits zu multiplizieren
or rmp,R2 ; Irgendein Bit Eins?
brne fpconv10m2 ; Noch Einsen, mach weiter
ret ; fertig, kehre zurück
fpconv10m2:
lsr R2 ; Schiebe MSB nach rechts (teilen durch 2)
ror R1 ; Rotiere LSB rechts und setze Bit 7
brcc fpconv10m3 ; Wenn das niedrigste Bit eine 0 war,
; dann überspringe den Additionsschritt
add R7,R3 ; Addiere die Zahl in R6:R5:R4:R3 zum Ergebnis
adc R8,R4
adc R9,R5
adc R10,R6
fpconv10m3:
lsl R3 ; Multipliziere R6:R5:R4:R3 mit 2
rol R4
rol R5
rol R6
rjmp fpconv10m1 ; Wiederhole für das n?chste Bit
;
; Runde die Zahl in R10:R9 mit dem Wert von Bit 7 von R8
;
fpconv10r:
clr rmp ; Null nach rmp
lsl R8 ; Rotiere Bit 7 ins Carry
adc R9,rmp ; Addiere LSB mit ?bertrag
adc R10,rmp ; Addiere MSB mit ?bertrag
mov R2,R10 ; Kopiere den Wert nach R2:R1 (durch 65536 teilen)
mov R1,R9
ret