HF SHOOTER
09.12.2007, 14: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
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