www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC C18 float -> int


Autor: Edi _2k (edi_2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

ich habe vor aus 4 Integerwerten (16bit) den Mittelwert zu bilden und 
diesen dann per rs232 zu senden.

vorgehensweise:

float avg = 0;
avg += Wert[1...4]
avg = avg / 4;

da die rs232 schnittstelle natürlich keine float werte senden kann caste 
ich auf integer, da der mittelwert den wertebereich nie überschreiten 
kann.

int avg_send = (int)avg;

danach sende ich high- und lowbyte getrennt. der empfangene wert ist 
jedoch falsch. gibt es beim casten irgendeine sache, die ich übersehen 
habe?

danke

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.
Was bedeutet denn 'falsch'?
Nenn doch mal ein paar konkrete Zahlen und zeig
den tatsächlichen Code.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du bei avg_int vielleicht einen Überlauf?
Setzt du die beiden Bytes auch richtig zusammen (beide in HEX, danach 
die beiden HEX-Bytes zusammen in int)?

Autor: Edi _2k (edi_2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
folgendes problem hatte ich.

ich verwendete zuerst einen PIC16F877A mit dem Sourceboost C2C 
Compliler.
dessen größter datentyp war ein 'int' mit 16 bit.

ich muss jedoch den mittelwert aus 4 'int' Werten ermitteln. dazu teilte 
ich die einzelnen werte vorher durch 4 und addierte sie anschließend.

a/4 + b/4 + c/4 + d/4 = avg

statt

(a + b + c + d)/4 = avg

das ist nach dem assoziativgesetz erlaubt. man erhält jedoch eine 
ungenauigkeit von 2 bit, da man die letzten beiden bit jedes messwerten 
raus shiftet.

um dies zu ändern stieg ich auf PIC18F4550 um und verwende den C18 
Compiler von Microchip, der sowohl 'double' als auch 'float' beherrscht.

unsigned int val_0 ... val_4, sum_val;
unsigned int AVG_1,AVG_2;
float temp;

...

...     temp = (float)(val_0 + val_1 + val_2 + val_3);
        AVG_2 = temp/4;
        // diese version funktioniert nicht
        // messwert unten (22892) erscheint hier als 6508

        // vier zu mittlende messwerte (int)
        val_0 = val_0 >> 2;      //val_0 = val_0/4
        val_1 = val_1 >> 2;
        val_2 = val_2 >> 2;
        val_3 = val_3 >> 2;
        sum_val = val_0 + val_1 + val_2 + val_3;
        // diese version funktioniert
        // messwert z.b. sum_val = 22892



alle variablen werden vor jedem aufruf der funktion, die die messwerte 
abholt zu 0 gesetzt.

es sieht so aus, als würden die zwei MSBs fehlen.


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche mal

temp = (float)val_0 + (float)val_1 + (float)val_2 + (float)val_3;

Autor: Edi _2k (edi_2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wars! im nachhinein auch logisch, da beim addieren von 4 mal 0xFFFF 
ein 18 bit wert entsteht, bei dem dann die beiden MSBs fehlen.

danke!

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorsicht, alle Zahlen als float zu verarbeiten ist sehr 
Ressourcenfressend. Wenn du
temp = (floatval_0 + val_1 + val_2 + )((unsigned long)val_3);
schreibst, dann sollte deine Rechnung wesentlich schneller gehen und 
weniger Speicherplatz verbrauchen.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@bernhard:

Lies mal weiter oben.
Auf seinem PIC hat er kein long.
Wenn er eines hätte, wäre der ganze Umstieg auf float
gar nicht nötig.

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.