www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Formelberechnung in C


Autor: froschi3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Möchte eine 16bit Variable umrechnen in einen anderen Wert. Der Codeteil 
sieht wie folgt aus(programmiert wird ein 8032):

Impulse=TH1
TH1=0;
Impulse=Impulse<<8;
Impulse=Impulse+TL1;
TL1=0;

Feuchte=(65954/Impulse)-55;


Die ersten 5 Befehle diene nur zur Auswertung einer Elektronikschaltung.

In der Variable Impulse hab ich also eine 16bit Zahl stehen. Wenn ich 
mir diese Variable anzeigen lasse wird die korrekte Zahl angezeigt.

Diese Variable wird in die Formel eingesetzt und umgerechnet. Jedoch 
liefert C ein anderes Ergebnis als, wenn man es händisch kontrolliert 
mit ein und der selben Zahl(Impulse).

Ich weiß jetzt echt nicht mehr weiter. Vielleicht könnt ihr mir 
helfen.Bin mit den Details von C nicht so vertraut, dass ich hier vlt. 
etwas übersehen habe(math.h ist inkludiert).
Vielen Dank im voraus!

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
65954 passt aber nicht in 16bit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
math.h brauchst du dafür nicht.
Du rufst ja keine Funktion auf, die in der Mathe-Bibliothek
definiert ist.

Allerdings: Wie sind die ganzen Variablen definiert?
signed oder unsigned? Welchen Wertebereich hast du tatsächlich
in Impulse?

65964, wie bereits gesagt, passt nicht in signed int. NOch
nicht mal in unsigned int. Der Compiler sollte dafür
eigentlich einen long hernehmen (wenn der größer ist).
Wenn er das nicht tut, dann mach mal 65964L da draus.

Welche Ergebnisse kommen bei welchen Zahlen raus?

Bist du sicher, dass der Fehler nicht in der Anzeigefunktion
liegt?

Autor: Marc989 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Ergebnis ist danach ja kein integer mehr (division) Hast du für das 
ergebnis ein double oder fload als variable?

marc989

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Dein Ergebnis ist danach ja kein integer mehr (division)

Doch das Ergebnis ist nach der Division immer
noch ein integer. Ob er das aber so haben
will oder nicht, muss er selber entscheiden.
Das hängt im Wesentlichen ja davon ab, wie
die Wertebereiche liegen.
Rein aus C-Sicht spricht nichts dagegen, das
als Integer Division auszuführen.

Autor: froschi3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal an alle mit ihren Tipps!

Messe mit den Timer1 des 8032  10ms lang die Impulse eines 54kHz 
Signals.

Wenn ich nur die Impulse anzeigen lasse zeigt die Anzeige auch korrekt 
die 540 an.

Bei der händischen Rechnungen müsste nach der Formel 67 rauskommen ( das 
Ergebnis bewegt sich immer in einem Bereich von 0-100, da es eine 
Anzeige für Luftfeuchte sein soll). Das Feuchte als unsignend int 
definiert ist, ist Absicht.
Um a) eine ganze Zahl zu erhalten
und b)sich das Ergebnis sowieso nur zw. 0-100 in Normalbetrieb bewegt 
und nur in diesem auch getestet wird.


Wenn ich nun den prozessor rechnen lasse wird ein Ergebnis von ca. 94 
angezeigt.

Weil einige gemeint haben das die Zahl im Zähler zu groß ist.... wäre es 
ein Versuch wert diese Zahl als double Variable zu verwenden??

Autor: ein suchender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja sicher wäre es sinnvoll double zu probieren!
im schlimmsten fall stellst du ahlt wieder um..
was für einen controller verwendest du?


nur aus neugierde..

was für ein gerät baust du?
grüsse

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Weil einige gemeint haben das die Zahl im Zähler zu groß ist.... wäre es
>ein Versuch wert diese Zahl als double Variable zu verwenden??

Schreib mal 65964L, oder verwende den nächst grösseren Datentype (ist 
das double? Eher long, oder?).

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.