mikrocontroller.net

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


Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht 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:
    OperationCnt=OperationCnt+1;                  // Erhöhen des Betriebstundenzählers
    Cnthelp = OperationCnt;              // Zum bearbeiten abspeichern in Cnthelp

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

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

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

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

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist genau die andere Richtung...

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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom A. (thomas_a)
Datum:

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

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
 unsigned long OperationCnt;
 OperationCnt = 0;
 OperationCnt = OperationCnt+1;
Dann wird da anschliessend 1 (0x00000001) im OperationCnt stehen.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.. 
;-)

Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.