Forum: Mikrocontroller und Digitale Elektronik mit 64bit Zahlen rechnen


von Dshing S. (dshing)


Lesenswert?

Hi, ich versuche grade den folgenden Code zum laufen zu bekommen. Für P 
sollte 100009 raus kommen, aber ich bekomme immer 0xFFFF98E8 raus. Was 
mache ich denn falsch?
1
    int64_t SENS=40127;
2
    int64_t OFF=36924;
3
    int64_t TCS=23317;
4
    int64_t TCO=23282;
5
    int64_t TREF=33464;
6
    int64_t TEMPSENS=28312;
7
    int64_t temperature;
8
    int64_t dT;
9
    int64_t TEMP;
10
    int64_t Offset;
11
    int64_t Sensitivity;
12
    int64_t pressure;
13
    int64_t P;
14
    uint8_t part1a=130;
15
    uint8_t part2a=193;
16
    uint8_t part3a=62;
17
    uint8_t part1b=138;
18
    uint8_t part2b=162;
19
    uint8_t part3b=26;
20
21
    temperature=(part1a<<16)+(part2a<<8)+part3a;
22
    dT=temperature-TREF*256LL;
23
    TEMP=2000LL+dT*TEMPSENS/8388608LL;
24
    Offset=OFF*65536LL+(TCO*dT)/128LL;
25
    Sensitivity=SENS*32768LL+(TCS*dT)/256LL;
26
    pressure=(part1b<<16)+(part2b<<8)+part3b;
27
28
    P=(pressure*Sensitivity/2097152LL-Offset)/32768LL;
29
30
    x1=(unsigned char)(P>>24);
31
    x2=(unsigned char)(P>>16);
32
    x3=(unsigned char)(P>>8);
33
    x4=(unsigned char)(P);
34
    UARTAusgang(x1,x2,x3,x4);

von Adrian (Gast)


Lesenswert?

part1a<<16 ist kein uint8_t mehr! das wird zu groß

von Peter II (Gast)


Lesenswert?

Dshing Sung schrieb:
> temperature=(part1a<<16)+(part2a<<8)+part3a;

wenn du part1a schiftest dann wird das mit int gerechnet. Dammit geht 
dort Daten verloren. Du musst es erst auf 64casten.

von A. F. (elagil)


Lesenswert?

deklarier es direkt als uint64_t/uint32_t.. oder schreib:

  temperature=(((uint32_t)part1a)<<16)+(((uint16_t)part2a)<<8)+part3a;

ich bin mir nicht ganz sicher, ob die größen reichen, sollten sie aber!

von Dshing S. (dshing)


Lesenswert?

Achso alles klar danke, mit der 32 bzw. 16 Konvertierungen vorm schiften 
funktioniert es jetzt. Super! ^^

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.