mikrocontroller.net

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


Autor: Klaus T. (klaustaler)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Verschwende" ein Byte und verwende einen (u)int32_t.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Klaus T. (Gast)
Datum:

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

Autor: Peter Sager (Gast)
Datum:

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

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

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was fürn Prozessor hat denn deine Zielhardware ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das sollte allerdings schon klappen.

Je nach Endianness eben nicht =)

Autor: Bartli (Gast)
Datum:

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

Autsch. Selbstverständlich stimmt das nicht.

Autor: Klaus T. (Gast)
Datum:

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

Was meint ihr mit Endianness ?

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was meint ihr mit Endianness ?
Sowas in der Richtung:
http://de.wikipedia.org/wiki/Endian

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.