@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.