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
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