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. ?
>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;
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.
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
> 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.
> Das sollte allerdings schon klappen.
Je nach Endianness eben nicht =)
>> Das sollte allerdings schon klappen. > >Je nach Endianness eben nicht =) Autsch. Selbstverständlich stimmt das nicht.
ich nehme nen ATMega5815. Jetzt allerdings scheint es zu funktionieren. Die 3 Zeilen sind also OK... Was meint ihr mit Endianness ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.