PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen mit zwei Byte...



The_Darkside
12.01.2006, 14:42
Irgendwie steh ich gerade mal wieder total auf der Leitung und versteh nichts mehr.
Mal mein Problem:
Ich habe einen Analogwert (Spannung) eingelesen, der jetzt in LB(lowbyte) und LH(highbyte) gesperichert ist. Da ich den wert gern wieder ausgeben möchte, muss ich diesen ja wieder in eine Spannung zurückrechnen. Das heißt ich würde den eingelesenen Wert /1024(10bit) teilen und mit Vref multiplizieren, bei mir 5V. Soweit ist alles klar. Nur stellt sich mir gerade die Frage, wie ich das ganze mit 2Byte anstell, ein Byte wäre kein Problem, aber bei zwei setzt es aus bei mir. Vor allem da bei allen Sachen, die mir durch den Kopf gingen, immer sämtliche Nachkommastellen weg sind und das dann nicht mehr wirklich sinnvoll ist, da ich wenigstens zwei brauche.
Das die Division durch log. Rechtsschieben funkt. ist auch klar, meine Problem liegt einzig und allein bei den zwei Byte. Vielleicht kann mir jemand das "einfach" erklären.
Danke im voraus Tobias

PicNick
12.01.2006, 15:26
Du meinst, du weißt nicht, wie man zwei byte shiftet ? oder wie man überhaupt mit zwei bytes rechnet ?

xanadu
12.01.2006, 15:30
Um welche Programmiersprache geht's denn? Wenn Du (von) C sprichst, definierst du eine int-Variable, die hat 16 Bit also zwei Bytes, und liest nicht ADCL und ADCR getrennt aus, sondern ADC als zwei Byte Wert.

Wenn ADLAR=0 ist, solltest Du zuerst mit 5 multiplizieren, bevor Du durch 1024 teilst, dann verlierst du keine signifikanten Bits.

The_Darkside
12.01.2006, 15:46
@PicNick
Ich hab überhaupt keine Idee im Moment wie ich mit zwei Byte die zusammengehören arbeiten soll, ich hab das alles mal gelernt aber leider zulange nicht gemacht und auch meine Unterlagen sind zum großenteil nicht mehr vorhanden (Hochwasser)
@xanadu
Sorry, es handelt sich um Assembler, also ich möchte das ganze in Assembler umsetzen, in C wär's natürlich einfacher.
Auch wenn ich zuerst mit 5 multipliziere gehen mir doch am Ende die Nachkommastellen verloren. Zwei würden ja reichen, aber die brauch ich eben auch.
Irgendwie musste man doch da erst die Kommastelle schieben und dann rechnen und am Ende für die Ausgabe zurück? War das nicht irgendwie so?

Wenn man sich mal 5Jahre nicht mit einer Sache beschäftigen kann ist einfach jegliches Wissen weg, ein denkanstoß würde sicher auch schon sehr weiterhelfen...

Danke Tobias

PicNick
12.01.2006, 16:14
Ganz kurz: du findest bei den math-Befehlen immer auch eine Variante mit Carry, die brauchst du immer fürs zweite und weitere Bytes. z.B:
r14:r15 16-Bit-Zahl
wert 16-Bit-wert zu draufaddieren
add r14, low(wert)
adc r15, high(wert)

r14:r15 shift-left
clc clear carry
rol r14 (2^^7 --> Carry)
rol r15 (carry --->2^^0, 2^^7 --> Carry)

das fällt dir schon wieder alles ein

xanadu
12.01.2006, 17:00
Sorry, es handelt sich um Assembler

Schade.... ;-)


Auch wenn ich zuerst mit 5 multipliziere gehen mir doch am Ende die Nachkommastellen verloren. Zwei würden ja reichen, aber die brauch ich eben auch.

Integer kann nur ganze Zahlen, insofern liegt es in der Natur der Sache, dass du die Nachkommastellen verlierst.

URef * ADC ergibt einen Messwert mit der Einheit V/1024.
URef * ADC / 1024 ergibt einen Messwer mit der Einheit (V/1024)/1024, also V.

Wenn du den Messwert in der Einheit V/100 (also V mit zwei Nachkommastellen) haben möchtest, ergibt sich (V/1024)/100 => URef * ADC / 10,24. Da der Teiler ganzzahlig sein muss, heisst es also URef * ADC / 10, also musst du einen Fehler von über 2,5% nur aufgrund der Rechnung in Kauf nehmen.

PicNick
12.01.2006, 18:32
Na, ein bißchen mehr erweitern kann er schon, daß nicht gar so viel den Bach runtergeht. Aber es kommt auf die gewünschte Genauigkeit an. Den divisor (Uref * Extens.) / 1024 kann er ja schon vorher vom Kompiler ausrechen. bleibt also nur dieser Wert * ADC , auf zwei dezimalen runtergeteilt.

The_Darkside
13.01.2006, 07:48
Solangsam kommts wieder... das waren so die Teile die ich nicht mehr im Gedächtnis finden konnte ;).
Danke erstmal, hab ich fürs WE ne ganze Menge zum probieren

Hellmut
13.01.2006, 07:57
Hallo The_Darkside

Wenn du den Kode für deine Berechnung in einer Hochsprache kodierst, dann compilierst und dir über eine Disassembler-Funktion die in den Tools im allgemeinen verfügbar ist den erzeugten Assemblerkode anschaust, so hättest du die Vorlage wie es in Assembler gelöst werden kann.

The_Darkside
26.01.2006, 13:05
Das hab ich jetzt auch gemacht, hab das ganze jetzt wieder weitgehend begriffen, noch paar mal in verschiedener Form umgesetzt und dann gehts wieder ausm FF,

Danke nochmal für die Tipps und die Hilfe

PicNick
26.01.2006, 13:17
Na, dann welcome to the party !