mikrocontroller.net

Forum: Compiler & IDEs Hex "Überlauf"


Autor: Michael Leahcim (riegaz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe zwei Hex Werte, gibts eine Möglichkeit wenn der eine
Wert über 0xFF drüber is, das er den andern auf 0x01 erhöht?

ich mein mit einer if schleife gehts ja ohne weiteres, gibts da eine
elegantere Lösung???

Danke

Autor: unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm doch gleich ein integer :-)

Autor: Michael Leahcim (riegaz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soviel heißt wie? ;-)
Wie bau ich den dass so auf das er mir dann den zweiten hex wert
erhöht? Also mit einer if Abfrage bekomm ich das schon hin, wollt nur
wissen obs irgendwie eleganter geht! Beispiele wären super.

Danke

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erhöhe i um eins wenn j = 42 ist:

i += (j == 42);

Das geht so m.W. aber nur in C.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Was soviel heißt wie? ;-)"


Zähle mit einer Variable und teile sie erst bei Bedarf in Low- und
High-Byte:

unsigned int val;
...
val++;
...
unsigned char low = val;
unsigned char high = val / 256;


Peter

Autor: Peter Sager (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Bei Deiner Lösung muss aber immer noch gerechnet bzw. geshiftet werden
um die Bytes aufzuteilen. Da ist die Variante mit einem "if"" immer
noch schneller und effizienter!

Am effizientesten lösst man die Sache mit einer UNION.

// -----------------------------------------------
// definiere ein UNION, zum Beispiel:
// -----------------------------------------------
union {unsigned int u16; unsigned char u08[1];} val;
// -----------------------------------------------
// d.h. val.u08[0..1] (2 Byte Array) nutzt den
// selben Speicherplatz wie val.u16 (16 Bit Integer)
// -----------------------------------------------
unsigned char temp;    // eine weitere Temp-Variable
// -----------------------------------------------
// einige Bespiel Anweisungen
// -----------------------------------------------
val.u16=0x12AB;        // 16-Bit Wert setzen
temp = val.u08[0];     // Low Byte => temp = 0xAB
temp = val.u08[1];     // Hi Byte  => temp = 0x12
val.u08[0] = 0xFF;     // nun ist val.u16 = 0x12FF
val.u16++;             // +1 => val.u16 = 0x1300
temp = val.u08[0];     // Low Byte => temp = 0x00
temp = val.u08[1];     // Hi Byte  => temp = 0x13
// -----------------------------------------------


Ich hoffe das Beispiel reicht aus, um es zu verstehen...?

Gruss Peter

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Sager

Da ich mit verschiedenen CPUs arbeite, vermeide ich Compiler- und
CPU-abhängigen Code, wenn immer es geht.

Siehe:

http://www.mikrocontroller.net/forum/read-1-297451.html#new


Peter

Autor: Peter Sager (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Und da ich auf "kleinen" CPU's arbeite vermeide ich alles, was
mein Program gross und langsam macht.

"unsigned char" ist immer 8 Bit. Doch wer nicht weiss ob der "int"
für seinen Compiler+CPU 16-Bit oder 32-Bit hat, der sollte lieber die
Finger von Hardwarenaher SW für Embedded-Systems lassen.

Oder für Porttierbarkeit noch besser: C99 bzw. GNU99 Integer-Typen
verwenden, die sind nämlich eindeutig!

Bei AVR-GCC zum Beispiel:

// Integer types having exactly the specified width

typedef signed char  int8_t
typedef unsigned char  uint8_t
typedef signed int  int16_t
typedef unsigned int  uint16_t
typedef signed long int  int32_t
typedef unsigned long int  uint32_t
typedef signed long long int  int64_t
typedef unsigned long long int  uint64_t


Gruzzo Peter

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

"...Und da ich auf "kleinen" CPU's arbeite vermeide ich alles, was
mein Program gross und langsam macht."


Ehe Du solche unsinnigen Behauptungen aufstellst, probiers doch erstmal
aus.

Für die Division /256 kriegt der Compiler nämlich mit, daß er einfach
nur das High-Byte nehmen muß. Geschiftet wird da absolut nichts.

Die Größen- und Laufzeitunterschiede dürften unter 0,1% bezogen auf ein
komplettes Programm liegen.


Ich will mich nicht dafür interessieren müssen, welche Byteorder nun
welcher Compiler intern verwendet. Und deshalb lege ich mir solche
faulen Eier nicht ins Nest.


Peter

Autor: Michael Leahcim (riegaz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke vielmals für die Antworten, ich werd Peters Vorschlag mal
ausprobieren!

PS: Eine Frage an Peter Danneger, wegen dem Bootloader, ich weiß es
gehört da nicht wirklich hin!
Wäre super wenn du dich melden könntest, der Bootloader lief bei mir
mit einem Max232 aber seit ich nenn FTDI verwende will er nicht
mehr...

Danke michi

: Wiederhergestellt durch Admin

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.