Forum: Mikrocontroller und Digitale Elektronik Problem mit Formelberechnung in C


von froschi3 (Gast)


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!

von Andreas W. (Gast)


Lesenswert?

65954 passt aber nicht in 16bit.

von Karl H. (kbuchegg)


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?

von Marc989 (Gast)


Lesenswert?

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

marc989

von Karl heinz B. (kbucheg)


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.

von froschi3 (Gast)


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

von ein suchender (Gast)


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

von unsichtbarer WM-Rahul (Gast)


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

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.