-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

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

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

    16-bit int in 2 8-bit int zerlegen

    Anzeige

    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.791
    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
    26
    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.791
    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
    26
    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
    48
    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.791
    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
    26
    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 Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    ... die high hab ich int8_t gemacht, sonst hab ich keine vorzeichen bei der int16_t.
    Wenn du die Integer so sendest, wie oben weiter gezeigt, dürfte das nicht stimmen!
    Beide 8-Bit-Variablen müssen uint8_t sein.

    Gruß Dirk

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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