Forum: Mikrocontroller und Digitale Elektronik unsigned long in 4 byte umwandeln


von Stefan s. (snkrde)


Lesenswert?

Hallo,

im Moment beiße ich mir einen Zacken aus der Krone. Die Lösung ist 
bestimmt simple, ich finde aber keinen Lösungsweg. Hab schon gegoogled 
aber keinen brauchbaren Ansatz gefunden.

Zum Problem:
Ich habe mehrere unsigned long Werte die ich in einen i2c eeprom 
(24c512) speichern (loggen) möchte. Wie ich den 24c512 anspreche weiß 
ich. Ich brauche nur einen Tipp wie ich den unsigned long als C-Code in 
4 einzelne byte zerlege.

Beispiel:
unsigned long = 265896

ergebniss:

byte3 = 0x00
byte2 = 0x04
byte1 = 0xE0
byte0 = 0xA8

Hoffe mir kann einer einen Tipp geben und bedanke mich dafür schon mal 
!!

von Karl H. (kbuchegg)


Lesenswert?

Stefan snkrde schrieb:

> Zum Problem:
> Ich habe mehrere unsigned long Werte die ich in einen i2c eeprom
> (24c512) speichern (loggen) möchte. Wie ich den 24c512 anspreche weiß
> ich. Ich brauche nur einen Tipp wie ich den unsigned long als C-Code in
> 4 einzelne byte zerlege.

Da in dieser Anwendung die Byte-Order wahrscheinlich keine Rolle spielen 
wird, da derselbe µC die Bytes wieder zurückliest, der sie auch 
geschrieben hat, warum dann nicht einfach so
1
void writeLong( uint8_t* address, unsigned long value )
2
{
3
  writeBlock( address, (uint8_t*)&value, siezof(unsigned long) );
4
}
5
6
void writeBlock( uint8_t* adress, uint8_t* blockStart, size_t blockSize )
7
{
8
  // schreibe eine Anzahl an Bytes in das EEPROM beginnend an der
9
  // STartadresse address
10
  ...
11
}

von H.Joachim S. (crazyhorse)


Lesenswert?

Oder als union. Dürfte die effizienteste Möglichkeit sein.

von troll (Gast)


Lesenswert?

H.Joachim Seifert schrieb:
> Oder als union. Dürfte die effizienteste Möglichkeit sein.

Aber laut Standard undefiniert. Kommt ja nur alle drei Tage die Frage... 
Bits schieben!

von Markus M. (mark_m)


Lesenswert?

Welchen Standard meinst du?

In C/C++ ist union sehr wohl definiert. union ist aber Prozessor 
Abhängig und daher nicht portabel. Wenn dein Programm also nicht auf 
verschiedenen MC Typen (Pic, AVR, ARM, ...) laufen soll, ist es kein 
Problem.

Grüsse

von troll (Gast)


Lesenswert?

Markus M. schrieb:
> In C/C++ ist union sehr wohl definiert.
Natürlich, aber dort wird kein Ergebnis garantiert wenn man Datentyp A 
schreibt und dann Datentyp B liest bzw. das Ergebnis ist 
implementation-defined.

In der Bibel findet sich auf S. 214 "a member of a union may not be 
inspected unless the value of the union has been assigned using that 
same member". Die dort genannte Ausnahme zieht hier nicht.

von Markus M. (mark_m)


Lesenswert?

@troll
Am besten Du testest die Funktionsweise und entscheidest dich dann dafür 
oder dagegen. Der Lerneffekt ist unbezahlbar.

Grüsse

von Stefan s. (snkrde)


Lesenswert?

Danke für Eurer Antworten !
Habe gerade bemerkt das mein Beitrag nicht im AVR-Thread gelandet ist.
Gemeint war AVR-GCC.

Der Code-Schnipsel von Karl-Heinz bringt mich warscheinlich weiter !

Danke :)

von troll (Gast)


Lesenswert?

Markus M. schrieb:
> @troll
> Am besten Du testest die Funktionsweise und entscheidest dich dann dafür
> oder dagegen. Der Lerneffekt ist unbezahlbar.
Ja ich weiss, es geht, aber wie gesagt.

von Bronco (Gast)


Lesenswert?

Markus M. schrieb:
> @troll
> Am besten Du testest die Funktionsweise und entscheidest dich dann dafür
> oder dagegen. Der Lerneffekt ist unbezahlbar.

troll hat da durchaus Recht.
Man macht in C so einiges unbewußt, was eigentlich nicht definiert ist, 
aber jeder C-Compiler unterstützt es.
Dann stolpert man eines Tages über so seltsame Dinge wie Aliasing und 
guckt erstmal dumm aus der Wäsche...
http://en.wikipedia.org/wiki/Strict_aliasing#Conflicts_with_optimization

von Udo S. (urschmitt)


Lesenswert?

Stefan snkrde schrieb:
> Der Code-Schnipsel von Karl-Heinz bringt mich warscheinlich weiter !

Der bringt dich ganz sicher weiter.
Ansonsten liegts an dir.

troll schrieb:
> Natürlich, aber dort wird kein Ergebnis garantiert wenn man Datentyp A
> schreibt und dann Datentyp B liest bzw. das Ergebnis ist
> implementation-defined.

Wo Troll recht hat hat er recht :-)

von Stefan s. (snkrde)


Lesenswert?

Udo Schmitt schrieb:
> Stefan snkrde schrieb:
>> Der Code-Schnipsel von Karl-Heinz bringt mich warscheinlich weiter !
>
> Der bringt dich ganz sicher weiter.
> Ansonsten liegts an dir.

Gerade mal im Studio Simuliert !
JAAAAA, das war die Lösung....

DANKE :)

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.