-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Ersten 8 bit einer 32 bit Zahl auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118

    Ersten 8 bit einer 32 bit Zahl auslesen

    Anzeige

    Hey,
    ich schreibe gerade eine Funktion, um ein EEPROM anzusteuern. Dieses hat 18 Adressleitungen. Nun möchte ich meiner Funktion einfach eine Zahl übergeben, die dann auf die 3 Ports aufgeteilt wird.
    Dazu muss ich die große Zahl (momentan 32 bit) in 3 kleine 8-Bit-Zahlen aufteilen. Wie kann man so etwas machen?

    MfG C_Classic

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    ...32 bit) in 3 kleine 8-Bit-Zahlen aufteilen. Wie kann man so etwas machen?
    ... z.B. mit einer union, in der mittels struct die 3 Bytes definiert werden.

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    Könntest du mir bitte erklären, wie diese union denn aussehen muss... hab noch nie damit gearbeitet.

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    3*8 gibt aber nicht 32. Deswegen brauchst du doch 4 Teile und nicht 3?!

    Du kannst das z.B. so machen (ich hab es nicht probiert aber theoretisch müsse es doch so funktionieren?):
    Code:
    struct SFloat {
    char parts[4];
    };
    
    SFloat zahl2;
    float zahl1;
    zahl2 = (SFloat)(zahl1);
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    3*8 gibt aber nicht 32.
    Ja, aber ich hab 18 Adressleitungen und 32Bit ist die nächst-größte Bit-Zahl, die der GCC unterstützt. Deshalb reichen mir 3 Teile.

    Wie kann ich jetzt bei deiner Variante auf die einzelnen Teile zugreifen?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Nimm lieber sowas:
    Code:
    output = (input >> (byte * 8)) & 0xFF;
    input: 32-Bit Eingabewert
    output: 8-Bit Ausgabewert
    byte: Index des Bytes (0 .. 3)

    Am besten Funktioniert das ganze wenn "byte" eine Konstante ist, dann pickt sich der GCC einfach das passende Byte aus dem (u)int32_t raus.

    mfG
    Markus

    PS: Type-Punning mit Unions sollte man vermeiden

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    Wie kann ich jetzt bei deiner Variante auf die einzelnen Teile zugreifen?
    Falls meine Variante funktioniert, dann so:
    zahl2.parts[x]

    x muss dabei zwischen 0 und 3 liegen.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    C_Classic,

    eine 32-Bit Zahl, die grösser als 16.777.215 ist, kann man nur in vier 8-Bit Zahlen aufteilen - drei 8-Bit Zahlen reichen gerademal für 24 Bit .

    Die Umwandlung in einzelne 8-Bit Zahlen (also Bytes) geht so: Dividiere die Originalzahl durch 256. Der Divisionsrest ist die erste 8-Bit Zahl. Wenn das Ergebnis dieser Division grösser als Null ist, dann dividierst Du es wieder durch 256 und nimmst den Divisionsrest als zweite 8-Bit Zahl usw., bis das Divisionsergebnis gleich Null ist.

    Dieser Algorithmus gilt alle Zahlen, egal wieviel Bit sie haben .

    Ciao,

    mare_crisium

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    Type-Punning mit Unions sollte man vermeiden
    Warum solte man das vermeiden? Das ist 1. praktisch und 2. braucht man nicht doppelt so viel Speicher.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Weil Unions nicht dafür gemacht sind, "a" reinzustecken und "b" rauszuholen.
    Das kann funktionieren, muss es aber nicht, das Verhalten ist für diesen Fall unspezifiziert!
    http://en.wikipedia.org/wiki/Type_punning#cite_note-0

    mfG
    Markus

    PS: Wenn du castest brauchst du auch keinen doppelten Speicher - und bei meiner Variante ebenfalls nicht

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •