- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: m168, AVRGCC: 32Bit Werte verrechnen - Problem!!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.09.2005
    Beiträge
    30

    m168, AVRGCC: 32Bit Werte verrechnen - Problem!!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,

    ich hab mal wieder ein Problem.

    verwendete Tools
    -ATmega168
    -AVR Studio 4.12
    -WinAVR mit GCC für AVR

    zum (vorgelagerten, uneigentlichen) Problem:

    In meinem Programm kommen Werte größer als 0xFFFF = 65.536 = 16Bit vor, also zB. 68.000.
    Dazu sind ja nun die Datentypen "int" und "unsigned int" gedacht...
    Leider bekomme ich Fehlermeldungen im AVR-Studio, wenn ich mit:

    volatile unsigned int VAR1;
    unsigned int VAR2;

    definierte Variablen Werte zuweisen will, die größer als 65.536 sind.
    zB. erzeugt:

    VAR1 = 68000;

    beim compilieren eine Fehlermeldung folgender Art:

    ..warning: large integer implicitly truncated to unsigned type

    Auch:

    VAR1 = 68000L;

    oder

    VAR1 = 68000UL;

    erzeugt diese Fehlermeldung.

    Dies wäre mir ja alles wurscht, weil ich das ja so nicht brauche.
    Mein eigentliches Problem liegt in einer Berechnung mit 8 und 16Bit Werten, deren Output in eine 32Bit Variable kommt, wo ich nun mal naiv vermute, dass das zusammenhängt. Also zB:

    volatile unsigned int VAR1; // Zielvariable
    volatile unsigned short int VAR2_16; // Wert GRANTIERT maximal 0xFFFF
    volatile unsigned char VAR3_8; // Wert GARANTIERT maximal 0xFF

    // im Programmverlauf bekommen die Variablen VAR2_16 zB. 8000 und VAR3_8 zB. 10 zugewiesen
    // folgende Rechnung bringt dann aber kein Ergebniss mehr.
    // Ergebniss wäre '80.000' > 65.535, wobei ich 65.535 ich als Obergrenze festgestellt habe

    VAR1 = (VAR2_16 * 10 * VAR3_;

    Wenn dagegen im Programmverlauf das Ergebniss der Rechnung unterhalb 65.535 bleibt, wird ein Ergebniss ausgegeben.

    Ich hab auch schon mit den Präfixen 'L' und 'UL' nach den Zahlen sowie mit den Sufixen (uint32_t) vor die Variablennamen blindlings versucht Erfolge zu erzielen, aber auch da kam nix..
    Dh. ich weiß nicht, was diese Prä/Suffixe bewirken sollen, was mich natürlich auch interessieren würde, da ich dazu keine Info gefunden habe.

    Ich Suche also Antworten zu:

    32Bit Variablen mit Werten größer 0xFFFF belegen und verarbeiten.


    Vielen Dank
    0tes_Gesetz

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    int ist nicht zwingend 32bit (ich vermute mal, beim AVR ist das nur 16 bit).

    Was Du willst ist: unsigned long, bzw. long als Variablentyp

    Da Du den GCC verwendest empfehle ich die Verwendung von

    Code:
    #include <inttypes.h>
    
    uint32_t varUnsigned32bit;
    uint16_t varUnsigned16bit;
    int32_t varSigned32bit;
    in16_t  varSigned16bit;
    uint8_t varUnsigned8bit;
    ...usw.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    VAR1 = (long) (VAR2_16 * 10 * VAR3_;

    Oder die Typen/Casts von Ogni. Sonst wird die Rechnung mit 16 gemacht und erst *danach* der Typ gewandelt!
    Disclaimer: none. Sue me.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    22.09.2005
    Beiträge
    30
    Danke ihr 2, das hat geholfen.. und wieder was gelernt

    Grüße
    0tes-Gesetz

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad