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.
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.
bringt als Ergebnis 0. Die Variablen zahl und zahl_int sind wie folgt festgelegt:Code:zahl = 7372800 / 64 / 1000000; zahl_int = zahl * 1000; itoa(zahl_int,buffer,10); lcd_puts(buffer);
In Zeile 1 komtm doch als Ergebnis raus: 0,1152 das ist doch kein problem für eine float Variable.Code:float zahl; uint16_t zahl_int;
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
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo,
Hier wird nur mit int Zahlen gerechnet.Code:zahl = 7372800 / 64 / 1000000;
Nimm
GrußCode:zahl = (float)7372800 / 64 / 1000000;
Jens
Nö,Zitat von PicNick
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
Danke
jetzt klappts.
@PicNick
geht leider trotzdem nicht, bringt als Ergebnis 0.Code:zahl_int = (uint16_t)( (float)zahl * (float)1000) ;
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
cooming soon...
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
Alles klar dann besten Dank für die schnelle Lösung!
mfg
Beny
cooming soon...
Lesezeichen