Forum: Mikrocontroller und Digitale Elektronik Rechnung mit dem PIC16F


von Insane1991 (Gast)


Angehängte Dateien:

Lesenswert?

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:)

von Max H. (hartl192)


Lesenswert?

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
von Noch einer (Gast)


Lesenswert?

Pic16 Floating Point Routinen finden sich in der AN575. Festkomma 
Library findest du der AN617.

von Christian J. (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von chris (Gast)


Lesenswert?

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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von Kritiker (Gast)


Lesenswert?

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.

von Insane1991 (Gast)


Lesenswert?

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.

von asdfasd (Gast)


Lesenswert?

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!!!

von Max H. (hartl192)


Lesenswert?

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
von Noch einer (Gast)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

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

von Kritiker (Gast)


Lesenswert?

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?

von Christian J. (Gast)


Lesenswert?

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.

von GroberKlotz (Gast)


Lesenswert?

Hallo Insane,
vielleicht findest Du die Loesung auf dieser Seite:
[http://www.piclist.com/techref/microchip/math/mul/index.htm]

mfG GroberKlotz

von Peter D. (peda)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Insane1991 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.