From: Peter J. <pet...@aa...> - 2003-12-03 22:47:28
|
I have some problem with a function returning a long, which I don't seem to be able to reproduce in a simple example. I have this function defined in aad7789.c unsigned long ad7789Read(unsigned char ch, unsigned long *data) { unsigned long d; unsigned char rx; P1OUT &= ~0x01; /* CS */ /* AD7789 mode single converison, unipolar */ ad7789ModeWrite(ch & 0x03, 0x86); #ifdef TARGET while ((P3IN & 0x04) != 0); /* Wait for data ready */ #endif rx = ad7789StatusRead(); /* Read the data register */ ad7789CommWrite(0x38 | (ch & 0x03)); rx = ad7789SpiTxRx(0xff); d = rx; rx = ad7789SpiTxRx(0x00); d = (d << 8) + rx; rx = ad7789SpiTxRx(0xff); d = (d << 8) + rx; P1OUT |= 0x01; /* CS */ *data = d; return d; } and a function calling this from cmd.c void Ad7789Cmd(void) { unsigned char chan; unsigned long data, d; char *p; p = Line; p = GetNextParameter(p); /* find the next param if there is one */ chan = (unsigned char)stoi(p, 10); ad7789PowerUp(); data = ad7789Read(chan, &d); printf("AD7789 data %ld\r\n", data); ad7789ShutDown(); printf("AD7789 d %ld\r\n", d); } now the value returned to data seems to be the upper 16 bits of the return value, where as d (passed as a pointer) is correct. The assumbler listing for the above function is .LM32: mov r4, r15 add #llo(6), r15 mov.b @r4, r13 mov r15, r14 mov r13, r15 call #ad7789Read mov r15, 2(r4) mov 2(r4), 2+2(r4) rla 2+2(r4) subc 2+2(r4), 2+2(r4) inv 2+2(r4) I don't understand what the last 4 instructions do? and it never uses the value returned in r14. the compile line for ad7789.c are msp430-gcc -save-temps -DTARGET -mmcu=msp430x149 -g -Wno-main -I./include -Ibl/include -Iblbl/include -Iblblbl/include -c lib/ad7789/ad7789.c -o lib/ad7789/msp430x149/ad7789.o and for cmd.c are msp430-gcc -save-temps -DTARGET -g -Wno-main -mmcu=msp430x149 -I./include -Ibl/include -Iblbl/include -Iblblbl/include -c multiSensor/cmd.c -o multiSensor/msp430/cmd.o does anyone have any ideas? -- Peter Jansen STS Australian Antarctic Division Channel Highway Kingston TAS 7050 AUSTRALIA Ph (03) 62 323 533 Fax (03) 62 323 351 |