Thanks Mark, That cleared it up even further... I realized the problem in the original 16byte structure that I posted...
I assumed that the top of the structure is the MSB... but it's actually the LSB... but i was filling it in the right way...i was filling in the MSB in buff[0] and LSB in buff[15]... buff[15] being the highest location in mem, which is bottom of structure... all the bytes were ordered correctly... but I think the bits werent becuase i was recieving bits from serial input...MSB first... but the MSP430 is little endian... thus LSB is first!! the final fix was to ... Re-arrange the definitions of the structure.. flip everything... (the MSB become LSB and so on)... and fill it up with the right order..and that works! :) buff[15] = MSB.. ....... buff[0] = LSB I allways fall for those Endian problems... thanks for help, Abe.. On November 20, 2003 11:33 am, Stokes, Mark wrote: > Actually, it hasn't swapped nibbles, it has swapped bytes. But more > accurately, you have swapped bytes. > When you declare: > nibble.buffb[0]=0x12; > nibble.buffb[1]=0x34; > You are declaring them backwards. > The output is accurate: > nibble1 2 > nibble2 1 > nibble3 4 > nibble4 3 > Mem location Zero is the first one, and mem location one is the second. > The output is exactly the same as the second example except w/ the bytes > reversed. As you have the union laid out, you have nibbles 1 and 2 > corresponding to buffb[1], and 3 and 4 corresponding to buffb[0]. Which is > correct. In looking at the documentation on struct, it's not totally > obvious that the elements are actually allocated in reverse order. For > instance, in your case, the first mem location is nibble4, then nibble3, > and so on. With this knowledge, it is obvious that the declaration is > correct. The only way I was able to surmise this was by looking at the > struct section of my C++ book. It references the function biosequipt( ) > which returns an int that contains a bunch of useful bits. The > documentation for that function in my Borland Compiler gave this: > Return Value: > The return value is interpreted as a collection of bit-sized fields. > > +------------------- Number of parallel printers installed: > | 00 = 0; 01 = 1; 10 = 2; 11 = 3 > | +--------------- Serial printer attached > | > | | +------------ Game I/O attached > | | > | | | +------ Number of COM ports: 000 = 0, 001 = 1,..., 111 = > | | | 7 > | | | > | | | | + Direct memory access (DMA) > | | | | > | | | | | 0 = Machine has DMA; 1 = Machine doesn't have > | | | | | DMA > > +-----+--+--+--------+--+-----------------------+ > > |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| > > +-----------------------+-----+-----+-----+--+--+ > Number of disk drives: ---+ | | | | > 00 = 0; 01 = 1; 10 = 2; 11 = 3 | | | | > Initial video mode -------------+ | | | > 00 = Unused | | | > 01 = 40x25 BW with color card | | | > 10 = 80x25 BW with color card | | | > 11 = 80x25 BW with mono card | | | > Motherboard RAM size -----------------+ | | > 00 = 16K; 01 = 32K; 10 = 48K; 11 = 64K | | > Floating-point coprocessor ----------------+ | > Boot from disk -------------------------------+ > > (obviously quite an outdated function) > > And the struct that accesses that is declared as: > struct equipment { > unsigned hasdiskette : 1; > unsigned hascoprocessor: 1; > unsigned planar : 2; > unsigned videomode : 2; > unsigned numfloppy : 2; > unsigned hasdma: 1; > unsigned numserial : 3; > unsigned gameadaptor : 1; > unsigned serialprinter: 1; > unsigned numprinters : 2; > }; > > union twotypes { > struct equipment eq; /* The bit field structure */ > int k; /* Same bytes as an integer */ > }; > > Hope this cleares it up. > -Mark Stokes > > > > -----Original Message----- > From: Ibrahim Saidi [mailto:isa...@dal.ca] > Sent: Thursday, November 20, 2003 5:46 AM > To: mspgcc-users@lists.sourceforge.net > Subject: Re: [Mspgcc-users] [Fwd: Structure help] > > > > Hi, > refrence to the problem..... > I compiled the following code on just a regular GNU gcc compiler... (for my > pentium machine target, not the msp430) > > see the output below: > > > union nibble_t { > > struct nibbles { > unsigned nibble1:4; > unsigned nibble2:4; > unsigned nibble3:4; > unsigned nibble4:4; > }; > unsigned char buffb[2]; > unsigned buff; > }; > > int main(void) > { > int i; > union nibble_t nibble; > > nibble.buffb[0]=0x12; > nibble.buffb[1]=0x34; > printf("\n2 bytes\n"); > printf("nibble1 %x \n",nibble.nibble1); > printf("nibble2 %x \n",nibble.nibble2); > printf("nibble3 %x \n",nibble.nibble3); > printf("nibble4 %x \n",nibble.nibble4); > > printf("\none word\n"); > nibble.buff=0x1234; > printf("nibble1 %x \n",nibble.nibble1); > printf("nibble2 %x \n",nibble.nibble2); > printf("nibble3 %x \n",nibble.nibble3); > printf("nibble4 %x \n",nibble.nibble4); > > return 0; > } > > > ------------------------------- OUTPUT----------------------- > 2 bytes > nibble1 2 > nibble2 1 > nibble3 4 > nibble4 3 > > one word > nibble1 4 > nibble2 3 > nibble3 2 > nibble4 1 > > > > > > the nibbles are swapped.... depending on access type.... how do we fix > this... that cuasing me problems in my structure.... write to it using a > one byte buff[i].. and then i want to access the low-nibble of the 5th > byte... but it gives me the high-nibble of the 5th byte... becuase of > swaping... i thought endian problems are only for accessing structures > larger than bytes.... any one have any ideas how can I get over this > problem... > > thanks... > Abe > > On November 19, 2003 12:27 pm, Garst R. Reese wrote: > > Sorry, they were in the original fwd. > > G. > > > > Dmitry wrote: > > > Oops... > > > where are bitfields? > > > ~d > > > > > > On Wednesday 19 November 2003 18:29, Garst R. Reese wrote: > > > > Dmitry wrote: > > > > > hm... > > > > > any code snippet? > > > > > ~d > > > > > > > > Sure, let me know if you need more. > > > > Thanks, > > > > Garst > > > > > > > > #ifdef _MMC_TEST > > > > int main(void) > > > > { > > > > unsigned int i; > > > > union reg16b_t reg16b; > > > > mcu_init(); > > > > spi_init(); > > > > lcd_init(); > > > > clear_display(); > > > > lcd_set_pos(0,0); > > > > get_register(MMC_SEND_CSD,®16b); > > > > print_register(®16b); > > > > print_response(0xEE); > > > > print_response(reg16b.csd.READ_BL_LEN); > > > > SPI_NONE; > > > > } > > > > #endif > > > > > > > > > > > > int get_register( unsigned char reg_cmd, union reg16b_t *reg16) { > > > > unsigned char arguments[4]; > > > > unsigned char temp25; > > > > int i; > > > > > > > > arguments[0]=0x00; > > > > arguments[1]=0x00; > > > > arguments[2]=0x00; > > > > arguments[3]=0x00; > > > > temp25=mmc_sendcmd(reg_cmd,arguments); > > > > if(temp25) > > > > { > > > > SPI_NONE; > > > > SPI_LCD_EN; > > > > lcd_write_string("GETREG"); > > > > print_response(temp25); > > > > BREAKPNT; > > > > return FALSE; > > > > } > > > > mmc_get_data((unsigned char*) reg16); > > > > return TRUE; > > > > } > > > > > > > > > > > > int mmc_get_data(unsigned char* data) > > > > { > > > > unsigned char temp25; > > > > int i ; > > > > > > > > while((temp25=mmc_get_response())==0); //if card is busy > > > > if(temp25!=0xFE) > > > > { > > > > BREAKPNT; > > > > return FALSE; > > > > } > > > > > > > > /*read the data*/ > > > > for(i=0;i<16;i++) > > > > { > > > > data[i]=spi_read(); > > > > } > > > > > > > > //CRC TOKENs > > > > spi_read(); > > > > spi_read(); > > > > > > > > return TRUE; > > > > } > > > > > > > > > > > > ------------------------------------------------------- > > > > This SF.net email is sponsored by: SF.net Giveback Program. Does > > > > SourceForge.net help you be more productive? Does it help you > > > > create better code? SHARE THE LOVE, and help us help YOU! Click > > > > Here: http://sourceforge.net/donate/ > > > > _______________________________________________ > > > > Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net > > > > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > > > > > > -- > > > /***************************************************************** > > > ("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ > > > `6_ 6 ) `-. ( ).`-.__.`) State Polytechnical Univ. > > > (_Y_.)' ._ ) `._ `. ``-..-' Radio-Physics Departament > > > _..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia > > > (il),-'' (li),' ((!.-' +7 (812) 5403923, 5585314 > > > *****************************************************************/ > > > > > > ------------------------------------------------------- > > > This SF.net email is sponsored by: SF.net Giveback Program. Does > > > SourceForge.net help you be more productive? Does it help you > > > create better code? SHARE THE LOVE, and help us help YOU! Click > > > Here: http://sourceforge.net/donate/ > > > _______________________________________________ > > > Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net > > > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > > ------------------------------------------------------- > This SF.net email is sponsored by: SF.net Giveback Program. Does > SourceForge.net help you be more productive? Does it help you create > better code? SHARE THE LOVE, and help us help YOU! Click Here: > http://sourceforge.net/donate/ > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > > > ------------------------------------------------------- > This SF.net email is sponsored by: SF.net Giveback Program. > Does SourceForge.net help you be more productive? Does it > help you create better code? SHARE THE LOVE, and help us help > YOU! Click Here: http://sourceforge.net/donate/ > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users