PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Datentypen (z.B. Integer Zahl in float)



HF SHOOTER
09.12.2007, 13:47
Hallo

Ich möchte mir einen Funktion basteln, die den Timer0 so einstellt das ein Ausgang in einer bestimmten Frequenz toggelt. Das toggeln erfolgt bei jedem Overflow.

z.B. rufe ich die Funktion so auf: SetFreq(2000);
Diese stellt mir dann den Vorteiler auf 64 ein, und setzt den Reloadwert auf 198, um dann eine Frequenz von ~1986 Hz zu generieren.

Mein Problem ist das ich den Reloadwert bestimmen muss (das bei bestimmten Frequenzen auch der Vorteiler anders gesetzt werden muss weiß ich, aber erstmal bleib ich bei 64 bis das soweit funktioniert).

7372800 Hz / 64 Vorteiler = 115200 Hz (Timer inkrementiert in diesem Takt)

1 / 115200 Hz = 8,68055... µs (Timer inkrementiert also alle 8,68055... µs)

1 / 2000 Hz (meine gewünschte Frequenz) = 500 µs

500 µs / 8,68055... µs = 57,6 -> 58 (so oft muss er inkrementieren, dann soller Überlaufen)

256 - 58 = 198 (mein Reloadwert)



Diese Rechenschritte sollen nun in eine Funktion, dabei habe ich aber noch Probleme mit den Datentypen.


zahl = 7372800 / 64 / 1000000;
zahl_int = zahl * 1000;
itoa(zahl_int,buffer,10);
lcd_puts(buffer);
bringt als Ergebnis 0. Die Variablen zahl und zahl_int sind wie folgt festgelegt:

float zahl;
uint16_t zahl_int;

In Zeile 1 komtm doch als Ergebnis raus: 0,1152 das ist doch kein problem für eine float Variable.
Warum er dann selbst nicht mal bei 0,1152 * 1000 als Ergebnis 115 rauskommt versteh ich auch nicht.
Entweder steht in der float Variable 0 oder es gibt Probleme wenn ich das Ergebnis der float Variable * 1000 nehme und es dann in einer Integer Variable abspeichere.

Wer weiß Rat?

mfg
Benny

PicNick
09.12.2007, 14:24
Damit er erst "zahl * 1000" rechnet und dann erst auf integer brauchst du genaugenommen:
zahl_int = (uint16_t)( (float)zahl * (float)1000) ;
sonst wandelt er erst um (0,1152 --> 0) und multipliziert danach.

McJenso
09.12.2007, 14:25
Hallo,



zahl = 7372800 / 64 / 1000000;


Hier wird nur mit int Zahlen gerechnet.

Nimm


zahl = (float)7372800 / 64 / 1000000;


Gruß

Jens

McJenso
09.12.2007, 14:30
Damit er erst "zahl * 1000" rechnet und dann erst auf integer brauchst du genaugenommen:
zahl_int = (uint16_t)( (float)zahl * (float)1000) ;
sonst wandelt er erst um (0,1152 --> 0) und multipliziert danach.

Nö,

er weiß beim berechnen noch nix von uint16_t. Er sieht erst zahl ist float und rechnet eh mit float typen. 1000 ist in diesem Fall auch vom Type float.

Daher auch das Problem mit der ersten Zeile. Es sind nur int Werte. und damit rechnet er, um das Ergebnis dann in float zu wandeln.

Gruß

Jens

HF SHOOTER
09.12.2007, 14:37
Danke

jetzt klappts.

@PicNick

zahl_int = (uint16_t)( (float)zahl * (float)1000) ;
geht leider trotzdem nicht, bringt als Ergebnis 0.

Mit dem Vorschlag von McJenson klappts.
Soll das heißen man muss expliziet sagen das min. eine Zahl vom Typ float ist wenn man dies in eine Float-Variable speichern will?

mfg
Benny

McJenso
09.12.2007, 14:50
Ja,
es wird sonst nur mit int gerechnet. Gibt es verschiedene Typen, wird der genauere hergenommen.

Die Codezeile von Robert ist als solches nicht falsch. Es ist jedoch genau das, was eh berechnet wird.

Gruß

Jens

HF SHOOTER
09.12.2007, 14:57
Alles klar dann besten Dank für die schnelle Lösung!

mfg
Beny