@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
halihalo weiss jemand warum wird mit 320.313 Multipliziere rcall fpconv10m ; 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 Warum... Bitte es geht um hilfe...
Wenn ihr die Probleme gelöst habt, dann können wir gerne mal eine Barbie Session starten. Aber bitte ohne Ken. Der ist blöd!
Hallo. Ich bin der, von dem das abgekupfert ist. Nämlich bei: http://www.avr-asm-tutorial.net/avr_de/rechnen/fp_conv10_de.html Wenn man den Kopf der Datei nicht abschneidet, sondern liest, dann kommt folgendes zutage: ; Demonstriert Fließkomma-Umwandlung in ; Assembler, (C)2003 www.avr-asm-tutorial.net ; ; Die Aufgabe: Ein 10-Bit-Analog-Wandler-Signal ; in Binärform wird eingelesen, die Zahlen ; reichen von hex 0000 bis 03FF. ; Diese Zahlen sind umzurechnen in eine ; Fließkommazahl zwischen 0,000 bis 5,000 ; Volt. ; ; Der Programmablauf: ; 1. Die Eingabezahl wird geprüft, ob sie ; kleiner als $0400 ist. ; Das vermeidet Überläufe bei der anschlie- ; ßenden Multiplikation. ; 2. Multiplikation mit 320.313 (hex 04E338). ; Dieser Schritt multipliziert die Zahl mit ; den Faktoren 5.000 und 65.536 und divi- ; diert mit 1.023 in einem Schritt. ; 3. Das Ergebnis wird gerundet und die letzten ; beiden Bytes abgeschnitten. ; Dieser Schritt dividiert durch 65.536, ; indem die beiden letzten Bytes des Ergeb- ; nisses ignoriert werden. Davor wird das ; Bit 15 des Ergebnisse abgefragt und zum ; Runden des Ergebnisses verwendet. ; 4. Die erhaltene Zahl wird in ASCII-Zeichen ; umgewandelt und mit einem Dezimalpunkt ; versehen. ; Das Ergebnis, eine Zahl zwischen 0 und ; 5.000 wird in ASCII-Zeichen umgewandelt. Noch Fragen? mfg gerd
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.