mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik Spannungmessung mit eine ADC


Autor: Anne (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was die Bunnies heute doch für Probleme haben :)

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Susanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich bin der, von dem das abgekupfert ist. Nämlich bei:

http://www.avr-asm-tutorial.net/avr_de/rechnen/fp_...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.