- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: 16-bit int in 2 8-bit int zerlegen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    34
    Beiträge
    460

    16-bit int in 2 8-bit int zerlegen

    Hallo!

    Ich muss einen 16 Bit int-werte in 2 8-Bit werte zerlegen, damit ich diese über I2C an meinen motorcontroller schicken kann.

    Gibt es dazu in avr-gcc eine funktion?

    Ich hab mir auch schon selber ein programm überlegt, nur weiß ich nicht wie die vorzeichen sein müssen. Sollen die dann zum höherwertigen byte oder zum niederwertigeren?

    Code:
    int8_t int16to8_high(uint16_t variable)
    {	variable=variable/128;
    
    	//vorzeichen??
    
    	return(uint8_t) variable;
    }
    
    int8_t int16to8_low(uint16_t variable)
    {	variable=variable & 0b1000000001111111;
    	return (uint8_t) variable;
    }
    Also hier ist mein programm, gibt es von avr-gcc auch eins?

    lg christoph

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Wahrscheinlich stellt sich deine Frage so gar nicht. Wenn du einen Integer-Wert (var) in 2 Bytes verschicken must, kannst du das einfach so machen:
    LByte = var;
    HByte = (var >> 8 );

    Auf der anderen Seite wird der Wert wieder hergestellt:
    var = ((HByte << 8 ) | LByte);

    Oder habe ich deine Frage nicht verstanden?

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    34
    Beiträge
    460
    Nein du hast das richtig verstanden, danke.
    Ich hab an das verschieben garnicht gedacht, immer nur an dividieren... aber eigentlich ist das ja das selbe...

    wenn ich so mache:

    variable8bit = (uint8_t) variable16bit;

    Dann fallen einfach die höheren 8 bit der 16-bit variable weg oder?


    lg Christoph

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ja genau.

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man kann auch direkt auf die einzelnen Bytes zugreifen, wenn man die Variable als union definiert.

    Es könnte sein dass GCC das per Optimierung auch so hinkriegt. Manchmal geht die Optimierung ja sehr weit, einige einfach aushende Dinge klappen aber auch nicht.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    34
    Beiträge
    460
    Hi!

    Danke, ich hab jetzt ein programm zum umwandeln von 16 bit in zwei 8 Bit werte, es funktioniert super.

    Jetzt brauche ich einens, dass es umgekehrt macht, von zwei 8 bit werten in eine 16 bit variable.

    Ich wollte das so machen:

    Code:
    int16_t int8to16(int8_t high, int8_t low)
    {	uint16_t out;
    
    	out = (high<<8);
    	out = out | low;
    
    	return out;
    }

    Es funktioniert aber leider nicht. Es kommen irgendwelche zufallszahlen heraus, ich vermute einen vorzeichenfehler. aber ich kann nicht erkennen wo da ein fehler sein soll.

    Könnt ihr euch das mal ansehen?

    lg christoph

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    hast du mal Beispielzahlen. low darf natürlich nur unsigned sein. Was soll sonst z.B. high = 16 und low -5 ergeben?
    Was meinst du mit Zufallszahlen? Bei gleichen Parametern verschiedene Ergebnisse?

    Gruß

    Jens

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Christoph2,

    in deiner Funktion müssen die 8-Bit-Variablen uint8_t sein und die out-Variable natürlich int16_t.

    Gruß Dirk

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    34
    Beiträge
    460
    ahhh danke!!
    Es funktioiert!!

    Ich hab aber nur die low variable uint8_t gemacht, die high hab ich int8_t gemacht, sonst hab ich keine vorzeichen bei der int16_t.

    lg und danke
    Christoph

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo Christoph,
    Zitat Zitat von Christoph2 Beitrag anzeigen
    ahhh danke!!
    Ich hab aber nur die low variable uint8_t gemacht, die high hab ich int8_t gemacht, sonst hab ich keine vorzeichen bei der int16_t.
    Ich denke du hast das mit signed und unsigned noch nicht wirklich verstanden.

    Der 8-Bit-Wert 0b11111111 hat unsigned den Wert 255 und signed -1.
    Das höchstwertige Bit ist das Vorzeichen 0 = "+" und 1 = "-" (zumindest beim üblichen 2er Komplement)

    Wird nun unsigned auf 16-Bit erweitert ergibt dies 0b00000000'11111111, bei signed wird es 0b11111111'11111111

    Der 8-Bit-Wert 0b01111111 ist unsigned und signed = 127.
    Entsprechend wird unsigned und signed als 16-Bit 0b00000000'01111111

    Bei der Erweiterung werden die zusätzlichen Bits bei unsigned immer mit 0en gefüllt.
    Bei signed, entsprechend dem Vorzeichen-Bit mit 0en oder 1ern.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen