Forum: Mikrocontroller und Digitale Elektronik Betriebsstundenzähler - Überlauf - Denkfehler?!


von Tom A. (thomas_a)


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

von Erich (Gast)


Lesenswert?


von Tom A. (thomas_a)


Lesenswert?

Ist genau die andere Richtung...

Tom A. schrieb:
> Die Annahme, dass ein unsigned long 4 Byte lang ist stimmt schon oder?

von Gerhard (Gast)


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

von Walter (Gast)


Lesenswert?

Tom A. schrieb:
> Ist genau die andere Richtung...

na und, es geht ums Prinzip.
Du hast einfach was falsches angenommen bezugl. des Aufbaus eines long

von Tom A. (thomas_a)


Lesenswert?

Walter schrieb:
> Du hast einfach was falsches angenommen bezugl. des Aufbaus eines long

Was den? Ein long ist doch 4 Byte lang....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von oldmax (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

oldmax schrieb:
> Mal eine Frage: wie oft beschreibst du den EEProm ? Dir ist klar, das er
> "nur" 100000 Schreibzyklen "aushält".
Lassen wir das z.B. auch mal 1 Mio sein. Das wäre aber immer noch sehr 
weit weg von den erwähnten 4294967295, die in ein unsigned long passen.. 
;-)

von Tom A. (thomas_a)


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

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.