- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Eine Variable in einem Bereich in ein Byte schreiben/lesen

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795

    Eine Variable in einem Bereich in ein Byte schreiben/lesen

    Anzeige

    Powerstation Test
    Hallo...

    Die Frage ist wahrscheinlich oberpeinlich... aber hilft ja nicht... ich komm einfach nicht drauf!

    Ich habe ein Satusbyte (status). Dieses hat noch drei freie Bits (0...2).

    In diese möchte ich eine Zahl schreiben oder eine Zahl herauslesen.


    Ich hab quasi eine Variable x, welche die Werte zwischen 0 und 7 annimmt.
    Diese soll mit einem möglichst einfachen Befehl in die unteren drei Bits von Status geschrieben/gelesen werden.


    Ich hoffe auf was direktes.. Und nicht die Methode, die statusvariablenbits in alle Himmelsruchtungen zu verschieben....

    Ich hoffe ihr versteht was ich meine und könnt mir helfen.

    Danke!
    Gruß,
    Franz

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Also ich würde da einfach erstmal die 3 Bits in Status löschen, und dann per Oder die 3 Bit von x reinkopieren....

    also so:
    Code:
    Status &= ~0x07;
    Status |= (x & 0x07)
    sollte eigentlich klappen...
    aber alle Angaben sind wie immer ohne Kanone
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Naja, entweder dir bleiben die Himmelsrichtungen, oder du legst das Ding als bitfield an.

    Oder eben händisch:
    Code:
    status = (status & ~0x7) | (wert & 0x7);
    Mit Bitfeldern sieht's natürlich viel feiner aus:

    Code:
    typedef struct
    {
       unsigned feld_foo:3;
       ...
    } status_t;
    
    status_t status;
    
    ...
       status.feld_foo = wert;
    
       if (status.feld_foo == 5) ...
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    hm, das Händische gefällt mir besser....

    Da status ein array ist und für mehrere Parts ein statusbyte ist...

    Also status[0] für Part 0 usw....


    Kannst mir das veilleicht noch ein bisschen erläutern...
    Da komm ich nicht so ganz damit zurecht...
    Gruß,
    Franz

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Äh... status ist ein Array?

    uint8_t status[100];

    und du willst die Elemente 0..2 setzen?

    Eben war status noch ein Byte.
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Naja...

    status & ~0x07 entspricht status aber eben ohne die untersten 3 Bit (die sind 0)

    x & 0x07 entspricht den untersten 3 Bit von x (nur um ganz sicher zu gehen, daß man sich nix in status kaputtmacht wenn x doch mal größer ist als 7)

    die beiden werte kann man jetzt gefahrlos zusammensetzen (per Oder), und wieder in status schreiben.
    (ob man das jetzt in einer oder zwei Zeilen macht ist relativ wurscht)


    edit:
    @Sprinter
    ich glaube er will bei jedem Element jeweils die unteren 3 Bit verändern
    So viele Treppen und so wenig Zeit!

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Ok, ich danke euch beiden! Habt mir sehr geholfen.


    Das Statusbyte wird Folgendermaßen verwendet:

    Ich programmiere gerade ein Protokoll. Dieses Managed UART0...1 SPI, Parallel usw. mit nur einer eingebindeten Datei.

    Die zu sendenden und empfangenen Daten werden in Puffer gespeichert:

    BUFFER[anzahl][12];

    Bei jedem Puffer wird das erste Byte ( BUFFER[irgendeiner][0] ) für
    den status des Puffers verwendet. Die unteren 3 Bits sind eben für die
    Schnittstelle, an der gesendet weren soll, oder empfangen wurde.

    Sorry an SprinterSB, hätte ich früher sagen sollen...
    Gruß,
    Franz

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Dann ist es am klarsten etwa so
    Code:
    typedef struct
    {
       unsigned int schnittstelle:3;
       unsigned int flag_1:1;
       unsigned int status:4;
    
       unsigned char count;
       unsigned char buf[12];
    } buffer_t;
    
    buffer_t buffers[ANZAHL];
    Dann hat jeder Puffer ein Status-Feld (4 Bit), ein Feld zum coden der Schnittstelle (3 Bit), ein Flag (1 Bit) und den eigentlichen Daten-Puffer (12 Bytes) und ein Byte für die Anzahl Bytes im Puffer (count).

    Dann kannst du einfach setzen

    Code:
    buffers[2].schnittstelle = SID_UART0;
    oder so. Wieso musst du die Schnittstelle überhaupt merken, die kannst du doch fest einem Puffer zuordnen (bzw. ein Puffer für jede Schnittstelle), etwa so:
    Code:
    buffers[SID_UART0].flag = 1;
    ".schnittstelle" ist damit redundant und kann entfallen. Du arbeitest doch nichst etwa mit malloc???
    Disclaimer: none. Sue me.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Ort
    Attnang
    Alter
    47
    Beiträge
    54
    Hi,
    also mit den Bitfeldern würde ich aufpassen.
    Die sind lt. ANSI C nicht genormt und können auf unterschiedlichen CPU-Arten (Little/Big-Endian wie PPC und ARM und Pentium) abhängig von deren Compiler Probleme verursachen!
    Auf der einen Plattform passt alles, auf der anderen sind alle Bits spiegelverkehrt...
    LG, Alex

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Hi, Danke für die Antworten...

    Das mit dem Struct ist ne gute Idee.
    Und NEIN, mit malloc oder so sachen mach ich GARNICHTS!
    Auch nicht printf oder so a Gschmarre...

    Man kann definieren wieviele Puffer man zur verfügung stellt.
    Um Speicher zu sparen, können die Puffer je nach gebrauch für
    Empfangspuffer/Sendepuffer und für die jeweilige Schnittstelle
    Reserviert werden. Funktioniert perfekt! ich werd das Teil bald
    Online stellen!

    Hab halt jetzt nur für zwei schnittstellen Programmiert....
    ( ein Bit 0 oder 1 )


    Auf jeden Fall.... In diesem Statusbyte sind eben alle Infos was der Puffer gerade macht.

    // -=> BUFFER-INFO-DEFINES <=-
    #define SMART_B_DEV 0
    #define SMART_B_FILL 3
    #define SMART_B_RTS 4
    #define SMART_B_SEND 5
    #define SMART_B_REC 6
    #define SMART_B_RTR 7


    FILL... Puffer wird gerade mit Informationen Gefüllt und zum Senden vorbereitet.
    RTS...Ready to Send
    SEND... Wird gesendet
    REC....Receiving
    RTR....Ready to read

    und die ersten Bits sind eben für die schnittstellt gedacht.


    Wenn was unternommenwerden soll, wird erst nach einem Freien Puffer gesucht. Ein puffer ist dann frei, wenn das Infobyte 0 ist.

    Deshalb möchte ich auf das Struct lieber verzichten...
    Wenns ist mach ich halt ne Funktion die mir den Divice auslest oder reinschreibt....



    Zitat Zitat von Felix G
    sollte eigentlich klappen...
    aber alle Angaben sind wie immer ohne Kanone
    --> lol
    Gruß,
    Franz

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad