Hallo Leute,
ein kleines Problem habe ich gerade, wobei ich nicht weiter komme.
Ich möchte mit dem PICPCF887 folgende Rechnung in Assembler schreiben:
(-46.85 + 175.72 / 65536.0 *(den Wert den ich vom Sensor ausgelesen
bekommen habe).
Diese Rechnung steht so im Datenblatt meines Sensors. Es handelt sich um
einen Tempertursensor. Die Werte vom Sensor mit dem PIC habe ich
auslesen können.
Falls dennoch Fragen vorhanden sind lege ich noch das Datenblatt im
Anhang bei. Leider weiss ich nicht wie ich diese Rechnung in Assembler
genau frabrizieren soll :(, Zwar habe ich mal auf dieser Seite:
http://www.convict.lu/Jeunes/Math/Fast_operations2.htm mich umgeschaut
hat mir leider nicht geholfen, da 175.72/65536 kleiner als null ist und
floating variablen kann der pic nicht speichern. Im Pic kann ich nur
8Bit variablen speichern.
Vielleicht irre ich mich in meiner Denkweise wäre aber über einige
Ratschläge sehr dankbar.
bis dann:)
Insane1991 schrieb:> da 175.72/65536 kleiner als null ist und> floating variablen kann der pic nicht speichern.
Natürlich kann er das, nur wird es ohne Float Libs kompliziert.
> Im Pic kann ich nur 8Bit variablen speichern.
Und aus mehreren 8bit Variablen kannst du dir eine größere bauen.
Insane1991 schrieb:> -46.85 + 175.72 / 65536.0 *(den Wert den ich vom Sensor ausgelesen> bekommen habe).
Mit festkomma Arithmetik würde das ganz gut gehen:
1. T = <Sensorwert> * 17272
2. T = T / 2^16
3. T = T – 4685
Das größte Problem dabei ist die in Schritt 1 benötigte 16*16-bit
Multiplikation. Da eine Division durch 2^16 nichts anderes als ein
Rechtssshift und 16 Stellen ist kann man für die 2. Operation einfach
die zwei niederwertigsten Bytes verwerfen und brauch keine aufwendige
Divisionsroutine.
Das Ergebnis ist bei dieser Methode dann aber in Hundertstelgrad.
double x;
x = (-46.85 + 175.72 / 65536.0) *AD_Value
(-46.85 + 175.72 / 65536.0) wird vom Compiler direkt ausgerechnet und
als float Konstante ablegt. 5s in C .... unverständlich warum sich noch
Menschen mit Assembler herumquälen...
Christian J. schrieb:> double x;
Fließkomma und doppelte Genauigkeit für eine Temperatur?
> x = (-46.85 + 175.72 / 65536.0) *AD_Value
^
Wo kommt die denn her?
Das kommt davon, wenn man nicht imstande ist die Formel in c
niederzuschreiben. Dasselbe wie wenn der 8k Speicher mit 6k wegen dem
floating point belegt wird. Macht ja nichts, braicht man dann halt ein
32 bittet.
Christian J. schrieb:> unverständlich warum sich noch> Menschen mit Assembler herumquälen...
Es gibt auch Leute, die benutzen immernoch die Treppe, ob wohl es
Aufzüge gibt, Leute die Briefe schreiben, ob wohl es Sms/E-Mail what
ever gibt... Wenn er das in ASM machen möchte, lass ihn doch.
Wahrscheinlich genügt aber auch diese Formel:
T=-46.85 + ((11*AD_Value)/4096)
Wenn man dann z.b. die kommastellen auf 16 begrenzt ist es dann
T=64786+((11*AD_value)>>8)
Wenn man die 4 LSB mit 160 multipliziert und >>8 macht, also nur das
high byte nimmt, bekommt man schön eine Nachkommastelle ohne Sprünge.
Wozu soll bei einem Temperatursensor überhaupt der Dynamikbereich einer
Float-Rechnung nötig sein. Der Sensor wird nie Temperaturen außerhalb
des Bereichs -40°C..125°C zu sehen bekommen - wenn überhaupt.
ah danke :D also wenn das mit dieser Formel:T=-46.85 +
((11*AD_Value)/4096) in Assembler funktionieren sollte bin ich ein
Stückchen weiter. Dachte ich müsste mit 2^16 rechnen mit einem 14bit
Microkontoller.
Und Jungs mir ist das schon klar, dass man das in C viel einfacher hat.
Sonst würde ich mir auch nicht die Zeit verschwenden, ein Thread hier
auf machen. Ich muss den scheiss leider in Assembler schreiben. Deswegen
fragte ich ja ob jmd eine routinne hätte wie man das in Assembler
rechnet.
Kurz zu dieser Formel
T=64786+((11*AD_value)>>8)
dieses 8 mal nach rechts schiften
wenn ich z.b
movlw 0xA4 hätte
und schreibe das in der variable result ein
movwf result
Nun möchte ich das 8 mal geschiftet haben
muss ich dann 8 mal diesen befehl hier schreiben
rrf result,1 ?
Macht der Pic das überhaupt. Im Debug modus habe ich im Workingregister
nichts gesehen, dass sich die Stelle um ein Komma nach rechts verschoben
hätet.
Ich bin ja ein ruhiger Typ, aber wenn ich sehe, dass jemand in Assembler
programmieren möchte und sich fragt, wie er auf einer 8-Bit CPU einen
16-Bit Wert 8 Bits nach rechts verschiebt, dann werd ich sauer. SCHALT
DEIN GEHIRN EIN!!!
Insane1991 schrieb:> Kurz zu dieser Formel> T=64786+((11*AD_value)>>8)>> dieses 8 mal nach rechts schiften> wenn ich z.b>> movlw 0xA4 hätte> und schreibe das in der variable result ein> movwf result> Nun möchte ich das 8 mal geschiftet haben> muss ich dann 8 mal diesen befehl hier schreiben>> rrf result,1 ?
Eine 8bit variable um 8 Stellen nach rechts zu verschieben hat wenig
Sinn, das Ergebnis bei einem Arithmetischen Shift ist dann 0 oder -1, je
nach dem Welches Vorzeichen die Variable hatte. Das Ergebnis der
Multiplikation hast du sowieso nicht in 8bit Platz und brauchst dafür
min. 2 8-bit Speicherzellen. Ein Rechtsschift um 8 entspricht einfach
dem weglassen des Least Significant Bytes.
> Macht der Pic das überhaupt. Im Debug modus habe ich im Workingregister> nichts gesehen, dass sich die Stelle um ein Komma nach rechts verschoben> hätet.
Das verschieben läuft binar ab, also entspricht ein Rechtsschift einer
Division durch 2 und nicht wie in 10er System einer durch 10. Zum Komma:
So lange du keine Fließkomma Funktionen implementiert hast rechnet der
PIC nur mit Ganzzahlen.
asdfasd schrieb:> SCHALT DEIN GEHIRN EIN!!!
Das ist auf jeden Fall eine gute Idee.
> Deswegen fragte ich ja ob jmd eine routinne hätte
Hatte damals die Routinen aus der AN617 benutzt. Gibt wohl keine
anderen.
> SCHALT DEIN GEHIRN EIN!!!
Seit die Automobilindustrie sogar ein Blinkerrelays in C auf stm8
schreiben lässt, dürften solche Übungen wohl etwas überflüssig geworden
sein. Blos nicht nachdenken - da bekommt man nur Schreikrämpfe.
Insane1991 schrieb:> Ich muss den scheiss leider in Assembler schreiben.
Wer sagt das?
Den XC8 gibts kostenlos zum Download.
Oder sollen wir DEINE Hausaufgabe lösen?
fchk
Insane1991 schrieb:> Macht der Pic das überhaupt. Im Debug modus habe ich im Workingregister> nichts gesehen, dass sich die Stelle um ein Komma nach rechts verschoben> hätet.
Hast du in einem "Workingregister" überhaupt schon mal ein Komma
gesehen. Das Register hat ein paar Bits und die braucht es für die
Daten. Für ein Komma ist da kein Platz. Weißt du überhaupt
näherungsweise, was du da tust?
Kritiker schrieb:> Daten. Für ein Komma ist da kein Platz. Weißt du überhaupt> näherungsweise, was du da tust?
Nein, hier sollen wie üblich Hausaufgaben für jemand gemacht werden, der
weder Plan noch Interesse hat, sondern einfach nur schnell davon ab
will...
>>da 175.72/65536 kleiner als null ist und>>floating variablen kann der pic nicht speichern. Im Pic kann ich nur>>8Bit variablen speichern.
Aha.... q.e.d.
Insane1991 schrieb:> floating variablen kann der pic nicht speichern.
Kann er sehr wohl. Es ist ihm völlig wurscht, ob Du Daten als int oder
float interpretierst.
Wenn Du keinen Compiler verwenden willst, kannst Du auch mit ganzen
Zahlen leben. Willst Du z.B. 2 Nachkommastellen, multiplizierts Du
einfach zuerst * 100.
Es ist recht einfach, die Grundrechenarten (+,-,*,/) von 8 Bit auf 16
oder 32 Bit zu erweitern.
Insane1991 schrieb:> ein kleines Problem habe ich gerade, wobei ich nicht weiter komme.> Ich möchte mit dem PICPCF887 folgende Rechnung in Assembler schreiben:>> (-46.85 + 175.72 / 65536.0 *(den Wert den ich vom Sensor ausgelesen> bekommen habe).
Dann suche du hier im Forum, ich habe vor kurzem mein
PIC16-Gleitkommapaket hier gepostet: "
http://www.mikrocontroller.net/attachment/249797/PIC16Fxxx_Gleitkomma.zip"
Das Paket kennt die 4 Grundrechenarten, hat nen int->float und
float->ascii Konverter mit drin.
W.S.
Vielen Dank für die Hilfen. Nochmal ich will nicht haben das einer meine
Hausaufgaben macht! Vielleicht habt ihr mich alle nicht richtig
verstanden. Ich wollte nur verstehen wie das geht und wo ich die nötigen
Informationen finden kann. Den Code kann ich mir auch selber schreiben!
Trotzdem vielen dank :-)