PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : m168, AVRGCC: 32Bit Werte verrechnen - Problem!!



0tes_Gesetz
26.04.2006, 13:37
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_8);

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

ogni42
26.04.2006, 14:10
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



#include <inttypes.h>

uint32_t varUnsigned32bit;
uint16_t varUnsigned16bit;
int32_t varSigned32bit;
in16_t varSigned16bit;
uint8_t varUnsigned8bit;


...usw.

SprinterSB
26.04.2006, 18:43
VAR1 = (long) (VAR2_16 * 10 * VAR3_8);

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

0tes_Gesetz
27.04.2006, 10:16
Danke ihr 2, das hat geholfen.. und wieder was gelernt ;)

Grüße
0tes-Gesetz