Betriebsstundenzähler - Überlauf - Denkfehler?!

OP #2012672
Lesenswert?

Hallo,
ich muss wohl einen Denkfehler haben und komme einfach nicht darauf.
Ich hab einen 4 Byte langen Betriebsstundenzähler (unsigned long).
Diese Möchte ich in 4 Bytes zerhacken.

also habe ich folgendes gemacht:
1
    OperationCnt=OperationCnt+1;                  // Erhöhen des Betriebstundenzählers
2
    Cnthelp = OperationCnt;              // Zum bearbeiten abspeichern in Cnthelp
3

4
    xdat[0] = E2PROM_ADDRESS_LSB_OPCNT_H;      // Speichern der EEPROM Betriebstundenzähler Adresse (HIGH und LOW Byte)      
5
    xdat[1] = E2PROM_ADDRESS_LSB_OPCNT_L;
6
    xdat[2] = (Cnthelp & 0xFF); 
7
    Cnthelp = Cnthelp >> 8;    // Aufteilen der Betriebstundenzählers in 4 Byte
8
    xdat[3] = (Cnthelp & 0xFF);
9
    Cnthelp = Cnthelp >> 8;
10
    xdat[4] = (Cnthelp & 0xFF);
11
    Cnthelp = Cnthelp >> 8;
12
    xdat[5] = (Cnthelp & 0xFF);// Cnthelp >>= 8;
13

14
    EZUSB_WaitForEEPROMWrite(EEPROM_ADDR);      // Warten bis das EEPROM bereit ist
15
    EZUSB_WriteI2C(EEPROM_ADDR, 6, &xdat[0]);    // Schrieben der Adress Bytes und der 4 Daten Bytes in EEPROM
16

17
    // Speichern des Betriebsstundenzählers im RAM, von hier aus werden die Daten an den Host geschickt
18
    dat[8] = xdat[5];
19
    dat[9] = xdat[4];
20
    dat[10] = xdat[3];
21
    dat[11] = xdat[2];

Das hat eigentlich auch gut funktioniert. Wenn ich jetzt aber den 
Betriebsstundenzähler zurücksetze
1
 OperationCnt=0;
Dann bekomme ich nach einemmal inkrementieren nicht die 1 wie erwartet 
sondern Werte wie 0x1001 = 4097d.
Und der Überlauf findet bei 65xxx statt und nicht wie erwartet bei 
4294967295.

Die Annahme, dass ein unsigned long 4 Byte lang ist stimmt schon oder?

Freue mich über jede neue Idee :)

Gruß Tom
Gast #2012823
Lesenswert?

Hallo

wie gross ein Ulong ist kannst du abfragen

int x;
x = sizeof( unsigned long); //mit x in Byte

Umwandlung von long in Byte geht auch mit einem union

union BtoL{
   unsigned long ul;
   byte b[4];
};

union BtoL btol;
Byte b1;

btol.ul = 0;
b1 = btol.b[0];


Gerhard
Moderator (Firma: Titel) Persönliche Seite #2012996
Lesenswert?

Tom A. schrieb:
>> Du hast einfach was falsches angenommen bezugl. des Aufbaus eines long
> Was den? Ein long ist doch 4 Byte lang....
Aber welches ist das MSB?
Stichworte: Little- und Big-Endian

Tom A. schrieb:
> Ich hab einen 4 Byte langen Betriebsstundenzähler (unsigned long).
> Das hat eigentlich auch gut funktioniert. Wenn ich jetzt aber den
> Betriebsstundenzähler zurücksetze
> OperationCnt=0;
> Dann bekomme ich nach einemmal inkrementieren nicht die 1 wie
> erwartet sondern Werte wie 0x1001 = 4097d.
Kann nicht sein, denn ein long wäre 8 hex-Stellen breit.
Du könntest also schlimmstenfalls sowas bekommen: 0x00001001

> Und der Überlauf findet bei 65xxx statt
Wenn schon, dann sollte der bei 65535 nach 65536 stattfinden...

Um es kurz zu fassen:
Das Problem liegt nicht im geposteten Code(abschnitt).

Denn wenn du sowas machst:
1
 unsigned long OperationCnt;
2
 OperationCnt = 0;
3
 OperationCnt = OperationCnt+1;
Dann wird da anschliessend 1 (0x00000001) im OperationCnt stehen.
Gast #2014702
Lesenswert?

Hi
Mal eine Frage: wie oft beschreibst du den EEProm ? Dir ist klar, das er 
"nur" 100000 Schreibzyklen "aushält". Danach garantiert der Hersteller 
nix mehr, und so wie ich es sehe, schreibst du lustig drauf los.
Gruß oldmax
OP #2014826
Lesenswert?

mh... das habe ich natürlich nicht bedacht... mh... das könnte ein 
problem darstellen ;)

Danke für den Tipp.

Der Betriebsstundenzähler läuft inzwischen irgendwie gab es probleme 
beim schreiben des unsigned longs auf das EEPROM. evtl. sind das auch 
schon die ersten mangel erscheinungen ;)

Das wird sich alles noch rausstellen.

Tom

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren