PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4byte in 4 einzelne bytes aufteilen



Stefan0985
02.03.2010, 11:46
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

askazo
02.03.2010, 12:01
Hi,
zuerst mal den Wert in 2 x 2 Byte aufteilen


unsigned short HiWord = (unsigned short)(Data >> 16);
unsigned short LoWord = (unsigned short)(Data);

dann diese 2 Words wieder in je 2 Bytes aufteilen:


array[0] = (unsigned char)(LoWord);
array[1] = (unsigned char)(LoWord >> 8);
array[2] = (unsigned char)(HiWord);
array[3] = (unsigned char)(HiWord >> 8);



Hab's gerade mal probiert, geht auch in einem Schritt:


array[0] = (unsigned char)(Data);
array[1] = (unsigned char)(Data >> 8);
array[2] = (unsigned char)(Data >> 16);
array[3] = (unsigned char)(Data >> 24);



Gruß,
askazo

Ceos
02.03.2010, 14:20
geht auch noch kürzer, sogar ultrakurz wenn man es quick n dirty macht ^^



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!!!

Stefan0985
02.03.2010, 17:39
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)



#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



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ß

askazo
02.03.2010, 18:36
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