Forum: Compiler & IDEs bis 2E23 hochzählen, in 3 Bytes


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Klaus T. (klaustaler)


Lesenswert?

Hi

Ich muss einen Wert von 0 bis 2^23 kontinuiertlich hochzählen. Dazu
habe ich gedacht, benutze ich 3 Byte die ich zusammengehängt
betrachte.
Byte0,
Byte1,
Byte2

Ich müsste dann eine Funktion ausführen (bei jedem Interrupt) die immer
eins inkrementiert.
//interrupt-fkt
if (++byte0 < 255)
{
 byte0=0;
 if (++byte1 < 255)
 {
  byte1=0;
  if (++byte2 < 255)
  {
   byte2=0;
  }
 }
}

Gibt es noch eine andere Möglichkeit, evtl per
uint24_t byteX;
Dann bräuchte ich keine 3 if-Schleifen.
?
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"Verschwende" ein Byte und verwende einen (u)int32_t.
von inoffizieller WM-Rahul (Gast)


Lesenswert?

>if-Schleifen.

Kann man die irgendwo kaufen?

Übrigens produziert deine "Berechnung" ziemlichen Quark.
1. Mit drei Bytes kann man bis 2^24-1 zählen
2. if (++byte0 < 255) byte0 = 0; (abgekürzt)
Sorgt dafür, dass byte0 zwischen 0 und 1 hin- und hergestossen wird.

Wenn dann sollte das heissen:

if (++byte0 == 0)
  if (++byte1 == 0)
   ++byte2;

Noch kürzer:

if (!(++byte0))
  if (!(++byte1)
   ++byte2;
von Klaus T. (Gast)


Lesenswert?

Ich brauche nach dem Hochzählen dann aber 3 separate Bytes.
Byte0..Byte2

Wie kann ich die dann trennen? Ich hätte so versucht:


0: seconds & 0xFF;
1: (seconds >> 8) & 0xFF;
2: (seconds >> 16) & 0xFF;

Kommt aber nur Müll bei raus.
von Peter Sager (Gast)


Lesenswert?

Da gibt's eine elegante Methode mit Unions.  Du kanst z.B. einen
uint32_t und einen array von 4 Bytes übereinander definieren und dann
wahlweise auf den 32 Bit Integer oder ein einzelnes Byte zugreifen...

Mach Dich mal schlau bezüglich Unions via folgendem Link:

http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTAX/union.html

Leider hat diese Methode einen Nachteil, der eventuell störend ist: Sie
ist nicht portierbar bzw. abhängig davon, ob ne CPU im Big-Endian oder
Little-Endian Modus rechnet...

MfG  Peter
von Bartli (Gast)


Lesenswert?

Was fürn Prozessor hat denn deine Zielhardware ?
von Karl H. (kbuchegg)


Lesenswert?

> 0: seconds & 0xFF;
> 1: (seconds >> 8) & 0xFF;
> 2: (seconds >> 16) & 0xFF;

Das sollte allerdings schon klappen.

> Kommt aber nur Müll bei raus.

Zeig doch mal mehr.
von Bartli (Gast)


Lesenswert?

> Das sollte allerdings schon klappen.

Je nach Endianness eben nicht =)
von Bartli (Gast)


Lesenswert?

>> Das sollte allerdings schon klappen.
>
>Je nach Endianness eben nicht =)

Autsch. Selbstverständlich stimmt das nicht.
von Klaus T. (Gast)


Lesenswert?

ich nehme nen ATMega5815. Jetzt allerdings scheint es zu funktionieren.
Die 3 Zeilen sind also OK...

Was meint ihr mit Endianness ?
von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Was meint ihr mit Endianness ?
Sowas in der Richtung:
http://de.wikipedia.org/wiki/Endian
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.