- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

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

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

    LiFePo4 Akku selber bauen - Video
    Zur Not muss ichs dann so machen:

    Code:
    void WRITE( uint8_t n, uint8_t device ){
    if( device > 7 ){ device = 7; }
    BUFFER[n][0] &=~ (1<<2)|(1<<1)|(1<<0);
    BUFFER[n][0] = BUFFER[n][0] + device;
    }
    
    uint8_t READ( uint8_t n ){
    device = (BUFFER[n][0]<<5);
    device = (device>>5);
    return device;
    }
    Aber es geht mir eigentlich nur darum, diese zwei Dinge zu vereinfachen.
    Gruß,
    Franz

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von trickTronic
    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
    Das ist hier egal weil die Bitfields hier nicht transferiert werden. Ob Bits/Bytes little oder big endian sind spezifiziert C auch nicht, das Problem hast du ohnehin immer. Der Inhalt eines Bitfields zu übertragen ist also genauso sicher/unsicher wie einen char zu übertragen.

    Das von dir angerissene Problem kann dann auftreten, wenn man die ganze Struktur en block überträgt.

    Das Endian-Problem kannst du leicht lösen, indem du es zur Laufzeit abfragst.
    Disclaimer: none. Sue me.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Achja... ich hätte ja das Händische fast vergessen...

    So müsste es ja funktionieren....

    Code:
    void WRITE( uint8_t buffer, uint8_t device ){
    	BUFFER[buffer][0] = (BUFFER[buffer][0] & 0xF8) | (device & 0x07);
    }
    
    
    uint8_t READ( uint8_t buffer ){
    	device |= (BUFFER[buffer][0] & 0x07);
    }

    EDIT: Gibds eigendlich ne Seite wo man so sachen nachschlagen kann? in meinem C-Buch hab ich sowas nochnie gesehen...
    Und in den Tutorials ist das auch immer nicht so ganz drinn...
    Gruß,
    Franz

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Kaiser-F
    [...] 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...
    Womit kollidiert denn struct? Wenn es so ist, hast du nen Designfehler.

    Code:
    If (buffers[i].Infobyte == 0) ...
    Es kommt auch darauf an, was an Speicher du sparen willst. Wenn du Flash sparen willst sieht die Antwort anders aus, als wenn du RAM sparen möchtest. Eine handvoll Bits zu sparen bedeutet idR einem anderen Code der empfindlich mehr Flash schluckt.
    Disclaimer: none. Sue me.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Zitat Zitat von SprinterSB
    Womit kollidiert denn struct? Wenn es so ist, hast du nen Designfehler.
    Code:
    If (buffers[i].Infobyte == 0) ...
    Ich glaube da reden wir aneinander vorbei... ich will bloß die uint8_t in die unteren drei Bits schreiben und herauslesen...
    Wird ein puffer nicht mehr gebraucht, dann wird dieses infobyte auf 0 gesetzt. Er steht dann wieder frei zur verfügung.

    Zitat Zitat von SprinterSB
    Es kommt auch darauf an, was an Speicher du sparen willst. Wenn du Flash sparen willst sieht die Antwort anders aus, als wenn du RAM sparen möchtest. Eine handvoll Bits zu sparen bedeutet idR einem anderen Code der empfindlich mehr Flash schluckt.
    Ich möchte RAM sparen. Und zwar wird das dadurch realisiert, dass
    zB 8 Puffer zur verfügung stehen. Alle schnittstellen können diesen
    also sende- sowie als empfangspuffer verwenden.

    Und nicht extra puffer für jede schnittstelle....
    Damit werden die Puffer Optimal genutzt.
    Gruß,
    Franz

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Mach Infobyte als Bitfeld der Länge 3, that's it. Jedenfalls wird der Code dadurch lesbarer und kann ganz einfach, auf eine Flash-sparene Variante umgestellt werden


    Auch egel, du hast ja jetzt Infos genug...
    Disclaimer: none. Sue me.

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Jap, Infos hab ich jetzt wirklich genug .

    Die Idee mit dem Bitfeld ist ech super!
    ( Ich hab überhaupt schon gemerkt, dass du Bitfelder liebst )

    Sei mir nicht böse, aber ich nimm deinen aller ersten Vorschlag :

    Zitat Zitat von SprinterSB
    Naja, entweder dir bleiben die Himmelsrichtungen, oder du legst das Ding als bitfield an.

    Oder eben händisch:
    Code:
    status = (status & ~0x7) | (wert & 0x7);
    Hab ich gerade getestet... ist Platzsparend und haut super hin!


    Mir ist es in diesen Fall lieber, wenn das Puffer-Array ein stinknormales Array bleibt. Aber für meine Tasteranwendungen nimm ich brav Bitfelder her .

    Danke für deine Hilfe.
    Gruß,
    Franz

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Kaiser-F
    Ich hab überhaupt schon gemerkt, dass du Bitfelder liebst
    Nö, nicht wirklich. Ich denke nur, die sind einfacher zu benutzen und die Quelle bleibt besser lesbar, was für Einsteiger wohl angenehmer ist.

    Ich selbst verwende keine Bitfelder, weil der Code damit wie gesagt länger (und damit auch langsamer) wird.
    Disclaimer: none. Sue me.

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    da hast du recht...

    Was auch immer recht schwierig zu finden ist, sind genau so sachen:

    status = (status & ~0x7) | (wert & 0x7);
    oder if( status & (1<<RTR) ){}

    Gibs da nicht ne seite wo sowas steht... oder sind dass dan eh alle möglichkeiten...

    Weisst schon... so §$%&/( sachen hlt ....?
    Gruß,
    Franz

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Das ist ja immer das gleiche Schema

    Bit löschen: AND (0=bit wird 0, 1=bit bleibt unverändert)
    Bit setzen: OR (1=bit wird 1, 0=bit bleibt unverändert)
    Bit wechseln: XOR (1=bit wird gewechselt (1<->0), 0=bit bleibt unverändert)
    Alle Bits wechseln: NOT

    Und dann eben noch Bits links oder rechts schieben. Das sind die 5 Grundoperationen (XOR wird nur selten gebraucht) für Bitmanipulationen.
    Disclaimer: none. Sue me.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen