- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: 4byte in 4 einzelne bytes aufteilen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.11.2009
    Beiträge
    7

    4byte in 4 einzelne bytes aufteilen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich steh grad glaub ich auf dem schlauch.
    ich programmier grad einen atmega128 in AVR studio in C.
    ich habe einen 4byte großen wert und möchte diesen aber in ein array[4] zu je 1 byte speichern.
    ich bekomm's einfach nicht hin.
    wär super wenn mir hierzu jemand kurz einen tip geben könnte so schwer kann das doch nicht sein
    danke

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Hi,
    zuerst mal den Wert in 2 x 2 Byte aufteilen
    Code:
    unsigned short HiWord = (unsigned short)(Data >> 16);
    unsigned short LoWord = (unsigned short)(Data);
    dann diese 2 Words wieder in je 2 Bytes aufteilen:
    Code:
    array[0] = (unsigned char)(LoWord);
    array[1] = (unsigned char)(LoWord >> 8);
    array[2] = (unsigned char)(HiWord);
    array[3] = (unsigned char)(HiWord >> 8);
    [edit]
    Hab's gerade mal probiert, geht auch in einem Schritt:
    Code:
    array[0] = (unsigned char)(Data);
    array[1] = (unsigned char)(Data >> 8);
    array[2] = (unsigned char)(Data >> 16);
    array[3] = (unsigned char)(Data >> 24);
    [/edit]

    Gruß,
    askazo

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    geht auch noch kürzer, sogar ultrakurz wenn man es quick n dirty macht ^^

    Code:
    kurz:
    
    unsigned char *ptr = (usnigned char*)&Mein4ByteWort; 
    for(int i = 0; i < 4; i++)
    {
        meinchararray[i] = *(ptr+i);
    }
    
    ALTERNATIV ->>> ACHTUNG kann sein dass ich ziel und quelle vertauscht habe, bitte in der beschreibung nachsehen ^^
    
    memcpy(ptr, meinchararray, 4);
    
    quick n dirty, wenn man die werte nur kurzweilig braucht und NICHT verändert
    
    unsigned char *ptr = (unsigned char*) &Mein4ByteWort; 
    
    und dann einfach per ptr[index] direkt benutzen!!!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.11.2009
    Beiträge
    7
    viele dank
    läuft jetzt.
    aber ich hab trotzdem noch ein problem und zwar macht AVR studio ein paar kommische sachen beim debuggen.
    (ich hab askazo's lösung verwendet)

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    unsigned char arr1[4];
    unsigned char arr2[4];
    int i;
    uint32_t zahl;
    
    ;
    
    int main(void)
    {
    
    
    while(1)
    {
    arr1[0]=0xaa;
    arr1[1]=0xbb;
    arr1[2]=0x44; 
    arr1[3]=0x7F; 
    
    
    
    zahl=*(uint32_t*)arr1;
    
    
    arr2[0]=(unsigned char)(zahl);
    arr2[1]=(unsigned char)(zahl>>8);
    arr2[2]=(unsigned char)(zahl>>16);
    arr2[3]=(unsigned char)(zahl>>24);
    
    arr1[0]=0x99;
    arr1[1]=0x55;
    arr1[2]=0xaf; 
    arr1[3]=0x65; 
    
    zahl=zahl*2;
    }
    
    }
    und zwar folgendes.
    ich klick auf build and run drück alt+1 (um zu sehen welche werte meine variablen einnehmen) und drück dann F10 bzw F11 (ist hier ja das selbe?!)
    der gelbe pfeil springt dann von int main... auf arr1[1]-F10-arr1[2]-F10-arr1[3]-F10-arr1[0] und fängt dort erst an werte anzunehmen. dann geht der pfeil ganz normal weiter wenn ich F10 drück und die variablen nehmen die werte an die sie sollen, aber die varialbe zahl zeigt ihren wert nicht an (warum?) aber arr2 nimmt die werte an die das array annehmen soll.
    der gelbe pfeil springt dann aber von arr2[3] zu arr1[0] und überspringt einfach das hier alles

    Code:
    arr1[0]=0x99;
    arr1[1]=0x55;
    arr1[2]=0xaf; 
    arr1[3]=0x65; 
    
    zahl=zahl*2;
    was mach ich hier falsch? kann vllt jemand kurz ausprobieren, ob ihr das selbe problem habt?
    das programm ist natürlich völlig sinnlos ich wollt damit nur ein paar sachen ausprobieren für mein eigentliches programm.

    danke für eure hilfe

    gruß

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Ich schätze, da macht Dir der Optimierer einen Strich durch die Rechnung.
    Stelle mal in der Configuration die Optimization von -Os auf -O0,
    dann sollte es auch gehen (hab's bei mir mit dem Simulator getestet).

    Gruß,
    askazo

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad