Hallo Leute, ein kleines Problem habe ich gerade, wobei ich nicht weiter komme. Ich möchte mit dem PIC PCF887 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.
:
Bearbeitet durch User
Pic16 Floating Point Routinen finden sich in der AN575. Festkomma Library findest du der AN617.
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?
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
> 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.
Hallo Insane, vielleicht findest Du die Loesung auf dieser Seite: [http://www.piclist.com/techref/microchip/math/mul/index.htm] mfG GroberKlotz
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 PIC PCF887 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 :-)
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.