-         

Ergebnis 1 bis 7 von 7

Thema: Problem mit Datentypen (z.B. Integer Zahl in float)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116

    Problem mit Datentypen (z.B. Integer Zahl in float)

    Anzeige

    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.

    Code:
    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:
    Code:
    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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,

    Code:
    zahl = 7372800 / 64 / 1000000;
    Hier wird nur mit int Zahlen gerechnet.

    Nimm
    Code:
    zahl = (float)7372800 / 64 / 1000000;
    Gruß

    Jens

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Zitat Zitat von PicNick
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    Danke

    jetzt klappts.

    @PicNick
    Code:
    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
    cooming soon...

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    Alles klar dann besten Dank für die schnelle Lösung!

    mfg
    Beny
    cooming soon...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •