- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Rechenoperationen nur bis 16bit

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    39
    Beiträge
    731
    Anzeige

    Praxistest und DIY Projekte
    Ja ist ja auch einer, wenn der Controller kein 32Bit Register hat.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    44
    Beiträge
    38


    nagut, wie dem auch sei... ich würde gerne den Wert adcBat korrgieren (um Faktor 0.96 ... wollte dafür eigentlich adcBat erst mit 1000 multiplizieren und dann durch 1033 divideren...

    OK, geht leider nicht

    Wie kann ich adcBat dann mit den zu Verfügung stehenden Mitteln anpassen?

    THX

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.02.2006
    Alter
    54
    Beiträge
    781
    uint32_t wert1 = 700 / 100 * 100;

    Ich vermute mal, dass das Standard-Datenformat deines Controllers 16bit ("int") ist. Die Konstanten (700, 100, 100) werden als int behandelt. Erst beim Schreiben in "wert1" (das kommt als letztes) wird der Wert in 32 bit umgewandelt.
    Lösung:

    uint32_t wert1 = (uint32_t)700 / 100 * 100;
    oder vielleicht auch so:
    uint32_t wert1 = 700UL / 100 * 100;

    Teste das bitte mal.

  4. #14
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Variable hat so schon 32 Bit, nur kurz vor der Ausgabe, wenn die Daten an WriteInteger übergeben werden, bleiben nur die unteren 16 über.

    Bei den Rechnungen muß man noch angeben das die konstanten auch 32 bit sein sollen. Die Berechnung wird GCC (zumindest mit Optimierung) ohnehin schon beim compilieren ausführen. Ohne Zusatz sind in C konstanten erstmal Integer also 16 Bit. Man muß also statt 700 einfach 700L schreiben, und bei den andern Zahlen analog.

    Das hat nichts damit zu tun ob der Conroller 32 bit Register hat - hier passiert das abschneiden ja sogar schon am PC.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    39
    Beiträge
    731
    Die Variable hat so schon 32 Bit, nur kurz vor der Ausgabe, wenn die Daten an WriteInteger übergeben werden, bleiben nur die unteren 16 über.
    ...
    Ohne Zusatz sind in C konstanten erstmal Integer also 16 Bit. Man muß also statt 700 einfach 700L schreiben, und bei den andern Zahlen analog.
    Auch ne Möglichkeit, hab ich nicht dran gedacht.


    nagut, wie dem auch sei... ich würde gerne den Wert adcBat korrgieren (um Faktor 0.96 ... wollte dafür eigentlich adcBat erst mit 1000 multiplizieren und dann durch 1033 divideren...
    Ja dann benutz doch einfach den Faktor 0,968, dafür gibt es ja Fliesskomma zahlen!

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    44
    Beiträge
    38
    Lösung -> uint32_t wert1 = 700L * 106L / 100L;

    Die Zeile gibt nun den gewünschten Wert aus!

    @KingTobi
    Fliesskommazahlen wollte ich nicht verwenden, da ich beim Durchstöbern des Forums immer wieder gelesen habe, dass man das vermeiden sollte...

    THX an Alle

  7. #17
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Die writeInteger Funktion kannst Du übrigens auch auf 32 Bit erweitern bei Bedarf.

    Einfach aus der Lib rauskopieren. Anstatt itoa müsstest Du ltoa verwenden
    http://www.nongnu.org/avr-libc/user-...r__stdlib.html


    MfG,
    SlyD

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    34
    Beiträge
    607
    Fließkommazahlen sind nicht schlimm, solange du keine übertriebens zeitintensiven Programme hast.

    Gruß, Yaro

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    44
    Beiträge
    38
    Im Moment ist das Programm nicht groß, aber ich bin hart am arbeiten...

    Der RP6, ausgestattet mit einem LCD & sonstigem Zeug was noch hinzukommt, soll dann über eine Menüführung welche über Taster und gleichzeitig über RC5 Codes gesteuert werden kann, unterschiedlichste Dinge erledigen.

    Ich möchte alles in ein Programm reinpacken was geht... einfach mal um nicht immer nur kurze 08/15 Programme zu schreiben.

    Dehalb die Lösung mit" uint32_t wert1 = 700L * 106L / 100L;" .... die gefällt mir eigentlich ganz gut, ist übersichtlich und ich erspare mir die Fließkommazahlen^^

    mfg
    Aircode

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.08.2007
    Ort
    Delmenhorst
    Alter
    39
    Beiträge
    731
    @aircode
    Du könntest die Berechnung auch direkt in writeInteger packen, dürfte Speicher sparen, wären immerhin 4 Byte.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test